@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
133 lines (132 loc) • 19.4 kB
JavaScript
import { NetworkUtil } from "../NetworkUtil.es.js";
import Identifiers from "../Identifiers.es.js";
import DataPacket from "./DataPacket.es.js";
//#region src/network/packet/AvailableCommandsPacket.ts
/**
* AvailableCommandsPacket is sent by the server to the client to provide information about available commands.
* @TODO: Argument types are not implemented.
*/
var AvailableCommandsPacket = class extends DataPacket {
static NetID = Identifiers.AvailableCommandsPacket;
ARG_FLAG_VALID = 1048576;
ARG_FLAG_INT = 1;
ARG_FLAG_FLOAT = 3;
ARG_TYPE_WILDCARD_INT = 5;
ARG_TYPE_STRING = 56;
ARG_TYPE_INT_POSITION = 64;
ARG_TYPE_POSITION = 65;
ARG_FLAG_ENUM = 2097152;
ARG_FLAG_POSTFIX = 16777216;
ARG_FLAG_SOFT_ENUM = 67108864;
commandData = [];
hardcodedEnums = [];
softEnums = [];
enumConstraints = [];
encodePayload() {
const enumValueIndexes = /* @__PURE__ */ new Map();
const postfixIndexes = /* @__PURE__ */ new Map();
const enums = [];
const enumIndexes = /* @__PURE__ */ new Map();
const softEnums = [];
const softEnumIndexes = /* @__PURE__ */ new Map();
const appendEnum = (_enum) => {
const { name, soft, values } = _enum;
if (soft) {
if (!softEnumIndexes.has(name)) {
const index = softEnumIndexes.set(name, softEnumIndexes.size).get(name);
softEnums[index] = _enum;
}
return;
}
values.forEach((value) => {
if (!enumValueIndexes.has(value)) enumValueIndexes.set(value, enumValueIndexes.size);
});
if (!enumIndexes.has(name)) {
const index = enumIndexes.set(name, enumIndexes.size).get(name);
enums[index] = _enum;
}
};
this.hardcodedEnums.forEach((e) => appendEnum(e));
this.softEnums.forEach((e) => appendEnum(e));
this.commandData.forEach((commandData) => {
if (commandData.aliases) appendEnum(commandData.aliases);
commandData.overloads.forEach((overload) => {
overload.forEach((parameter) => {
if (parameter.enum) appendEnum(parameter.enum);
if (parameter.postfix) {
if (!postfixIndexes.has(parameter.postfix)) postfixIndexes.set(parameter.postfix, postfixIndexes.size);
}
});
});
});
this.writeUnsignedVarInt(enumValueIndexes.size);
enumValueIndexes.forEach((_index, enumValue) => {
NetworkUtil.writeString(this, enumValue);
});
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(postfixIndexes.size);
postfixIndexes.forEach((_index, postfix) => {
NetworkUtil.writeString(this, postfix);
});
this.writeUnsignedVarInt(enums.length);
enums.forEach((_enum) => {
this.writeEnum(_enum, enumValueIndexes);
});
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(this.commandData.length);
this.commandData.forEach((data) => {
this.writeCommandData(data, enumIndexes, postfixIndexes);
});
this.writeUnsignedVarInt(this.softEnums.length);
this.softEnums.forEach((_enum) => {
this.writeSoftEnum(_enum);
});
this.writeUnsignedVarInt(this.enumConstraints.length);
this.enumConstraints.forEach((constraint) => {
this.writeEnumConstraint(constraint, enumIndexes, enumValueIndexes);
});
}
writeEnum({ name, values }, enumValueMap) {
NetworkUtil.writeString(this, name);
this.writeUnsignedVarInt(values.length);
const listSize = enumValueMap.size;
values.forEach((value) => {
const index = enumValueMap.get(value) ?? -1;
if (index === -1) return;
this.writeEnumValueIndex(index, listSize);
});
}
writeEnumValueIndex(index, valueCount) {
if (valueCount < 256) this.writeByte(index);
else if (valueCount < 65536) this.writeUnsignedShortLE(index);
else this.writeUnsignedIntLE(index);
}
writeCommandData(data, enumIndexes, _postfixIndexes) {
NetworkUtil.writeString(this, data.commandName);
NetworkUtil.writeString(this, data.commandDescription);
this.writeShortLE(data.flags);
this.writeByte(data.permission);
if (data.aliases !== null) this.writeIntLE(enumIndexes.get(data.aliases.name) ?? -1);
else this.writeIntLE(-1);
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(0);
}
writeSoftEnum(_enum) {
NetworkUtil.writeString(this, _enum.name);
this.writeUnsignedVarInt(_enum.values.length);
_enum.values.forEach((value) => {
NetworkUtil.writeString(this, value);
});
}
writeEnumConstraint(constraint, enumIndexes, enumValueIndexes) {
this.writeIntLE(enumValueIndexes.get(constraint.getAffectedValue()) ?? 0);
this.writeIntLE(enumIndexes.get(constraint.getEnum().name) ?? 0);
this.writeUnsignedVarInt(constraint.getConstraints().length);
constraint.getConstraints().forEach((v) => {
this.writeByte(v);
});
}
};
//#endregion
export { AvailableCommandsPacket as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25ldHdvcmsvcGFja2V0L0F2YWlsYWJsZUNvbW1hbmRzUGFja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5ldHdvcmtVdGlsIH0gZnJvbSAnLi4vLi4vbmV0d29yay9OZXR3b3JrVXRpbCc7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IHR5cGUgQ29tbWFuZERhdGEgZnJvbSAnLi4vdHlwZS9Db21tYW5kRGF0YSc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRFbnVtIH0gZnJvbSAnLi4vdHlwZS9Db21tYW5kRW51bSc7XG5pbXBvcnQgdHlwZSBDb21tYW5kRW51bUNvbnN0cmFpbnQgZnJvbSAnLi4vdHlwZS9Db21tYW5kRW51bUNvbnN0cmFpbnQnO1xuaW1wb3J0IERhdGFQYWNrZXQgZnJvbSAnLi9EYXRhUGFja2V0JztcblxuLyoqXG4gKiBBdmFpbGFibGVDb21tYW5kc1BhY2tldCBpcyBzZW50IGJ5IHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudCB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBjb21tYW5kcy5cbiAqIEBUT0RPOiBBcmd1bWVudCB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdmFpbGFibGVDb21tYW5kc1BhY2tldCBleHRlbmRzIERhdGFQYWNrZXQge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5BdmFpbGFibGVDb21tYW5kc1BhY2tldDtcblxuICAgIHB1YmxpYyBBUkdfRkxBR19WQUxJRCA9IDB4MTAwMDAwO1xuICAgIHB1YmxpYyBBUkdfRkxBR19JTlQgPSAxO1xuICAgIHB1YmxpYyBBUkdfRkxBR19GTE9BVCA9IDM7XG4gICAgcHVibGljIEFSR19UWVBFX1dJTERDQVJEX0lOVCA9IDU7XG4gICAgcHVibGljIEFSR19UWVBFX1NUUklORyA9IDU2O1xuICAgIHB1YmxpYyBBUkdfVFlQRV9JTlRfUE9TSVRJT04gPSA2NDtcbiAgICBwdWJsaWMgQVJHX1RZUEVfUE9TSVRJT04gPSA2NTtcbiAgICBwdWJsaWMgQVJHX0ZMQUdfRU5VTSA9IDB4MjAwMDAwO1xuICAgIHB1YmxpYyBBUkdfRkxBR19QT1NURklYID0gMHgxMDAwMDAwO1xuICAgIHB1YmxpYyBBUkdfRkxBR19TT0ZUX0VOVU0gPSAweDQwMDAwMDA7XG5cbiAgICBwdWJsaWMgY29tbWFuZERhdGE6IENvbW1hbmREYXRhW10gPSBbXTtcbiAgICBwdWJsaWMgaGFyZGNvZGVkRW51bXM6IENvbW1hbmRFbnVtW10gPSBbXTtcbiAgICBwdWJsaWMgc29mdEVudW1zOiBDb21tYW5kRW51bVtdID0gW107XG4gICAgcHVibGljIGVudW1Db25zdHJhaW50czogQ29tbWFuZEVudW1Db25zdHJhaW50W10gPSBbXTtcblxuICAgIHB1YmxpYyBlbmNvZGVQYXlsb2FkKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVJbmRleGVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBwb3N0Zml4SW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZW51bXM6IENvbW1hbmRFbnVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgZW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHNvZnRFbnVtczogQ29tbWFuZEVudW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBzb2Z0RW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgY29uc3QgYXBwZW5kRW51bSA9IChfZW51bTogQ29tbWFuZEVudW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgc29mdCwgdmFsdWVzIH0gPSBfZW51bTtcblxuICAgICAgICAgICAgaWYgKHNvZnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNvZnRFbnVtSW5kZXhlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzb2Z0RW51bUluZGV4ZXMuc2V0KG5hbWUsIHNvZnRFbnVtSW5kZXhlcy5zaXplKS5nZXQobmFtZSkhO1xuICAgICAgICAgICAgICAgICAgICBzb2Z0RW51bXNbaW5kZXhdID0gX2VudW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnVtVmFsdWVJbmRleGVzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlSW5kZXhlcy5zZXQodmFsdWUsIGVudW1WYWx1ZUluZGV4ZXMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWVudW1JbmRleGVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZW51bUluZGV4ZXMuc2V0KG5hbWUsIGVudW1JbmRleGVzLnNpemUpLmdldChuYW1lKSE7XG4gICAgICAgICAgICAgICAgZW51bXNbaW5kZXhdID0gX2VudW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5oYXJkY29kZWRFbnVtcy5mb3JFYWNoKChlKSA9PiBhcHBlbmRFbnVtKGUpKTtcbiAgICAgICAgdGhpcy5zb2Z0RW51bXMuZm9yRWFjaCgoZSkgPT4gYXBwZW5kRW51bShlKSk7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kRGF0YS5mb3JFYWNoKChjb21tYW5kRGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbW1hbmREYXRhLmFsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBhcHBlbmRFbnVtKGNvbW1hbmREYXRhLmFsaWFzZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21tYW5kRGF0YS5vdmVybG9hZHMuZm9yRWFjaCgob3ZlcmxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBvdmVybG9hZC5mb3JFYWNoKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5lbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFbnVtKHBhcmFtZXRlci5lbnVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIucG9zdGZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3N0Zml4SW5kZXhlcy5oYXMocGFyYW1ldGVyLnBvc3RmaXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGZpeEluZGV4ZXMuc2V0KHBhcmFtZXRlci5wb3N0Zml4LCBwb3N0Zml4SW5kZXhlcy5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludChlbnVtVmFsdWVJbmRleGVzLnNpemUpO1xuICAgICAgICBlbnVtVmFsdWVJbmRleGVzLmZvckVhY2goKF9pbmRleDogbnVtYmVyLCBlbnVtVmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgZW51bVZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApOyAvLyBjaGFpbmVkU3ViQ29tbWFuZFZhbHVlTmFtZUluZGV4ZXNcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQocG9zdGZpeEluZGV4ZXMuc2l6ZSk7XG4gICAgICAgIHBvc3RmaXhJbmRleGVzLmZvckVhY2goKF9pbmRleDogbnVtYmVyLCBwb3N0Zml4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHBvc3RmaXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoZW51bXMubGVuZ3RoKTtcbiAgICAgICAgZW51bXMuZm9yRWFjaCgoX2VudW06IENvbW1hbmRFbnVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlRW51bShfZW51bSwgZW51bVZhbHVlSW5kZXhlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gYWxsQ2hhaW5lZFN1YkNvbW1hbmREYXRhXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuY29tbWFuZERhdGEubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5jb21tYW5kRGF0YS5mb3JFYWNoKChkYXRhOiBDb21tYW5kRGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZUNvbW1hbmREYXRhKGRhdGEsIGVudW1JbmRleGVzLCBwb3N0Zml4SW5kZXhlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLnNvZnRFbnVtcy5sZW5ndGgpO1xuICAgICAgICB0aGlzLnNvZnRFbnVtcy5mb3JFYWNoKChfZW51bTogQ29tbWFuZEVudW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVTb2Z0RW51bShfZW51bSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLmVudW1Db25zdHJhaW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzLmVudW1Db25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBDb21tYW5kRW51bUNvbnN0cmFpbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVFbnVtQ29uc3RyYWludChjb25zdHJhaW50LCBlbnVtSW5kZXhlcywgZW51bVZhbHVlSW5kZXhlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVFbnVtKHsgbmFtZSwgdmFsdWVzIH06IENvbW1hbmRFbnVtLCBlbnVtVmFsdWVNYXA6IE1hcDxzdHJpbmcsIG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgbmFtZSk7XG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCh2YWx1ZXMubGVuZ3RoKTtcblxuICAgICAgICBjb25zdCBsaXN0U2l6ZSA9IGVudW1WYWx1ZU1hcC5zaXplO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtVmFsdWVNYXAuZ2V0KHZhbHVlKSA/PyAtMTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMud3JpdGVFbnVtVmFsdWVJbmRleChpbmRleCwgbGlzdFNpemUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRW51bVZhbHVlSW5kZXgoaW5kZXg6IG51bWJlciwgdmFsdWVDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZUNvdW50IDwgMjU2KSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZShpbmRleCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDb3VudCA8IDY1NTM2KSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRTaG9ydExFKGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZEludExFKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVDb21tYW5kRGF0YShcbiAgICAgICAgZGF0YTogQ29tbWFuZERhdGEsXG4gICAgICAgIGVudW1JbmRleGVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICAgICAgICBfcG9zdGZpeEluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgZGF0YS5jb21tYW5kTmFtZSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIGRhdGEuY29tbWFuZERlc2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy53cml0ZVNob3J0TEUoZGF0YS5mbGFncyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlKGRhdGEucGVybWlzc2lvbik7XG5cbiAgICAgICAgaWYgKGRhdGEuYWxpYXNlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUludExFKGVudW1JbmRleGVzLmdldChkYXRhLmFsaWFzZXMubmFtZSkgPz8gLTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZUludExFKC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gY2hhaW5lZFN1YkNvbW1hbmREYXRhXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApO1xuICAgICAgICAvKnRoaXMud3JpdGVVbnNpZ25lZFZhckludChkYXRhLm92ZXJsb2Fkcy5sZW5ndGgpO1xuICAgICAgICBkYXRhLm92ZXJsb2Fkcy5mb3JFYWNoKChvdmVybG9hZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KG92ZXJsb2FkLmxlbmd0aCk7XG4gICAgICAgICAgICBvdmVybG9hZC5mb3JFYWNoKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBwYXJhbWV0ZXIucGFyYW1OYW1lKTtcblxuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcGFyYW1ldGVyLnBhcmFtVHlwZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmVudW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5lbnVtLnNvZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQVJHX0ZMQUdfU09GVF9FTlVNIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFSR19GTEFHX1ZBTElEIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bUluZGV4ZXMuZ2V0KHBhcmFtZXRlci5lbnVtLm5hbWUpID8/IC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0aGlzLkFSR19GTEFHX0VOVU0gfCB0aGlzLkFSR19GTEFHX1ZBTElEIHwgKGVudW1JbmRleGVzLmdldChwYXJhbWV0ZXIuZW51bS5uYW1lKSA/PyAtMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5wb3N0Zml4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHBvc3RmaXhJbmRleGVzLmdldChwYXJhbWV0ZXIucG9zdGZpeCkgPz8gLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IC0xKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0aGlzLkFSR19GTEFHX1BPU1RGSVggfCBrZXk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUludExFKHR5cGUpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHBhcmFtZXRlci5pc09wdGlvbmFsKTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZShwYXJhbWV0ZXIuZmxhZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyovXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZVNvZnRFbnVtKF9lbnVtOiBDb21tYW5kRW51bSk6IHZvaWQge1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBfZW51bS5uYW1lKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KF9lbnVtLnZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBfZW51bS52YWx1ZXMuZm9yRWFjaCgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRW51bUNvbnN0cmFpbnQoXG4gICAgICAgIGNvbnN0cmFpbnQ6IENvbW1hbmRFbnVtQ29uc3RyYWludCxcbiAgICAgICAgZW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIGVudW1WYWx1ZUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUludExFKGVudW1WYWx1ZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQuZ2V0QWZmZWN0ZWRWYWx1ZSgpKSA/PyAwKTtcbiAgICAgICAgdGhpcy53cml0ZUludExFKGVudW1JbmRleGVzLmdldChjb25zdHJhaW50LmdldEVudW0oKS5uYW1lKSA/PyAwKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KGNvbnN0cmFpbnQuZ2V0Q29uc3RyYWludHMoKS5sZW5ndGgpO1xuICAgICAgICBjb25zdHJhaW50LmdldENvbnN0cmFpbnRzKCkuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGUodik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFXQSxJQUFxQiwwQkFBckIsY0FBcUQsV0FBVztDQUM1RCxPQUFjLFFBQVEsWUFBWTtDQUVsQyxpQkFBd0I7Q0FDeEIsZUFBc0I7Q0FDdEIsaUJBQXdCO0NBQ3hCLHdCQUErQjtDQUMvQixrQkFBeUI7Q0FDekIsd0JBQStCO0NBQy9CLG9CQUEyQjtDQUMzQixnQkFBdUI7Q0FDdkIsbUJBQTBCO0NBQzFCLHFCQUE0QjtDQUU1QixjQUFvQyxDQUFDO0NBQ3JDLGlCQUF1QyxDQUFDO0NBQ3hDLFlBQWtDLENBQUM7Q0FDbkMsa0JBQWtELENBQUM7Q0FFbkQsZ0JBQTZCO0VBQ3pCLE1BQU0sbUNBQXdDLElBQUksSUFBSTtFQUN0RCxNQUFNLGlDQUFzQyxJQUFJLElBQUk7RUFDcEQsTUFBTSxRQUF1QixDQUFDO0VBQzlCLE1BQU0sOEJBQW1DLElBQUksSUFBSTtFQUNqRCxNQUFNLFlBQTJCLENBQUM7RUFDbEMsTUFBTSxrQ0FBdUMsSUFBSSxJQUFJO0VBRXJELE1BQU0sY0FBYyxVQUF1QjtHQUN2QyxNQUFNLEVBQUUsTUFBTSxNQUFNLFdBQVc7R0FFL0IsSUFBSSxNQUFNO0lBQ04sSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksR0FBRztLQUM1QixNQUFNLFFBQVEsZ0JBQWdCLElBQUksTUFBTSxnQkFBZ0IsSUFBSSxFQUFFLElBQUksSUFBSTtLQUN0RSxVQUFVLFNBQVM7SUFDdkI7SUFDQTtHQUNKO0dBRUEsT0FBTyxTQUFTLFVBQVU7SUFDdEIsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUssR0FDM0IsaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsSUFBSTtHQUV6RCxDQUFDO0dBQ0QsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEdBQUc7SUFDeEIsTUFBTSxRQUFRLFlBQVksSUFBSSxNQUFNLFlBQVksSUFBSSxFQUFFLElBQUksSUFBSTtJQUM5RCxN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