UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

183 lines (182 loc) • 13.4 kB
import { BlockToolType } from "./BlockToolType.es.js"; import { ItemEnchantmentType } from "../item/ItemEnchantmentType.es.js"; import { ItemTieredToolType } from "../item/ItemTieredToolType.es.js"; import { item_id_map } from "@jsprismarine/bedrock-data"; //#region src/block/Block.ts var Block = class Block { /** * The block's numeric block ID. */ id; /** * The block's namespaced block ID. */ name; /** * The block's java-edition namespaced block ID. */ javaName; hardness; meta = 0; networkId; nbt = null; count = 1; constructor({ id, name, javaName, parentName, hardness }) { Object.setPrototypeOf(this, Block.prototype); this.id = id; this.name = name; this.javaName = javaName ?? name; this.hardness = hardness ?? 0; this.networkId = item_id_map[parentName ?? name]; } get [Symbol.toStringTag]() { return `Block(${this.toString()})`; } toString() { return this.name; } /** * Get the Block's namespaced id. */ getName() { return this.name; } /** * Get the Block's meta value. */ getMeta() { return this.meta; } /** * Get the Block's numeric id. * * @returns The block's numeric ID. */ getId() { return this.id; } /** * Get the Block's network numeric id. */ getNetworkId() { return this.networkId || this.getId(); } /** * Get the Block's hardness value. */ getHardness() { return this.hardness; } /** * Get the Block's break time. */ getBreakTime(_item, _server) { return this.getHardness(); } /** * Get the Block's blast resistance. */ getBlastResistance() { return this.getHardness() * 5; } /** * Get the Block's light level emission. */ getLightLevel() { return 0; } /** * Get the Block's flammability. */ getFlammability() { return 0; } /** * Get the Block's required tool type. */ getToolType() { return [BlockToolType.None]; } /** * Get the Block's required item tool tier. */ getToolHarvestLevel() { return ItemTieredToolType.None; } /** * Get the Block's drop(s) if the tool is compatible. */ getDropsForCompatibleTool(_item, _server) { return [this]; } /** * Get the Block's drop(s) from the current item. */ getDrops(item, server) { if (this.isCompatibleWithTool(item)) { if (this.isAffectedBySilkTouch() && item?.hasEnchantment(ItemEnchantmentType.SilkTouch)) return this.getSilkTouchDrops(item, server); return this.getDropsForCompatibleTool(item, server); } return []; } /** * Get the Block's drop(s) if silk touch is used. */ getSilkTouchDrops(_item, _server) { return [this]; } getLightFilter() { return 15; } canPassThrough() { return false; } /** * Sets if the block can be replaced when place action occurs on it. */ canBeReplaced() { return false; } canBePlaced() { return true; } canBeFlowedInto() { return false; } isTransparent() { return false; } /** * Check if the block is breakable. * * @returns `true` if the block is breakable otherwise `false`. */ isBreakable() { return true; } /** * Check if the block is solid. * * @returns `true` if the block is solid otherwise `false`. */ isSolid() { return false; } isCompatibleWithTool(item) { const toolType = this.getToolType(); const harvestLevel = this.getToolHarvestLevel(); if (toolType.includes(BlockToolType.None) || harvestLevel <= 0) return true; if (!item) return false; if (toolType.includes(item.getToolType()) && item.getToolHarvestLevel() >= harvestLevel) return true; return false; } isAffectedBySilkTouch() { return true; } isPartOfCreativeInventory() { return true; } }; //#endregion export { Block }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2suZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrL0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGl0ZW1faWRfbWFwIGFzIEJsb2NrSWRNYXAgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JlZHJvY2stZGF0YSc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCB0eXBlIHsgSXRlbSB9IGZyb20gJy4uL2l0ZW0vSXRlbSc7XG5pbXBvcnQgeyBJdGVtRW5jaGFudG1lbnRUeXBlIH0gZnJvbSAnLi4vaXRlbS9JdGVtRW5jaGFudG1lbnRUeXBlJztcbmltcG9ydCB7IEl0ZW1UaWVyZWRUb29sVHlwZSB9IGZyb20gJy4uL2l0ZW0vSXRlbVRpZXJlZFRvb2xUeXBlJztcbmltcG9ydCB7IEJsb2NrVG9vbFR5cGUgfSBmcm9tICcuL0Jsb2NrVG9vbFR5cGUnO1xuXG5leHBvcnQgY2xhc3MgQmxvY2sge1xuICAgIC8qKlxuICAgICAqIFRoZSBibG9jaydzIG51bWVyaWMgYmxvY2sgSUQuXG4gICAgICovXG4gICAgcHVibGljIGlkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBuYW1lc3BhY2VkIGJsb2NrIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBqYXZhLWVkaXRpb24gbmFtZXNwYWNlZCBibG9jayBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgamF2YU5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgaGFyZG5lc3M6IG51bWJlcjtcbiAgICBwdWJsaWMgbWV0YSA9IDA7XG4gICAgcHJpdmF0ZSBuZXR3b3JrSWQ6IG51bWJlcjtcblxuICAgIC8vIFRPRE9cbiAgICBwdWJsaWMgbmJ0ID0gbnVsbDtcbiAgICBwdWJsaWMgY291bnQgPSAxO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGphdmFOYW1lLFxuICAgICAgICBwYXJlbnROYW1lLFxuICAgICAgICBoYXJkbmVzc1xuICAgIH06IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBqYXZhTmFtZT86IHN0cmluZztcbiAgICAgICAgcGFyZW50TmFtZT86IHN0cmluZztcbiAgICAgICAgaGFyZG5lc3M/OiBudW1iZXI7XG4gICAgfSkge1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQmxvY2sucHJvdG90eXBlKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmphdmFOYW1lID0gamF2YU5hbWUgPz8gbmFtZTtcbiAgICAgICAgdGhpcy5oYXJkbmVzcyA9IGhhcmRuZXNzID8/IDA7XG5cbiAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSAoQmxvY2tJZE1hcCBhcyBhbnkpW3BhcmVudE5hbWUgPz8gbmFtZV0gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgICAgIHJldHVybiBgQmxvY2soJHt0aGlzLnRvU3RyaW5nKCl9KWA7XG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmFtZXNwYWNlZCBpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbWV0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWV0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbnVtZXJpYyBpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBibG9jaydzIG51bWVyaWMgSUQuXG4gICAgICovXG4gICAgcHVibGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmV0d29yayBudW1lcmljIGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXR3b3JrSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtJZCB8fCB0aGlzLmdldElkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGhhcmRuZXNzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXJkbmVzcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXJkbmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgYnJlYWsgdGltZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QnJlYWtUaW1lKF9pdGVtOiBJdGVtIHwgbnVsbCwgX3NlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhhcmRuZXNzKCk7IC8vIFRPRE86IEZpeCBicmVhayB0aW1lIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgIC8qIGxldCBiYXNlID0gdGhpcy5nZXRIYXJkbmVzcygpO1xuICAgICAgICBiYXNlICo9IHRoaXMuaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbSkgPyAxLjUgOiA1O1xuICAgICAgICBjb25zdCBlZmZpY2llbmN5ID0gMTsgLy8gSXRlbS5nZXRNaW5pbmdFZmZpY2llbmN5KHRoaXMpO1xuICAgICAgICByZXR1cm4gKGJhc2UgLz0gZWZmaWNpZW5jeSk7ICovXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGJsYXN0IHJlc2lzdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsYXN0UmVzaXN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGFyZG5lc3MoKSAqIDU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGxpZ2h0IGxldmVsIGVtaXNzaW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWdodExldmVsKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgZmxhbW1hYmlsaXR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGbGFtbWFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyByZXF1aXJlZCB0b29sIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvb2xUeXBlKCk6IEJsb2NrVG9vbFR5cGVbXSB7XG4gICAgICAgIHJldHVybiBbQmxvY2tUb29sVHlwZS5Ob25lXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgcmVxdWlyZWQgaXRlbSB0b29sIHRpZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvb2xIYXJ2ZXN0TGV2ZWwoKTogSXRlbVRpZXJlZFRvb2xUeXBlIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1UaWVyZWRUb29sVHlwZS5Ob25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGlmIHRoZSB0b29sIGlzIGNvbXBhdGlibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldERyb3BzRm9yQ29tcGF0aWJsZVRvb2woX2l0ZW06IEl0ZW0gfCBudWxsLCBfc2VydmVyOiBTZXJ2ZXIpOiBBcnJheTxCbG9jayB8IEl0ZW0gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGRyb3AocykgZnJvbSB0aGUgY3VycmVudCBpdGVtLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcm9wcyhpdGVtOiBJdGVtIHwgbnVsbCwgc2VydmVyOiBTZXJ2ZXIpOiBBcnJheTxCbG9jayB8IEl0ZW0gfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcGF0aWJsZVdpdGhUb29sKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0FmZmVjdGVkQnlTaWxrVG91Y2goKSAmJiBpdGVtPy5oYXNFbmNoYW50bWVudChJdGVtRW5jaGFudG1lbnRUeXBlLlNpbGtUb3VjaCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2lsa1RvdWNoRHJvcHMoaXRlbSwgc2VydmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJvcHNGb3JDb21wYXRpYmxlVG9vbChpdGVtLCBzZXJ2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGlmIHNpbGsgdG91Y2ggaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2lsa1RvdWNoRHJvcHMoX2l0ZW06IEl0ZW0sIF9zZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMaWdodEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIDE1O1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5QYXNzVGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgdGhlIGJsb2NrIGNhbiBiZSByZXBsYWNlZCB3aGVuIHBsYWNlIGFjdGlvbiBvY2N1cnMgb24gaXQuXG4gICAgICovXG4gICAgcHVibGljIGNhbkJlUmVwbGFjZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQmVQbGFjZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5CZUZsb3dlZEludG8oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUcmFuc3BhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBicmVha2FibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJsb2NrIGlzIGJyZWFrYWJsZSBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCcmVha2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBzb2xpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYmxvY2sgaXMgc29saWQgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzU29saWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbTogSXRlbSB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG9vbFR5cGUgPSB0aGlzLmdldFRvb2xUeXBlKCk7XG4gICAgICAgIGNvbnN0IGhhcnZlc3RMZXZlbCA9IHRoaXMuZ2V0VG9vbEhhcnZlc3RMZXZlbCgpO1xuXG4gICAgICAgIGlmICh0b29sVHlwZS5pbmNsdWRlcyhCbG9ja1Rvb2xUeXBlLk5vbmUpIHx8IGhhcnZlc3RMZXZlbCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0b29sVHlwZS5pbmNsdWRlcyhpdGVtLmdldFRvb2xUeXBlKCkpICYmIGl0ZW0uZ2V0VG9vbEhhcnZlc3RMZXZlbCgpID49IGhhcnZlc3RMZXZlbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBZmZlY3RlZEJ5U2lsa1RvdWNoKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXJ0T2ZDcmVhdGl2ZUludmVudG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQU9BLElBQWEsUUFBYixNQUFhLE1BQU07Ozs7Q0FJZjs7OztDQUtBOzs7O0NBS0E7Q0FDQTtDQUNBLE9BQWM7Q0FDZDtDQUdBLE1BQWE7Q0FDYixRQUFlO0NBRWYsWUFBbUIsRUFDZixJQUNBLE1BQ0EsVUFDQSxZQUNBLFlBT0Q7RUFDQyxPQUFPLGVBQWUsTUFBTSxNQUFNLFNBQVM7RUFDM0MsS0FBSyxLQUFLO0VBQ1YsS0FBSyxPQUFPO0VBQ1osS0FBSyxXQUFXLFlBQVk7RUFDNUIsS0FBSyxXQUFXLFlBQVk7RUFFNUIsS0FBSyxZQUFhLFlBQW1CLGNBQWM7Q0FDdkQ7Q0FFQSxLQUFZLE9BQU8sZUFBZTtFQUM5QixPQUFPLFNBQVMsS0FBSyxTQUFTLEVBQUU7Q0FDcEM7Q0FDQSxXQUFrQjtFQUNkLE9BQU8sS0FBSztDQUNoQjs7OztDQUtBLFVBQWlCO0VBQ2IsT0FBTyxLQUFLO0NBQ2hCOzs7O0NBS0EsVUFBaUI7RUFDYixPQUFPLEtBQUs7Q0FDaEI7Ozs7OztDQU9BLFFBQWU7RUFDWCxPQUFPLEtBQUs7Q0FDaEI7Ozs7Q0FLQSxlQUFzQjtFQUNsQixPQUFPLEtBQUssYUFBYSxLQUFLLE1BQU07Q0FDeEM7Ozs7Q0FLQSxjQUE2QjtFQUN6QixPQUFPLEtBQUs7Q0FDaEI7Ozs7Q0FLQSxhQUFvQixPQUFvQixTQUFpQjtFQUNyRCxPQUFPLEtBQUssWUFBWTtDQU01Qjs7OztDQUtBLHFCQUE0QjtFQUN4QixPQUFPLEtBQUssWUFBWSxJQUFJO0NBQ2hDOzs7O0NBS0EsZ0JBQXVCO0VBQ25CLE9BQU87Q0FDWDs7OztDQUtBLGtCQUF5QjtFQUNyQixPQUFPO0NBQ1g7Ozs7Q0FLQSxjQUFzQztFQUNsQyxPQUFPLENBQUMsY0FBYyxJQUFJO0NBQzlCOzs7O0NBS0Esc0JBQWlEO0VBQzdDLE9BQU8sbUJBQW1CO0NBQzlCOzs7O0NBS0EsMEJBQWlDLE9BQW9CLFNBQTZDO0VBQzlGLE9BQU8sQ0FBQyxJQUFJO0NBQ2hCOzs7O0NBS0EsU0FBZ0IsTUFBbUIsUUFBNEM7RUFDM0UsSUFBSSxLQUFLLHFCQUFxQixJQUFJLEdBQUc7R0FDakMsSUFBSSxLQUFLLHNCQUFzQixLQUFLLE1BQU0sZUFBZSxvQkFBb0IsU0FBUyxHQUNsRixPQUFPLEtBQUssa0JBQWtCLE1BQU0sTUFBTTtHQUU5QyxPQUFPLEtBQUssMEJBQTBCLE1BQU0sTUFBTTtFQUN0RDtFQUVBLE9BQU8sQ0FBQztDQUNaOzs7O0NBS0Esa0JBQXlCLE9BQWEsU0FBaUI7RUFDbkQsT0FBTyxDQUFDLElBQUk7Q0FDaEI7Q0FFQSxpQkFBd0I7RUFDcEIsT0FBTztDQUNYO0NBRUEsaUJBQXdCO0VBQ3BCLE9BQU87Q0FDWDs7OztDQUtBLGdCQUF1QjtFQUNuQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPO0NBQ1g7Q0FFQSxrQkFBeUI7RUFDckIsT0FBTztDQUNYO0NBRUEsZ0JBQXVCO0VBQ25CLE9BQU87Q0FDWDs7Ozs7O0NBT0EsY0FBOEI7RUFDMUIsT0FBTztDQUNYOzs7Ozs7Q0FPQSxVQUFpQjtFQUNiLE9BQU87Q0FDWDtDQUVBLHFCQUE0QixNQUFtQjtFQUMzQyxNQUFNLFdBQVcsS0FBSyxZQUFZO0VBQ2xDLE1BQU0sZUFBZSxLQUFLLG9CQUFvQjtFQUU5QyxJQUFJLFNBQVMsU0FBUyxjQUFjLElBQUksS0FBSyxnQkFBZ0IsR0FBRyxPQUFPO0VBQ3ZFLElBQUksQ0FBQyxNQUFNLE9BQU87RUFDbEIsSUFBSSxTQUFTLFNBQVMsS0FBSyxZQUFZLENBQUMsS0FBSyxLQUFLLG9CQUFvQixLQUFLLGNBQWMsT0FBTztFQUNoRyxPQUFPO0NBQ1g7Q0FFQSx3QkFBK0I7RUFDM0IsT0FBTztDQUNYO0NBRUEsNEJBQW1DO0VBQy9CLE9BQU87Q0FDWDtBQUNKIn0=