UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

134 lines (131 loc) • 19.7 kB
import BinaryStream from '@jsprismarine/jsbinaryutils'; import { Vector3 } from '@jsprismarine/math'; import { NBTWriter, NBTTagCompound } from '@jsprismarine/nbt'; import { NetworkUtil } from '../NetworkUtil.es.js'; import UUID from '../../utils/UUID.es.js'; import Identifiers from '../Identifiers.es.js'; import DataPacket from './DataPacket.es.js'; class StartGamePacket extends DataPacket { static NetID = Identifiers.StartGamePacket; entityId; runtimeEntityId; gamemode; defaultGamemode = 0; playerPos = new Vector3(0, 5, 0); pitch = 0; yaw = 0; serverIdentifier; worldIdentifier; scenarioIdentifier; levelId; worldName; seed; time = 0; ticks = 0; worldSpawnPos; gamerules; // Cache item IDs mappings static cachedItemIds = null; encodePayload() { this.writeVarLong(this.entityId); this.writeUnsignedVarLong(this.runtimeEntityId); this.writeVarInt(this.gamemode); NetworkUtil.writeVector3(this, this.playerPos); this.writeFloatLE(this.pitch); this.writeFloatLE(this.yaw); this.writeLongLE(BigInt(this.seed)); this.writeUnsignedShortLE(0); NetworkUtil.writeString(this, "plains"); this.writeVarInt(0); this.writeVarInt(1); this.writeVarInt(this.defaultGamemode); this.writeBoolean(false); this.writeVarInt(0); this.writeVarInt(this.worldSpawnPos.getX()); this.writeUnsignedVarInt(this.worldSpawnPos.getY()); this.writeVarInt(this.worldSpawnPos.getZ()); this.writeBoolean(true); this.writeVarInt(0); this.writeBoolean(false); this.writeBoolean(false); this.writeVarInt(this.time); this.writeVarInt(0); this.writeBoolean(false); NetworkUtil.writeString(this, ""); this.writeFloatLE(0); this.writeFloatLE(0); this.writeByte(0); this.writeByte(1); this.writeByte(1); this.writeVarInt(4); this.writeVarInt(4); this.writeByte(1); this.writeByte(0); this.gamerules.networkSerialize(this); this.writeUnsignedIntLE(0); this.writeBoolean(false); this.writeByte(0); this.writeByte(0); this.writeVarInt(1); this.writeUnsignedIntLE(4); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); this.writeByte(0); NetworkUtil.writeString(this, "*"); this.writeUnsignedIntLE(0); this.writeUnsignedIntLE(0); this.writeBoolean(true); NetworkUtil.writeString(this, ""); NetworkUtil.writeString(this, ""); this.writeBoolean(false); this.writeByte(0); this.writeByte(0); NetworkUtil.writeString(this, this.serverIdentifier); NetworkUtil.writeString(this, this.worldIdentifier); NetworkUtil.writeString(this, this.scenarioIdentifier); NetworkUtil.writeString(this, this.levelId); NetworkUtil.writeString(this, this.worldName); NetworkUtil.writeString(this, "00000000-0000-0000-0000-000000000000"); this.writeByte(0); this.writeUnsignedVarInt(0); this.writeVarInt(0); this.writeBoolean(false); this.writeLongLE(BigInt(this.ticks)); this.writeVarInt(0); this.writeUnsignedVarInt(0); this.writeUnsignedVarInt(0); NetworkUtil.writeString(this, ""); this.writeBoolean(true); NetworkUtil.writeString(this, Identifiers.MinecraftVersions.at(0)); const str = new BinaryStream(); const nbt = new NBTWriter(str, 1); nbt.setUseVarint(true); nbt.writeCompound(new NBTTagCompound()); this.write(str.getBuffer()); this.writeLongLE(0n); UUID.fromRandom().networkSerialize(this); this.writeBoolean(true); this.writeByte(0); this.writeByte(0); } /* private generateItemPalette(): Buffer { const stream = new BinaryStream(); const itemMappings = Object.entries(item_id_map); stream.writeUnsignedVarInt(itemMappings.length); for (const [name, data] of itemMappings) { NetworkUtil.writeString(stream, name); stream.writeShortLE((data as any).runtime_id as number); stream.writeByte(0); // unknown } return stream.getBuffer(); } */ } export { StartGamePacket as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhcnRHYW1lUGFja2V0LmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvU3RhcnRHYW1lUGFja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICdAanNwcmlzbWFyaW5lL21hdGgnO1xuaW1wb3J0IHsgTkJUVGFnQ29tcG91bmQsIE5CVFdyaXRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbmJ0JztcbmltcG9ydCB7IE5ldHdvcmtVdGlsIH0gZnJvbSAnLi4vLi4vbmV0d29yay9OZXR3b3JrVXRpbCc7XG5pbXBvcnQgVVVJRCBmcm9tICcuLi8uLi91dGlscy9VVUlEJztcbmltcG9ydCB0eXBlIEdhbWVydWxlTWFuYWdlciBmcm9tICcuLi8uLi93b3JsZC9HYW1lcnVsZU1hbmFnZXInO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4uL0lkZW50aWZpZXJzJztcbmltcG9ydCBEYXRhUGFja2V0IGZyb20gJy4vRGF0YVBhY2tldCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXJ0R2FtZVBhY2tldCBleHRlbmRzIERhdGFQYWNrZXQge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5TdGFydEdhbWVQYWNrZXQ7XG5cbiAgICBwdWJsaWMgZW50aXR5SWQhOiBiaWdpbnQ7XG4gICAgcHVibGljIHJ1bnRpbWVFbnRpdHlJZCE6IGJpZ2ludDtcbiAgICBwdWJsaWMgZ2FtZW1vZGUhOiBudW1iZXI7XG4gICAgcHVibGljIGRlZmF1bHRHYW1lbW9kZTogbnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBwbGF5ZXJQb3M6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCA1LCAwKTtcbiAgICBwdWJsaWMgcGl0Y2g6IG51bWJlciA9IDA7XG4gICAgcHVibGljIHlhdzogbnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBzZXJ2ZXJJZGVudGlmaWVyITogc3RyaW5nO1xuICAgIHB1YmxpYyB3b3JsZElkZW50aWZpZXIhOiBzdHJpbmc7XG4gICAgcHVibGljIHNjZW5hcmlvSWRlbnRpZmllciE6IHN0cmluZztcbiAgICBwdWJsaWMgbGV2ZWxJZCE6IHN0cmluZztcbiAgICBwdWJsaWMgd29ybGROYW1lITogc3RyaW5nO1xuICAgIHB1YmxpYyBzZWVkITogbnVtYmVyO1xuICAgIHB1YmxpYyB0aW1lOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyB0aWNrczogbnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyB3b3JsZFNwYXduUG9zITogVmVjdG9yMztcblxuICAgIHB1YmxpYyBnYW1lcnVsZXMhOiBHYW1lcnVsZU1hbmFnZXI7XG5cbiAgICAvLyBDYWNoZSBpdGVtIElEcyBtYXBwaW5nc1xuICAgIHB1YmxpYyBzdGF0aWMgY2FjaGVkSXRlbUlkczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgZW5jb2RlUGF5bG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVZhckxvbmcodGhpcy5lbnRpdHlJZCk7XG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckxvbmcodGhpcy5ydW50aW1lRW50aXR5SWQpO1xuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQodGhpcy5nYW1lbW9kZSk7XG5cbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVWZWN0b3IzKHRoaXMsIHRoaXMucGxheWVyUG9zKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0TEUodGhpcy5waXRjaCk7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdExFKHRoaXMueWF3KTtcblxuICAgICAgICB0aGlzLndyaXRlTG9uZ0xFKEJpZ0ludCh0aGlzLnNlZWQpKTsgLy8gU2VlZFxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFNob3J0TEUoMHgwMCk7IC8vIERlZmF1bHQgc3Bhd24gYmlvbWUgdHlwZVxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCAncGxhaW5zJyk7IC8vIFVzZXIgZGVmaW5lZCBiaW9tZSBuYW1lXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gRGltZW5zaW9uXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgxKTsgLy8gR2VuZXJhdG9yXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQodGhpcy5kZWZhdWx0R2FtZW1vZGUpOyAvLyBEZWZhdWx0IEdhbWVtb2RlXG5cbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBJcyBoYXJkY29yZSBlbmFibGVkXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gRGlmZmljdWx0eVxuXG4gICAgICAgIC8vIHdvcmxkIHNwYXduIHZlY3RvciAzXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQodGhpcy53b3JsZFNwYXduUG9zLmdldFgoKSk7XG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLndvcmxkU3Bhd25Qb3MuZ2V0WSgpKTtcbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLndvcmxkU3Bhd25Qb3MuZ2V0WigpKTtcblxuICAgICAgICAvLyBSZWNlbnRseSBmb3VuZCB0aGF0IG1heSBjcmFzaCB0aGUgY2xpZW50XG4gICAgICAgIC8vIHdhaXRpbmcgZm9yIG1vcmUgaW5mbyBhYm91dCBpdFxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbih0cnVlKTsgLy8gQWNoaWV2ZW1lbnQgZGlzYWJsZWRcblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDApOyAvLyBFZGl0b3Igd29ybGQgdHlwZT9cbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBDcmVhdGVkIGluIGVkaXRvciBtb2RlP1xuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIEV4cG9ydGVkIGZyb20gZWRpdG9yIG1vZGU/XG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLnRpbWUpOyAvLyBEYXkgY3ljbGUgLyB0aW1lXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoMCk7IC8vIEVkdSBlZGl0aW9uIG9mZmVyXG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gRWR1IGZlYXR1cmVzXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcnKTsgLy8gRWR1IHByb2R1Y3QgaWRcblxuICAgICAgICB0aGlzLndyaXRlRmxvYXRMRSgwKTsgLy8gUmFpbiBsdmxcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0TEUoMCk7IC8vIExpZ2h0bmluZyBsdmxcblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gQ29uZmlybWVkIHBsYXRmb3JtIGxvY2tlZFxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgxKTsgLy8gTXVsdGkgcGxheWVyIGdhbWVcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMSk7IC8vIEJyb2FkY2FzdCB0byBsYW5cblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDQpOyAvLyBYYmwgYnJvYWRjYXN0IG1vZGVcbiAgICAgICAgdGhpcy53cml0ZVZhckludCg0KTsgLy8gUGxhdGZvcm0gYnJvYWRjYXN0IG1vZGVcblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgxKTsgLy8gQ29tbWFuZHMgZW5hYmxlZFxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gVGV4dHVyZSByZXF1aXJlZFxuXG4gICAgICAgIHRoaXMuZ2FtZXJ1bGVzLm5ldHdvcmtTZXJpYWxpemUodGhpcyk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkSW50TEUoMCk7IC8vIEV4cGVyaW1lbnQgY291bnRcbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBFeHBlcmltZW50cyBwcmV2aW91c2x5IHRvZ2dsZWQ/XG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIEJvbnVzIGNoZXN0XG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBTdGFydCB3aXRoIG1hcFxuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoMSk7IC8vIFBsYXllciBwZXJtc1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZEludExFKDQpOyAvLyBDaHVuayB0aWNrIHJhbmdlXG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIExvY2tlZCBiZWhhdmlvclxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gTG9ja2VkIHRleHR1cmVcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIEZyb20gbG9ja2VkIHRlbXBsYXRlXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBNc2EgZ2FtZXIgdGFncyBvbmx5XG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBGcm9tIHdvcmxkIHRlbXBsYXRlXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBXb3JsZCB0ZW1wbGF0ZSBvcHRpb24gbG9ja2VkXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBPbmx5IHNwYXduIHYxIHZpbGxhZ2Vyc1xuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gRGlzYWJsZSBwZXJzb25hIHNraW5zXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBEaXNhYmxlIGN1c3RvbSBza2luc1xuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gRGlzYWJsZSBlbW90ZVxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCAnKicpO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZEludExFKDApOyAvLyBMaW1pdGVkIHdvcmxkIGhlaWdodFxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRJbnRMRSgwKTsgLy8gTGltaXRlZCB3b3JsZCBsZW5ndGhcblxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbih0cnVlKTsgLy8gSGFzIG5ldyBuZXRoZXJcblxuICAgICAgICAvLyBUT0RPc1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCAnJyk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcnKTtcblxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIEV4cGVyaW1lbnRhbCBnYW1lcGxheVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBDaGF0IHJlc3RyaWN0aW9uIGxldmVsXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBEaXNhYmxlIHBsYXllciBpbnRlcmFjdGlvbnNcblxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB0aGlzLnNlcnZlcklkZW50aWZpZXIpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB0aGlzLndvcmxkSWRlbnRpZmllcik7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHRoaXMuc2NlbmFyaW9JZGVudGlmaWVyKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgdGhpcy5sZXZlbElkKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgdGhpcy53b3JsZE5hbWUpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJyk7IC8vIFRlbXBsYXRlIGNvbnRlbnQgaWRlbnRpdHlcblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gSXMgdHJpYWxcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoMCk7IC8vIFNlcnZlciBhdXRoIG1vdmVtZW50XG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoMCk7IC8vIFJld2luZCBIaXN0b3J5IFNpemVcbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBJcyBTZXJ2ZXIgQXV0aG9yaXRhdGl2ZSBCbG9jayBCcmVha2luZ1xuXG4gICAgICAgIHRoaXMud3JpdGVMb25nTEUoQmlnSW50KHRoaXMudGlja3MpKTsgLy8gV29ybGQgdGlja3MgKGZvciB0aW1lKVxuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoMCk7IC8vIEVuY2hhbnRtZW50IHNlZWRcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoMCk7IC8vIEJsb2NrcyBwYWxldHRlXG5cbiAgICAgICAgLyogSXRlbSBwYWxldHRlXG4gICAgICAgIGlmIChTdGFydEdhbWVQYWNrZXQuY2FjaGVkSXRlbUlkcykge1xuICAgICAgICAgICAgdGhpcy53cml0ZShTdGFydEdhbWVQYWNrZXQuY2FjaGVkSXRlbUlkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZW5lcmF0ZUl0ZW1QYWxldHRlKCk7XG4gICAgICAgICAgICBTdGFydEdhbWVQYWNrZXQuY2FjaGVkSXRlbUlkcyA9IHBhbGV0dGU7XG4gICAgICAgICAgICB0aGlzLndyaXRlKHBhbGV0dGUpO1xuICAgICAgICB9ICovXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTtcblxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCAnJyk7XG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHRydWUpOyAvLyBOZXcgaW52ZW50b3J5IHN5c3RlbVxuXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIElkZW50aWZpZXJzLk1pbmVjcmFmdFZlcnNpb25zLmF0KDApISk7XG5cbiAgICAgICAgLy8gVE9ET1xuICAgICAgICBjb25zdCBzdHIgPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgIGNvbnN0IG5idCA9IG5ldyBOQlRXcml0ZXIoc3RyLCAxKTtcbiAgICAgICAgbmJ0LnNldFVzZVZhcmludCh0cnVlKTtcbiAgICAgICAgbmJ0LndyaXRlQ29tcG91bmQobmV3IE5CVFRhZ0NvbXBvdW5kKCkpO1xuICAgICAgICB0aGlzLndyaXRlKHN0ci5nZXRCdWZmZXIoKSk7XG5cbiAgICAgICAgdGhpcy53cml0ZUxvbmdMRSgwbik7IC8vIEJsb2NrIHBhbGV0dGUgY2hlY2tzdW1cblxuICAgICAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiBhIHJhbmRvbSBvbmUgd2lsbCB3b3JrLCBidXQgbGV0J3MgdHJ5XG4gICAgICAgIFVVSUQuZnJvbVJhbmRvbSgpLm5ldHdvcmtTZXJpYWxpemUodGhpcyk7XG5cbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4odHJ1ZSk7IC8vIFVzZSBjbGllbnQgc2lkZSBjaHVuayBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBCbG9jayBORVQgSURzIGFyZSBoYXNoZXNcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIERpc2FibGUgY2xpZW50IGF1ZGlvXG4gICAgfVxuXG4gICAgLyogcHJpdmF0ZSBnZW5lcmF0ZUl0ZW1QYWxldHRlKCk6IEJ1ZmZlciB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgY29uc3QgaXRlbU1hcHBpbmdzID0gT2JqZWN0LmVudHJpZXMoaXRlbV9pZF9tYXApO1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludChpdGVtTWFwcGluZ3MubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgaXRlbU1hcHBpbmdzKSB7XG4gICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIG5hbWUpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlU2hvcnRMRSgoZGF0YSBhcyBhbnkpLnJ1bnRpbWVfaWQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMCk7IC8vIHVua25vd25cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICAgIH0gKi9cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLE1BQXFCLHdCQUF3QixVQUFXLENBQUE7QUFBQSxFQUNwRCxPQUFjLFFBQVEsV0FBWSxDQUFBLGVBQUE7QUFBQSxFQUUzQixRQUFBO0FBQUEsRUFDQSxlQUFBO0FBQUEsRUFDQSxRQUFBO0FBQUEsRUFDQSxlQUEwQixHQUFBLENBQUE7QUFBQSxFQUUxQixTQUFxQixHQUFBLElBQUksT0FBUSxDQUFBLENBQUEsRUFBRyxHQUFHLENBQUMsQ0FBQTtBQUFBLEVBQ3hDLEtBQWdCLEdBQUEsQ0FBQTtBQUFBLEVBQ2hCLEdBQWMsR0FBQSxDQUFBO0FBQUEsRUFFZCxnQkFBQTtBQUFBLEVBQ0EsZUFBQTtBQUFBLEVBQ0Esa0JBQUE7QUFBQSxFQUNBLE9BQUE7QUFBQSxFQUNBLFNBQUE7QUFBQSxFQUNBLElBQUE7QUFBQSxFQUNBLElBQWUsR0FBQSxDQUFBO0FBQUEsRUFDZixLQUFnQixHQUFBLENBQUE7QUFBQSxFQUVoQixhQUFBO0FBQUEsRUFFQSxTQUFBO0FBQUE7QUFBQSxFQUdQLE9BQWMsYUFBK0IsR0FBQSxJQUFBO0FBQUEsRUFFdEMsYUFBc0IsR0FBQTtBQUN6QixJQUFLLElBQUEsQ0FBQSxZQUFBLENBQWEsS0FBSyxRQUFRLENBQUE7QUFDL0IsSUFBSyxJQUFBLENBQUEsb0JBQUEsQ0FBcUIsS0FBSyxlQUFlLENBQUE7QUFFOUMsSUFBSyxJQUFBLENBQUEsV0FBQSxDQUFZLEtBQUssUUFBUSxDQUFBO0FBRTlCLElBQVksV0FBQSxDQUFBLFlBQUEsQ0FBYSxJQUFNLEVBQUEsSUFBQSxDQUFLLFNBQVMsQ0FBQTtBQUM3QyxJQUFLLElBQUEsQ0FBQSxZQUFBLENBQWEsS0FBSyxLQUFLLENBQUE7QUFDNUIsSUFBSyxJQUFBLENBQUEsWUFBQSxDQUFhLEtBQUssR0FBRyxDQUFBO0FBRTFCLElBQUEsSUFBQSxDQUFLLFdBQVksQ0FBQSxNQUFBLENBQU8sSUFBSyxDQUFBLElBQUksQ0FBQyxDQUFBO0FBRWxDLElBQUEsSUFBQSxDQUFLLHFCQUFxQixDQUFJLENBQUE7QUFDOUIsSUFBWSxXQUFBLENBQUEsV0FBQSxDQUFZLE1BQU0sUUFBUSxDQUFBO0FBRXRDLElBQUEsSUFBQSxDQUFLLFlBQVksQ0FBQyxDQUFBO0FBRWxCLElBQUEsSUFBQSxDQUFLLFlBQVksQ0FBQyxDQUFBO0FBQ2xCLElBQUssSUFBQSxDQUFBLFdBQUEsQ0FBWSxLQUFLLGVBQWUsQ0FBQTtBQUVyQyxJQUFBLElBQUEsQ0FBSyxhQUFhLEtBQUssQ0FBQTtBQUV2QixJQUFBLElBQUEsQ0FBSyxZQUFZLENBQUMsQ0FBQTtBQUdsQixJQUFBLElBQUEsQ0FBSyxXQUFZLENBQUEsSUFBQSxDQUFLLGFBQWMsQ0FBQSxJQUFBLEVBQU0sQ0FBQTtBQUMxQyxJQUFBLElBQUEsQ0FBSyxtQkFBb0IsQ0FBQSxJQUFBLENBQUssYUFBYyxDQUFBLElBQUEsRUFBTSxDQUFBO0FBQ2xELElBQUEsSUFBQSxDQUFLLFdBQVksQ0FBQSxJQUFBLENBQUssYUFBYyxDQUFBLElBQUEsRUFBTSxDQUFBO0FBSTFDLElBQUEsSUFBQSxDQUFLLGFBQWEsSUFBSSxDQUFBO0FBRXRCLElBQUEsSUFBQSxDQUFLLFlBQVksQ0FBQyxDQUFBO0FBQ2xCLElBQUEsSUFBQSxDQUFLLGFBQWEsS0FBSyxDQUFBO0FBQ3ZCLElBQUEsSUFBQSxDQUFLLGFBQWEsS0FBSyxDQUFBO0FBRXZCLElBQUssSUFBQSxDQUFBLFdBQUEsQ0FBWSxLQUFLLElBQUksQ0FBQTtBQUMxQixJQUFBLElBQUEsQ0FBSyxZQUFZLENBQUMsQ0FBQTtBQUNsQixJQUFBLElBQUEsQ0FBSyxhQUFhLEtBQUssQ0FBQTtBQUN2QixJQUFZLFdBQUEsQ0FBQSxXQUFBLENBQVksTUFBTSxFQUFFLENBQUE7QUFFaEMsSUFBQSxJQUFBLENBQUssYUFBYSxDQUFDLENBQUE7QUFDbkIsSUFBQSxJQUFBLENBQUssYUFBYSxDQUFDLENBQUE7QUFFbkIsSUFBQSxJQUFBLENBQUssVUFBVSxDQUFDLENBQUE7QUFDaEIsSUFBQSxJQUFBLENBQUssVUFB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