@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
132 lines (131 loc) • 20.6 kB
JavaScript
import { NBTDefinitions } from "./NBTDefinitions.es.js";
import { Allocation } from "./Allocation.es.js";
import NBTStreamReader from "./NBTStreamReader.es.js";
import NBTTagCompound from "./NBTTagCompound.es.js";
//#region src/NBTReader.ts
var NBTReader = class extends NBTStreamReader {
constructor(input, byteOrder) {
super(input, byteOrder);
}
parseList() {
this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
if (this.readByteValue().getValue() !== NBTDefinitions.TAG_LIST) throw new Error("Invalid NBT Data: Not list tag found");
this.readStringValue();
return this.readTagListValue();
}
parse() {
this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
if (this.readByteValue().getValue() !== NBTDefinitions.TAG_COMPOUND) throw new Error("Invalid NBT Data: No root tag found");
const name = this.readStringValue().getValue();
const root = this.readTagCompoundValue();
root.setName(name);
return root;
}
readTagCompoundValue() {
this.alterAllocationLimit(Allocation.COMPOUND);
const compound = new NBTTagCompound();
this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false);
let tagID = this.readByteValue().getValue();
while (tagID !== NBTDefinitions.TAG_END) {
switch (tagID) {
case NBTDefinitions.TAG_BYTE:
compound.addValue(this.readStringValue().getValue(), this.readByteValue());
break;
case NBTDefinitions.TAG_SHORT:
compound.addValue(this.readStringValue().getValue(), this.readShortValue());
break;
case NBTDefinitions.TAG_INT:
compound.addValue(this.readStringValue().getValue(), this.readIntValue());
break;
case NBTDefinitions.TAG_LONG:
compound.addValue(this.readStringValue().getValue(), this.readLongValue());
break;
case NBTDefinitions.TAG_FLOAT:
compound.addValue(this.readStringValue().getValue(), this.readFloatValue());
break;
case NBTDefinitions.TAG_DOUBLE:
compound.addValue(this.readStringValue().getValue(), this.readDoubleValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue());
break;
case NBTDefinitions.TAG_STRING:
compound.addValue(this.readStringValue().getValue(), this.readStringValue());
break;
case NBTDefinitions.TAG_LIST:
compound.addValue(this.readStringValue().getValue(), this.readTagListValue());
break;
case NBTDefinitions.TAG_COMPOUND:
const name = this.readStringValue().getValue();
const child = this.readTagCompoundValue();
child.setName(name);
compound.addChild(child);
break;
case NBTDefinitions.TAG_INT_ARRAY:
compound.addValue(this.readStringValue().getValue(), this.readIntArrayValue());
break;
default: throw new Error(`Invalid NBT Data: Unknown tag <${tagID}>`);
}
this.expectInput(1, "Invalid NBT Data: Expected tag ID in tag compound", false);
tagID = this.readByteValue().getValue();
}
return compound;
}
readTagListValue() {
this.expectInput(this.isUsingVarint() ? 2 : 5, "Invalid NBT Data: Expected TAGList header", false);
const listType = this.readByteValue().getValue();
let listLength = this.readIntValue().getValue();
this.alterAllocationLimit(Allocation.ARRAY_LIST);
this.alterAllocationLimit(Allocation.REFERENCE);
const backingList = /* @__PURE__ */ new Set();
switch (listType) {
case NBTDefinitions.TAG_END:
listLength = 0;
break;
case NBTDefinitions.TAG_BYTE:
this.expectInput(listLength, "Invalid NBT Data: Expected bytes for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readShortValue());
break;
case NBTDefinitions.TAG_SHORT:
this.expectInput(2 * listLength, "Invalid NBT Data: Expected shorts for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readShortValue());
break;
case NBTDefinitions.TAG_INT:
this.expectInput(4 * listLength, "Invalid NBT Data: Expected ints for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readIntValue());
break;
case NBTDefinitions.TAG_LONG:
this.expectInput(8 * listLength, "Invalid NBT Data: Expected longs for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readLongValue());
break;
case NBTDefinitions.TAG_FLOAT:
this.expectInput(4 * listLength, "Invalid NBT Data: Expected floats for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readFloatValue());
break;
case NBTDefinitions.TAG_DOUBLE:
this.expectInput(8 * listLength, "Invalid NBT Data: Expected doubles for list");
for (let i = 0; i < listLength; i++) backingList.add(this.readDoubleValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
for (let i = 0; i < listLength; i++) backingList.add(this.readByteArrayValue());
break;
case NBTDefinitions.TAG_STRING:
for (let i = 0; i < listLength; i++) backingList.add(this.readStringValue());
break;
case NBTDefinitions.TAG_LIST:
for (let i = 0; i < listLength; i++) backingList.add(this.readTagListValue());
break;
case NBTDefinitions.TAG_COMPOUND:
for (let i = 0; i < listLength; i++) backingList.add(this.readTagCompoundValue());
break;
case NBTDefinitions.TAG_INT_ARRAY:
for (let i = 0; i < listLength; i++) backingList.add(this.readIntArrayValue());
break;
default: throw new Error(`Invalid NBT Data: Unknown tag <${listType}>`);
}
return backingList;
}
};
//#endregion
export { NBTReader as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUUmVhZGVyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9OQlRSZWFkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuaW1wb3J0IHsgQWxsb2NhdGlvbiB9IGZyb20gJy4vQWxsb2NhdGlvbic7XG5pbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB0eXBlIHsgQnl0ZU9yZGVyIH0gZnJvbSAnLi9CeXRlT3JkZXInO1xuaW1wb3J0IHsgTkJURGVmaW5pdGlvbnMgfSBmcm9tICcuL05CVERlZmluaXRpb25zJztcbmltcG9ydCBOQlRTdHJlYW1SZWFkZXIgZnJvbSAnLi9OQlRTdHJlYW1SZWFkZXInO1xuaW1wb3J0IE5CVFRhZ0NvbXBvdW5kIGZyb20gJy4vTkJUVGFnQ29tcG91bmQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOQlRSZWFkZXIgZXh0ZW5kcyBOQlRTdHJlYW1SZWFkZXIge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihpbnB1dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICBzdXBlcihpbnB1dCwgYnl0ZU9yZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VMaXN0PFRhZ1R5cGU+KCk6IFNldDxUYWdUeXBlPiB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyAyIDogMywgJ0ludmFsaWQgTkJUIERhdGE6IE5vdCBlbm91Z2ggZGF0YSB0byByZWFkIG5ldyB0YWcnLCBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpICE9PSBOQlREZWZpbml0aW9ucy5UQUdfTElTVCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgbGlzdCB0YWcgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhZFN0cmluZ1ZhbHVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRUYWdMaXN0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UoKTogTkJUVGFnQ29tcG91bmQge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDMsICdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBuZXcgdGFnJywgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKSAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTkJUIERhdGE6IE5vIHJvb3QgdGFnIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHJvb3Q6IE5CVFRhZ0NvbXBvdW5kID0gdGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpO1xuICAgICAgICByb290LnNldE5hbWUobmFtZSk7XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTogTkJUVGFnQ29tcG91bmQge1xuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uQ09NUE9VTkQpO1xuICAgICAgICBjb25zdCBjb21wb3VuZDogTkJUVGFnQ29tcG91bmQgPSBuZXcgTkJUVGFnQ29tcG91bmQoKTtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgVGFnIElEIGluIGNvbXBvdW5kIHRhZycsIGZhbHNlKTtcblxuICAgICAgICBsZXQgdGFnSUQgPSB0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB3aGlsZSAodGFnSUQgIT09IE5CVERlZmluaXRpb25zLlRBR19FTkQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnSUQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEJ5dGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkU2hvcnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEludFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZExvbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkRmxvYXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZERvdWJsZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEJ5dGVBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkU3RyaW5nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkVGFnTGlzdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZDogTkJUVGFnQ29tcG91bmQgPSB0aGlzLnJlYWRUYWdDb21wb3VuZFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldE5hbWUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEludEFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogVW5rbm93biB0YWcgPCR7dGFnSUR9PmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDEsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCB0YWcgSUQgaW4gdGFnIGNvbXBvdW5kJywgZmFsc2UpO1xuICAgICAgICAgICAgdGFnSUQgPSB0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvdW5kO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZFRhZ0xpc3RWYWx1ZSgpOiBTZXQ8YW55PiB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyAyIDogNSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIFRBR0xpc3QgaGVhZGVyJywgZmFsc2UpO1xuICAgICAgICBjb25zdCBsaXN0VHlwZTogbnVtYmVyID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgbGV0IGxpc3RMZW5ndGg6IG51bWJlciA9IHRoaXMucmVhZEludFZhbHVlKCkuZ2V0VmFsdWUoKTtcblxuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uQVJSQVlfTElTVCk7XG4gICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQoQWxsb2NhdGlvbi5SRUZFUkVOQ0UpO1xuXG4gICAgICAgIGNvbnN0IGJhY2tpbmdMaXN0OiBTZXQ8YW55PiA9IG5ldyBTZXQoKTtcblxuICAgICAgICBzd2l0Y2ggKGxpc3RUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19FTkQ6XG4gICAgICAgICAgICAgICAgbGlzdExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQobGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGJ5dGVzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDIgKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgc2hvcnRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGludHMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkSW50VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBsb25ncyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRMb25nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQgKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgZmxvYXRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEZsb2F0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGRvdWJsZXMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkRG91YmxlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRCeXRlQXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkU3RyaW5nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRUYWdMaXN0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkSW50QXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBVbmtub3duIHRhZyA8JHtsaXN0VHlwZX0+YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmFja2luZ0xpc3Q7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVFBLElBQXFCLFlBQXJCLGNBQXVDLGdCQUFnQjtDQUNuRCxZQUFtQixPQUFxQixXQUFzQjtFQUMxRCxNQUFNLE9BQU8sU0FBUztDQUMxQjtDQUVBLFlBQTBDO0VBQ3RDLEtBQUssWUFBWSxLQUFLLGNBQWMsSUFBSSxJQUFJLEdBQUcscURBQXFELEtBQUs7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