@jsprismarine/nbt 0.1.0-rc.53 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/dist/Allocation.cjs.js +14 -0
- package/dist/Allocation.es.js +10 -0
- package/dist/ByteOrder-C8lF6w2G.cjs +16 -0
- package/dist/ByteOrder-mAT605jQ.js +13 -0
- package/dist/ByteOrder.cjs.js +10 -0
- package/dist/ByteOrder.es.js +2 -0
- package/dist/NBT.cjs.js +30 -0
- package/dist/NBT.d.ts +7 -7
- package/dist/NBT.d.ts.map +1 -1
- package/dist/NBT.es.js +16 -0
- package/dist/NBTDefinitions-BF_rcBoW.js +23 -0
- package/dist/NBTDefinitions-DUnu0laJ.cjs +26 -0
- package/dist/NBTDefinitions.cjs.js +10 -0
- package/dist/NBTDefinitions.es.js +2 -0
- package/dist/NBTReader.cjs.js +23 -0
- package/dist/NBTReader.d.ts +4 -4
- package/dist/NBTReader.d.ts.map +1 -1
- package/dist/NBTReader.es.js +15 -0
- package/dist/NBTStreamReader.cjs.js +119 -0
- package/dist/NBTStreamReader.d.ts +9 -9
- package/dist/NBTStreamReader.d.ts.map +1 -1
- package/dist/NBTStreamReader.es.js +115 -0
- package/dist/NBTTagCompound.cjs.js +23 -0
- package/dist/NBTTagCompound.d.ts +1 -1
- package/dist/NBTTagCompound.d.ts.map +1 -1
- package/dist/NBTTagCompound.es.js +15 -0
- package/dist/NBTWriter-CWx4uanO.js +515 -0
- package/dist/NBTWriter-KG_h2i_E.cjs +524 -0
- package/dist/NBTWriter.cjs.js +23 -0
- package/dist/NBTWriter.d.ts +2 -2
- package/dist/NBTWriter.d.ts.map +1 -1
- package/dist/NBTWriter.es.js +15 -0
- package/dist/Types-7TSvUTtn.js +21 -0
- package/dist/Types-CTvMjHAk.cjs +23 -0
- package/dist/types/ByteVal.cjs.js +16 -0
- package/dist/types/ByteVal.es.js +12 -0
- package/dist/types/DoubleVal.cjs.js +16 -0
- package/dist/types/DoubleVal.es.js +12 -0
- package/dist/types/FloatVal.cjs.js +16 -0
- package/dist/types/FloatVal.es.js +12 -0
- package/dist/types/LongVal.cjs.js +16 -0
- package/dist/types/LongVal.es.js +12 -0
- package/dist/types/NumberVal.cjs.js +16 -0
- package/dist/types/NumberVal.es.js +12 -0
- package/dist/types/ShortVal.cjs.js +16 -0
- package/dist/types/ShortVal.es.js +12 -0
- package/dist/types/StringVal.cjs.js +16 -0
- package/dist/types/StringVal.es.js +12 -0
- package/dist/types/Types.cjs.js +22 -0
- package/dist/types/Types.d.ts +7 -7
- package/dist/types/Types.d.ts.map +1 -1
- package/dist/types/Types.es.js +8 -0
- package/package.json +50 -27
- package/dist/Allocation.js +0 -8
- package/dist/Allocation.js.map +0 -1
- package/dist/ByteOrder.js +0 -6
- package/dist/ByteOrder.js.map +0 -1
- package/dist/NBT.js +0 -9
- package/dist/NBT.js.map +0 -1
- package/dist/NBTDefinitions.js +0 -16
- package/dist/NBTDefinitions.js.map +0 -1
- package/dist/NBTReader.js +0 -157
- package/dist/NBTReader.js.map +0 -1
- package/dist/NBTStreamReader.js +0 -113
- package/dist/NBTStreamReader.js.map +0 -1
- package/dist/NBTTagCompound.js +0 -137
- package/dist/NBTTagCompound.js.map +0 -1
- package/dist/NBTWriter.js +0 -242
- package/dist/NBTWriter.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types/ByteVal.js +0 -10
- package/dist/types/ByteVal.js.map +0 -1
- package/dist/types/DoubleVal.js +0 -10
- package/dist/types/DoubleVal.js.map +0 -1
- package/dist/types/FloatVal.js +0 -10
- package/dist/types/FloatVal.js.map +0 -1
- package/dist/types/LongVal.js +0 -10
- package/dist/types/LongVal.js.map +0 -1
- package/dist/types/NumberVal.js +0 -10
- package/dist/types/NumberVal.js.map +0 -1
- package/dist/types/ShortVal.js +0 -10
- package/dist/types/ShortVal.js.map +0 -1
- package/dist/types/StringVal.js +0 -10
- package/dist/types/StringVal.js.map +0 -1
- package/dist/types/Types.js +0 -9
- package/dist/types/Types.js.map +0 -1
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { a as ByteOrder } from './ByteOrder-mAT605jQ.js';
|
|
2
|
+
import ByteValue from './types/ByteVal.es.js';
|
|
3
|
+
import DoubleValue from './types/DoubleVal.es.js';
|
|
4
|
+
import FloatValue from './types/FloatVal.es.js';
|
|
5
|
+
import LongValue from './types/LongVal.es.js';
|
|
6
|
+
import { a as NBTDefinitions } from './NBTDefinitions-BF_rcBoW.js';
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import BinaryStream from '@jsprismarine/jsbinaryutils';
|
|
9
|
+
import { Allocation } from './Allocation.es.js';
|
|
10
|
+
import NBTStreamReader from './NBTStreamReader.es.js';
|
|
11
|
+
import NumberValue from './types/NumberVal.es.js';
|
|
12
|
+
import ShortValue from './types/ShortVal.es.js';
|
|
13
|
+
import StringValue from './types/StringVal.es.js';
|
|
14
|
+
|
|
15
|
+
class NBTReader extends NBTStreamReader {
|
|
16
|
+
constructor(input, byteOrder) {
|
|
17
|
+
super(input, byteOrder);
|
|
18
|
+
}
|
|
19
|
+
parseList() {
|
|
20
|
+
this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
|
|
21
|
+
if (this.readByteValue().getValue() !== NBTDefinitions.TAG_LIST) {
|
|
22
|
+
throw new Error("Invalid NBT Data: Not list tag found");
|
|
23
|
+
}
|
|
24
|
+
this.readStringValue();
|
|
25
|
+
return this.readTagListValue();
|
|
26
|
+
}
|
|
27
|
+
parse() {
|
|
28
|
+
this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
|
|
29
|
+
if (this.readByteValue().getValue() !== NBTDefinitions.TAG_COMPOUND) {
|
|
30
|
+
throw new Error("Invalid NBT Data: No root tag found");
|
|
31
|
+
}
|
|
32
|
+
const name = this.readStringValue().getValue();
|
|
33
|
+
const root = this.readTagCompoundValue();
|
|
34
|
+
root.setName(name);
|
|
35
|
+
return root;
|
|
36
|
+
}
|
|
37
|
+
readTagCompoundValue() {
|
|
38
|
+
this.alterAllocationLimit(Allocation.COMPOUND);
|
|
39
|
+
const compound = new NBTTagCompound();
|
|
40
|
+
this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false);
|
|
41
|
+
let tagID = this.readByteValue().getValue();
|
|
42
|
+
while (tagID !== NBTDefinitions.TAG_END) {
|
|
43
|
+
switch (tagID) {
|
|
44
|
+
case NBTDefinitions.TAG_BYTE:
|
|
45
|
+
compound.addValue(this.readStringValue().getValue(), this.readByteValue());
|
|
46
|
+
break;
|
|
47
|
+
case NBTDefinitions.TAG_SHORT:
|
|
48
|
+
compound.addValue(this.readStringValue().getValue(), this.readShortValue());
|
|
49
|
+
break;
|
|
50
|
+
case NBTDefinitions.TAG_INT:
|
|
51
|
+
compound.addValue(this.readStringValue().getValue(), this.readIntValue());
|
|
52
|
+
break;
|
|
53
|
+
case NBTDefinitions.TAG_LONG:
|
|
54
|
+
compound.addValue(this.readStringValue().getValue(), this.readLongValue());
|
|
55
|
+
break;
|
|
56
|
+
case NBTDefinitions.TAG_FLOAT:
|
|
57
|
+
compound.addValue(this.readStringValue().getValue(), this.readFloatValue());
|
|
58
|
+
break;
|
|
59
|
+
case NBTDefinitions.TAG_DOUBLE:
|
|
60
|
+
compound.addValue(this.readStringValue().getValue(), this.readDoubleValue());
|
|
61
|
+
break;
|
|
62
|
+
case NBTDefinitions.TAG_BYTE_ARRAY:
|
|
63
|
+
compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue());
|
|
64
|
+
break;
|
|
65
|
+
case NBTDefinitions.TAG_STRING:
|
|
66
|
+
compound.addValue(this.readStringValue().getValue(), this.readStringValue());
|
|
67
|
+
break;
|
|
68
|
+
case NBTDefinitions.TAG_LIST:
|
|
69
|
+
compound.addValue(this.readStringValue().getValue(), this.readTagListValue());
|
|
70
|
+
break;
|
|
71
|
+
case NBTDefinitions.TAG_COMPOUND:
|
|
72
|
+
const name = this.readStringValue().getValue();
|
|
73
|
+
const child = this.readTagCompoundValue();
|
|
74
|
+
child.setName(name);
|
|
75
|
+
compound.addChild(child);
|
|
76
|
+
break;
|
|
77
|
+
case NBTDefinitions.TAG_INT_ARRAY:
|
|
78
|
+
compound.addValue(this.readStringValue().getValue(), this.readIntArrayValue());
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
throw new Error(`Invalid NBT Data: Unknown tag <${tagID}>`);
|
|
82
|
+
}
|
|
83
|
+
this.expectInput(1, "Invalid NBT Data: Expected tag ID in tag compound", false);
|
|
84
|
+
tagID = this.readByteValue().getValue();
|
|
85
|
+
}
|
|
86
|
+
return compound;
|
|
87
|
+
}
|
|
88
|
+
readTagListValue() {
|
|
89
|
+
this.expectInput(this.isUsingVarint() ? 2 : 5, "Invalid NBT Data: Expected TAGList header", false);
|
|
90
|
+
const listType = this.readByteValue().getValue();
|
|
91
|
+
let listLength = this.readIntValue().getValue();
|
|
92
|
+
this.alterAllocationLimit(Allocation.ARRAY_LIST);
|
|
93
|
+
this.alterAllocationLimit(Allocation.REFERENCE);
|
|
94
|
+
const backingList = /* @__PURE__ */ new Set();
|
|
95
|
+
switch (listType) {
|
|
96
|
+
case NBTDefinitions.TAG_END:
|
|
97
|
+
listLength = 0;
|
|
98
|
+
break;
|
|
99
|
+
case NBTDefinitions.TAG_BYTE:
|
|
100
|
+
this.expectInput(listLength, "Invalid NBT Data: Expected bytes for list");
|
|
101
|
+
for (let i = 0; i < listLength; i++) {
|
|
102
|
+
backingList.add(this.readShortValue());
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case NBTDefinitions.TAG_SHORT:
|
|
106
|
+
this.expectInput(2 * listLength, "Invalid NBT Data: Expected shorts for list");
|
|
107
|
+
for (let i = 0; i < listLength; i++) {
|
|
108
|
+
backingList.add(this.readShortValue());
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case NBTDefinitions.TAG_INT:
|
|
112
|
+
this.expectInput(4 * listLength, "Invalid NBT Data: Expected ints for list");
|
|
113
|
+
for (let i = 0; i < listLength; i++) {
|
|
114
|
+
backingList.add(this.readIntValue());
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
case NBTDefinitions.TAG_LONG:
|
|
118
|
+
this.expectInput(8 * listLength, "Invalid NBT Data: Expected longs for list");
|
|
119
|
+
for (let i = 0; i < listLength; i++) {
|
|
120
|
+
backingList.add(this.readLongValue());
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
case NBTDefinitions.TAG_FLOAT:
|
|
124
|
+
this.expectInput(4 * listLength, "Invalid NBT Data: Expected floats for list");
|
|
125
|
+
for (let i = 0; i < listLength; i++) {
|
|
126
|
+
backingList.add(this.readFloatValue());
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
case NBTDefinitions.TAG_DOUBLE:
|
|
130
|
+
this.expectInput(8 * listLength, "Invalid NBT Data: Expected doubles for list");
|
|
131
|
+
for (let i = 0; i < listLength; i++) {
|
|
132
|
+
backingList.add(this.readDoubleValue());
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
case NBTDefinitions.TAG_BYTE_ARRAY:
|
|
136
|
+
for (let i = 0; i < listLength; i++) {
|
|
137
|
+
backingList.add(this.readByteArrayValue());
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
case NBTDefinitions.TAG_STRING:
|
|
141
|
+
for (let i = 0; i < listLength; i++) {
|
|
142
|
+
backingList.add(this.readStringValue());
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
case NBTDefinitions.TAG_LIST:
|
|
146
|
+
for (let i = 0; i < listLength; i++) {
|
|
147
|
+
backingList.add(this.readTagListValue());
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
case NBTDefinitions.TAG_COMPOUND:
|
|
151
|
+
for (let i = 0; i < listLength; i++) {
|
|
152
|
+
backingList.add(this.readTagCompoundValue());
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
case NBTDefinitions.TAG_INT_ARRAY:
|
|
156
|
+
for (let i = 0; i < listLength; i++) {
|
|
157
|
+
backingList.add(this.readIntArrayValue());
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
default:
|
|
161
|
+
throw new Error(`Invalid NBT Data: Unknown tag <${listType}>`);
|
|
162
|
+
}
|
|
163
|
+
return backingList;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
class NBTTagCompound {
|
|
168
|
+
name;
|
|
169
|
+
children = /* @__PURE__ */ new Map();
|
|
170
|
+
static readFromFile(path, byteOrder) {
|
|
171
|
+
return NBTTagCompound.readFromStream(new BinaryStream(fs.readFileSync(path)), byteOrder);
|
|
172
|
+
}
|
|
173
|
+
static readFromStream(input, byteOrder) {
|
|
174
|
+
const reader = new NBTReader(input, byteOrder);
|
|
175
|
+
return reader.parse();
|
|
176
|
+
}
|
|
177
|
+
constructor(name = null) {
|
|
178
|
+
this.name = name;
|
|
179
|
+
}
|
|
180
|
+
setName(name) {
|
|
181
|
+
this.name = name;
|
|
182
|
+
}
|
|
183
|
+
getName() {
|
|
184
|
+
return this.name;
|
|
185
|
+
}
|
|
186
|
+
addValue(name, value) {
|
|
187
|
+
if (value instanceof NBTTagCompound && !(name === value.getName())) {
|
|
188
|
+
throw new Error(`Failed to add NBTTagCompound with name ${value.getName()} given name ${name}`);
|
|
189
|
+
}
|
|
190
|
+
this.children.set(name, value);
|
|
191
|
+
}
|
|
192
|
+
addChild(tag) {
|
|
193
|
+
this.children.set(tag.getName(), tag);
|
|
194
|
+
}
|
|
195
|
+
getList(name, insert) {
|
|
196
|
+
if (this.children.has(name)) {
|
|
197
|
+
return this.children.get(name);
|
|
198
|
+
}
|
|
199
|
+
if (insert) {
|
|
200
|
+
const backingList = /* @__PURE__ */ new Set();
|
|
201
|
+
this.addValue(name, backingList);
|
|
202
|
+
return backingList;
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
getCompound(name, insert) {
|
|
207
|
+
if (this.children.has(name)) {
|
|
208
|
+
return this.children.get(name);
|
|
209
|
+
}
|
|
210
|
+
if (insert) {
|
|
211
|
+
const compound = new NBTTagCompound();
|
|
212
|
+
this.addValue(name, compound);
|
|
213
|
+
return compound;
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
writeToStream(out, byteOrder) {
|
|
218
|
+
const writer = new NBTWriter(out, byteOrder);
|
|
219
|
+
writer.writeCompound(this);
|
|
220
|
+
}
|
|
221
|
+
getByte(name, defaultValue) {
|
|
222
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
223
|
+
}
|
|
224
|
+
getShort(name, defaultValue) {
|
|
225
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
226
|
+
}
|
|
227
|
+
getNumber(name, defaultValue) {
|
|
228
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
229
|
+
}
|
|
230
|
+
getLong(name, defaultValue) {
|
|
231
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
232
|
+
}
|
|
233
|
+
getFloat(name, defaultValue) {
|
|
234
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
235
|
+
}
|
|
236
|
+
getDouble(name, defaultValue) {
|
|
237
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
238
|
+
}
|
|
239
|
+
getString(name, defaultValue) {
|
|
240
|
+
return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
|
|
241
|
+
}
|
|
242
|
+
remove(key) {
|
|
243
|
+
return this.children.delete(key);
|
|
244
|
+
}
|
|
245
|
+
entries() {
|
|
246
|
+
return this.children.entries();
|
|
247
|
+
}
|
|
248
|
+
has(key) {
|
|
249
|
+
return this.children.has(key);
|
|
250
|
+
}
|
|
251
|
+
size() {
|
|
252
|
+
return this.children.size;
|
|
253
|
+
}
|
|
254
|
+
// Thanks stackoverflow! https://stackoverflow.com/questions/35948335/how-can-i-check-if-two-map-objects-are-equal
|
|
255
|
+
equals(that) {
|
|
256
|
+
if (this.children.size !== that.children.size) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
for (const [key, val] of this.children) {
|
|
260
|
+
const testVal = that.children.get(key);
|
|
261
|
+
if (testVal === void 0 && !that.children.has(key)) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
if (val instanceof NBTTagCompound && testVal instanceof NBTTagCompound && !val.equals(testVal)) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
if (val instanceof ByteValue && testVal instanceof ByteValue && val.getValue() !== testVal.getValue()) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
if (val instanceof DoubleValue && testVal instanceof DoubleValue && val.getValue() !== testVal.getValue()) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
if (val instanceof FloatValue && testVal instanceof FloatValue && val.getValue() !== testVal.getValue()) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
if (val instanceof LongValue && testVal instanceof LongValue && val.getValue() !== testVal.getValue()) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
if (val instanceof NumberValue && testVal instanceof NumberValue && val.getValue() !== testVal.getValue()) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
if (val instanceof ShortValue && testVal instanceof ShortValue && val.getValue() !== testVal.getValue()) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
if (val instanceof StringValue && testVal instanceof StringValue && val.getValue() !== testVal.getValue()) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
class NBTWriter {
|
|
294
|
+
order;
|
|
295
|
+
buf;
|
|
296
|
+
useVarint = false;
|
|
297
|
+
constructor(out, byteOrder) {
|
|
298
|
+
this.buf = out;
|
|
299
|
+
this.order = byteOrder;
|
|
300
|
+
}
|
|
301
|
+
setUseVarint(useVarint) {
|
|
302
|
+
this.useVarint = useVarint;
|
|
303
|
+
}
|
|
304
|
+
writeList(list) {
|
|
305
|
+
this.writeTagHeader(NBTDefinitions.TAG_LIST, "");
|
|
306
|
+
this.writeListValue(list);
|
|
307
|
+
}
|
|
308
|
+
writeCompound(compound) {
|
|
309
|
+
this.writeTagHeader(NBTDefinitions.TAG_COMPOUND, compound.getName() ?? "");
|
|
310
|
+
this.writeCompoundValue(compound);
|
|
311
|
+
}
|
|
312
|
+
writeTagHeader(type, name) {
|
|
313
|
+
this.writeByteValue(type);
|
|
314
|
+
this.writeStringValue(name);
|
|
315
|
+
}
|
|
316
|
+
writeStringValue(value) {
|
|
317
|
+
if (value !== null) {
|
|
318
|
+
const bytes = Buffer.from(value, "utf8");
|
|
319
|
+
if (this.useVarint) {
|
|
320
|
+
this.buf.writeUnsignedVarInt(Buffer.byteLength(value));
|
|
321
|
+
} else {
|
|
322
|
+
this.writeShortValue(Buffer.byteLength(value));
|
|
323
|
+
}
|
|
324
|
+
this.buf.write(bytes);
|
|
325
|
+
} else if (this.useVarint) {
|
|
326
|
+
this.writeByteValue(0);
|
|
327
|
+
} else {
|
|
328
|
+
this.writeShortValue(0);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
writeByteValue(value) {
|
|
332
|
+
this.buf.writeByte(value);
|
|
333
|
+
}
|
|
334
|
+
writeShortValue(value) {
|
|
335
|
+
if (this.order === ByteOrder.LITTLE_ENDIAN) {
|
|
336
|
+
this.buf.writeUnsignedShortLE(value);
|
|
337
|
+
} else {
|
|
338
|
+
this.buf.writeUnsignedShort(value);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
writeIntegerValue(value) {
|
|
342
|
+
if (this.useVarint) {
|
|
343
|
+
this.buf.writeVarInt(value);
|
|
344
|
+
} else if (this.order === ByteOrder.LITTLE_ENDIAN) {
|
|
345
|
+
this.buf.writeUnsignedIntLE(value);
|
|
346
|
+
} else {
|
|
347
|
+
this.buf.writeUnsignedInt(value);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
writeLongValue(value) {
|
|
351
|
+
if (this.useVarint) {
|
|
352
|
+
this.buf.writeVarLong(value);
|
|
353
|
+
} else if (this.order === ByteOrder.LITTLE_ENDIAN) {
|
|
354
|
+
this.buf.writeUnsignedLongLE(value);
|
|
355
|
+
} else {
|
|
356
|
+
this.buf.writeUnsignedLong(value);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
writeFloatValue(value) {
|
|
360
|
+
if (this.order === ByteOrder.LITTLE_ENDIAN) {
|
|
361
|
+
this.buf.writeFloatLE(value);
|
|
362
|
+
} else {
|
|
363
|
+
this.buf.writeFloat(value);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
writeDoubleValue(value) {
|
|
367
|
+
if (this.order === ByteOrder.LITTLE_ENDIAN) {
|
|
368
|
+
this.buf.writeDoubleLE(value);
|
|
369
|
+
} else {
|
|
370
|
+
this.buf.writeDouble(value);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
writeByteArrayValue(value) {
|
|
374
|
+
this.writeIntegerValue(value.length);
|
|
375
|
+
this.buf.write(value);
|
|
376
|
+
}
|
|
377
|
+
writeIntegerArrayValue(value) {
|
|
378
|
+
this.writeIntegerValue(value.length);
|
|
379
|
+
value.forEach((v) => {
|
|
380
|
+
this.writeIntegerValue(v);
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
writeListValue(value) {
|
|
384
|
+
if (value.size > 0) {
|
|
385
|
+
const listNbtType = this.getNBTTypeFromValue(value.entries().next().value);
|
|
386
|
+
this.writeByteValue(listNbtType);
|
|
387
|
+
this.writeIntegerValue(value.size);
|
|
388
|
+
for (const rawValue of value) {
|
|
389
|
+
switch (listNbtType) {
|
|
390
|
+
case NBTDefinitions.TAG_BYTE:
|
|
391
|
+
this.writeByteValue(rawValue.getValue());
|
|
392
|
+
break;
|
|
393
|
+
case NBTDefinitions.TAG_SHORT:
|
|
394
|
+
this.writeShortValue(rawValue.getValue());
|
|
395
|
+
break;
|
|
396
|
+
case NBTDefinitions.TAG_INT:
|
|
397
|
+
this.writeIntegerValue(rawValue.getValue());
|
|
398
|
+
break;
|
|
399
|
+
case NBTDefinitions.TAG_LONG:
|
|
400
|
+
this.writeLongValue(rawValue.getValue());
|
|
401
|
+
break;
|
|
402
|
+
case NBTDefinitions.TAG_FLOAT:
|
|
403
|
+
this.writeFloatValue(rawValue.getValue());
|
|
404
|
+
break;
|
|
405
|
+
case NBTDefinitions.TAG_DOUBLE:
|
|
406
|
+
this.writeDoubleValue(rawValue.getValue());
|
|
407
|
+
break;
|
|
408
|
+
case NBTDefinitions.TAG_BYTE_ARRAY:
|
|
409
|
+
this.writeDoubleValue(rawValue);
|
|
410
|
+
break;
|
|
411
|
+
case NBTDefinitions.TAG_STRING:
|
|
412
|
+
this.writeStringValue(rawValue.getValue());
|
|
413
|
+
break;
|
|
414
|
+
case NBTDefinitions.TAG_LIST:
|
|
415
|
+
this.writeListValue(rawValue);
|
|
416
|
+
break;
|
|
417
|
+
case NBTDefinitions.TAG_COMPOUND:
|
|
418
|
+
this.writeCompoundValue(rawValue);
|
|
419
|
+
break;
|
|
420
|
+
case NBTDefinitions.TAG_INT_ARRAY:
|
|
421
|
+
this.writeIntegerArrayValue(rawValue);
|
|
422
|
+
break;
|
|
423
|
+
default:
|
|
424
|
+
throw new Error("Invalid NBTTagType");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
} else {
|
|
428
|
+
this.writeByteValue(NBTDefinitions.TAG_BYTE);
|
|
429
|
+
this.writeIntegerValue(0);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
writeCompoundValue(compound) {
|
|
433
|
+
for (const [key, value] of compound.entries()) {
|
|
434
|
+
const nbtType = this.getNBTTypeFromValue(value);
|
|
435
|
+
this.writeTagHeader(nbtType, key);
|
|
436
|
+
switch (nbtType) {
|
|
437
|
+
case NBTDefinitions.TAG_BYTE:
|
|
438
|
+
this.writeByteValue(value.getValue());
|
|
439
|
+
break;
|
|
440
|
+
case NBTDefinitions.TAG_SHORT:
|
|
441
|
+
this.writeShortValue(value.getValue());
|
|
442
|
+
break;
|
|
443
|
+
case NBTDefinitions.TAG_INT:
|
|
444
|
+
this.writeIntegerValue(value.getValue());
|
|
445
|
+
break;
|
|
446
|
+
case NBTDefinitions.TAG_LONG:
|
|
447
|
+
this.writeLongValue(value.getValue());
|
|
448
|
+
break;
|
|
449
|
+
case NBTDefinitions.TAG_FLOAT:
|
|
450
|
+
this.writeFloatValue(value.getValue());
|
|
451
|
+
break;
|
|
452
|
+
case NBTDefinitions.TAG_DOUBLE:
|
|
453
|
+
this.writeDoubleValue(value.getValue());
|
|
454
|
+
break;
|
|
455
|
+
case NBTDefinitions.TAG_BYTE_ARRAY:
|
|
456
|
+
this.writeByteArrayValue(value);
|
|
457
|
+
break;
|
|
458
|
+
case NBTDefinitions.TAG_STRING:
|
|
459
|
+
this.writeStringValue(value.getValue());
|
|
460
|
+
break;
|
|
461
|
+
case NBTDefinitions.TAG_LIST:
|
|
462
|
+
this.writeListValue(value);
|
|
463
|
+
break;
|
|
464
|
+
case NBTDefinitions.TAG_COMPOUND:
|
|
465
|
+
this.writeCompoundValue(value);
|
|
466
|
+
break;
|
|
467
|
+
case NBTDefinitions.TAG_INT_ARRAY:
|
|
468
|
+
this.writeIntegerValue(value);
|
|
469
|
+
break;
|
|
470
|
+
default:
|
|
471
|
+
throw new Error("Invalid NBTTagType");
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
this.writeByteValue(NBTDefinitions.TAG_END);
|
|
475
|
+
}
|
|
476
|
+
getNBTTypeFromValue(value) {
|
|
477
|
+
if (value instanceof ByteValue) {
|
|
478
|
+
return NBTDefinitions.TAG_BYTE;
|
|
479
|
+
}
|
|
480
|
+
if (value instanceof ShortValue) {
|
|
481
|
+
return NBTDefinitions.TAG_SHORT;
|
|
482
|
+
}
|
|
483
|
+
if (value instanceof NumberValue) {
|
|
484
|
+
return NBTDefinitions.TAG_INT;
|
|
485
|
+
}
|
|
486
|
+
if (value instanceof LongValue) {
|
|
487
|
+
return NBTDefinitions.TAG_LONG;
|
|
488
|
+
}
|
|
489
|
+
if (value instanceof FloatValue) {
|
|
490
|
+
return NBTDefinitions.TAG_FLOAT;
|
|
491
|
+
}
|
|
492
|
+
if (value instanceof DoubleValue) {
|
|
493
|
+
return NBTDefinitions.TAG_DOUBLE;
|
|
494
|
+
}
|
|
495
|
+
if (value instanceof Buffer) {
|
|
496
|
+
return NBTDefinitions.TAG_BYTE_ARRAY;
|
|
497
|
+
}
|
|
498
|
+
if (value instanceof StringValue) {
|
|
499
|
+
return NBTDefinitions.TAG_STRING;
|
|
500
|
+
}
|
|
501
|
+
if (value instanceof Set) {
|
|
502
|
+
return NBTDefinitions.TAG_LIST;
|
|
503
|
+
}
|
|
504
|
+
if (value instanceof NBTTagCompound) {
|
|
505
|
+
return NBTDefinitions.TAG_COMPOUND;
|
|
506
|
+
}
|
|
507
|
+
if (Array.isArray(value)) {
|
|
508
|
+
return NBTDefinitions.TAG_INT_ARRAY;
|
|
509
|
+
}
|
|
510
|
+
throw new TypeError(`Invalid NBT Data: Cannot deduce NBT type of class ${value.constructor.name} (${value})`);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
export { NBTReader as N, NBTTagCompound as a, NBTWriter as b };
|
|
515
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUV3JpdGVyLUNXeDR1YW5PLmpzIiwic291cmNlcyI6WyIuLi9zcmMvTkJUUmVhZGVyLnRzIiwiLi4vc3JjL05CVFRhZ0NvbXBvdW5kLnRzIiwiLi4vc3JjL05CVFdyaXRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBBbGxvY2F0aW9uIH0gZnJvbSAnLi9BbGxvY2F0aW9uJztcbmltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IEJ5dGVPcmRlciB9IGZyb20gJy4vQnl0ZU9yZGVyJztcbmltcG9ydCB7IE5CVERlZmluaXRpb25zIH0gZnJvbSAnLi9OQlREZWZpbml0aW9ucyc7XG5pbXBvcnQgTkJUU3RyZWFtUmVhZGVyIGZyb20gJy4vTkJUU3RyZWFtUmVhZGVyJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUUmVhZGVyIGV4dGVuZHMgTkJUU3RyZWFtUmVhZGVyIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaW5wdXQ6IEJpbmFyeVN0cmVhbSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpIHtcbiAgICAgICAgc3VwZXIoaW5wdXQsIGJ5dGVPcmRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlTGlzdDxUYWdUeXBlPigpOiBTZXQ8VGFnVHlwZT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDMsICdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBuZXcgdGFnJywgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKSAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlQgRGF0YTogTm90IGxpc3QgdGFnIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGFnTGlzdFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiAzLCAnSW52YWxpZCBOQlQgRGF0YTogTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgbmV3IHRhZycsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCkgIT09IE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVCBEYXRhOiBObyByb290IHRhZyBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCByb290OiBOQlRUYWdDb21wb3VuZCA9IHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTtcbiAgICAgICAgcm9vdC5zZXROYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdDb21wb3VuZFZhbHVlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkNPTVBPVU5EKTtcbiAgICAgICAgY29uc3QgY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kID0gbmV3IE5CVFRhZ0NvbXBvdW5kKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIFRhZyBJRCBpbiBjb21wb3VuZCB0YWcnLCBmYWxzZSk7XG5cbiAgICAgICAgbGV0IHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgd2hpbGUgKHRhZ0lEICE9PSBOQlREZWZpbml0aW9ucy5UQUdfRU5EKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZ0lEKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRMb25nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEZsb2F0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWREb3VibGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlQXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQ6IE5CVFRhZ0NvbXBvdW5kID0gdGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXROYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IFVua25vd24gdGFnIDwke3RhZ0lEfT5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgdGFnIElEIGluIHRhZyBjb21wb3VuZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3VuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdMaXN0VmFsdWUoKTogU2V0PGFueT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDUsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBUQUdMaXN0IGhlYWRlcicsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgbGlzdFR5cGU6IG51bWJlciA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIGxldCBsaXN0TGVuZ3RoOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkFSUkFZX0xJU1QpO1xuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uUkVGRVJFTkNFKTtcblxuICAgICAgICBjb25zdCBiYWNraW5nTGlzdDogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgc3dpdGNoIChsaXN0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRU5EOlxuICAgICAgICAgICAgICAgIGxpc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlcyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgyICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHNob3J0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDggKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZ3MgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkTG9uZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGZsb2F0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRGbG9hdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBkb3VibGVzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZERvdWJsZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkQnl0ZUFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkVGFnTGlzdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludEFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogVW5rbm93biB0YWcgPCR7bGlzdFR5cGV9PmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhY2tpbmdMaXN0O1xuICAgIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgQnl0ZU9yZGVyIH0gZnJvbSAnLi9CeXRlT3JkZXInO1xuaW1wb3J0IEJ5dGVWYWwgZnJvbSAnLi90eXBlcy9CeXRlVmFsJztcbmltcG9ydCBEb3VibGVWYWwgZnJvbSAnLi90eXBlcy9Eb3VibGVWYWwnO1xuaW1wb3J0IEZsb2F0VmFsIGZyb20gJy4vdHlwZXMvRmxvYXRWYWwnO1xuaW1wb3J0IExvbmdWYWwgZnJvbSAnLi90eXBlcy9Mb25nVmFsJztcbmltcG9ydCBOQlRSZWFkZXIgZnJvbSAnLi9OQlRSZWFkZXInO1xuaW1wb3J0IE5CVFdyaXRlciBmcm9tICcuL05CVFdyaXRlcic7XG5pbXBvcnQgTnVtYmVyVmFsIGZyb20gJy4vdHlwZXMvTnVtYmVyVmFsJztcbmltcG9ydCBTaG9ydFZhbCBmcm9tICcuL3R5cGVzL1Nob3J0VmFsJztcbmltcG9ydCBTdHJpbmdWYWwgZnJvbSAnLi90eXBlcy9TdHJpbmdWYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOQlRUYWdDb21wb3VuZCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBjaGlsZHJlbjogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZEZyb21GaWxlKHBhdGg6IHN0cmluZywgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIHJldHVybiBOQlRUYWdDb21wb3VuZC5yZWFkRnJvbVN0cmVhbShuZXcgQmluYXJ5U3RyZWFtKGZzLnJlYWRGaWxlU3luYyhwYXRoKSksIGJ5dGVPcmRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkRnJvbVN0cmVhbShpbnB1dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcik6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgY29uc3QgcmVhZGVyOiBOQlRSZWFkZXIgPSBuZXcgTkJUUmVhZGVyKGlucHV0LCBieXRlT3JkZXIpO1xuICAgICAgICByZXR1cm4gcmVhZGVyLnBhcnNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOQlRUYWdDb21wb3VuZCAmJiAhKG5hbWUgPT09IHZhbHVlLmdldE5hbWUoKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGFkZCBOQlRUYWdDb21wb3VuZCB3aXRoIG5hbWUgJHt2YWx1ZS5nZXROYW1lKCl9IGdpdmVuIG5hbWUgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDaGlsZCh0YWc6IE5CVFRhZ0NvbXBvdW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uc2V0KHRhZy5nZXROYW1lKCkhLCB0YWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMaXN0KG5hbWU6IHN0cmluZywgaW5zZXJ0OiBib29sZWFuKTogU2V0PGFueT4gfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5nZXQobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5zZXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBiYWNraW5nTGlzdDogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB0aGlzLmFkZFZhbHVlKG5hbWUsIGJhY2tpbmdMaXN0KTtcbiAgICAgICAgICAgIHJldHVybiBiYWNraW5nTGlzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb3VuZChuYW1lOiBzdHJpbmcsIGluc2VydDogYm9vbGVhbik6IE5CVFRhZ0NvbXBvdW5kIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc2VydCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kID0gbmV3IE5CVFRhZ0NvbXBvdW5kKCk7XG4gICAgICAgICAgICB0aGlzLmFkZFZhbHVlKG5hbWUsIGNvbXBvdW5kKTtcbiAgICAgICAgICAgIHJldHVybiBjb21wb3VuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVRvU3RyZWFtKG91dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB3cml0ZXI6IE5CVFdyaXRlciA9IG5ldyBOQlRXcml0ZXIob3V0LCBieXRlT3JkZXIpO1xuICAgICAgICB3cml0ZXIud3JpdGVDb21wb3VuZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qnl0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIEJ5dGVWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNob3J0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgU2hvcnRWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE51bWJlcihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIE51bWJlclZhbCkuZ2V0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TG9uZyhuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYmlnaW50KTogYmlnaW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIExvbmdWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZsb2F0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgRmxvYXRWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERvdWJsZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIERvdWJsZVZhbCkuZ2V0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RyaW5nKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgU3RyaW5nVmFsKS5nZXRWYWx1ZSgpIDogZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBhbnldPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmVudHJpZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnNpemU7XG4gICAgfVxuXG4gICAgLy8gVGhhbmtzIHN0YWNrb3ZlcmZsb3chIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1OTQ4MzM1L2hvdy1jYW4taS1jaGVjay1pZi10d28tbWFwLW9iamVjdHMtYXJlLWVxdWFsXG4gICAgcHVibGljIGVxdWFscyh0aGF0OiBOQlRUYWdDb21wb3VuZCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5zaXplICE9PSB0aGF0LmNoaWxkcmVuLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0VmFsID0gdGhhdC5jaGlsZHJlbi5nZXQoa2V5KTtcblxuICAgICAgICAgICAgaWYgKHRlc3RWYWwgPT09IHVuZGVmaW5lZCAmJiAhdGhhdC5jaGlsZHJlbi5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kICYmIHRlc3RWYWwgaW5zdGFuY2VvZiBOQlRUYWdDb21wb3VuZCAmJiAhdmFsLmVxdWFscyh0ZXN0VmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEJ5dGVWYWwgJiYgdGVzdFZhbCBpbnN0YW5jZW9mIEJ5dGVWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERvdWJsZVZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgRG91YmxlVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBGbG9hdFZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgRmxvYXRWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExvbmdWYWwgJiYgdGVzdFZhbCBpbnN0YW5jZW9mIExvbmdWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlclZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgTnVtYmVyVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTaG9ydFZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgU2hvcnRWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZ1ZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgU3RyaW5nVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgQnl0ZVZhbCBmcm9tICcuL3R5cGVzL0J5dGVWYWwnO1xuaW1wb3J0IERvdWJsZVZhbCBmcm9tICcuL3R5cGVzL0RvdWJsZVZhbCc7XG5pbXBvcnQgRmxvYXRWYWwgZnJvbSAnLi90eXBlcy9GbG9hdFZhbCc7XG5pbXBvcnQgTG9uZ1ZhbCBmcm9tICcuL3R5cGVzL0xvbmdWYWwnO1xuaW1wb3J0IHsgTkJURGVmaW5pdGlvbnMgfSBmcm9tICcuL05CVERlZmluaXRpb25zJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcbmltcG9ydCBOdW1iZXJWYWwgZnJvbSAnLi90eXBlcy9OdW1iZXJWYWwnO1xuaW1wb3J0IFNob3J0VmFsIGZyb20gJy4vdHlwZXMvU2hvcnRWYWwnO1xuaW1wb3J0IFN0cmluZ1ZhbCBmcm9tICcuL3R5cGVzL1N0cmluZ1ZhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFdyaXRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcmRlcjogQnl0ZU9yZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmOiBCaW5hcnlTdHJlYW07XG5cbiAgICBwcml2YXRlIHVzZVZhcmludCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG91dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICB0aGlzLmJ1ZiA9IG91dDtcbiAgICAgICAgdGhpcy5vcmRlciA9IGJ5dGVPcmRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlVmFyaW50KHVzZVZhcmludDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZVZhcmludCA9IHVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVMaXN0KGxpc3Q6IFNldDxhbnk+KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIoTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QsICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShsaXN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVDb21wb3VuZChjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZ0hlYWRlcihOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQsIGNvbXBvdW5kLmdldE5hbWUoKSA/PyAnJyk7XG4gICAgICAgIHRoaXMud3JpdGVDb21wb3VuZFZhbHVlKGNvbXBvdW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlVGFnSGVhZGVyKHR5cGU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodHlwZSk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlU3RyaW5nVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKHZhbHVlLCAndXRmOCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFZhckludChCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZShieXRlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJ5dGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlQnl0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU2hvcnRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0TEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVmFySW50KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZEludExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRJbnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUxvbmdWYWx1ZSh2YWx1ZTogYmlnaW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVWYXJMb25nKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZExvbmdMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkTG9uZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRmxvYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRmxvYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZURvdWJsZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRG91YmxlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVCeXRlQXJyYXlWYWx1ZSh2YWx1ZTogQnVmZmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyQXJyYXlWYWx1ZSh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlTGlzdFZhbHVlKHZhbHVlOiBTZXQ8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3ROYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlLmVudHJpZXMoKS5uZXh0KCkudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShsaXN0TmJ0VHlwZSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLnNpemUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdE5idFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRG91YmxlVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJBcnJheVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVFRhZ1R5cGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19CWVRFKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUoMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlQ29tcG91bmRWYWx1ZShjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29tcG91bmQuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBuYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIobmJ0VHlwZSwga2V5KTtcbiAgICAgICAgICAgIHN3aXRjaCAobmJ0VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZUFycmF5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlRUYWdUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19FTkQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TkJUVHlwZUZyb21WYWx1ZSh2YWx1ZTogYW55KTogTkJURGVmaW5pdGlvbnMge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0lOVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19MSVNUO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBDYW5ub3QgZGVkdWNlIE5CVCB0eXBlIG9mIGNsYXNzICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0gKCR7dmFsdWV9KWApO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJCeXRlVmFsIiwiRG91YmxlVmFsIiwiRmxvYXRWYWwiLCJMb25nVmFsIiwiTnVtYmVyVmFsIiwiU2hvcnRWYWwiLCJTdHJpbmdWYWwiXSwibWFwcGluZ3MiOiI7Ozs7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
|