@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
324 lines (321 loc) • 35.8 kB
JavaScript
import { Suggestions } from '@jsprismarine/brigadier';
import CommandParameter, { CommandParameterFlags, CommandParameterType } from '../network/type/CommandParameter.es.js';
import { Vector3 } from '@jsprismarine/math';
import { getGametypeName, getGametypeId } from '@jsprismarine/minecraft';
import { CommandEnum } from '../network/type/CommandEnum.es.js';
import ParseTargetSelector from '../utils/ParseTargetSelector.es.js';
import ParseTildeCaretNotation from '../utils/ParseTildeCaretNotation.es.js';
class CommandArgument {
getReadableType() {
return "";
}
// eslint-disable-next-line unused-imports/no-unused-vars
getParameters(server) {
return /* @__PURE__ */ new Set();
}
}
class CommandArgumentGamemode {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "gameMode";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
return getGametypeName(getGametypeId(reader.readString()));
}
async listSuggestions(_context, _builder) {
return Suggestions.empty();
}
getExamples() {
return ["survival", "creative", "adventure", "spectator"];
}
getReadableType() {
return this.name;
}
getParameters() {
const gameModeEnum = new CommandEnum();
gameModeEnum.name = "GameMode";
gameModeEnum.values = ["survival", "creative", "adventure", "spectator"];
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
isOptional: this.optional,
flags: this.flags,
enum: gameModeEnum,
postfix: this.postfix
})
]);
}
}
class CommandArgumentMob {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "entityType";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
let str = "";
while (reader.canRead()) {
const pos = reader.getCursor();
const char = reader.read();
if (char === " ") {
reader.setCursor(pos);
break;
}
str += char;
}
return str;
}
async listSuggestions(_context, _builder) {
return Suggestions.empty();
}
getExamples() {
return [];
}
getReadableType() {
return this.name;
}
getParameters() {
const entityTypeEnum = new CommandEnum();
entityTypeEnum.name = "EntityType";
entityTypeEnum.values = [];
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
isOptional: this.optional,
flags: this.flags,
enum: entityTypeEnum,
postfix: this.postfix
})
]);
}
}
class CommandArgumentEntity {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "target";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, context) {
let player = "";
while (reader.canRead()) {
const pos = reader.getCursor();
const char = reader.read();
if (char === " ") {
reader.setCursor(pos);
break;
}
player += char;
}
if (player.startsWith("@"))
try {
return ParseTargetSelector({
input: player,
source: context.getSource(),
entities: context.getSource().getWorld().getEntities()
});
} catch (error) {
if (!error.message.includes("no results")) throw error;
return [];
}
return [context.getSource().getServer().getSessionManager().getPlayerByExactName(player)];
}
getReadableType() {
return this.name;
}
getParameters() {
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
paramType: CommandParameterType.Target,
isOptional: this.optional,
flags: this.flags,
postfix: this.postfix
})
]);
}
}
class CommandArgumentPosition extends Vector3 {
name;
optional;
flags;
postfix;
constructor(data) {
super(0, 0, 0);
this.name = data?.name ?? "position";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, context) {
const getPos = () => {
let pos = "";
while (reader.canRead()) {
const cursor = reader.getCursor();
const char = reader.read();
if (char === " ") {
reader.setCursor(cursor);
break;
}
pos += char;
}
return pos;
};
this.setX(
ParseTildeCaretNotation({
input: getPos(),
source: context.getSource(),
type: "x"
})
);
reader.skip();
this.setY(
ParseTildeCaretNotation({
input: getPos(),
source: context.getSource(),
type: "y"
})
);
reader.skip();
this.setZ(
ParseTildeCaretNotation({
input: getPos(),
source: context.getSource(),
type: "z"
})
);
return this;
}
getReadableType() {
return this.name;
}
getParameters() {
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
paramType: CommandParameterType.Position,
isOptional: this.optional,
flags: this.flags,
postfix: this.postfix
})
]);
}
}
class CommandArgumentCommand {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "command";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
const command = reader.readString();
return command;
}
getReadableType() {
return this.name;
}
getParameters() {
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
paramType: CommandParameterType.Position,
isOptional: this.optional,
flags: this.flags,
postfix: this.postfix
})
]);
}
}
class BooleanArgumentCommand {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "boolean";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
const boolean = reader.readString();
if (boolean === "true") return true;
return false;
}
getReadableType() {
return this.name;
}
getParameters() {
const booleanEnum = new CommandEnum();
booleanEnum.name = "Boolean";
booleanEnum.values = ["true", "false"];
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
isOptional: this.optional,
enum: booleanEnum,
flags: this.flags,
postfix: this.postfix
})
]);
}
}
class PlayerArgumentCommand {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "player";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
const player = reader.readString();
return player;
}
getReadableType() {
return this.name;
}
getParameters(server) {
const playerEnum = new CommandEnum();
playerEnum.name = "Player";
try {
playerEnum.values = server.getSessionManager().getAllPlayers().map((player) => player.getName());
} catch {
playerEnum.values = [];
}
return /* @__PURE__ */ new Set([
new CommandParameter({
paramName: this.name,
isOptional: this.optional,
enum: playerEnum,
flags: this.flags,
postfix: this.postfix
})
]);
}
}
export { BooleanArgumentCommand, CommandArgument, CommandArgumentCommand, CommandArgumentEntity, CommandArgumentGamemode, CommandArgumentMob, CommandArgumentPosition, PlayerArgumentCommand };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWFuZEFyZ3VtZW50cy5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmQvQ29tbWFuZEFyZ3VtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1hbmRDb250ZXh0LCBTdHJpbmdSZWFkZXIgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JyaWdhZGllcic7XG5pbXBvcnQgeyBTdWdnZXN0aW9ucyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYnJpZ2FkaWVyJztcbmltcG9ydCBDb21tYW5kUGFyYW1ldGVyLCB7IENvbW1hbmRQYXJhbWV0ZXJGbGFncywgQ29tbWFuZFBhcmFtZXRlclR5cGUgfSBmcm9tICcuLi9uZXR3b3JrL3R5cGUvQ29tbWFuZFBhcmFtZXRlcic7XG5cbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICdAanNwcmlzbWFyaW5lL21hdGgnO1xuaW1wb3J0IHsgZ2V0R2FtZXR5cGVJZCwgZ2V0R2FtZXR5cGVOYW1lIH0gZnJvbSAnQGpzcHJpc21hcmluZS9taW5lY3JhZnQnO1xuaW1wb3J0IHR5cGUgUGxheWVyIGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCB7IENvbW1hbmRFbnVtIH0gZnJvbSAnLi4vbmV0d29yay90eXBlL0NvbW1hbmRFbnVtJztcbmltcG9ydCBQYXJzZVRhcmdldFNlbGVjdG9yIGZyb20gJy4uL3V0aWxzL1BhcnNlVGFyZ2V0U2VsZWN0b3InO1xuaW1wb3J0IFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uIGZyb20gJy4uL3V0aWxzL1BhcnNlVGlsZGVDYXJldE5vdGF0aW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKHNlcnZlcjogU2VydmVyKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdnYW1lTW9kZSc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICByZXR1cm4gZ2V0R2FtZXR5cGVOYW1lKGdldEdhbWV0eXBlSWQocmVhZGVyLnJlYWRTdHJpbmcoKSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgbGlzdFN1Z2dlc3Rpb25zKF9jb250ZXh0OiBhbnksIF9idWlsZGVyOiBhbnkpIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICByZXR1cm4gU3VnZ2VzdGlvbnMuZW1wdHkoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEV4YW1wbGVzKCkge1xuICAgICAgICByZXR1cm4gWydzdXJ2aXZhbCcsICdjcmVhdGl2ZScsICdhZHZlbnR1cmUnLCAnc3BlY3RhdG9yJ107XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IGdhbWVNb2RlRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBnYW1lTW9kZUVudW0ubmFtZSA9ICdHYW1lTW9kZSc7XG5cbiAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgZHluYW1pY1xuICAgICAgICBnYW1lTW9kZUVudW0udmFsdWVzID0gWydzdXJ2aXZhbCcsICdjcmVhdGl2ZScsICdhZHZlbnR1cmUnLCAnc3BlY3RhdG9yJ107XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGdhbWVNb2RlRW51bSxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudE1vYiBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdlbnRpdHlUeXBlJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgd2hpbGUgKHJlYWRlci5jYW5SZWFkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgbGlzdFN1Z2dlc3Rpb25zKF9jb250ZXh0OiBhbnksIF9idWlsZGVyOiBhbnkpIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICByZXR1cm4gU3VnZ2VzdGlvbnMuZW1wdHkoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEV4YW1wbGVzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVR5cGVFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGVudGl0eVR5cGVFbnVtLm5hbWUgPSAnRW50aXR5VHlwZSc7XG4gICAgICAgIGVudGl0eVR5cGVFbnVtLnZhbHVlcyA9IFtdOyAvL09iamVjdC5lbnRyaWVzKEVudGl0aWVzKS5tYXAoKFssIGVudGl0eV0pID0+IGVudGl0eS5NT0JfSUQpO1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBlbnVtOiBlbnRpdHlUeXBlRW51bSxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudEVudGl0eSBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICd0YXJnZXQnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBsZXQgcGxheWVyID0gJyc7XG4gICAgICAgIHdoaWxlIChyZWFkZXIuY2FuUmVhZCgpKSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSByZWFkZXIuZ2V0Q3Vyc29yKCk7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChjaGFyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIuc2V0Q3Vyc29yKHBvcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBsYXllciArPSBjaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYXllci5zdGFydHNXaXRoKCdAJykpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVRhcmdldFNlbGVjdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdGllczogY29udGV4dC5nZXRTb3VyY2UoKS5nZXRXb3JsZCgpLmdldEVudGl0aWVzKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXJyb3IgYXMgYW55KS5tZXNzYWdlLmluY2x1ZGVzKCdubyByZXN1bHRzJykpIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2NvbnRleHQuZ2V0U291cmNlKCkuZ2V0U2VydmVyKCkuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJCeUV4YWN0TmFtZShwbGF5ZXIpXTsgLy8gVE9ETzogYnkgbmFtZSBub3QgZXhhY3RcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuVGFyZ2V0LFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRQb3NpdGlvbiBleHRlbmRzIFZlY3RvcjMgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgc3VwZXIoMCwgMCwgMCk7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3Bvc2l0aW9uJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIGNvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgY29uc3QgZ2V0UG9zID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBvcyA9ICcnO1xuICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5jYW5SZWFkKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3IgPSByZWFkZXIuZ2V0Q3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhciA9IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2V0Q3Vyc29yKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBvcyArPSBjaGFyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNldFgoXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJlYWRlci5za2lwKCk7XG4gICAgICAgIHRoaXMuc2V0WShcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd5J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmVhZGVyLnNraXAoKTtcbiAgICAgICAgdGhpcy5zZXRaKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3onXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnY29tbWFuZCc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBjb21tYW5kID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcblxuICAgICAgICByZXR1cm4gY29tbWFuZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5Bcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnYm9vbGVhbic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBib29sZWFuID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcblxuICAgICAgICBpZiAoYm9vbGVhbiA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW5FbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGJvb2xlYW5FbnVtLm5hbWUgPSAnQm9vbGVhbic7XG4gICAgICAgIGJvb2xlYW5FbnVtLnZhbHVlcyA9IFsndHJ1ZScsICdmYWxzZSddO1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBlbnVtOiBib29sZWFuRW51bSxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllckFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdwbGF5ZXInO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoc2VydmVyOiBTZXJ2ZXIpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBwbGF5ZXJFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIHBsYXllckVudW0ubmFtZSA9ICdQbGF5ZXInO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGxheWVyRW51bS52YWx1ZXMgPSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgICAgICAubWFwKChwbGF5ZXIpID0+IHBsYXllci5nZXROYW1lKCkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHBsYXllckVudW0udmFsdWVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBlbnVtOiBwbGF5ZXJFbnVtLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBWU8sTUFBZSxlQUFnQixDQUFBO0FBQUEsRUFDM0IsZUFBMEIsR0FBQTtBQUM3QixJQUFPLE9BQUEsRUFBQTtBQUFBO0FBQ1g7QUFBQSxFQUVPLGNBQWMsTUFBbUQsRUFBQTtBQUNwRSxJQUFB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