@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
189 lines (188 loc) • 24.2 kB
JavaScript
"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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