UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

189 lines (188 loc) • 24.2 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const require_network_NetworkUtil = require("../../network/NetworkUtil.cjs.cjs"); const require_utils_skin_SkinAnimation = require("./SkinAnimation.cjs.cjs"); const require_utils_skin_SkinCape = require("./SkinCape.cjs.cjs"); const require_utils_skin_SkinImage = require("./SkinImage.cjs.cjs"); const require_utils_skin_skin_persona_SkinPersona = require("./skin-persona/SkinPersona.cjs.cjs"); const require_utils_skin_skin_persona_SkinPersonaPiece = require("./skin-persona/SkinPersonaPiece.cjs.cjs"); const require_utils_skin_skin_persona_SkinPersonaPieceTintColor = require("./skin-persona/SkinPersonaPieceTintColor.cjs.cjs"); //#region src/utils/skin/Skin.ts var Skin = class Skin { id; playFabId; resourcePatch; image; animations = /* @__PURE__ */ new Set(); cape; geometry; animationData; premium; persona; capeOnClassicSkin; color = "#0"; armSize = "wide"; personaData; /** * Full skin ID, computed because * not sent on JWT. */ fullId; isTrusted = true; /** * Loads a skin from a JSON file containing skin data * using minecraft bedrock login fields. * * (loads the skin persona) */ static fromJWT(jwt) { const skin = new Skin(); skin.id = jwt.SkinId; skin.resourcePatch = Buffer.from(jwt.SkinResourcePatch, "base64").toString(); skin.image = new require_utils_skin_SkinImage.default({ width: jwt.SkinImageWidth, height: jwt.SkinImageHeight, data: Buffer.from(jwt.SkinData, "base64") }); skin.playFabId = jwt.PlayFabId; skin.color = jwt.SkinColor; skin.armSize = jwt.ArmSize; for (const animation of jwt.AnimatedImageData) skin.animations.add(new require_utils_skin_SkinAnimation.default({ image: new require_utils_skin_SkinImage.default({ width: animation.ImageWidth, height: animation.ImageHeight, data: Buffer.from(animation.Image, "base64") }), frames: animation.Frames, type: animation.Type, expression: animation.AnimationExpression })); skin.cape = new require_utils_skin_SkinCape.default({ id: jwt.CapeId, image: new require_utils_skin_SkinImage.default({ width: jwt.CapeImageWidth, height: jwt.CapeImageHeight, data: Buffer.from(jwt.CapeData, "base64") }) }); skin.geometry = Buffer.from(jwt.SkinGeometryData, "base64").toString(); skin.animationData = Buffer.from(jwt.SkinAnimationData, "base64").toString(); skin.premium = jwt.PremiumSkin; skin.persona = jwt.PersonaSkin; skin.capeOnClassicSkin = jwt.CapeOnClassicSkin; if (skin.persona) { skin.personaData = new require_utils_skin_skin_persona_SkinPersona.default(); for (const personaPiece of jwt.PersonaPieces) skin.personaData.getPieces().add(new require_utils_skin_skin_persona_SkinPersonaPiece.default({ def: personaPiece.IsDefault, packId: personaPiece.PackId, pieceId: personaPiece.PieceId, pieceType: personaPiece.PieceType, productId: personaPiece.ProductId })); for (const pieceTintColor of jwt.PieceTintColors) { const tintColor = new require_utils_skin_skin_persona_SkinPersonaPieceTintColor.default(); tintColor.getColors().push(...pieceTintColor.Colors); tintColor.setPieceType(pieceTintColor.PieceType); skin.personaData.getTintColors().add(tintColor); } } skin.fullId = skin.id + skin.getCape().getId(); return skin; } networkSerialize(stream) { require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getId()); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getPlayFabId()); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getResourcePatch()); this.getImage().networkSerialize(stream); stream.writeUnsignedIntLE(this.getAnimations().size); for (const animation of this.getAnimations()) { animation.getImage().networkSerialize(stream); stream.writeUnsignedIntLE(animation.getType()); stream.writeFloatLE(animation.getFrames()); stream.writeUnsignedIntLE(animation.getExpression()); } this.getCape().getImage().networkSerialize(stream); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getGeometry()); require_network_NetworkUtil.NetworkUtil.writeString(stream, "0.0.0"); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getAnimationData()); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getCape().getId()); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getFullId()); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getArmSize()); require_network_NetworkUtil.NetworkUtil.writeString(stream, this.getColor()); if (this.isPersona()) { stream.writeUnsignedIntLE(this.getPersonaData().getPieces().size); for (const personaPiece of this.getPersonaData().getPieces()) { require_network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getPieceId()); require_network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getPieceType()); require_network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getPackId()); stream.writeBoolean(personaPiece.isDefault()); require_network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getProductId()); } stream.writeUnsignedIntLE(this.getPersonaData().getTintColors().size); for (const tint of this.getPersonaData().getTintColors()) { require_network_NetworkUtil.NetworkUtil.writeString(stream, tint.getPieceType()); stream.writeUnsignedIntLE(tint.getColors().length); for (const color of tint.getColors()) require_network_NetworkUtil.NetworkUtil.writeString(stream, color); } } else { stream.writeUnsignedIntLE(0); stream.writeUnsignedIntLE(0); } stream.writeBoolean(this.isPremium()); stream.writeBoolean(this.isPersona()); stream.writeBoolean(this.isCapeOnClassicSkin()); stream.writeBoolean(false); stream.writeBoolean(true); } getId() { return this.id; } getFullId() { return this.fullId || this.getId() + this.getCape().getId(); } getPlayFabId() { return this.playFabId; } getResourcePatch() { return this.resourcePatch; } getImage() { return this.image; } getAnimations() { return this.animations; } getAnimationData() { return this.animationData; } isPersona() { return this.persona; } isPremium() { return this.premium; } isCapeOnClassicSkin() { return this.capeOnClassicSkin; } getColor() { return this.color; } getArmSize() { return this.armSize; } getPersonaData() { return this.personaData; } getGeometry() { return this.geometry; } getCape() { return this.cape; } }; //#endregion exports.default = Skin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbi5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9za2luL1NraW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBOZXR3b3JrVXRpbCB9IGZyb20gJy4uLy4uL25ldHdvcmsvTmV0d29ya1V0aWwnO1xuaW1wb3J0IFNraW5BbmltYXRpb24gZnJvbSAnLi9Ta2luQW5pbWF0aW9uJztcbmltcG9ydCBTa2luQ2FwZSBmcm9tICcuL1NraW5DYXBlJztcbmltcG9ydCBTa2luSW1hZ2UgZnJvbSAnLi9Ta2luSW1hZ2UnO1xuaW1wb3J0IFNraW5QZXJzb25hIGZyb20gJy4vc2tpbi1wZXJzb25hL1NraW5QZXJzb25hJztcbmltcG9ydCBTa2luUGVyc29uYVBpZWNlIGZyb20gJy4vc2tpbi1wZXJzb25hL1NraW5QZXJzb25hUGllY2UnO1xuaW1wb3J0IFNraW5QZXJzb25hUGllY2VUaW50Q29sb3IgZnJvbSAnLi9za2luLXBlcnNvbmEvU2tpblBlcnNvbmFQaWVjZVRpbnRDb2xvcic7XG5cbmludGVyZmFjZSBJbWFnZSB7XG4gICAgSW1hZ2VXaWR0aDogbnVtYmVyO1xuICAgIEltYWdlSGVpZ2h0OiBudW1iZXI7XG4gICAgSW1hZ2U6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFuaW1hdGVkSW1hZ2VEYXRhIGV4dGVuZHMgSW1hZ2Uge1xuICAgIEZyYW1lczogbnVtYmVyO1xuICAgIFR5cGU6IG51bWJlcjtcbiAgICBBbmltYXRpb25FeHByZXNzaW9uOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQZXJzb25hUGllY2Uge1xuICAgIElzRGVmYXVsdDogYm9vbGVhbjtcbiAgICBQYWNrSWQ6IHN0cmluZztcbiAgICBQaWVjZUlkOiBzdHJpbmc7XG4gICAgUGllY2VUeXBlOiBzdHJpbmc7XG4gICAgUHJvZHVjdElkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQaWVjZVRpbnRDb2xvciB7XG4gICAgQ29sb3JzOiBzdHJpbmdbXTtcbiAgICBQaWVjZVR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEpXVCB7XG4gICAgU2tpbklkOiBzdHJpbmc7XG4gICAgQ2FwZUlkOiBzdHJpbmc7XG4gICAgU2tpblJlc291cmNlUGF0Y2g6IHN0cmluZztcbiAgICBQbGF5RmFiSWQ6IHN0cmluZztcbiAgICBTa2luSW1hZ2VIZWlnaHQ6IG51bWJlcjtcbiAgICBTa2luSW1hZ2VXaWR0aDogbnVtYmVyO1xuICAgIFNraW5HZW9tZXRyeURhdGE6IHN0cmluZztcbiAgICBTa2luQW5pbWF0aW9uRGF0YTogc3RyaW5nO1xuICAgIENhcGVJbWFnZUhlaWdodDogbnVtYmVyO1xuICAgIENhcGVJbWFnZVdpZHRoOiBudW1iZXI7XG4gICAgQ2FwZU9uQ2xhc3NpY1NraW46IGJvb2xlYW47XG4gICAgU2tpbkRhdGE6IHN0cmluZztcbiAgICBDYXBlRGF0YTogc3RyaW5nO1xuICAgIFByZW1pdW1Ta2luOiBib29sZWFuO1xuICAgIFBlcnNvbmFTa2luOiBib29sZWFuO1xuICAgIFNraW5Db2xvcjogc3RyaW5nO1xuICAgIEFybVNpemU6IHN0cmluZztcbiAgICBBbmltYXRlZEltYWdlRGF0YTogQW5pbWF0ZWRJbWFnZURhdGFbXTtcbiAgICBQZXJzb25hUGllY2VzOiBQZXJzb25hUGllY2VbXTtcbiAgICBQaWVjZVRpbnRDb2xvcnM6IFBpZWNlVGludENvbG9yW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNraW4ge1xuICAgIHByaXZhdGUgaWQhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwbGF5RmFiSWQhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZXNvdXJjZVBhdGNoITogc3RyaW5nO1xuICAgIHByaXZhdGUgaW1hZ2UhOiBTa2luSW1hZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhbmltYXRpb25zOiBTZXQ8U2tpbkFuaW1hdGlvbj4gPSBuZXcgU2V0KCk7XG4gICAgcHJpdmF0ZSBjYXBlITogU2tpbkNhcGU7XG4gICAgcHJpdmF0ZSBnZW9tZXRyeSE6IHN0cmluZztcbiAgICBwcml2YXRlIGFuaW1hdGlvbkRhdGEhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwcmVtaXVtITogYm9vbGVhbjtcbiAgICBwcml2YXRlIHBlcnNvbmEhOiBib29sZWFuO1xuICAgIHByaXZhdGUgY2FwZU9uQ2xhc3NpY1NraW4hOiBib29sZWFuO1xuICAgIHByaXZhdGUgY29sb3IgPSAnIzAnO1xuICAgIHByaXZhdGUgYXJtU2l6ZSA9ICd3aWRlJztcbiAgICBwcml2YXRlIHBlcnNvbmFEYXRhITogU2tpblBlcnNvbmE7XG5cbiAgICAvKipcbiAgICAgKiBGdWxsIHNraW4gSUQsIGNvbXB1dGVkIGJlY2F1c2VcbiAgICAgKiBub3Qgc2VudCBvbiBKV1QuXG4gICAgICovXG4gICAgcHVibGljIGZ1bGxJZCE6IHN0cmluZztcbiAgICBwdWJsaWMgaXNUcnVzdGVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgc2tpbiBmcm9tIGEgSlNPTiBmaWxlIGNvbnRhaW5pbmcgc2tpbiBkYXRhXG4gICAgICogdXNpbmcgbWluZWNyYWZ0IGJlZHJvY2sgbG9naW4gZmllbGRzLlxuICAgICAqXG4gICAgICogKGxvYWRzIHRoZSBza2luIHBlcnNvbmEpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSldUKGp3dDogSldUKTogU2tpbiB7XG4gICAgICAgIGNvbnN0IHNraW4gPSBuZXcgU2tpbigpO1xuXG4gICAgICAgIC8vIFJlYWQgc2tpblxuICAgICAgICBza2luLmlkID0gand0LlNraW5JZDtcbiAgICAgICAgc2tpbi5yZXNvdXJjZVBhdGNoID0gQnVmZmVyLmZyb20oand0LlNraW5SZXNvdXJjZVBhdGNoLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcbiAgICAgICAgc2tpbi5pbWFnZSA9IG5ldyBTa2luSW1hZ2Uoe1xuICAgICAgICAgICAgd2lkdGg6IGp3dC5Ta2luSW1hZ2VXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogand0LlNraW5JbWFnZUhlaWdodCxcbiAgICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGp3dC5Ta2luRGF0YSwgJ2Jhc2U2NCcpXG4gICAgICAgIH0pO1xuICAgICAgICBza2luLnBsYXlGYWJJZCA9IGp3dC5QbGF5RmFiSWQ7XG4gICAgICAgIHNraW4uY29sb3IgPSBqd3QuU2tpbkNvbG9yO1xuICAgICAgICBza2luLmFybVNpemUgPSBqd3QuQXJtU2l6ZTtcblxuICAgICAgICAvLyBSZWFkIGFuaW1hdGlvbnNcbiAgICAgICAgZm9yIChjb25zdCBhbmltYXRpb24gb2Ygand0LkFuaW1hdGVkSW1hZ2VEYXRhKSB7XG4gICAgICAgICAgICBza2luLmFuaW1hdGlvbnMuYWRkKFxuICAgICAgICAgICAgICAgIG5ldyBTa2luQW5pbWF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IG5ldyBTa2luSW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGFuaW1hdGlvbi5JbWFnZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhbmltYXRpb24uSW1hZ2VIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShhbmltYXRpb24uSW1hZ2UsICdiYXNlNjQnKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVzOiBhbmltYXRpb24uRnJhbWVzLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBhbmltYXRpb24uVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogYW5pbWF0aW9uLkFuaW1hdGlvbkV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYWQgY2FwZVxuICAgICAgICBza2luLmNhcGUgPSBuZXcgU2tpbkNhcGUoe1xuICAgICAgICAgICAgaWQ6IGp3dC5DYXBlSWQsXG4gICAgICAgICAgICBpbWFnZTogbmV3IFNraW5JbWFnZSh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGp3dC5DYXBlSW1hZ2VXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGp3dC5DYXBlSW1hZ2VIZWlnaHQsXG4gICAgICAgICAgICAgICAgZGF0YTogQnVmZmVyLmZyb20oand0LkNhcGVEYXRhLCAnYmFzZTY0JylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IG1ha2UgYSBjbGFzcyB0byBtYW5hZ2UgZ2VvbWV0cnlcbiAgICAgICAgc2tpbi5nZW9tZXRyeSA9IEJ1ZmZlci5mcm9tKGp3dC5Ta2luR2VvbWV0cnlEYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICAgICAgICAvLyBUT0RPOiBNb3N0IG9mIHRoZSB0aW1lcyBpcyBlbXB0eSwgZmlndXJlIG91dCB3aGF0IGlzIGl0XG4gICAgICAgIHNraW4uYW5pbWF0aW9uRGF0YSA9IEJ1ZmZlci5mcm9tKGp3dC5Ta2luQW5pbWF0aW9uRGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy8gUmVhZCBza2luIGJvb2xlYW4gcHJvcGVydGllc1xuICAgICAgICBza2luLnByZW1pdW0gPSBqd3QuUHJlbWl1bVNraW47XG4gICAgICAgIHNraW4ucGVyc29uYSA9IGp3dC5QZXJzb25hU2tpbjtcbiAgICAgICAgc2tpbi5jYXBlT25DbGFzc2ljU2tpbiA9IGp3dC5DYXBlT25DbGFzc2ljU2tpbjtcblxuICAgICAgICAvLyBBdm9pZCByZWFkaW5nIHdoZW4gc2tpbiBpcyBub3QgcGVyc29uYSB0eXBlXG4gICAgICAgIGlmIChza2luLnBlcnNvbmEpIHtcbiAgICAgICAgICAgIHNraW4ucGVyc29uYURhdGEgPSBuZXcgU2tpblBlcnNvbmEoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCBwZXJzb25hIHBpZWNlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBwZXJzb25hUGllY2Ugb2Ygand0LlBlcnNvbmFQaWVjZXMpIHtcbiAgICAgICAgICAgICAgICBza2luLnBlcnNvbmFEYXRhLmdldFBpZWNlcygpLmFkZChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFNraW5QZXJzb25hUGllY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmOiBwZXJzb25hUGllY2UuSXNEZWZhdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja0lkOiBwZXJzb25hUGllY2UuUGFja0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGllY2VJZDogcGVyc29uYVBpZWNlLlBpZWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWVjZVR5cGU6IHBlcnNvbmFQaWVjZS5QaWVjZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWQ6IHBlcnNvbmFQaWVjZS5Qcm9kdWN0SWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWFkIHBpZWNlIHRpbnQgY29sb3JzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBpZWNlVGludENvbG9yIG9mIGp3dC5QaWVjZVRpbnRDb2xvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW50Q29sb3IgPSBuZXcgU2tpblBlcnNvbmFQaWVjZVRpbnRDb2xvcigpO1xuICAgICAgICAgICAgICAgIHRpbnRDb2xvci5nZXRDb2xvcnMoKS5wdXNoKC4uLnBpZWNlVGludENvbG9yLkNvbG9ycyk7XG4gICAgICAgICAgICAgICAgdGludENvbG9yLnNldFBpZWNlVHlwZShwaWVjZVRpbnRDb2xvci5QaWVjZVR5cGUpO1xuICAgICAgICAgICAgICAgIHNraW4ucGVyc29uYURhdGEuZ2V0VGludENvbG9ycygpLmFkZCh0aW50Q29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhIGZ1bGwgaWRcbiAgICAgICAgc2tpbi5mdWxsSWQgPSBza2luLmlkICsgc2tpbi5nZXRDYXBlKCkuZ2V0SWQoKTtcbiAgICAgICAgcmV0dXJuIHNraW47XG4gICAgfVxuXG4gICAgcHVibGljIG5ldHdvcmtTZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiB2b2lkIHtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldElkKCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0UGxheUZhYklkKCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0UmVzb3VyY2VQYXRjaCgpKTtcblxuICAgICAgICAvLyBTa2luIGltYWdlXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2UoKS5uZXR3b3JrU2VyaWFsaXplKHN0cmVhbSk7XG5cbiAgICAgICAgLy8gQW5pbWF0aW9uc1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKHRoaXMuZ2V0QW5pbWF0aW9ucygpLnNpemUpO1xuICAgICAgICBmb3IgKGNvbnN0IGFuaW1hdGlvbiBvZiB0aGlzLmdldEFuaW1hdGlvbnMoKSkge1xuICAgICAgICAgICAgYW5pbWF0aW9uLmdldEltYWdlKCkubmV0d29ya1NlcmlhbGl6ZShzdHJlYW0pO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRShhbmltYXRpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUZsb2F0TEUoYW5pbWF0aW9uLmdldEZyYW1lcygpKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUoYW5pbWF0aW9uLmdldEV4cHJlc3Npb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYXBlIGltYWdlXG4gICAgICAgIHRoaXMuZ2V0Q2FwZSgpLmdldEltYWdlKCkubmV0d29ya1NlcmlhbGl6ZShzdHJlYW0pO1xuXG4gICAgICAgIC8vIE1pc2NlbGxhbmVvdXNcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldEdlb21ldHJ5KCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sICcwLjAuMCcpOyAvLyBnZW9tZXRyeSBkYXRhIGVuZ2luZSB2ZXJzaW9uXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRBbmltYXRpb25EYXRhKCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0Q2FwZSgpLmdldElkKCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0RnVsbElkKCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0QXJtU2l6ZSgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldENvbG9yKCkpO1xuXG4gICAgICAgIC8vIEhhY2sgdG8ga2VlcCBsZXNzIHVzZWxlc3MgZGF0YSBpbiBzb2Z0d2FyZVxuICAgICAgICBpZiAodGhpcy5pc1BlcnNvbmEoKSkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRSh0aGlzLmdldFBlcnNvbmFEYXRhKCkuZ2V0UGllY2VzKCkuc2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBlcnNvbmFQaWVjZSBvZiB0aGlzLmdldFBlcnNvbmFEYXRhKCkuZ2V0UGllY2VzKCkpIHtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHBlcnNvbmFQaWVjZS5nZXRQaWVjZUlkKCkpO1xuICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgcGVyc29uYVBpZWNlLmdldFBpZWNlVHlwZSgpKTtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHBlcnNvbmFQaWVjZS5nZXRQYWNrSWQoKSk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbihwZXJzb25hUGllY2UuaXNEZWZhdWx0KCkpO1xuICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgcGVyc29uYVBpZWNlLmdldFByb2R1Y3RJZCgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRSh0aGlzLmdldFBlcnNvbmFEYXRhKCkuZ2V0VGludENvbG9ycygpLnNpemUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0aW50IG9mIHRoaXMuZ2V0UGVyc29uYURhdGEoKS5nZXRUaW50Q29sb3JzKCkpIHtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRpbnQuZ2V0UGllY2VUeXBlKCkpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUodGludC5nZXRDb2xvcnMoKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sb3Igb2YgdGludC5nZXRDb2xvcnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIGNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKDApOyAvLyBQZXJzb25hIHBpZWNlc1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRSgwKTsgLy8gVGludCBjb2xvcnNcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4odGhpcy5pc1ByZW1pdW0oKSk7XG4gICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4odGhpcy5pc1BlcnNvbmEoKSk7XG4gICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4odGhpcy5pc0NhcGVPbkNsYXNzaWNTa2luKCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gSXMgcHJpbWFyeSB1c2VyXG4gICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4odHJ1ZSk7IC8vIElzIG92ZXJyaWRlXG4gICAgfVxuXG4gICAgcHVibGljIGdldElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGdWxsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVsbElkIHx8IHRoaXMuZ2V0SWQoKSArIHRoaXMuZ2V0Q2FwZSgpLmdldElkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBsYXlGYWJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5RmFiSWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlc291cmNlUGF0Y2goKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQYXRjaDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW1hZ2UoKTogU2tpbkltYWdlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFuaW1hdGlvbnMoKTogU2V0PFNraW5BbmltYXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW5pbWF0aW9uRGF0YSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRpb25EYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BlcnNvbmEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbmE7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUHJlbWl1bSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlbWl1bTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDYXBlT25DbGFzc2ljU2tpbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwZU9uQ2xhc3NpY1NraW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbG9yKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBcm1TaXplKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmFybVNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBlcnNvbmFEYXRhKCk6IFNraW5QZXJzb25hIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYURhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdlb21ldHJ5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb21ldHJ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXBlKCk6IFNraW5DYXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwZTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUF5REEsSUFBcUIsT0FBckIsTUFBcUIsS0FBSztDQUN0QjtDQUNBO0NBQ0E7Q0FDQTtDQUNBLDZCQUFrRCxJQUFJLElBQUk7Q0FDMUQ7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0EsUUFBZ0I7Q0FDaEIsVUFBa0I7Q0FDbEI7Ozs7O0NBTUE7Q0FDQSxZQUFtQjs7Ozs7OztDQVFuQixPQUFjLFFBQVEsS0FBZ0I7RUFDbEMsTUFBTSxPQUFPLElBQUksS0FBSztFQUd0QixLQUFLLEtBQUssSUFBSTtFQUNkLEtBQUssZ0JBQWdCLE9BQU8sS0FBSyxJQUFJLG1CQUFtQixRQUFRLEVBQUUsU0FBUztFQUMzRSxLQUFLLFFBQVEsSUFBSSw2QkFBQSxRQUFVO0dB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