obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
202 lines (188 loc) • 15.6 kB
JavaScript
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
(function initCjs() {
const globalThisRecord = globalThis;
globalThisRecord['__name'] ??= name;
const originalRequire = require;
if (originalRequire && !originalRequire.__isPatched) {
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
require = Object.assign(
(id) => requirePatched(id),
originalRequire,
{
__isPatched: true
}
);
}
const newFuncs = {
__extractDefault() {
return extractDefault;
},
process() {
const browserProcess = {
browser: true,
cwd() {
return '/';
},
env: {},
platform: 'android'
};
return browserProcess;
}
};
for (const key of Object.keys(newFuncs)) {
globalThisRecord[key] ??= newFuncs[key]?.();
}
function name(obj) {
return obj;
}
function extractDefault(module) {
return module && module.__esModule && 'default' in module ? module.default : module;
}
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
'obsidian',
'@codemirror/autocomplete',
'@codemirror/collab',
'@codemirror/commands',
'@codemirror/language',
'@codemirror/lint',
'@codemirror/search',
'@codemirror/state',
'@codemirror/text',
'@codemirror/view',
'@lezer/common',
'@lezer/lr',
'@lezer/highlight'];
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
'@codemirror/closebrackets',
'@codemirror/comment',
'@codemirror/fold',
'@codemirror/gutter',
'@codemirror/highlight',
'@codemirror/history',
'@codemirror/matchbrackets',
'@codemirror/panel',
'@codemirror/rangeset',
'@codemirror/rectangular-selection',
'@codemirror/stream-parser',
'@codemirror/tooltip'];
function requirePatched(id) {
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
return originalRequire?.(id);
}
// eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/no-unnecessary-condition -- We need access to app here which might not be available yet.
if (globalThis?.app?.isMobile) {
if (id === 'process' || id === 'node:process') {
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
return globalThis.process;
}
} else {
const module = originalRequire?.(id);
if (module) {
return extractDefault(module);
}
}
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
return {};
}
})();
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Queue_exports = {};
__export(Queue_exports, {
addToQueue: () => addToQueue,
addToQueueAndWait: () => addToQueueAndWait,
flushQueue: () => flushQueue
});
module.exports = __toCommonJS(Queue_exports);
var import_AbortController = require('../AbortController.cjs');
var import_Async = require('../Async.cjs');
var import_Error = require('../Error.cjs');
var import_Function = require('../Function.cjs');
var import_App = require('./App.cjs');
var import_AsyncWithNotice = require('./AsyncWithNotice.cjs');
var import_i18n = require('./i18n/i18n.cjs');
var import_Logger = require('./Logger.cjs');
function addToQueue(options) {
const stackTrace = options.stackTrace ?? (0, import_Error.getStackTrace)(1);
(0, import_Async.invokeAsyncSafely)(() => addToQueueAndWait(options), stackTrace);
}
async function addToQueueAndWait(options) {
const abortSignal = options.abortSignal ?? (0, import_AbortController.abortSignalNever)();
abortSignal.throwIfAborted();
const DEFAULT_TIMEOUT_IN_MILLISECONDS = 6e4;
const timeoutInMilliseconds = options.timeoutInMilliseconds ?? DEFAULT_TIMEOUT_IN_MILLISECONDS;
const stackTrace = options.stackTrace ?? (0, import_Error.getStackTrace)(1);
const operationName = options.operationName ?? "";
const queue = getQueue(options.app).value;
queue.items.push({
abortSignal,
operationFn: options.operationFn,
operationName,
shouldShowTimeoutNotice: options.shouldShowTimeoutNotice ?? true,
stackTrace,
timeoutInMilliseconds
});
queue.promise = queue.promise.then(() => processNextQueueItem(options.app));
await queue.promise;
}
async function flushQueue(app) {
await addToQueueAndWait({
app,
operationFn: import_Function.noop,
operationName: (0, import_i18n.t)(($) => $.obsidianDevUtils.queue.flushQueue)
});
}
function getQueue(app) {
return (0, import_App.getObsidianDevUtilsState)(app, "queue", { items: [], promise: Promise.resolve() });
}
async function processNextQueueItem(app) {
const queue = getQueue(app).value;
const item = queue.items[0];
if (!item) {
return;
}
await (0, import_Async.addErrorHandler)(
() => (0, import_AsyncWithNotice.runWithTimeoutNotice)({
context: { queuedFn: item.operationFn },
async operationFn(abortSignal) {
await (0, import_Logger.invokeAsyncAndLog)(
item.operationName || processNextQueueItem.name,
item.operationFn,
(0, import_AbortController.abortSignalAny)(abortSignal, item.abortSignal),
item.stackTrace
);
},
operationName: item.operationName,
shouldShowTimeoutNotice: item.shouldShowTimeoutNotice,
stackTrace: item.stackTrace,
timeoutInMilliseconds: item.timeoutInMilliseconds
})
);
queue.items.shift();
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
addToQueue,
addToQueueAndWait,
flushQueue
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1F1ZXVlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBlbnF1ZXVpbmcgYW5kIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVdyYXBwZXIgfSBmcm9tICcuL0FwcC50cyc7XG5cbmltcG9ydCB7XG4gIGFib3J0U2lnbmFsQW55LFxuICBhYm9ydFNpZ25hbE5ldmVyXG59IGZyb20gJy4uL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQge1xuICBhZGRFcnJvckhhbmRsZXIsXG4gIGludm9rZUFzeW5jU2FmZWx5XG59IGZyb20gJy4uL0FzeW5jLnRzJztcbmltcG9ydCB7IGdldFN0YWNrVHJhY2UgfSBmcm9tICcuLi9FcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9BcHAudHMnO1xuaW1wb3J0IHsgcnVuV2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL0FzeW5jV2l0aE5vdGljZS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgaW52b2tlQXN5bmNBbmRMb2cgfSBmcm9tICcuL0xvZ2dlci50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBhZGRUb1F1ZXVlQW5kV2FpdH0gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVG9RdWV1ZUFuZFdhaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFib3J0IHNpZ25hbC5cbiAgICovXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gYWRkLlxuICAgKi9cbiAgb3BlcmF0aW9uRm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIG9wZXJhdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgc3RhY2sgdHJhY2UuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBhZGRUb1F1ZXVlfSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRUb1F1ZXVlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBhYm9ydCBzaWduYWwuXG4gICAqL1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGFkZC5cbiAgICovXG4gIG9wZXJhdGlvbkZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBuYW1lIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgYSB0aW1lb3V0IG5vdGljZS4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRTaG93VGltZW91dE5vdGljZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICAgKi9cbiAgc3RhY2tUcmFjZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUXVldWUge1xuICBpdGVtczogUXVldWVJdGVtW107XG4gIHByb21pc2U6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBRdWV1ZUl0ZW0ge1xuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIG9wZXJhdGlvbkZuKHRoaXM6IHZvaWQsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2FibGU8dm9pZD47XG4gIG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U6IGJvb2xlYW47XG4gIHN0YWNrVHJhY2U6IHN0cmluZztcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQWRkcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUb1F1ZXVlKG9wdGlvbnM6IEFkZFRvUXVldWVPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBvcHRpb25zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gYWRkVG9RdWV1ZUFuZFdhaXQob3B0aW9ucyksIHN0YWNrVHJhY2UpO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBwcmV2aW91cyBmdW5jdGlvbiBjb21wbGV0ZXMgYW5kIHJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdW5jdGlvbiBjb21wbGV0ZXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVG9RdWV1ZUFuZFdhaXQob3B0aW9uczogQWRkVG9RdWV1ZUFuZFdhaXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFib3J0U2lnbmFsID0gb3B0aW9ucy5hYm9ydFNpZ25hbCA/PyBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgREVGQVVMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuICBjb25zdCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICBjb25zdCBzdGFja1RyYWNlID0gb3B0aW9ucy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBvcHRpb25zLm9wZXJhdGlvbk5hbWUgPz8gJyc7XG4gIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUob3B0aW9ucy5hcHApLnZhbHVlO1xuICBxdWV1ZS5pdGVtcy5wdXNoKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBvcGVyYXRpb25Gbjogb3B0aW9ucy5vcGVyYXRpb25GbixcbiAgICBvcGVyYXRpb25OYW1lLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBvcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlID8/IHRydWUsXG4gICAgc3RhY2tUcmFjZSxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgfSk7XG4gIHF1ZXVlLnByb21pc2UgPSBxdWV1ZS5wcm9taXNlLnRoZW4oKCkgPT4gcHJvY2Vzc05leHRRdWV1ZUl0ZW0ob3B0aW9ucy5hcHApKTtcbiAgYXdhaXQgcXVldWUucHJvbWlzZTtcbn1cblxuLyoqXG4gKiBGbHVzaGVzIHRoZSBxdWV1ZTtcbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmx1c2hRdWV1ZShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhZGRUb1F1ZXVlQW5kV2FpdCh7XG4gICAgYXBwLFxuICAgIG9wZXJhdGlvbkZuOiBub29wLFxuICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5xdWV1ZS5mbHVzaFF1ZXVlKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UXVldWUoYXBwOiBBcHApOiBWYWx1ZVdyYXBwZXI8UXVldWU+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdxdWV1ZScsIHsgaXRlbXM6IFtdLCBwcm9taXNlOiBQcm9taXNlLnJlc29sdmUoKSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05leHRRdWV1ZUl0ZW0oYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShhcHApLnZhbHVlO1xuICBjb25zdCBpdGVtID0gcXVldWUuaXRlbXNbMF07XG4gIGlmICghaXRlbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkZEVycm9ySGFuZGxlcigoKSA9PlxuICAgIHJ1bldpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICAgIGNvbnRleHQ6IHsgcXVldWVkRm46IGl0ZW0ub3BlcmF0aW9uRm4gfSxcbiAgICAgIGFzeW5jIG9wZXJhdGlvbkZuKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBpbnZva2VBc3luY0FuZExvZyhcbiAgICAgICAgICBpdGVtLm9wZXJhdGlvbk5hbWUgfHwgcHJvY2Vzc05leHRRdWV1ZUl0ZW0ubmFtZSxcbiAgICAgICAgICBpdGVtLm9wZXJhdGlvbkZuLFxuICAgICAgICAgIGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBpdGVtLmFib3J0U2lnbmFsKSxcbiAgICAgICAgICBpdGVtLnN0YWNrVHJhY2VcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvcGVyYXRpb25OYW1lOiBpdGVtLm9wZXJhdGlvbk5hbWUsXG4gICAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogaXRlbS5zaG91bGRTaG93VGltZW91dE5vdGljZSxcbiAgICAgIHN0YWNrVHJhY2U6IGl0ZW0uc3RhY2tUcmFjZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogaXRlbS50aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KVxuICApO1xuICBxdWV1ZS5pdGVtcy5zaGlmdCgpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EsNkJBR087QUFDUCxtQkFHTztBQUNQLG1CQUE4QjtBQUM5QixzQkFBcUI7QUFDckIsaUJBQXlDO0FBQ3pDLDZCQUFxQztBQUNyQyxrQkFBa0I7QUFDbEIsb0JBQWtDO0FBcUczQixTQUFTLFdBQVcsU0FBa0M7QUFDM0QsUUFBTSxhQUFhLFFBQVEsa0JBQWMsNEJBQWMsQ0FBQztBQUN4RCxzQ0FBa0IsTUFBTSxrQkFBa0IsT0FBTyxHQUFHLFVBQVU7QUFDaEU7QUFPQSxlQUFzQixrQkFBa0IsU0FBa0Q7QUFDeEYsUUFBTSxjQUFjLFFBQVEsbUJBQWUseUNBQWlCO0FBQzVELGNBQVksZUFBZTtBQUUzQixRQUFNLGtDQUFrQztBQUN4QyxRQUFNLHdCQUF3QixRQUFRLHlCQUF5QjtBQUMvRCxRQUFNLGFBQWEsUUFBUSxrQkFBYyw0QkFBYyxDQUFDO0FBQ3hELFFBQU0sZ0JBQWdCLFFBQVEsaUJBQWlCO0FBQy9DLFFBQU0sUUFBUSxTQUFTLFFBQVEsR0FBRyxFQUFFO0FBQ3BDLFFBQU0sTUFBTSxLQUFLO0FBQUEsSUFDZjtBQUFBLElBQ0EsYUFBYSxRQUFRO0FBQUEsSUFDckI7QUFBQSxJQUNBLHlCQUF5QixRQUFRLDJCQUEyQjtBQUFBLElBQzVEO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNELFFBQU0sVUFBVSxNQUFNLFFBQVEsS0FBSyxNQUFNLHFCQUFxQixRQUFRLEdBQUcsQ0FBQztBQUMxRSxRQUFNLE1BQU07QUFDZDtBQU9BLGVBQXNCLFdBQVcsS0FBeUI7QUFDeEQsUUFBTSxrQkFBa0I7QUFBQSxJQUN0QjtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsbUJBQWUsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsTUFBTSxVQUFVO0FBQUEsRUFDN0QsQ0FBQztBQUNIO0FBRUEsU0FBUyxTQUFTLEtBQStCO0FBQy9DLGFBQU8scUNBQXlCLEtBQUssU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLFNBQVMsUUFBUSxRQUFRLEVBQUUsQ0FBQztBQUN6RjtBQUVBLGVBQWUscUJBQXFCLEtBQXlCO0FBQzNELFFBQU0sUUFBUSxTQUFTLEdBQUcsRUFBRTtBQUM1QixRQUFNLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFDMUIsTUFBSSxDQUFDLE1BQU07QUFDVDtBQUFBLEVBQ0Y7QUFFQSxZQUFNO0FBQUEsSUFBZ0IsVUFDcEIsNkNBQXFCO0FBQUEsTUFDbkIsU0FBUyxFQUFFLFVBQVUsS0FBSyxZQUFZO0FBQUEsTUFDdEMsTUFBTSxZQUFZLGFBQXlDO0FBQ3pELGtCQUFNO0FBQUEsVUFDSixLQUFLLGlCQUFpQixxQkFBcUI7QUFBQSxVQUMzQyxLQUFLO0FBQUEsY0FDTCx1Q0FBZSxhQUFhLEtBQUssV0FBVztBQUFBLFVBQzVDLEtBQUs7QUFBQSxRQUNQO0FBQUEsTUFDRjtBQUFBLE1BQ0EsZUFBZSxLQUFLO0FBQUEsTUFDcEIseUJBQXlCLEtBQUs7QUFBQSxNQUM5QixZQUFZLEtBQUs7QUFBQSxNQUNqQix1QkFBdUIsS0FBSztBQUFBLElBQzlCLENBQUM7QUFBQSxFQUNIO0FBQ0EsUUFBTSxNQUFNLE1BQU07QUFDcEI7IiwKICAibmFtZXMiOiBbXQp9Cg==