@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
170 lines (167 loc) • 20 kB
JavaScript
import { ConfigInvalidDataError } from '@jsprismarine/errors';
import { stringifyYAML, parseYAML, parseJSON5 } from 'confbox';
import fs from 'node:fs';
import path from 'node: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.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.existsSync(pathSplitted.dir)) fs.mkdirSync(pathSplitted.dir, { recursive: true });
if (!fs.existsSync(filePath)) fs.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 ConfigInvalidDataError();
fs.writeFileSync(this.path, this.stringify(data), "utf8");
}
/**
* @private
*/
stringify(data = {}) {
switch (this.type) {
case "json":
return JSON.stringify(data, null, 4);
case "yaml":
return stringifyYAML(data, { indent: 4 });
default:
throw new Error(`Unknown config type ${this.type}!`);
}
}
getFileData() {
const raw = fs.readFileSync(this.path, "utf8");
switch (this.type) {
case "json":
try {
return parseJSON5(raw);
} catch {
}
break;
case "yaml":
try {
return 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;
}
}
export { ConfigBuilder };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnQnVpbGRlci5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9Db25maWdCdWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ0ludmFsaWREYXRhRXJyb3IgfSBmcm9tICdAanNwcmlzbWFyaW5lL2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZUpTT041LCBwYXJzZVlBTUwsIHN0cmluZ2lmeVlBTUwgfSBmcm9tICdjb25mYm94JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmNvbnN0IF8gPSB7XG4gICAgZ2V0OiAob2JqOiBhbnksIHBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYXZlbCA9IChyZWdleHA6IGFueSkgPT5cbiAgICAgICAgICAgIFN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICAgICAgICAgICAgICAuY2FsbChwYXRoLCByZWdleHApXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHJlcywga2V5KSA9PiAocmVzICE9PSBudWxsICYmIHJlcyAhPT0gdW5kZWZpbmVkID8gcmVzW2tleV0gOiByZXMpLCBvYmopO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cmF2ZWwoL1ssW1xcXV0rPy8pIHx8IHRyYXZlbCgvWyxbXFxdLl0rPy8pO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBvYmogPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfSxcbiAgICBzZXQ6IChvYmo6IGFueSwgcGF0aDogYW55LCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3Qob2JqKSAhPT0gb2JqKSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHBhdGggPSBwYXRoLnRvU3RyaW5nKCkubWF0Y2goL1teLltcXF1dKy9nKSB8fCBbXTtcbiAgICAgICAgcGF0aFxuICAgICAgICAgICAgLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoYTogYW55LCBjOiBhbnksIGk6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGFbY10pID09PSBhW2NdXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFbY11cbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGFbY10gPSBNYXRoLmFicyhwYXRoW2kgKyAxXSkgPj4gMCA9PT0gTnVtYmVyKHBhdGhbaSArIDFdKSA/IFtdIDoge30pLFxuICAgICAgICAgICAgICAgIG9ialxuICAgICAgICAgICAgKVtwYXRoLmF0KC0xKV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIGhhczogKG9iajogYW55LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBrZXlQYXJ0cyA9IGtleS5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICAgICAgb2JqICYmXG4gICAgICAgICAgICAgICAgKGtleVBhcnRzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgPyBfLmhhcyhvYmpba2V5LnNwbGl0KCcuJylbMF0hXSwga2V5UGFydHMuc2xpY2UoMSkuam9pbignLicpKVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSlcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIGRlbDogKG9iajogYW55LCBwYXRoOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aEFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLm1hdGNoKC8oW15bLlxcXV0pKy9nKTtcblxuICAgICAgICBwYXRoQXJyYXkucmVkdWNlKChhY2M6IGFueSwga2V5OiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgICAgICAgaWYgKGkgPT09IHBhdGhBcnJheS5sZW5ndGggLSAxKSBkZWxldGUgYWNjW2tleV07XG4gICAgICAgICAgICByZXR1cm4gYWNjW2tleV07XG4gICAgICAgIH0sIG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn07XG5cbmNvbnN0IFR5cGVEZWZhdWx0cyA9IHtcbiAgICBqc29uOiAne30nLFxuICAgIHlhbWw6ICcgJ1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZmlnRGF0YSA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59O1xuXG4vKipcbiAqIEdlbmVyYWwgY29uZmlnLWZpbGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ0J1aWxkZXIge1xuICAgIHByaXZhdGUgdHlwZTogJ3lhbWwnIHwgJ2pzb24nO1xuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29uZmlnIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdGhTcGxpdHRlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IHBhdGhTcGxpdHRlZC5leHQuc2xpY2UoMSkgYXMgJ3lhbWwnIHwgJ2pzb24nO1xuXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoVHlwZURlZmF1bHRzKS5zb21lKChpKSA9PiBpLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudHlwZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBjb25maWcgdHlwZS4gKFN1cHBvcnRlZCB0eXBlczogJHtPYmplY3Qua2V5cyhUeXBlRGVmYXVsdHMpLmpvaW4oJywgJyl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25maWcgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoU3BsaXR0ZWQuZGlyKSkgZnMubWtkaXJTeW5jKHBhdGhTcGxpdHRlZC5kaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCAoVHlwZURlZmF1bHRzIGFzIGFueSlbdGhpcy50eXBlXSwgJ3V0ZjgnKTtcblxuICAgICAgICB0aGlzLnBhdGggPSBmaWxlUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGF0aCB0byB0aGUgY29uZmlnIGZpbGUgb24gdGhlIGZpbGVzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0aCB0byB0aGUgY29uZmlnIGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29uZmlnIGZvcm1hdCAoZWcuIHR5cGUpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyd5YW1sJyB8ICdqc29uJ30gZWl0aGVyIGB5YW1sYCBvciBganNvbmBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiAneWFtbCcgfCAnanNvbicge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRGaWxlRGF0YShkYXRhOiBDb25maWdEYXRhID0ge30pIHtcbiAgICAgICAgaWYgKCEoZGF0YSBhcyBhbnkpKSB0aHJvdyBuZXcgQ29uZmlnSW52YWxpZERhdGFFcnJvcigpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMucGF0aCwgdGhpcy5zdHJpbmdpZnkoZGF0YSksICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0cmluZ2lmeShkYXRhOiBDb25maWdEYXRhID0ge30pIHtcbiAgICAgICAgLy8gRklYTUU6IFRoaXMgb3ZlcndyaXRlcyBjb21tZW50cyBpbiB0aGUgZmlsZS5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnlZQU1MKGRhdGEsIHsgaW5kZW50OiA0IH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29uZmlnIHR5cGUgJHt0aGlzLnR5cGV9IWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWxlRGF0YSgpOiBDb25maWdEYXRhIHtcbiAgICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMucGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSlNPTjUocmF3KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd5YW1sJzpcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VZQU1MKHJhdyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29uZmlnIHR5cGU6ICR7dGhpcy50eXBlfSFgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb25maWcgdmFsdWUgZnJvbSBhIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSB0aGUgY29uZmlnIGtleVxuICAgICAqIEBwYXJhbSB7VH0gZGVmYXVsdHMgLVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IGFueT4oa2V5OiBzdHJpbmcsIGRlZmF1bHRzPzogVCk6IFQge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGaWxlRGF0YSgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXy5nZXQoZGF0YSwga2V5KTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRlZmF1bHRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IF8uc2V0KGRhdGEsIGtleSwgZGVmYXVsdHMpO1xuICAgICAgICAgICAgdGhpcy5zZXRGaWxlRGF0YShuZXdEYXRhKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEga2V5IC0gdmFsdWUgcGFpciBpbiBjb25maWcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoKTtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IF8uc2V0KGRhdGEsIGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNldEZpbGVEYXRhKG5ld0RhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uZmlnIHZhbHVlIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSB0aGUgY29uZmlnIGtleVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbmZpZyBjb250YWlucyB0aGF0IGtleVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gXy5oYXMoZGF0YSwga2V5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBjb25maWcgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gdGhlIGNvbmZpZyBrZXlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWwoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoKTtcblxuICAgICAgICAvLyBJdCBtdXRhdGVzIHRoZSBvYmplY3QsIHdlXG4gICAgICAgIC8vIGRvbid0IG5lZWQgdG8gZGVmaW5lIGEgbmV3XG4gICAgICAgIC8vIHZhcmlhYmxlLlxuICAgICAgICBjb25zdCBpc1N1Y2Nlc3NmdWwgPSBfLmRlbChkYXRhLCBrZXkpO1xuXG4gICAgICAgIHRoaXMuc2V0RmlsZURhdGEoZGF0YSk7XG4gICAgICAgIHJldHVybiBpc1N1Y2Nlc3NmdWw7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbInBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsTUFBTSxDQUFJLEdBQUE7QUFBQSxFQUNOLEdBQUssRUFBQSxDQUFDLEdBQVVBLEVBQUFBLEtBQUFBLEVBQWMsZUFBZSxNQUFjLEtBQUE7QUFDdkQsSUFBTSxNQUFBLE1BQUEsR0FBUyxDQUFDLE1BQUEsS0FDWixNQUFPLENBQUEsU0FBQSxDQUFVLE1BQ1osSUFBS0EsQ0FBQUEsS0FBQUEsRUFBTSxNQUFNLENBQUEsQ0FDakIsTUFBTyxDQUFBLE9BQU8sRUFDZCxNQUFPLENBQUEsQ0FBQyxHQUFLLEVBQUEsR0FBQSxLQUFTLEdBQVEsS0FBQSxJQUFBLElBQVEsR0FBUSxLQUFBLE1BQUEsR0FBWSxHQUFJLENBQUEsR0FBRyxDQUFJLEdBQUEsR0FBQSxFQUFNLEdBQUcsQ0FBQTtBQUN2RixJQUFBLE1BQU0sTUFBUyxHQUFBLE1BQUEsQ0FBTyxVQUFVLENBQUEsSUFBSyxPQUFPLFdBQVcsQ0FBQTtBQUN2RCxJQUFBLE9BQU8sTUFBVyxLQUFBLE1BQUEsSUFBYSxNQUFXLEtBQUEsR0FBQSxHQUFNLFlBQWUsR0FBQSxNQUFBO0FBQUEsR0FDbkU7QUFBQSxFQUNBLEdBQUssRUFBQSxDQUFDLEdBQVVBLEVBQUFBLEtBQUFBLEVBQVcsS0FBZSxLQUFBO0FBQ3RDLElBQUEsSUFBSSxNQUFPLENBQUEsR0FBRyxDQUFNLEtBQUEsR0FBQSxFQUFZLE9BQUEsR0FBQTtBQUNoQyxJQUFBLElBQUksQ0FBQyxLQUFBLENBQU0sT0FBUUEsQ0FBQUEsS0FBSSxDQUFHLEVBQUFBLEtBQU9BLEdBQUFBLEtBQUFBLENBQUssUUFBUyxFQUFBLENBQUUsS0FBTSxDQUFBLFdBQVcsS0FBSyxFQUFDO0FBQ3hF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