@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
194 lines (191 loc) • 26.8 kB
JavaScript
import { NetworkUtil } from '../../network/NetworkUtil.es.js';
import SkinAnimation from './SkinAnimation.es.js';
import SkinCape from './SkinCape.es.js';
import SkinImage from './SkinImage.es.js';
import SkinPersona from './skin-persona/SkinPersona.es.js';
import SkinPersonaPiece from './skin-persona/SkinPersonaPiece.es.js';
import SkinPersonaPieceTintColor from './skin-persona/SkinPersonaPieceTintColor.es.js';
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 SkinImage({
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 SkinAnimation({
image: new SkinImage({
width: animation.ImageWidth,
height: animation.ImageHeight,
data: Buffer.from(animation.Image, "base64")
}),
frames: animation.Frames,
type: animation.Type,
expression: animation.AnimationExpression
})
);
}
skin.cape = new SkinCape({
id: jwt.CapeId,
image: new SkinImage({
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 SkinPersona();
for (const personaPiece of jwt.PersonaPieces) {
skin.personaData.getPieces().add(
new SkinPersonaPiece({
def: personaPiece.IsDefault,
packId: personaPiece.PackId,
pieceId: personaPiece.PieceId,
pieceType: personaPiece.PieceType,
productId: personaPiece.ProductId
})
);
}
for (const pieceTintColor of jwt.PieceTintColors) {
const tintColor = new SkinPersonaPieceTintColor();
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) {
NetworkUtil.writeString(stream, this.getId());
NetworkUtil.writeString(stream, this.getPlayFabId());
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);
NetworkUtil.writeString(stream, this.getGeometry());
NetworkUtil.writeString(stream, "0.0.0");
NetworkUtil.writeString(stream, this.getAnimationData());
NetworkUtil.writeString(stream, this.getCape().getId());
NetworkUtil.writeString(stream, this.getFullId());
NetworkUtil.writeString(stream, this.getArmSize());
NetworkUtil.writeString(stream, this.getColor());
if (this.isPersona()) {
stream.writeUnsignedIntLE(this.getPersonaData().getPieces().size);
for (const personaPiece of this.getPersonaData().getPieces()) {
NetworkUtil.writeString(stream, personaPiece.getPieceId());
NetworkUtil.writeString(stream, personaPiece.getPieceType());
NetworkUtil.writeString(stream, personaPiece.getPackId());
stream.writeBoolean(personaPiece.isDefault());
NetworkUtil.writeString(stream, personaPiece.getProductId());
}
stream.writeUnsignedIntLE(this.getPersonaData().getTintColors().size);
for (const tint of this.getPersonaData().getTintColors()) {
NetworkUtil.writeString(stream, tint.getPieceType());
stream.writeUnsignedIntLE(tint.getColors().length);
for (const color of tint.getColors()) {
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;
}
}
export { Skin as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbi5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3NraW4vU2tpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IE5ldHdvcmtVdGlsIH0gZnJvbSAnLi4vLi4vbmV0d29yay9OZXR3b3JrVXRpbCc7XG5pbXBvcnQgU2tpbkFuaW1hdGlvbiBmcm9tICcuL1NraW5BbmltYXRpb24nO1xuaW1wb3J0IFNraW5DYXBlIGZyb20gJy4vU2tpbkNhcGUnO1xuaW1wb3J0IFNraW5JbWFnZSBmcm9tICcuL1NraW5JbWFnZSc7XG5pbXBvcnQgU2tpblBlcnNvbmEgZnJvbSAnLi9za2luLXBlcnNvbmEvU2tpblBlcnNvbmEnO1xuaW1wb3J0IFNraW5QZXJzb25hUGllY2UgZnJvbSAnLi9za2luLXBlcnNvbmEvU2tpblBlcnNvbmFQaWVjZSc7XG5pbXBvcnQgU2tpblBlcnNvbmFQaWVjZVRpbnRDb2xvciBmcm9tICcuL3NraW4tcGVyc29uYS9Ta2luUGVyc29uYVBpZWNlVGludENvbG9yJztcblxuaW50ZXJmYWNlIEltYWdlIHtcbiAgICBJbWFnZVdpZHRoOiBudW1iZXI7XG4gICAgSW1hZ2VIZWlnaHQ6IG51bWJlcjtcbiAgICBJbWFnZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQW5pbWF0ZWRJbWFnZURhdGEgZXh0ZW5kcyBJbWFnZSB7XG4gICAgRnJhbWVzOiBudW1iZXI7XG4gICAgVHlwZTogbnVtYmVyO1xuICAgIEFuaW1hdGlvbkV4cHJlc3Npb246IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFBlcnNvbmFQaWVjZSB7XG4gICAgSXNEZWZhdWx0OiBib29sZWFuO1xuICAgIFBhY2tJZDogc3RyaW5nO1xuICAgIFBpZWNlSWQ6IHN0cmluZztcbiAgICBQaWVjZVR5cGU6IHN0cmluZztcbiAgICBQcm9kdWN0SWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBpZWNlVGludENvbG9yIHtcbiAgICBDb2xvcnM6IHN0cmluZ1tdO1xuICAgIFBpZWNlVHlwZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSldUIHtcbiAgICBTa2luSWQ6IHN0cmluZztcbiAgICBDYXBlSWQ6IHN0cmluZztcbiAgICBTa2luUmVzb3VyY2VQYXRjaDogc3RyaW5nO1xuICAgIFBsYXlGYWJJZDogc3RyaW5nO1xuICAgIFNraW5JbWFnZUhlaWdodDogbnVtYmVyO1xuICAgIFNraW5JbWFnZVdpZHRoOiBudW1iZXI7XG4gICAgU2tpbkdlb21ldHJ5RGF0YTogc3RyaW5nO1xuICAgIFNraW5BbmltYXRpb25EYXRhOiBzdHJpbmc7XG4gICAgQ2FwZUltYWdlSGVpZ2h0OiBudW1iZXI7XG4gICAgQ2FwZUltYWdlV2lkdGg6IG51bWJlcjtcbiAgICBDYXBlT25DbGFzc2ljU2tpbjogYm9vbGVhbjtcbiAgICBTa2luRGF0YTogc3RyaW5nO1xuICAgIENhcGVEYXRhOiBzdHJpbmc7XG4gICAgUHJlbWl1bVNraW46IGJvb2xlYW47XG4gICAgUGVyc29uYVNraW46IGJvb2xlYW47XG4gICAgU2tpbkNvbG9yOiBzdHJpbmc7XG4gICAgQXJtU2l6ZTogc3RyaW5nO1xuICAgIEFuaW1hdGVkSW1hZ2VEYXRhOiBBbmltYXRlZEltYWdlRGF0YVtdO1xuICAgIFBlcnNvbmFQaWVjZXM6IFBlcnNvbmFQaWVjZVtdO1xuICAgIFBpZWNlVGludENvbG9yczogUGllY2VUaW50Q29sb3JbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2tpbiB7XG4gICAgcHJpdmF0ZSBpZCE6IHN0cmluZztcbiAgICBwcml2YXRlIHBsYXlGYWJJZCE6IHN0cmluZztcbiAgICBwcml2YXRlIHJlc291cmNlUGF0Y2ghOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpbWFnZSE6IFNraW5JbWFnZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbnM6IFNldDxTa2luQW5pbWF0aW9uPiA9IG5ldyBTZXQoKTtcbiAgICBwcml2YXRlIGNhcGUhOiBTa2luQ2FwZTtcbiAgICBwcml2YXRlIGdlb21ldHJ5ITogc3RyaW5nO1xuICAgIHByaXZhdGUgYW5pbWF0aW9uRGF0YSE6IHN0cmluZztcbiAgICBwcml2YXRlIHByZW1pdW0hOiBib29sZWFuO1xuICAgIHByaXZhdGUgcGVyc29uYSE6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYXBlT25DbGFzc2ljU2tpbiE6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjb2xvciA9ICcjMCc7XG4gICAgcHJpdmF0ZSBhcm1TaXplID0gJ3dpZGUnO1xuICAgIHByaXZhdGUgcGVyc29uYURhdGEhOiBTa2luUGVyc29uYTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGwgc2tpbiBJRCwgY29tcHV0ZWQgYmVjYXVzZVxuICAgICAqIG5vdCBzZW50IG9uIEpXVC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZnVsbElkITogc3RyaW5nO1xuICAgIHB1YmxpYyBpc1RydXN0ZWQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBza2luIGZyb20gYSBKU09OIGZpbGUgY29udGFpbmluZyBza2luIGRhdGFcbiAgICAgKiB1c2luZyBtaW5lY3JhZnQgYmVkcm9jayBsb2dpbiBmaWVsZHMuXG4gICAgICpcbiAgICAgKiAobG9hZHMgdGhlIHNraW4gcGVyc29uYSlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KV1Qoand0OiBKV1QpOiBTa2luIHtcbiAgICAgICAgY29uc3Qgc2tpbiA9IG5ldyBTa2luKCk7XG5cbiAgICAgICAgLy8gUmVhZCBza2luXG4gICAgICAgIHNraW4uaWQgPSBqd3QuU2tpbklkO1xuICAgICAgICBza2luLnJlc291cmNlUGF0Y2ggPSBCdWZmZXIuZnJvbShqd3QuU2tpblJlc291cmNlUGF0Y2gsICdiYXNlNjQnKS50b1N0cmluZygpO1xuICAgICAgICBza2luLmltYWdlID0gbmV3IFNraW5JbWFnZSh7XG4gICAgICAgICAgICB3aWR0aDogand0LlNraW5JbWFnZVdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBqd3QuU2tpbkltYWdlSGVpZ2h0LFxuICAgICAgICAgICAgZGF0YTogQnVmZmVyLmZyb20oand0LlNraW5EYXRhLCAnYmFzZTY0JylcbiAgICAgICAgfSk7XG4gICAgICAgIHNraW4ucGxheUZhYklkID0gand0LlBsYXlGYWJJZDtcbiAgICAgICAgc2tpbi5jb2xvciA9IGp3dC5Ta2luQ29sb3I7XG4gICAgICAgIHNraW4uYXJtU2l6ZSA9IGp3dC5Bcm1TaXplO1xuXG4gICAgICAgIC8vIFJlYWQgYW5pbWF0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGFuaW1hdGlvbiBvZiBqd3QuQW5pbWF0ZWRJbWFnZURhdGEpIHtcbiAgICAgICAgICAgIHNraW4uYW5pbWF0aW9ucy5hZGQoXG4gICAgICAgICAgICAgICAgbmV3IFNraW5BbmltYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBpbWFnZTogbmV3IFNraW5JbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYW5pbWF0aW9uLkltYWdlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGFuaW1hdGlvbi5JbWFnZUhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGFuaW1hdGlvbi5JbWFnZSwgJ2Jhc2U2NCcpXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBmcmFtZXM6IGFuaW1hdGlvbi5GcmFtZXMsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGFuaW1hdGlvbi5UeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBhbmltYXRpb24uQW5pbWF0aW9uRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVhZCBjYXBlXG4gICAgICAgIHNraW4uY2FwZSA9IG5ldyBTa2luQ2FwZSh7XG4gICAgICAgICAgICBpZDogand0LkNhcGVJZCxcbiAgICAgICAgICAgIGltYWdlOiBuZXcgU2tpbkltYWdlKHtcbiAgICAgICAgICAgICAgICB3aWR0aDogand0LkNhcGVJbWFnZVdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogand0LkNhcGVJbWFnZUhlaWdodCxcbiAgICAgICAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShqd3QuQ2FwZURhdGEsICdiYXNlNjQnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVE9ETzogbWFrZSBhIGNsYXNzIHRvIG1hbmFnZSBnZW9tZXRyeVxuICAgICAgICBza2luLmdlb21ldHJ5ID0gQnVmZmVyLmZyb20oand0LlNraW5HZW9tZXRyeURhdGEsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXG4gICAgICAgIC8vIFRPRE86IE1vc3Qgb2YgdGhlIHRpbWVzIGlzIGVtcHR5LCBmaWd1cmUgb3V0IHdoYXQgaXMgaXRcbiAgICAgICAgc2tpbi5hbmltYXRpb25EYXRhID0gQnVmZmVyLmZyb20oand0LlNraW5BbmltYXRpb25EYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICAgICAgICAvLyBSZWFkIHNraW4gYm9vbGVhbiBwcm9wZXJ0aWVzXG4gICAgICAgIHNraW4ucHJlbWl1bSA9IGp3dC5QcmVtaXVtU2tpbjtcbiAgICAgICAgc2tpbi5wZXJzb25hID0gand0LlBlcnNvbmFTa2luO1xuICAgICAgICBza2luLmNhcGVPbkNsYXNzaWNTa2luID0gand0LkNhcGVPbkNsYXNzaWNTa2luO1xuXG4gICAgICAgIC8vIEF2b2lkIHJlYWRpbmcgd2hlbiBza2luIGlzIG5vdCBwZXJzb25hIHR5cGVcbiAgICAgICAgaWYgKHNraW4ucGVyc29uYSkge1xuICAgICAgICAgICAgc2tpbi5wZXJzb25hRGF0YSA9IG5ldyBTa2luUGVyc29uYSgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHBlcnNvbmEgcGllY2VzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBlcnNvbmFQaWVjZSBvZiBqd3QuUGVyc29uYVBpZWNlcykge1xuICAgICAgICAgICAgICAgIHNraW4ucGVyc29uYURhdGEuZ2V0UGllY2VzKCkuYWRkKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU2tpblBlcnNvbmFQaWVjZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWY6IHBlcnNvbmFQaWVjZS5Jc0RlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrSWQ6IHBlcnNvbmFQaWVjZS5QYWNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWVjZUlkOiBwZXJzb25hUGllY2UuUGllY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpZWNlVHlwZTogcGVyc29uYVBpZWNlLlBpZWNlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZDogcGVyc29uYVBpZWNlLlByb2R1Y3RJZFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlYWQgcGllY2UgdGludCBjb2xvcnNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGllY2VUaW50Q29sb3Igb2Ygand0LlBpZWNlVGludENvbG9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbnRDb2xvciA9IG5ldyBTa2luUGVyc29uYVBpZWNlVGludENvbG9yKCk7XG4gICAgICAgICAgICAgICAgdGludENvbG9yLmdldENvbG9ycygpLnB1c2goLi4ucGllY2VUaW50Q29sb3IuQ29sb3JzKTtcbiAgICAgICAgICAgICAgICB0aW50Q29sb3Iuc2V0UGllY2VUeXBlKHBpZWNlVGludENvbG9yLlBpZWNlVHlwZSk7XG4gICAgICAgICAgICAgICAgc2tpbi5wZXJzb25hRGF0YS5nZXRUaW50Q29sb3JzKCkuYWRkKHRpbnRDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIGEgZnVsbCBpZFxuICAgICAgICBza2luLmZ1bGxJZCA9IHNraW4uaWQgKyBza2luLmdldENhcGUoKS5nZXRJZCgpO1xuICAgICAgICByZXR1cm4gc2tpbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSk6IHZvaWQge1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0SWQoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRQbGF5RmFiSWQoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRSZXNvdXJjZVBhdGNoKCkpO1xuXG4gICAgICAgIC8vIFNraW4gaW1hZ2VcbiAgICAgICAgdGhpcy5nZXRJbWFnZSgpLm5ldHdvcmtTZXJpYWxpemUoc3RyZWFtKTtcblxuICAgICAgICAvLyBBbmltYXRpb25zXG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUodGhpcy5nZXRBbmltYXRpb25zKCkuc2l6ZSk7XG4gICAgICAgIGZvciAoY29uc3QgYW5pbWF0aW9uIG9mIHRoaXMuZ2V0QW5pbWF0aW9ucygpKSB7XG4gICAgICAgICAgICBhbmltYXRpb24uZ2V0SW1hZ2UoKS5uZXR3b3JrU2VyaWFsaXplKHN0cmVhbSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKGFuaW1hdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlRmxvYXRMRShhbmltYXRpb24uZ2V0RnJhbWVzKCkpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRShhbmltYXRpb24uZ2V0RXhwcmVzc2lvbigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhcGUgaW1hZ2VcbiAgICAgICAgdGhpcy5nZXRDYXBlKCkuZ2V0SW1hZ2UoKS5uZXR3b3JrU2VyaWFsaXplKHN0cmVhbSk7XG5cbiAgICAgICAgLy8gTWlzY2VsbGFuZW91c1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0R2VvbWV0cnkoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgJzAuMC4wJyk7IC8vIGdlb21ldHJ5IGRhdGEgZW5naW5lIHZlcnNpb25cbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldEFuaW1hdGlvbkRhdGEoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRDYXBlKCkuZ2V0SWQoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRGdWxsSWQoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRBcm1TaXplKCkpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0Q29sb3IoKSk7XG5cbiAgICAgICAgLy8gSGFjayB0byBrZWVwIGxlc3MgdXNlbGVzcyBkYXRhIGluIHNvZnR3YXJlXG4gICAgICAgIGlmICh0aGlzLmlzUGVyc29uYSgpKSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKHRoaXMuZ2V0UGVyc29uYURhdGEoKS5nZXRQaWVjZXMoKS5zaXplKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVyc29uYVBpZWNlIG9mIHRoaXMuZ2V0UGVyc29uYURhdGEoKS5nZXRQaWVjZXMoKSkge1xuICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgcGVyc29uYVBpZWNlLmdldFBpZWNlSWQoKSk7XG4gICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCBwZXJzb25hUGllY2UuZ2V0UGllY2VUeXBlKCkpO1xuICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgcGVyc29uYVBpZWNlLmdldFBhY2tJZCgpKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKHBlcnNvbmFQaWVjZS5pc0RlZmF1bHQoKSk7XG4gICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCBwZXJzb25hUGllY2UuZ2V0UHJvZHVjdElkKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKHRoaXMuZ2V0UGVyc29uYURhdGEoKS5nZXRUaW50Q29sb3JzKCkuc2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRpbnQgb2YgdGhpcy5nZXRQZXJzb25hRGF0YSgpLmdldFRpbnRDb2xvcnMoKSkge1xuICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGludC5nZXRQaWVjZVR5cGUoKSk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRSh0aW50LmdldENvbG9ycygpLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2xvciBvZiB0aW50LmdldENvbG9ycygpKSB7XG4gICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgY29sb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUoMCk7IC8vIFBlcnNvbmEgcGllY2VzXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKDApOyAvLyBUaW50IGNvbG9yc1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih0aGlzLmlzUHJlbWl1bSgpKTtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih0aGlzLmlzUGVyc29uYSgpKTtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih0aGlzLmlzQ2FwZU9uQ2xhc3NpY1NraW4oKSk7XG4gICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBJcyBwcmltYXJ5IHVzZXJcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih0cnVlKTsgLy8gSXMgb3ZlcnJpZGVcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZ1bGxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5mdWxsSWQgfHwgdGhpcy5nZXRJZCgpICsgdGhpcy5nZXRDYXBlKCkuZ2V0SWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGxheUZhYklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlGYWJJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVzb3VyY2VQYXRjaCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVBhdGNoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbWFnZSgpOiBTa2luSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW5pbWF0aW9ucygpOiBTZXQ8U2tpbkFuaW1hdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbmltYXRpb25EYXRhKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbkRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUGVyc29uYSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQcmVtaXVtKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVtaXVtO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NhcGVPbkNsYXNzaWNTa2luKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXBlT25DbGFzc2ljU2tpbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29sb3IoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFybVNpemUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJtU2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGVyc29uYURhdGEoKTogU2tpblBlcnNvbmEge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25hRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R2VvbWV0cnkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENhcGUoKTogU2tpbkNhcGUge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXBlO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQXlEQSxNQUFxQixJQUFLLENBQUE7QUFBQSxFQUNkLEVBQUE7QUFBQSxFQUNBLFNBQUE7QUFBQSxFQUNBLGFBQUE7QUFBQSxFQUNBLEtBQUE7QUFBQSxFQUNTLFVBQUEsdUJBQXFDLEdBQUksRUFBQTtBQUFBLEVBQ2xELElBQUE7QUFBQSxFQUNBLFFBQUE7QUFBQSxFQUNBLGFBQUE7QUFBQSxFQUNBLE9BQUE7QUFBQSxFQUNBLE9BQUE7QUFBQSxFQUNBLGlCQUFBO0FBQUEsRUFDQSxLQUFRLEdBQUEsSUFBQTtBQUFBLEVBQ1IsT0FBVSxHQUFBLE1BQUE7QUFBQSxFQUNWLFdBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUQsTUFBQTtBQUFBLEVBQ0EsU0FBWSxH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