UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

309 lines (308 loc) • 30.4 kB
import CommandParameter, { CommandParameterFlags, CommandParameterType } from "../network/type/CommandParameter.es.js"; import { CommandEnum } from "../network/type/CommandEnum.es.js"; import ParseTargetSelector from "../utils/ParseTargetSelector.es.js"; import ParseTildeCaretNotation from "../utils/ParseTildeCaretNotation.es.js"; import { Vector3 } from "@jsprismarine/math"; import { getGametypeId, getGametypeName } from "@jsprismarine/minecraft"; import { Suggestions } from "@jsprismarine/brigadier"; //#region src/command/CommandArguments.ts var CommandArgument = class { getReadableType() { return ""; } getParameters(server) { return /* @__PURE__ */ new Set(); } }; var CommandArgumentGamemode = class { 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 new Set([new CommandParameter({ paramName: this.name, isOptional: this.optional, flags: this.flags, enum: gameModeEnum, postfix: this.postfix })]); } }; var CommandArgumentMob = class { 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 new Set([new CommandParameter({ paramName: this.name, isOptional: this.optional, flags: this.flags, enum: entityTypeEnum, postfix: this.postfix })]); } }; var CommandArgumentEntity = class { 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 new Set([new CommandParameter({ paramName: this.name, paramType: CommandParameterType.Target, isOptional: this.optional, flags: this.flags, postfix: this.postfix })]); } }; var CommandArgumentPosition = class 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 new Set([new CommandParameter({ paramName: this.name, paramType: CommandParameterType.Position, isOptional: this.optional, flags: this.flags, postfix: this.postfix })]); } }; var CommandArgumentCommand = class { 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) { return reader.readString(); } getReadableType() { return this.name; } getParameters() { return new Set([new CommandParameter({ paramName: this.name, paramType: CommandParameterType.Position, isOptional: this.optional, flags: this.flags, postfix: this.postfix })]); } }; var BooleanArgumentCommand = class { 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) { if (reader.readString() === "true") return true; return false; } getReadableType() { return this.name; } getParameters() { const booleanEnum = new CommandEnum(); booleanEnum.name = "Boolean"; booleanEnum.values = ["true", "false"]; return new Set([new CommandParameter({ paramName: this.name, isOptional: this.optional, enum: booleanEnum, flags: this.flags, postfix: this.postfix })]); } }; var PlayerArgumentCommand = class { 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) { return reader.readString(); } 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 new Set([new CommandParameter({ paramName: this.name, isOptional: this.optional, enum: playerEnum, flags: this.flags, postfix: this.postfix })]); } }; //#endregion export { BooleanArgumentCommand, CommandArgument, CommandArgumentCommand, CommandArgumentEntity, CommandArgumentGamemode, CommandArgumentMob, CommandArgumentPosition, PlayerArgumentCommand }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWFuZEFyZ3VtZW50cy5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZC9Db21tYW5kQXJndW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tbWFuZENvbnRleHQsIFN0cmluZ1JlYWRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYnJpZ2FkaWVyJztcbmltcG9ydCB7IFN1Z2dlc3Rpb25zIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IENvbW1hbmRQYXJhbWV0ZXIsIHsgQ29tbWFuZFBhcmFtZXRlckZsYWdzLCBDb21tYW5kUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kUGFyYW1ldGVyJztcblxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgeyBnZXRHYW1ldHlwZUlkLCBnZXRHYW1ldHlwZU5hbWUgfSBmcm9tICdAanNwcmlzbWFyaW5lL21pbmVjcmFmdCc7XG5pbXBvcnQgdHlwZSBQbGF5ZXIgZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IHsgQ29tbWFuZEVudW0gfSBmcm9tICcuLi9uZXR3b3JrL3R5cGUvQ29tbWFuZEVudW0nO1xuaW1wb3J0IFBhcnNlVGFyZ2V0U2VsZWN0b3IgZnJvbSAnLi4vdXRpbHMvUGFyc2VUYXJnZXRTZWxlY3Rvcic7XG5pbXBvcnQgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24gZnJvbSAnLi4vdXRpbHMvUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoc2VydmVyOiBTZXJ2ZXIpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudEdhbWVtb2RlIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ2dhbWVNb2RlJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIHJldHVybiBnZXRHYW1ldHlwZU5hbWUoZ2V0R2FtZXR5cGVJZChyZWFkZXIucmVhZFN0cmluZygpKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBsaXN0U3VnZ2VzdGlvbnMoX2NvbnRleHQ6IGFueSwgX2J1aWxkZXI6IGFueSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHJldHVybiBTdWdnZXN0aW9ucy5lbXB0eSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0RXhhbXBsZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3N1cnZpdmFsJywgJ2NyZWF0aXZlJywgJ2FkdmVudHVyZScsICdzcGVjdGF0b3InXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgZ2FtZU1vZGVFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGdhbWVNb2RlRW51bS5uYW1lID0gJ0dhbWVNb2RlJztcblxuICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBkeW5hbWljXG4gICAgICAgIGdhbWVNb2RlRW51bS52YWx1ZXMgPSBbJ3N1cnZpdmFsJywgJ2NyZWF0aXZlJywgJ2FkdmVudHVyZScsICdzcGVjdGF0b3InXTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgZW51bTogZ2FtZU1vZGVFbnVtLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50TW9iIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ2VudGl0eVR5cGUnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICB3aGlsZSAocmVhZGVyLmNhblJlYWQoKSkge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gcmVhZGVyLmdldEN1cnNvcigpO1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnNldEN1cnNvcihwb3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHIgKz0gY2hhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBsaXN0U3VnZ2VzdGlvbnMoX2NvbnRleHQ6IGFueSwgX2J1aWxkZXI6IGFueSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHJldHVybiBTdWdnZXN0aW9ucy5lbXB0eSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0RXhhbXBsZXMoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VHlwZUVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgZW50aXR5VHlwZUVudW0ubmFtZSA9ICdFbnRpdHlUeXBlJztcbiAgICAgICAgZW50aXR5VHlwZUVudW0udmFsdWVzID0gW107IC8vT2JqZWN0LmVudHJpZXMoRW50aXRpZXMpLm1hcCgoWywgZW50aXR5XSkgPT4gZW50aXR5Lk1PQl9JRCk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGVudGl0eVR5cGVFbnVtLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50RW50aXR5IGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3RhcmdldCc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBwbGF5ZXIgPSAnJztcbiAgICAgICAgd2hpbGUgKHJlYWRlci5jYW5SZWFkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxheWVyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxheWVyLnN0YXJ0c1dpdGgoJ0AnKSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVGFyZ2V0U2VsZWN0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzOiBjb250ZXh0LmdldFNvdXJjZSgpLmdldFdvcmxkKCkuZ2V0RW50aXRpZXMoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShlcnJvciBhcyBhbnkpLm1lc3NhZ2UuaW5jbHVkZXMoJ25vIHJlc3VsdHMnKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dC5nZXRTb3VyY2UoKS5nZXRTZXJ2ZXIoKS5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckJ5RXhhY3ROYW1lKHBsYXllcildOyAvLyBUT0RPOiBieSBuYW1lIG5vdCBleGFjdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5UYXJnZXQsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudFBvc2l0aW9uIGV4dGVuZHMgVmVjdG9yMyBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICBzdXBlcigwLCAwLCAwKTtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAncG9zaXRpb24nO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBnZXRQb3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9zID0gJyc7XG4gICAgICAgICAgICB3aGlsZSAocmVhZGVyLmNhblJlYWQoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zICs9IGNoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2V0WChcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd4J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmVhZGVyLnNraXAoKTtcbiAgICAgICAgdGhpcy5zZXRZKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3knXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZWFkZXIuc2tpcCgpO1xuICAgICAgICB0aGlzLnNldFooXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneidcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdjb21tYW5kJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdib29sZWFuJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW4gPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIGlmIChib29sZWFuID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgYm9vbGVhbkVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgYm9vbGVhbkVudW0ubmFtZSA9ICdCb29sZWFuJztcbiAgICAgICAgYm9vbGVhbkVudW0udmFsdWVzID0gWyd0cnVlJywgJ2ZhbHNlJ107XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IGJvb2xlYW5FbnVtLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyQXJndW1lbnRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3BsYXllcic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycyhzZXJ2ZXI6IFNlcnZlcik6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IHBsYXllckVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgcGxheWVyRW51bS5uYW1lID0gJ1BsYXllcic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbGF5ZXJFbnVtLnZhbHVlcyA9IHNlcnZlclxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoKHBsYXllcikgPT4gcGxheWVyLmdldE5hbWUoKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcGxheWVyRW51bS52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IHBsYXllckVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBWUEsSUFBc0Isa0JBQXRCLE1BQXNDO0NBQ2xDLGtCQUFpQztFQUM3QixPQUFPO0NBQ1g7Q0FFQSxjQUFxQixRQUFtRDtFQUNwRSx1QkFBTyxJQUFJLElBQUk7Q0FDbkI7QUFDSjtBQUVBLElB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