UNPKG

obsidian-dev-utils

Version:

This is the collection of useful functions that you can use for your Obsidian plugin development

96 lines (93 loc) 15.1 kB
/* 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){require=Object.assign(id=>requirePatched(id),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>{const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};return browserProcess},"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&"default"in module?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id){const module=originalRequire?.(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})(); "use strict"; 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 AttachmentPath_exports = {}; __export(AttachmentPath_exports, { getAttachmentFilePath: () => getAttachmentFilePath, getAttachmentFolderPath: () => getAttachmentFolderPath, getAvailablePathForAttachments: () => getAvailablePathForAttachments, hasOwnAttachmentFolder: () => hasOwnAttachmentFolder }); module.exports = __toCommonJS(AttachmentPath_exports); var import_implementations = require('obsidian-typings/implementations'); var import_Path = require('../Path.cjs'); var import_String = require('../String.cjs'); var import_FileSystem = require('./FileSystem.cjs'); async function getAttachmentFilePath(app, attachmentPathOrFile, notePathOrFile) { const attachmentPath = (0, import_FileSystem.getPath)(app, attachmentPathOrFile); const notePath = (0, import_FileSystem.getPath)(app, notePathOrFile); const note = (0, import_FileSystem.getFile)(app, notePath, true); const ext = (0, import_Path.extname)(attachmentPath); const fileName = (0, import_Path.basename)(attachmentPath, ext); const internalFn = app.vault.getAvailablePathForAttachments; if (internalFn.isExtended) { return internalFn(fileName, ext.slice(1), note, true); } return await getAvailablePathForAttachments(app, fileName, ext.slice(1), note, true); } async function getAttachmentFolderPath(app, notePathOrFile) { return (0, import_implementations.parentFolderPath)(await getAttachmentFilePath(app, "DUMMY_FILE.pdf", notePathOrFile)); } async function getAvailablePathForAttachments(app, attachmentFileName, attachmentExtension, noteFile, shouldSkipMissingAttachmentFolderCreation) { let attachmentFolderPath = app.vault.getConfig("attachmentFolderPath"); const isCurrentFolder = attachmentFolderPath === "." || attachmentFolderPath === "./"; let relativePath = null; if (attachmentFolderPath.startsWith("./")) { relativePath = (0, import_String.trimStart)(attachmentFolderPath, "./"); } if (isCurrentFolder) { attachmentFolderPath = noteFile ? noteFile.parent?.path ?? "" : ""; } else if (relativePath) { attachmentFolderPath = (noteFile ? noteFile.parent?.getParentPrefix() ?? "" : "") + relativePath; } attachmentFolderPath = (0, import_String.normalize)(normalizeSlashes(attachmentFolderPath)); attachmentFileName = (0, import_String.normalize)(normalizeSlashes(attachmentFileName)); let folder = (0, import_FileSystem.getFolderOrNull)(app, attachmentFolderPath, true); if (!folder && relativePath) { if (shouldSkipMissingAttachmentFolderCreation) { folder = (0, import_FileSystem.getFolder)(app, attachmentFolderPath, true); } else { folder = await app.vault.createFolder(attachmentFolderPath); } } const prefix = folder?.getParentPrefix() ?? ""; return app.vault.getAvailablePath(prefix + attachmentFileName, attachmentExtension); } async function hasOwnAttachmentFolder(app, path) { const attachmentFolderPath = await getAttachmentFolderPath(app, path); const dummyAttachmentFolderPath = await getAttachmentFolderPath(app, (0, import_Path.join)((0, import_Path.dirname)(path), "DUMMY_FILE.md")); return attachmentFolderPath !== dummyAttachmentFolderPath; } function normalizeSlashes(path) { path = (0, import_String.replaceAll)(path, /(?:[\\/])+/g, "/"); path = (0, import_String.replaceAll)(path, /^\/+|\/+$/g, ""); return path || "/"; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getAttachmentFilePath, getAttachmentFolderPath, getAvailablePathForAttachments, hasOwnAttachmentFolder }); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0F0dGFjaG1lbnRQYXRoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJy4uL1N0cmluZy50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aFxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG4vKipcbiAqIElzIG92ZXJyaWRkZW4gd3JhcHBlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFdyYXBwZXIge1xuICAvKipcbiAgICogSXMgZXh0ZW5kZWQuXG4gICAqL1xuICBpc0V4dGVuZGVkOiB0cnVlO1xufVxuXG4vKipcbiAqIEdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRm4gPSAoXG4gIGF0dGFjaG1lbnRGaWxlTmFtZTogc3RyaW5nLFxuICBhdHRhY2htZW50RXh0ZW5zaW9uOiBzdHJpbmcsXG4gIG5vdGVGaWxlOiBudWxsIHwgVEZpbGUsXG4gIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uPzogYm9vbGVhblxuKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmaWxlIHBhdGggZm9yIGFuIGF0dGFjaG1lbnQgd2l0aGluIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGF0dGFjaG1lbnRQYXRoT3JGaWxlIC0gVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gKiBAcGFyYW0gbm90ZVBhdGhPckZpbGUgLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGaWxlUGF0aChhcHA6IEFwcCwgYXR0YWNobWVudFBhdGhPckZpbGU6IFBhdGhPckZpbGUsIG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYXR0YWNobWVudFBhdGggPSBnZXRQYXRoKGFwcCwgYXR0YWNobWVudFBhdGhPckZpbGUpO1xuICBjb25zdCBub3RlUGF0aCA9IGdldFBhdGgoYXBwLCBub3RlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5vdGUgPSBnZXRGaWxlKGFwcCwgbm90ZVBhdGgsIHRydWUpO1xuICBjb25zdCBleHQgPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSBiYXNlbmFtZShhdHRhY2htZW50UGF0aCwgZXh0KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGNvbnN0IGludGVybmFsRm4gPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzO1xuICBpZiAoKGludGVybmFsRm4gYXMgUGFydGlhbDxFeHRlbmRlZFdyYXBwZXI+KS5pc0V4dGVuZGVkKSB7XG4gICAgcmV0dXJuIChpbnRlcm5hbEZuIGFzIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRm4pKGZpbGVOYW1lLCBleHQuc2xpY2UoMSksIG5vdGUsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhhcHAsIGZpbGVOYW1lLCBleHQuc2xpY2UoMSksIG5vdGUsIHRydWUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmb3IgYSBnaXZlbiBub3RlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbm90ZVBhdGhPckZpbGUgLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHA6IEFwcCwgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gcGFyZW50Rm9sZGVyUGF0aChhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoYXBwLCAnRFVNTVlfRklMRS5wZGYnLCBub3RlUGF0aE9yRmlsZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXR0YWNobWVudEZpbGVOYW1lIC0gRmlsZSBuYW1lIG9mIHRoZSBhdHRhY2htZW50LlxuICogQHBhcmFtIGF0dGFjaG1lbnRFeHRlbnNpb24gLSBFeHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gKiBAcGFyYW0gbm90ZUZpbGUgLSBUaGUgZmlsZSB0byBhdHRhY2ggdG8uXG4gKiBAcGFyYW0gc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24gLSBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkP1xuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKFxuICBhcHA6IEFwcCxcbiAgYXR0YWNobWVudEZpbGVOYW1lOiBzdHJpbmcsXG4gIGF0dGFjaG1lbnRFeHRlbnNpb246IHN0cmluZyxcbiAgbm90ZUZpbGU6IG51bGwgfCBURmlsZSxcbiAgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IGJvb2xlYW5cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGFwcC52YXVsdC5nZXRDb25maWcoJ2F0dGFjaG1lbnRGb2xkZXJQYXRoJykgYXMgc3RyaW5nO1xuICBjb25zdCBpc0N1cnJlbnRGb2xkZXIgPSBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4nIHx8IGF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLi8nO1xuICBsZXQgcmVsYXRpdmVQYXRoID0gbnVsbDtcblxuICBpZiAoYXR0YWNobWVudEZvbGRlclBhdGguc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IHRyaW1TdGFydChhdHRhY2htZW50Rm9sZGVyUGF0aCwgJy4vJyk7XG4gIH1cblxuICBpZiAoaXNDdXJyZW50Rm9sZGVyKSB7XG4gICAgYXR0YWNobWVudEZvbGRlclBhdGggPSBub3RlRmlsZSA/IG5vdGVGaWxlLnBhcmVudD8ucGF0aCA/PyAnJyA6ICcnO1xuICB9IGVsc2UgaWYgKHJlbGF0aXZlUGF0aCkge1xuICAgIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gKG5vdGVGaWxlID8gbm90ZUZpbGUucGFyZW50Py5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJyA6ICcnKSArIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gbm9ybWFsaXplKG5vcm1hbGl6ZVNsYXNoZXMoYXR0YWNobWVudEZvbGRlclBhdGgpKTtcbiAgYXR0YWNobWVudEZpbGVOYW1lID0gbm9ybWFsaXplKG5vcm1hbGl6ZVNsYXNoZXMoYXR0YWNobWVudEZpbGVOYW1lKSk7XG5cbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoLCB0cnVlKTtcblxuICBpZiAoIWZvbGRlciAmJiByZWxhdGl2ZVBhdGgpIHtcbiAgICBpZiAoc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24pIHtcbiAgICAgIGZvbGRlciA9IGdldEZvbGRlcihhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9sZGVyID0gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gZm9sZGVyPy5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJztcbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKHByZWZpeCArIGF0dGFjaG1lbnRGaWxlTmFtZSwgYXR0YWNobWVudEV4dGVuc2lvbik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc093bkF0dGFjaG1lbnRGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgcGF0aCk7XG4gIGNvbnN0IGR1bW15QXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIGpvaW4oZGlybmFtZShwYXRoKSwgJ0RVTU1ZX0ZJTEUubWQnKSk7XG4gIHJldHVybiBhdHRhY2htZW50Rm9sZGVyUGF0aCAhPT0gZHVtbXlBdHRhY2htZW50Rm9sZGVyUGF0aDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCBieSBjb21iaW5pbmcgbXVsdGlwbGUgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIHNsYXNoIGFuZCByZW1vdmluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTbGFzaGVzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHBhdGggPSByZXBsYWNlQWxsKHBhdGgsIC8oPzpbXFxcXC9dKSsvZywgJy8nKTtcbiAgcGF0aCA9IHJlcGxhY2VBbGwocGF0aCwgL15cXC8rfFxcLyskL2csICcnKTtcbiAgcmV0dXJuIHBhdGggfHwgJy8nO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSw2QkFBaUM7QUFJakMsa0JBS087QUFDUCxvQkFJTztBQUNQLHdCQUtPO0FBOEJQLGVBQXNCLHNCQUFzQixLQUFVLHNCQUFrQyxnQkFBNkM7QUFDbkksUUFBTSxxQkFBaUIsMkJBQVEsS0FBSyxvQkFBb0I7QUFDeEQsUUFBTSxlQUFXLDJCQUFRLEtBQUssY0FBYztBQUM1QyxRQUFNLFdBQU8sMkJBQVEsS0FBSyxVQUFVLElBQUk7QUFDeEMsUUFBTSxVQUFNLHFCQUFRLGNBQWM7QUFDbEMsUUFBTSxlQUFXLHNCQUFTLGdCQUFnQixHQUFHO0FBRzdDLFFBQU0sYUFBYSxJQUFJLE1BQU07QUFDN0IsTUFBSyxXQUF3QyxZQUFZO0FBQ3ZELFdBQVEsV0FBd0QsVUFBVSxJQUFJLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSTtBQUFBLEVBQ3BHO0FBRUEsU0FBTyxNQUFNLCtCQUErQixLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUk7QUFDckY7QUFTQSxlQUFzQix3QkFBd0IsS0FBVSxnQkFBNkM7QUFDbkcsYUFBTyx5Q0FBaUIsTUFBTSxzQkFBc0IsS0FBSyxrQkFBa0IsY0FBYyxDQUFDO0FBQzVGO0FBWUEsZUFBc0IsK0JBQ3BCLEtBQ0Esb0JBQ0EscUJBQ0EsVUFDQSwyQ0FDaUI7QUFDakIsTUFBSSx1QkFBdUIsSUFBSSxNQUFNLFVBQVUsc0JBQXNCO0FBQ3JFLFFBQU0sa0JBQWtCLHlCQUF5QixPQUFPLHlCQUF5QjtBQUNqRixNQUFJLGVBQWU7QUFFbkIsTUFBSSxxQkFBcUIsV0FBVyxJQUFJLEdBQUc7QUFDekMsdUJBQWUseUJBQVUsc0JBQXNCLElBQUk7QUFBQSxFQUNyRDtBQUVBLE1BQUksaUJBQWlCO0FBQ25CLDJCQUF1QixXQUFXLFNBQVMsUUFBUSxRQUFRLEtBQUs7QUFBQSxFQUNsRSxXQUFXLGNBQWM7QUFDdkIsNEJBQXdCLFdBQVcsU0FBUyxRQUFRLGdCQUFnQixLQUFLLEtBQUssTUFBTTtBQUFBLEVBQ3RGO0FBRUEsNkJBQXVCLHlCQUFVLGlCQUFpQixvQkFBb0IsQ0FBQztBQUN2RSwyQkFBcUIseUJBQVUsaUJBQWlCLGtCQUFrQixDQUFDO0FBRW5FLE1BQUksYUFBUyxtQ0FBZ0IsS0FBSyxzQkFBc0IsSUFBSTtBQUU1RCxNQUFJLENBQUMsVUFBVSxjQUFjO0FBQzNCLFFBQUksMkNBQTJDO0FBQzdDLG1CQUFTLDZCQUFVLEtBQUssc0JBQXNCLElBQUk7QUFBQSxJQUNwRCxPQUFPO0FBQ0wsZUFBUyxNQUFNLElBQUksTUFBTSxhQUFhLG9CQUFvQjtBQUFBLElBQzVEO0FBQUEsRUFDRjtBQUVBLFFBQU0sU0FBUyxRQUFRLGdCQUFnQixLQUFLO0FBQzVDLFNBQU8sSUFBSSxNQUFNLGlCQUFpQixTQUFTLG9CQUFvQixtQkFBbUI7QUFDcEY7QUFTQSxlQUFzQix1QkFBdUIsS0FBVSxNQUFnQztBQUNyRixRQUFNLHVCQUF1QixNQUFNLHdCQUF3QixLQUFLLElBQUk7QUFDcEUsUUFBTSw0QkFBNEIsTUFBTSx3QkFBd0IsU0FBSyxzQkFBSyxxQkFBUSxJQUFJLEdBQUcsZUFBZSxDQUFDO0FBQ3pHLFNBQU8seUJBQXlCO0FBQ2xDO0FBUUEsU0FBUyxpQkFBaUIsTUFBc0I7QUFDOUMsYUFBTywwQkFBVyxNQUFNLGVBQWUsR0FBRztBQUMxQyxhQUFPLDBCQUFXLE1BQU0sY0FBYyxFQUFFO0FBQ3hDLFNBQU8sUUFBUTtBQUNqQjsiLAogICJuYW1lcyI6IFtdCn0K