@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
179 lines (172 loc) • 20.6 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const errors = require('@jsprismarine/errors');
const confbox = require('confbox');
const fs = require('node:fs');
const path = require('node:path');
const _interopDefault = e => e && e.__esModule ? e : { default: e };
const fs__default = /*#__PURE__*/_interopDefault(fs);
const path__default = /*#__PURE__*/_interopDefault(path);
const _ = {
get: (obj, path2, defaultValue = void 0) => {
const travel = (regexp) => String.prototype.split.call(path2, regexp).filter(Boolean).reduce((res, key) => res !== null && res !== void 0 ? res[key] : res, obj);
const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/);
return result === void 0 || result === obj ? defaultValue : result;
},
set: (obj, path2, value) => {
if (Object(obj) !== obj) return obj;
if (!Array.isArray(path2)) path2 = path2.toString().match(/[^.[\]]+/g) || [];
path2.slice(0, -1).reduce(
(a, c, i) => Object(a[c]) === a[c] ? a[c] : a[c] = Math.abs(path2[i + 1]) >> 0 === Number(path2[i + 1]) ? [] : {},
obj
)[path2.at(-1)] = value;
return obj;
},
has: (obj, key) => {
const keyParts = key.split(".");
return Boolean(
obj && (keyParts.length > 1 ? _.has(obj[key.split(".")[0]], keyParts.slice(1).join(".")) : Object.hasOwnProperty.call(obj, key))
);
},
del: (obj, path2) => {
const pathArray = Array.isArray(path2) ? path2 : path2.match(/([^[.\]])+/g);
pathArray.reduce((acc, key, i) => {
if (i === pathArray.length - 1) delete acc[key];
return acc[key];
}, obj);
return true;
}
};
const TypeDefaults = {
json: "{}",
yaml: " "
};
class ConfigBuilder {
type;
path;
/**
* Config constructor.
*/
constructor(filePath) {
const pathSplitted = path__default.default.parse(filePath);
this.type = pathSplitted.ext.slice(1);
if (!Object.keys(TypeDefaults).some((i) => i.toLowerCase() === this.type.toLowerCase())) {
throw new Error(`Unsupported config type. (Supported types: ${Object.keys(TypeDefaults).join(", ")})`);
}
if (!fs__default.default.existsSync(pathSplitted.dir)) fs__default.default.mkdirSync(pathSplitted.dir, { recursive: true });
if (!fs__default.default.existsSync(filePath)) fs__default.default.writeFileSync(filePath, TypeDefaults[this.type], "utf8");
this.path = filePath;
}
/**
* Get path to the config file on the filesystem.
*
* @returns {string} the path to the config file
*/
getPath() {
return this.path;
}
/**
* Get the config format (eg. type).
*
* @returns {'yaml' | 'json'} either `yaml` or `json`
*/
getType() {
return this.type;
}
/**
* @private
*/
setFileData(data = {}) {
if (!data) throw new errors.ConfigInvalidDataError();
fs__default.default.writeFileSync(this.path, this.stringify(data), "utf8");
}
/**
* @private
*/
stringify(data = {}) {
switch (this.type) {
case "json":
return JSON.stringify(data, null, 4);
case "yaml":
return confbox.stringifyYAML(data, { indent: 4 });
default:
throw new Error(`Unknown config type ${this.type}!`);
}
}
getFileData() {
const raw = fs__default.default.readFileSync(this.path, "utf8");
switch (this.type) {
case "json":
try {
return confbox.parseJSON5(raw);
} catch {
}
break;
case "yaml":
try {
return confbox.parseYAML(raw);
} catch {
}
break;
default:
throw new Error(`Unknown config type: ${this.type}!`);
}
return {};
}
/**
* Get a config value from a key.
*
* @param {string} key - the config key
* @param {T} defaults -
*/
get(key, defaults) {
const data = this.getFileData();
let result = _.get(data, key);
if (typeof result === "undefined" && typeof defaults !== "undefined") {
const newData = _.set(data, key, defaults);
this.setFileData(newData);
result = defaults;
}
return result;
}
/**
* Sets a key - value pair in config.
*
* @returns true if the value was set successfully
*/
set(key, value) {
const data = this.getFileData();
const newData = _.set(data, key, value);
try {
this.setFileData(newData);
return true;
} catch {
return false;
}
}
/**
* Check if config value exists.
*
* @param key - the config key
* @returns true if the config contains that key
*/
has(key) {
const data = this.getFileData();
const result = _.has(data, key);
return result;
}
/**
* Delete a config value.
*
* @param key - the config key
* @returns true if the deletion was successful
*/
del(key) {
const data = this.getFileData();
const isSuccessful = _.del(data, key);
this.setFileData(data);
return isSuccessful;
}
}
exports.ConfigBuilder = ConfigBuilder;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnQnVpbGRlci5janMuY2pzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL0NvbmZpZ0J1aWxkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnSW52YWxpZERhdGFFcnJvciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlSlNPTjUsIHBhcnNlWUFNTCwgc3RyaW5naWZ5WUFNTCB9IGZyb20gJ2NvbmZib3gnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuY29uc3QgXyA9IHtcbiAgICBnZXQ6IChvYmo6IGFueSwgcGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgdHJhdmVsID0gKHJlZ2V4cDogYW55KSA9PlxuICAgICAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgICAgICAgICAgICAgIC5jYWxsKHBhdGgsIHJlZ2V4cClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocmVzLCBrZXkpID0+IChyZXMgIT09IG51bGwgJiYgcmVzICE9PSB1bmRlZmluZWQgPyByZXNba2V5XSA6IHJlcyksIG9iaik7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYXZlbCgvWyxbXFxdXSs/LykgfHwgdHJhdmVsKC9bLFtcXF0uXSs/Lyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQgPT09IG9iaiA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9LFxuICAgIHNldDogKG9iajogYW55LCBwYXRoOiBhbnksIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKE9iamVjdChvYmopICE9PSBvYmopIHJldHVybiBvYmo7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcGF0aCA9IHBhdGgudG9TdHJpbmcoKS5tYXRjaCgvW14uW1xcXV0rL2cpIHx8IFtdO1xuICAgICAgICBwYXRoXG4gICAgICAgICAgICAuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgIChhOiBhbnksIGM6IGFueSwgaTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICBPYmplY3QoYVtjXSkgPT09IGFbY11cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYVtjXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoYVtjXSA9IE1hdGguYWJzKHBhdGhbaSArIDFdKSA+PiAwID09PSBOdW1iZXIocGF0aFtpICsgMV0pID8gW10gOiB7fSksXG4gICAgICAgICAgICAgICAgb2JqXG4gICAgICAgICAgICApW3BhdGguYXQoLTEpXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgaGFzOiAob2JqOiBhbnksIGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGtleVBhcnRzID0ga2V5LnNwbGl0KCcuJyk7XG5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgICAgICBvYmogJiZcbiAgICAgICAgICAgICAgICAoa2V5UGFydHMubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICA/IF8uaGFzKG9ialtrZXkuc3BsaXQoJy4nKVswXSFdLCBrZXlQYXJ0cy5zbGljZSgxKS5qb2luKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKVxuICAgICAgICApO1xuICAgIH0sXG4gICAgZGVsOiAob2JqOiBhbnksIHBhdGg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwYXRoQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGgubWF0Y2goLyhbXlsuXFxdXSkrL2cpO1xuXG4gICAgICAgIHBhdGhBcnJheS5yZWR1Y2UoKGFjYzogYW55LCBrZXk6IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICAgICAgICBpZiAoaSA9PT0gcGF0aEFycmF5Lmxlbmd0aCAtIDEpIGRlbGV0ZSBhY2Nba2V5XTtcbiAgICAgICAgICAgIHJldHVybiBhY2Nba2V5XTtcbiAgICAgICAgfSwgb2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufTtcblxuY29uc3QgVHlwZURlZmF1bHRzID0ge1xuICAgIGpzb246ICd7fScsXG4gICAgeWFtbDogJyAnXG59O1xuXG5leHBvcnQgdHlwZSBDb25maWdEYXRhID0ge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogR2VuZXJhbCBjb25maWctZmlsZSBoYW5kbGVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29uZmlnQnVpbGRlciB7XG4gICAgcHJpdmF0ZSB0eXBlOiAneWFtbCcgfCAnanNvbic7XG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWcgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGF0aFNwbGl0dGVkID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG5cbiAgICAgICAgdGhpcy50eXBlID0gcGF0aFNwbGl0dGVkLmV4dC5zbGljZSgxKSBhcyAneWFtbCcgfCAnanNvbic7XG5cbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhUeXBlRGVmYXVsdHMpLnNvbWUoKGkpID0+IGkudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGNvbmZpZyB0eXBlLiAoU3VwcG9ydGVkIHR5cGVzOiAke09iamVjdC5rZXlzKFR5cGVEZWZhdWx0cykuam9pbignLCAnKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbmZpZyBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGhTcGxpdHRlZC5kaXIpKSBmcy5ta2RpclN5bmMocGF0aFNwbGl0dGVkLmRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIChUeXBlRGVmYXVsdHMgYXMgYW55KVt0aGlzLnR5cGVdLCAndXRmOCcpO1xuXG4gICAgICAgIHRoaXMucGF0aCA9IGZpbGVQYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBwYXRoIHRvIHRoZSBjb25maWcgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb25maWcgZm9ybWF0IChlZy4gdHlwZSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7J3lhbWwnIHwgJ2pzb24nfSBlaXRoZXIgYHlhbWxgIG9yIGBqc29uYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUeXBlKCk6ICd5YW1sJyB8ICdqc29uJyB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEZpbGVEYXRhKGRhdGE6IENvbmZpZ0RhdGEgPSB7fSkge1xuICAgICAgICBpZiAoIShkYXRhIGFzIGFueSkpIHRocm93IG5ldyBDb25maWdJbnZhbGlkRGF0YUVycm9yKCk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5wYXRoLCB0aGlzLnN0cmluZ2lmeShkYXRhKSwgJ3V0ZjgnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RyaW5naWZ5KGRhdGE6IENvbmZpZ0RhdGEgPSB7fSkge1xuICAgICAgICAvLyBGSVhNRTogVGhpcyBvdmVyd3JpdGVzIGNvbW1lbnRzIGluIHRoZSBmaWxlLlxuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDQpO1xuICAgICAgICAgICAgY2FzZSAneWFtbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVlBTUwoZGF0YSwgeyBpbmRlbnQ6IDQgfSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb25maWcgdHlwZSAke3RoaXMudHlwZX0hYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbGVEYXRhKCk6IENvbmZpZ0RhdGEge1xuICAgICAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmModGhpcy5wYXRoLCAndXRmOCcpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VKU09ONShyYXcpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVlBTUwocmF3KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb25maWcgdHlwZTogJHt0aGlzLnR5cGV9IWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvbmZpZyB2YWx1ZSBmcm9tIGEga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIHRoZSBjb25maWcga2V5XG4gICAgICogQHBhcmFtIHtUfSBkZWZhdWx0cyAtXG4gICAgICovXG4gICAgcHVibGljIGdldDxUID0gYW55PihrZXk6IHN0cmluZywgZGVmYXVsdHM/OiBUKTogVCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEZpbGVEYXRhKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBfLmdldChkYXRhLCBrZXkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZGVmYXVsdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRhID0gXy5zZXQoZGF0YSwga2V5LCBkZWZhdWx0cyk7XG4gICAgICAgICAgICB0aGlzLnNldEZpbGVEYXRhKG5ld0RhdGEpO1xuICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBrZXkgLSB2YWx1ZSBwYWlyIGluIGNvbmZpZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGaWxlRGF0YSgpO1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gXy5zZXQoZGF0YSwga2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsZURhdGEobmV3RGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25maWcgdmFsdWUgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIHRoZSBjb25maWcga2V5XG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZmlnIGNvbnRhaW5zIHRoYXQga2V5XG4gICAgICovXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGaWxlRGF0YSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBfLmhhcyhkYXRhLCBrZXkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGNvbmZpZyB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSB0aGUgY29uZmlnIGtleVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgcHVibGljIGRlbChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGaWxlRGF0YSgpO1xuXG4gICAgICAgIC8vIEl0IG11dGF0ZXMgdGhlIG9iamVjdCwgd2VcbiAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBkZWZpbmUgYSBuZXdcbiAgICAgICAgLy8gdmFyaWFibGUuXG4gICAgICAgIGNvbnN0IGlzU3VjY2Vzc2Z1bCA9IF8uZGVsKGRhdGEsIGtleSk7XG5cbiAgICAgICAgdGhpcy5zZXRGaWxlRGF0YShkYXRhKTtcbiAgICAgICAgcmV0dXJuIGlzU3VjY2Vzc2Z1bDtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImZzIiwiQ29uZmlnSW52YWxpZERhdGFFcnJvciIsInN0cmluZ2lmeVlBTUwiLCJwYXJzZUpTT041IiwicGFyc2VZQU1MIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUtBLE1BQU0sQ0FBSSxHQUFBO0FBQUEsRUFDTixHQUFLLEVBQUEsQ0FBQyxHQUFVQSxFQUFBQSxLQUFBQSxFQUFjLGVBQWUsS0FBYyxDQUFBLEtBQUE7QUFDdkQsSUFBTSxNQUFBLE1BQUEsR0FBUyxDQUFDLE1BQUEsS0FDWixNQUFPLENBQUEsU0FBQSxDQUFVLE1BQ1osSUFBS0EsQ0FBQUEsS0FBQUEsRUFBTSxNQUFNLENBQUEsQ0FDakIsTUFBTyxDQUFBLE9BQU8sRUFDZCxNQUFPLENBQUEsQ0FBQyxHQUFLLEVBQUEsR0FBQSxLQUFTLEdBQVEsS0FBQSxJQUFBLElBQVEsR0FBUSxLQUFBLEtBQUEsQ0FBQSxHQUFZLEdBQUksQ0FBQSxHQUFHLENBQUksR0FBQSxHQUFBLEVBQU0sR0FBRyxDQUFBO0FBQ3ZGLElBQUEsTUFBTSxNQUFTLEdBQUEsTUFBQSxDQUFPLFVBQVUsQ0FBQSxJQUFLLE9BQU8sV0FBVyxDQUFBO0FBQ3ZELElBQUEsT0FBTyxNQUFXLEtBQUEsS0FBQSxDQUFBLElBQWEsTUFBVyxLQUFBLEdBQUEsR0FBTSxZQUFlLEdBQUEsTUFBQTtBQUFBLEdBQ25FO0FBQUEsRUFDQSxHQUFLLEVBQUEsQ0FBQyxHQUFVQSxFQUFBQSxLQUFBQSxFQUFXLEtBQWUsS0FBQTtBQUN0QyxJQUFBLElBQUksTUFBTyxDQUFBLEdBQUcsQ0FBTSxLQUFBLEdBQUEsRUFBWSxPQUFBLEdBQUE7QUFDaEMsSUFBQSxJQUFJLENBQUMsS0FBQSxDQUFN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