@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
191 lines (190 loc) • 25.3 kB
JavaScript
"use strict";
Object.defineProperties(exports, {
__esModule: { value: true },
[Symbol.toStringTag]: { value: "Module" }
});
const require_ByteOrder = require("./ByteOrder.cjs.cjs");
const require_NBTDefinitions = require("./NBTDefinitions.cjs.cjs");
const require_types_ByteVal = require("./types/ByteVal.cjs.cjs");
const require_types_DoubleVal = require("./types/DoubleVal.cjs.cjs");
const require_types_FloatVal = require("./types/FloatVal.cjs.cjs");
const require_types_LongVal = require("./types/LongVal.cjs.cjs");
const require_types_NumberVal = require("./types/NumberVal.cjs.cjs");
const require_types_ShortVal = require("./types/ShortVal.cjs.cjs");
const require_types_StringVal = require("./types/StringVal.cjs.cjs");
const require_NBTTagCompound = require("./NBTTagCompound.cjs.cjs");
//#region src/NBTWriter.ts
var NBTWriter = class {
order;
buf;
useVarint = false;
constructor(out, byteOrder) {
this.buf = out;
this.order = byteOrder;
}
setUseVarint(useVarint) {
this.useVarint = useVarint;
}
writeList(list) {
this.writeTagHeader(require_NBTDefinitions.NBTDefinitions.TAG_LIST, "");
this.writeListValue(list);
}
writeCompound(compound) {
this.writeTagHeader(require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND, compound.getName() ?? "");
this.writeCompoundValue(compound);
}
writeTagHeader(type, name) {
this.writeByteValue(type);
this.writeStringValue(name);
}
writeStringValue(value) {
if (value !== null) {
const bytes = Buffer.from(value, "utf8");
if (this.useVarint) this.buf.writeUnsignedVarInt(Buffer.byteLength(value));
else this.writeShortValue(Buffer.byteLength(value));
this.buf.write(bytes);
} else if (this.useVarint) this.writeByteValue(0);
else this.writeShortValue(0);
}
writeByteValue(value) {
this.buf.writeByte(value);
}
writeShortValue(value) {
if (this.order === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) this.buf.writeUnsignedShortLE(value);
else this.buf.writeUnsignedShort(value);
}
writeIntegerValue(value) {
if (this.useVarint) this.buf.writeVarInt(value);
else if (this.order === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) this.buf.writeUnsignedIntLE(value);
else this.buf.writeUnsignedInt(value);
}
writeLongValue(value) {
if (this.useVarint) this.buf.writeVarLong(value);
else if (this.order === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) this.buf.writeUnsignedLongLE(value);
else this.buf.writeUnsignedLong(value);
}
writeFloatValue(value) {
if (this.order === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) this.buf.writeFloatLE(value);
else this.buf.writeFloat(value);
}
writeDoubleValue(value) {
if (this.order === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) this.buf.writeDoubleLE(value);
else this.buf.writeDouble(value);
}
writeByteArrayValue(value) {
this.writeIntegerValue(value.length);
this.buf.write(value);
}
writeIntegerArrayValue(value) {
this.writeIntegerValue(value.length);
value.forEach((v) => {
this.writeIntegerValue(v);
});
}
writeListValue(value) {
if (value.size > 0) {
const listNbtType = this.getNBTTypeFromValue(value.entries().next().value);
this.writeByteValue(listNbtType);
this.writeIntegerValue(value.size);
for (const rawValue of value) switch (listNbtType) {
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE:
this.writeByteValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_SHORT:
this.writeShortValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT:
this.writeIntegerValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LONG:
this.writeLongValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY:
this.writeDoubleValue(rawValue);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_STRING:
this.writeStringValue(rawValue.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LIST:
this.writeListValue(rawValue);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(rawValue);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerArrayValue(rawValue);
break;
default: throw new Error("Invalid NBTTagType");
}
} else {
this.writeByteValue(require_NBTDefinitions.NBTDefinitions.TAG_BYTE);
this.writeIntegerValue(0);
}
}
writeCompoundValue(compound) {
for (const [key, value] of compound.entries()) {
const nbtType = this.getNBTTypeFromValue(value);
this.writeTagHeader(nbtType, key);
switch (nbtType) {
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE:
this.writeByteValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_SHORT:
this.writeShortValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT:
this.writeIntegerValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LONG:
this.writeLongValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY:
this.writeByteArrayValue(value);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_STRING:
this.writeStringValue(value.getValue());
break;
case require_NBTDefinitions.NBTDefinitions.TAG_LIST:
this.writeListValue(value);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(value);
break;
case require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerValue(value);
break;
default: throw new Error("Invalid NBTTagType");
}
}
this.writeByteValue(require_NBTDefinitions.NBTDefinitions.TAG_END);
}
getNBTTypeFromValue(value) {
if (value instanceof require_types_ByteVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_BYTE;
if (value instanceof require_types_ShortVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_SHORT;
if (value instanceof require_types_NumberVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_INT;
if (value instanceof require_types_LongVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_LONG;
if (value instanceof require_types_FloatVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_FLOAT;
if (value instanceof require_types_DoubleVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_DOUBLE;
if (value instanceof Buffer) return require_NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY;
if (value instanceof require_types_StringVal.default) return require_NBTDefinitions.NBTDefinitions.TAG_STRING;
if (value instanceof Set) return require_NBTDefinitions.NBTDefinitions.TAG_LIST;
if (value instanceof require_NBTTagCompound.default) return require_NBTDefinitions.NBTDefinitions.TAG_COMPOUND;
if (Array.isArray(value)) return require_NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY;
throw new TypeError(`Invalid NBT Data: Cannot deduce NBT type of class ${value.constructor.name} (${value})`);
}
};
//#endregion
exports.default = NBTWriter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUV3JpdGVyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL05CVFdyaXRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IEJ5dGVPcmRlciB9IGZyb20gJy4vQnl0ZU9yZGVyJztcbmltcG9ydCBCeXRlVmFsIGZyb20gJy4vdHlwZXMvQnl0ZVZhbCc7XG5pbXBvcnQgRG91YmxlVmFsIGZyb20gJy4vdHlwZXMvRG91YmxlVmFsJztcbmltcG9ydCBGbG9hdFZhbCBmcm9tICcuL3R5cGVzL0Zsb2F0VmFsJztcbmltcG9ydCBMb25nVmFsIGZyb20gJy4vdHlwZXMvTG9uZ1ZhbCc7XG5pbXBvcnQgeyBOQlREZWZpbml0aW9ucyB9IGZyb20gJy4vTkJURGVmaW5pdGlvbnMnO1xuaW1wb3J0IE5CVFRhZ0NvbXBvdW5kIGZyb20gJy4vTkJUVGFnQ29tcG91bmQnO1xuaW1wb3J0IE51bWJlclZhbCBmcm9tICcuL3R5cGVzL051bWJlclZhbCc7XG5pbXBvcnQgU2hvcnRWYWwgZnJvbSAnLi90eXBlcy9TaG9ydFZhbCc7XG5pbXBvcnQgU3RyaW5nVmFsIGZyb20gJy4vdHlwZXMvU3RyaW5nVmFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUV3JpdGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9yZGVyOiBCeXRlT3JkZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBidWY6IEJpbmFyeVN0cmVhbTtcblxuICAgIHByaXZhdGUgdXNlVmFyaW50ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3V0OiBCaW5hcnlTdHJlYW0sIGJ5dGVPcmRlcjogQnl0ZU9yZGVyKSB7XG4gICAgICAgIHRoaXMuYnVmID0gb3V0O1xuICAgICAgICB0aGlzLm9yZGVyID0gYnl0ZU9yZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRVc2VWYXJpbnQodXNlVmFyaW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXNlVmFyaW50ID0gdXNlVmFyaW50O1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUxpc3QobGlzdDogU2V0PGFueT4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZ0hlYWRlcihOQlREZWZpbml0aW9ucy5UQUdfTElTVCwgJycpO1xuICAgICAgICB0aGlzLndyaXRlTGlzdFZhbHVlKGxpc3QpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUNvbXBvdW5kKGNvbXBvdW5kOiBOQlRUYWdDb21wb3VuZCk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlVGFnSGVhZGVyKE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORCwgY29tcG91bmQuZ2V0TmFtZSgpID8/ICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUNvbXBvdW5kVmFsdWUoY29tcG91bmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVUYWdIZWFkZXIodHlwZTogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZSh0eXBlKTtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZ1ZhbHVlKG5hbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVTdHJpbmdWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20odmFsdWUsICd1dGY4Jyk7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkVmFySW50KEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTaG9ydFZhbHVlKEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlKGJ5dGVzKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZSgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVTaG9ydFZhbHVlKDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlQnl0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWYud3JpdGVCeXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTaG9ydFZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkU2hvcnRMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkU2hvcnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUludGVnZXJWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVWYXJJbnQodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkSW50TEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZEludCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlTG9uZ1ZhbHVlKHZhbHVlOiBiaWdpbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVZhckxvbmcodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkTG9uZ0xFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRMb25nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVGbG9hdFZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRG91YmxlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRG91YmxlTEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUJ5dGVBcnJheVZhbHVlKHZhbHVlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUludGVnZXJBcnJheVZhbHVlKHZhbHVlOiBudW1iZXJbXSkge1xuICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgIHZhbHVlLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVMaXN0VmFsdWUodmFsdWU6IFNldDxhbnk+KTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZS5zaXplID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdE5idFR5cGUgPSB0aGlzLmdldE5CVFR5cGVGcm9tVmFsdWUodmFsdWUuZW50cmllcygpLm5leHQoKS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKGxpc3ROYnRUeXBlKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUuc2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJhd1ZhbHVlIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsaXN0TmJ0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTaG9ydFZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVMb25nVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRmxvYXRWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRG91YmxlVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVEb3VibGVWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVN0cmluZ1ZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTGlzdFZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVDb21wb3VuZFZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlckFycmF5VmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTkJUVGFnVHlwZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUoTkJURGVmaW5pdGlvbnMuVEFHX0JZVEUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVDb21wb3VuZFZhbHVlKGNvbXBvdW5kOiBOQlRUYWdDb21wb3VuZCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb21wb3VuZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5idFR5cGUgPSB0aGlzLmdldE5CVFR5cGVGcm9tVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZVRhZ0hlYWRlcihuYnRUeXBlLCBrZXkpO1xuICAgICAgICAgICAgc3dpdGNoIChuYnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTaG9ydFZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVMb25nVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRmxvYXRWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRG91YmxlVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlQXJyYXlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVN0cmluZ1ZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTGlzdFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVDb21wb3VuZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVFRhZ1R5cGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUoTkJURGVmaW5pdGlvbnMuVEFHX0VORCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlOiBhbnkpOiBOQlREZWZpbml0aW9ucyB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGVWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfQllURTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTaG9ydFZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXJWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfSU5UO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmdWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfTE9ORztcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdFZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGVWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1ZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTkJUVGFnQ29tcG91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IENhbm5vdCBkZWR1Y2UgTkJUIHR5cGUgb2YgY2xhc3MgJHt2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfSAoJHt2YWx1ZX0pYCk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsSUFBcUIsWUFBckIsTUFBK0I7Q0FDM0I7Q0FDQTtDQUVBLFlBQW9CO0NBRXBCLFlBQW1CLEtBQW1CLFdBQXNCO0VBQ3hELEtBQUssTUFBTTtFQUNYLEtBQUssUUFBUTtDQUNqQjtDQUVBLGFBQW9CLFdBQTBCO0VBQzFDLEtBQUssWUFBWTtDQUNyQjtDQUVBLFVBQWlCLE1BQXNCO0VBQ25DLEtBQUssZUFBZSx1QkFBQSxlQUFlLFVBQVUsRUFBRTtFQUMvQyxLQUFLLGVBQWUsSUFBSTtDQUM1QjtDQUVBLGNBQXFCLFVBQWdDO0VBQ2pELEtBQUssZUFBZSx1QkFBQSxlQUFlLGNBQWMsU0FBUyxRQUFRLEtBQUssRUFBRTtFQUN6RSxLQUFLLG1CQUFtQixRQUFRO0NBQ3BDO0NBRUEsZUFBdUIsTUFBYyxNQUFvQjtFQUNyRCxLQUFLLGVBQWUsSUFBSTtFQUN4QixLQUFLLGlCQUFpQixJQUFJO0NBQzlCO0NBRUEsaUJBQXlCLE9BQTRCO0VBQ2pELElBQUksVUFBVSxNQUFNO0dBQ2hCLE1BQU0sUUFBUSxPQUFPLEtBQUssT0FBTyxNQUFNO0dBQ3ZDLElBQUksS0FBSyxXQUNMLEtBQUssSUFBSSxvQkFBb0IsT0FBTyxXQUFXLEtBQUssQ0FBQztRQUVyRCxLQUFLLGdCQUFnQixPQUFPLFdBQVcsS0FBSyxDQUFDO0dBR2pE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