UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

122 lines (121 loc) • 16.5 kB
import { NetworkUtil } from "../NetworkUtil.es.js"; import Identifiers from "../Identifiers.es.js"; import DataPacket from "./DataPacket.es.js"; import UUID from "../../utils/UUID.es.js"; import BinaryStream from "@jsprismarine/jsbinaryutils"; import { NBTTagCompound, NBTWriter } from "@jsprismarine/nbt"; import { Vector3 } from "@jsprismarine/math"; //#region src/network/packet/StartGamePacket.ts var StartGamePacket = class 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; 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); } }; //#endregion export { StartGamePacket as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhcnRHYW1lUGFja2V0LmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9TdGFydEdhbWVQYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgeyBOQlRUYWdDb21wb3VuZCwgTkJUV3JpdGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9uYnQnO1xuaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi8uLi9uZXR3b3JrL05ldHdvcmtVdGlsJztcbmltcG9ydCBVVUlEIGZyb20gJy4uLy4uL3V0aWxzL1VVSUQnO1xuaW1wb3J0IHR5cGUgR2FtZXJ1bGVNYW5hZ2VyIGZyb20gJy4uLy4uL3dvcmxkL0dhbWVydWxlTWFuYWdlcic7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IERhdGFQYWNrZXQgZnJvbSAnLi9EYXRhUGFja2V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhcnRHYW1lUGFja2V0IGV4dGVuZHMgRGF0YVBhY2tldCB7XG4gICAgcHVibGljIHN0YXRpYyBOZXRJRCA9IElkZW50aWZpZXJzLlN0YXJ0R2FtZVBhY2tldDtcblxuICAgIHB1YmxpYyBlbnRpdHlJZCE6IGJpZ2ludDtcbiAgICBwdWJsaWMgcnVudGltZUVudGl0eUlkITogYmlnaW50O1xuICAgIHB1YmxpYyBnYW1lbW9kZSE6IG51bWJlcjtcbiAgICBwdWJsaWMgZGVmYXVsdEdhbWVtb2RlOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHBsYXllclBvczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDUsIDApO1xuICAgIHB1YmxpYyBwaXRjaDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgeWF3OiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHNlcnZlcklkZW50aWZpZXIhOiBzdHJpbmc7XG4gICAgcHVibGljIHdvcmxkSWRlbnRpZmllciE6IHN0cmluZztcbiAgICBwdWJsaWMgc2NlbmFyaW9JZGVudGlmaWVyITogc3RyaW5nO1xuICAgIHB1YmxpYyBsZXZlbElkITogc3RyaW5nO1xuICAgIHB1YmxpYyB3b3JsZE5hbWUhOiBzdHJpbmc7XG4gICAgcHVibGljIHNlZWQhOiBudW1iZXI7XG4gICAgcHVibGljIHRpbWU6IG51bWJlciA9IDA7XG4gICAgcHVibGljIHRpY2tzOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHdvcmxkU3Bhd25Qb3MhOiBWZWN0b3IzO1xuXG4gICAgcHVibGljIGdhbWVydWxlcyE6IEdhbWVydWxlTWFuYWdlcjtcblxuICAgIC8vIENhY2hlIGl0ZW0gSURzIG1hcHBpbmdzXG4gICAgcHVibGljIHN0YXRpYyBjYWNoZWRJdGVtSWRzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBlbmNvZGVQYXlsb2FkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlVmFyTG9uZyh0aGlzLmVudGl0eUlkKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFyTG9uZyh0aGlzLnJ1bnRpbWVFbnRpdHlJZCk7XG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLmdhbWVtb2RlKTtcblxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVZlY3RvcjModGhpcywgdGhpcy5wbGF5ZXJQb3MpO1xuICAgICAgICB0aGlzLndyaXRlRmxvYXRMRSh0aGlzLnBpdGNoKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0TEUodGhpcy55YXcpO1xuXG4gICAgICAgIHRoaXMud3JpdGVMb25nTEUoQmlnSW50KHRoaXMuc2VlZCkpOyAvLyBTZWVkXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkU2hvcnRMRSgweDAwKTsgLy8gRGVmYXVsdCBzcGF3biBiaW9tZSB0eXBlXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICdwbGFpbnMnKTsgLy8gVXNlciBkZWZpbmVkIGJpb21lIG5hbWVcblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDApOyAvLyBEaW1lbnNpb25cblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDEpOyAvLyBHZW5lcmF0b3JcbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLmRlZmF1bHRHYW1lbW9kZSk7IC8vIERlZmF1bHQgR2FtZW1vZGVcblxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIElzIGhhcmRjb3JlIGVuYWJsZWRcblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDApOyAvLyBEaWZmaWN1bHR5XG5cbiAgICAgICAgLy8gd29ybGQgc3Bhd24gdmVjdG9yIDNcbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLndvcmxkU3Bhd25Qb3MuZ2V0WCgpKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMud29ybGRTcGF3blBvcy5nZXRZKCkpO1xuICAgICAgICB0aGlzLndyaXRlVmFySW50KHRoaXMud29ybGRTcGF3blBvcy5nZXRaKCkpO1xuXG4gICAgICAgIC8vIFJlY2VudGx5IGZvdW5kIHRoYXQgbWF5IGNyYXNoIHRoZSBjbGllbnRcbiAgICAgICAgLy8gd2FpdGluZyBmb3IgbW9yZSBpbmZvIGFib3V0IGl0XG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHRydWUpOyAvLyBBY2hpZXZlbWVudCBkaXNhYmxlZFxuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoMCk7IC8vIEVkaXRvciB3b3JsZCB0eXBlP1xuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIENyZWF0ZWQgaW4gZWRpdG9yIG1vZGU/XG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gRXhwb3J0ZWQgZnJvbSBlZGl0b3IgbW9kZT9cblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KHRoaXMudGltZSk7IC8vIERheSBjeWNsZSAvIHRpbWVcbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gRWR1IGVkaXRpb24gb2ZmZXJcbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBFZHUgZmVhdHVyZXNcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgJycpOyAvLyBFZHUgcHJvZHVjdCBpZFxuXG4gICAgICAgIHRoaXMud3JpdGVGbG9hdExFKDApOyAvLyBSYWluIGx2bFxuICAgICAgICB0aGlzLndyaXRlRmxvYXRMRSgwKTsgLy8gTGlnaHRuaW5nIGx2bFxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBDb25maXJtZWQgcGxhdGZvcm0gbG9ja2VkXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDEpOyAvLyBNdWx0aSBwbGF5ZXIgZ2FtZVxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgxKTsgLy8gQnJvYWRjYXN0IHRvIGxhblxuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoNCk7IC8vIFhibCBicm9hZGNhc3QgbW9kZVxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDQpOyAvLyBQbGF0Zm9ybSBicm9hZGNhc3QgbW9kZVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDEpOyAvLyBDb21tYW5kcyBlbmFibGVkXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBUZXh0dXJlIHJlcXVpcmVkXG5cbiAgICAgICAgdGhpcy5nYW1lcnVsZXMubmV0d29ya1NlcmlhbGl6ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRJbnRMRSgwKTsgLy8gRXhwZXJpbWVudCBjb3VudFxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIEV4cGVyaW1lbnRzIHByZXZpb3VzbHkgdG9nZ2xlZD9cblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gQm9udXMgY2hlc3RcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIFN0YXJ0IHdpdGggbWFwXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgxKTsgLy8gUGxheWVyIHBlcm1zXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkSW50TEUoNCk7IC8vIENodW5rIHRpY2sgcmFuZ2VcblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gTG9ja2VkIGJlaGF2aW9yXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBMb2NrZWQgdGV4dHVyZVxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gRnJvbSBsb2NrZWQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIE1zYSBnYW1lciB0YWdzIG9ubHlcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIEZyb20gd29ybGQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIFdvcmxkIHRlbXBsYXRlIG9wdGlvbiBsb2NrZWRcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIE9ubHkgc3Bhd24gdjEgdmlsbGFnZXJzXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBEaXNhYmxlIHBlcnNvbmEgc2tpbnNcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIERpc2FibGUgY3VzdG9tIHNraW5zXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBEaXNhYmxlIGVtb3RlXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcqJyk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkSW50TEUoMCk7IC8vIExpbWl0ZWQgd29ybGQgaGVpZ2h0XG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZEludExFKDApOyAvLyBMaW1pdGVkIHdvcmxkIGxlbmd0aFxuXG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHRydWUpOyAvLyBIYXMgbmV3IG5ldGhlclxuXG4gICAgICAgIC8vIFRPRE9zXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcnKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgJycpO1xuXG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gRXhwZXJpbWVudGFsIGdhbWVwbGF5XG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIENoYXQgcmVzdHJpY3Rpb24gbGV2ZWxcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIERpc2FibGUgcGxheWVyIGludGVyYWN0aW9uc1xuXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHRoaXMuc2VydmVySWRlbnRpZmllcik7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHRoaXMud29ybGRJZGVudGlmaWVyKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgdGhpcy5zY2VuYXJpb0lkZW50aWZpZXIpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB0aGlzLmxldmVsSWQpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB0aGlzLndvcmxkTmFtZSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnKTsgLy8gVGVtcGxhdGUgY29udGVudCBpZGVudGl0eVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBJcyB0cmlhbFxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gU2VydmVyIGF1dGggbW92ZW1lbnRcbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gUmV3aW5kIEhpc3RvcnkgU2l6ZVxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIElzIFNlcnZlciBBdXRob3JpdGF0aXZlIEJsb2NrIEJyZWFraW5nXG5cbiAgICAgICAgdGhpcy53cml0ZUxvbmdMRShCaWdJbnQodGhpcy50aWNrcykpOyAvLyBXb3JsZCB0aWNrcyAoZm9yIHRpbWUpXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gRW5jaGFudG1lbnQgc2VlZFxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gQmxvY2tzIHBhbGV0dGVcblxuICAgICAgICAvKiBJdGVtIHBhbGV0dGVcbiAgICAgICAgaWYgKFN0YXJ0R2FtZVBhY2tldC5jYWNoZWRJdGVtSWRzKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKFN0YXJ0R2FtZVBhY2tldC5jYWNoZWRJdGVtSWRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbGV0dGUgPSB0aGlzLmdlbmVyYXRlSXRlbVBhbGV0dGUoKTtcbiAgICAgICAgICAgIFN0YXJ0R2FtZVBhY2tldC5jYWNoZWRJdGVtSWRzID0gcGFsZXR0ZTtcbiAgICAgICAgICAgIHRoaXMud3JpdGUocGFsZXR0ZSk7XG4gICAgICAgIH0gKi9cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApO1xuXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4odHJ1ZSk7IC8vIE5ldyBpbnZlbnRvcnkgc3lzdGVtXG5cbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgSWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMuYXQoMCkhKTtcblxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIGNvbnN0IHN0ciA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgY29uc3QgbmJ0ID0gbmV3IE5CVFdyaXRlcihzdHIsIDEpO1xuICAgICAgICBuYnQuc2V0VXNlVmFyaW50KHRydWUpO1xuICAgICAgICBuYnQud3JpdGVDb21wb3VuZChuZXcgTkJUVGFnQ29tcG91bmQoKSk7XG4gICAgICAgIHRoaXMud3JpdGUoc3RyLmdldEJ1ZmZlcigpKTtcblxuICAgICAgICB0aGlzLndyaXRlTG9uZ0xFKDBuKTsgLy8gQmxvY2sgcGFsZXR0ZSBjaGVja3N1bVxuXG4gICAgICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIGEgcmFuZG9tIG9uZSB3aWxsIHdvcmssIGJ1dCBsZXQncyB0cnlcbiAgICAgICAgVVVJRC5mcm9tUmFuZG9tKCkubmV0d29ya1NlcmlhbGl6ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbih0cnVlKTsgLy8gVXNlIGNsaWVudCBzaWRlIGNodW5rIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIEJsb2NrIE5FVCBJRHMgYXJlIGhhc2hlc1xuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gRGlzYWJsZSBjbGllbnQgYXVkaW9cbiAgICB9XG5cbiAgICAvKiBwcml2YXRlIGdlbmVyYXRlSXRlbVBhbGV0dGUoKTogQnVmZmVyIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICBjb25zdCBpdGVtTWFwcGluZ3MgPSBPYmplY3QuZW50cmllcyhpdGVtX2lkX21hcCk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KGl0ZW1NYXBwaW5ncy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBpdGVtTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgbmFtZSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVTaG9ydExFKChkYXRhIGFzIGFueSkucnVudGltZV9pZCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQnl0ZSgwKTsgLy8gdW5rbm93blxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW0uZ2V0QnVm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