/*
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
if you want to view the source visit the plugin's github repository
*/
'use strict';
var obsidian = require('obsidian');
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
var codemirror = CodeMirror;
function createCommonjsModule(fn) {
var module = { exports: {} };
return fn(module, module.exports), module.exports;
}
createCommonjsModule(function (module, exports) {
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function(mod) {
mod(codemirror);
})(function(CodeMirror) {
CodeMirror.defineMode("cook", function() {
return {
token: function(stream, state) {
var sol = stream.sol() || state.afterSection;
var eol = stream.eol();
state.afterSection = false;
if (sol) {
if (state.nextMultiline) {
state.inMultiline = true;
state.nextMultiline = false;
} else {
state.position = null;
}
}
if (eol && ! state.nextMultiline) {
state.inMultiline = false;
state.position = null;
}
if (sol) {
while(stream.eatSpace()) {}
}
var ch = stream.next();
if (sol && ch === ">") {
if (stream.eat(">")) {
state.position = "metadata-key";
return "metadata"
}
}
if(state.position === "metadata");
else if(state.position === "metadata-key") {
if(ch === ':') state.position = "metadata";
}
else {
if (ch === "-") {
if (stream.eat("-")) {
stream.skipToEnd();
return "comment";
}
}
if (stream.match(/\[-.+?-\]/))
return "comment";
if(stream.match(/^@([^@#~]+?(?={))/))
return "ingredient";
else if(stream.match(/^@(.+?\b)/))
return "ingredient";
if(stream.match(/^#([^@#~]+?(?={))/))
return "cookware";
else if(stream.match(/^#(.+?\b)/))
return "cookware";
if(ch === '~'){
state.position = "timer";
return "formatting";
}
if(ch === '{'){
if(state.position != "timer") state.position = "measurement";
return "formatting";
}
if(ch === '}'){
state.position = null;
return "formatting";
}
if(ch === '%' && (state.position === "measurement" || state.position === "timer")){
state.position = "unit";
return "formatting";
}
}
return state.position;
},
startState: function() {
return {
formatting : false,
nextMultiline : false, // Is the next line multiline value
inMultiline : false, // Is the current line a multiline value
afterSection : false // Did we just open a section
};
}
};
});
CodeMirror.defineMIME("text/x-cook", "cook");
CodeMirror.defineMIME("text/x-cooklang", "cook");
});
});
// utility class for parsing cooklang files
class CookLang {
static parse(source) {
const recipe = new Recipe();
source.split('\n').forEach(line => {
let match;
// clear comments
line = line.replace(/(--.*)|(\[-.+?-\])/, '');
// skip blank lines
if (line.trim().length === 0)
return;
// metadata lines
else if (match = Metadata.regex.exec(line)) {
recipe.metadata.push(new Metadata(match[0]));
}
// method lines
else {
// ingredients on a line
while (match = Ingredient.regex.exec(line)) {
const ingredient = new Ingredient(match[0]);
recipe.ingredients.push(ingredient);
line = line.replace(match[0], ingredient.methodOutput());
}
// cookware on a line
while (match = Cookware.regex.exec(line)) {
const c = new Cookware(match[0]);
recipe.cookware.push(c);
line = line.replace(match[0], c.methodOutput());
}
// timers on a line
while (match = Timer.regex.exec(line)) {
const t = new Timer(match[0]);
recipe.timers.push(t);
line = line.replace(match[0], t.methodOutput());
}
// add in the method line
recipe.method.push(line.trim());
}
});
return recipe;
}
}
// a class representing a recipe
class Recipe {
constructor() {
this.metadata = [];
this.ingredients = [];
this.cookware = [];
this.timers = [];
this.method = [];
this.methodImages = new Map();
}
calculateTotalTime() {
let time = 0;
this.timers.forEach(timer => {
let amount = 0;
if (parseFloat(timer.amount) + '' == timer.amount)
amount = parseFloat(timer.amount);
else if (timer.amount.contains('/')) {
const split = timer.amount.split('/');
if (split.length == 2) {
const num = parseFloat(split[0]);
const den = parseFloat(split[1]);
if (num && den) {
amount = num / den;
}
}
}
if (amount > 0) {
if (timer.unit.toLowerCase().startsWith('s')) {
time += amount;
}
else if (timer.unit.toLowerCase().startsWith('m')) {
time += amount * 60;
}
else if (timer.unit.toLowerCase().startsWith('h')) {
time += amount * 60 * 60;
}
}
});
return time;
}
}
// a class representing an ingredient
class Ingredient {
constructor(s) {
var _a;
this.originalString = null;
this.name = null;
this.amount = null;
this.unit = null;
this.methodOutput = () => {
let s = ``;
if (this.amount !== null) {
s += `${this.amount} `;
}
if (this.unit !== null) {
s += `${this.unit} `;
}
s += `${this.name}`;
return s;
};
this.listOutput = () => {
let s = ``;
if (this.amount !== null) {
s += `${this.amount} `;
}
if (this.unit !== null) {
s += `${this.unit} `;
}
s += this.name;
return s;
};
this.originalString = s;
const match = Ingredient.regex.exec(s);
this.name = match[1] || match[3];
const attrs = (_a = match[2]) === null || _a === void 0 ? void 0 : _a.split('%');
this.amount = attrs && attrs.length > 0 ? attrs[0] : null;
this.unit = attrs && attrs.length > 1 ? attrs[1] : null;
}
}
// starts with an @, ends at a word boundary or {}
// (also capture what's inside the {})
Ingredient.regex = /@(?:([^@#~]+?)(?:{(.*?)}|{}))|@(.+?\b)/;
// a class representing an item of cookware
class Cookware {
constructor(s) {
this.originalString = null;
this.name = null;
this.methodOutput = () => {
return `${this.name}`;
};
this.listOutput = () => {
return this.name;
};
this.originalString = s;
const match = Cookware.regex.exec(s);
this.name = match[1] || match[2];
}
}
// starts with a #, ends at a word boundary or {}
Cookware.regex = /#(?:([^@#~]+?)(?:{}))|#(.+?\b)/;
// a class representing a timer
class Timer {
constructor(s) {
this.originalString = null;
this.amount = null;
this.unit = null;
this.methodOutput = () => {
return `${this.amount} ${this.unit}`;
};
this.listOutput = () => {
return `${this.amount} ${this.unit}`;
};
const match = Timer.regex.exec(s);
this.amount = match[1];
this.unit = match[2];
}
}
// contained within ~{}
Timer.regex = /~{([0-9]+)%(.+?)}/;
// a class representing metadata item
class Metadata {
constructor(s) {
this.originalString = null;
this.key = null;
this.value = null;
this.methodOutput = () => {
return `${this.key} ${this.value}`;
};
this.listOutput = () => {
return `${this.key} ${this.value}`;
};
const match = Metadata.regex.exec(s);
this.key = match[1].trim();
this.value = match[2].trim();
}
}
// starts with >>
Metadata.regex = />>\s*(.*?):\s*(.*)/;
// This is the custom view
class CookView extends obsidian.TextFileView {
constructor(leaf, settings) {
super(leaf);
this.settings = settings;
// Add Preview Mode Container
this.previewEl = this.contentEl.createDiv({ cls: 'cook-preview-view', attr: { 'style': 'display: none' } });
// Add Source Mode Container
this.sourceEl = this.contentEl.createDiv({ cls: 'cook-source-view', attr: { 'style': 'display: block' } });
// Add container for CodeMirror editor
this.editorEl = this.sourceEl.createEl('textarea', { cls: 'cook-cm-editor' });
// Create CodeMirror Editor with specific config
this.editor = CodeMirror.fromTextArea(this.editorEl, {
lineNumbers: false,
lineWrapping: true,
scrollbarStyle: null,
keyMap: "default",
theme: "obsidian"
});
}
onload() {
// Save file on change
this.editor.on('change', () => {
this.requestSave();
});
// add the action to switch between source and preview mode
this.changeModeButton = this.addAction('lines-of-text', 'Preview (Ctrl+Click to open in new pane)', (evt) => this.switchMode(evt), 17);
// undocumented: Get the current default view mode to switch to
let defaultViewMode = this.app.vault.getConfig('defaultViewMode');
this.setState(Object.assign(Object.assign({}, this.getState()), { mode: defaultViewMode }), {});
}
getState() {
return super.getState();
}
setState(state, result) {
return super.setState(state, result).then(() => {
if (state.mode)
this.switchMode(state.mode);
});
}
// function to switch between source and preview mode
switchMode(arg) {
let mode = arg;
// if force mode not provided, switch to opposite of current mode
if (!mode || mode instanceof MouseEvent)
mode = this.currentView === 'source' ? 'preview' : 'source';
if (arg instanceof MouseEvent) {
if (obsidian.Keymap.isModEvent(arg)) {
this.app.workspace.duplicateLeaf(this.leaf).then(() => {
var _a;
const cookLeaf = (_a = this.app.workspace.activeLeaf) === null || _a === void 0 ? void 0 : _a.view;
if (cookLeaf) {
cookLeaf.setState(Object.assign(Object.assign({}, cookLeaf.getState()), { mode: mode }), {});
}
});
}
else {
this.setState(Object.assign(Object.assign({}, this.getState()), { mode: mode }), {});
}
}
else {
// switch to preview mode
if (mode === 'preview') {
this.currentView = 'preview';
obsidian.setIcon(this.changeModeButton, 'pencil');
this.changeModeButton.setAttribute('aria-label', 'Edit (Ctrl+Click to edit in new pane)');
this.renderPreview(this.recipe);
this.previewEl.style.setProperty('display', 'block');
this.sourceEl.style.setProperty('display', 'none');
}
// switch to source mode
else {
this.currentView = 'source';
obsidian.setIcon(this.changeModeButton, 'lines-of-text');
this.changeModeButton.setAttribute('aria-label', 'Preview (Ctrl+Click to open in new pane)');
this.previewEl.style.setProperty('display', 'none');
this.sourceEl.style.setProperty('display', 'block');
this.editor.refresh();
}
}
}
// get the data for save
getViewData() {
this.data = this.editor.getValue();
// may as well parse the recipe while we're here.
this.recipe = CookLang.parse(this.data);
return this.data;
}
// load the data into the view
setViewData(data, clear) {
return __awaiter(this, void 0, void 0, function* () {
this.data = data;
if (clear) {
this.editor.swapDoc(CodeMirror.Doc(data, "text/x-cook"));
this.editor.clearHistory();
}
this.editor.setValue(data);
this.recipe = CookLang.parse(data);
// if we're in preview view, also render that
if (this.currentView === 'preview')
this.renderPreview(this.recipe);
});
}
// clear the editor, etc
clear() {
this.previewEl.empty();
this.editor.setValue('');
this.editor.clearHistory();
this.recipe = new Recipe();
this.data = null;
}
getDisplayText() {
if (this.file)
return this.file.basename;
else
return "Cooklang (no file)";
}
canAcceptExtension(extension) {
return extension == 'cook';
}
getViewType() {
return "cook";
}
// when the view is resized, refresh CodeMirror (thanks Licat!)
onResize() {
this.editor.refresh();
}
// icon for the view
getIcon() {
return "document-cook";
}
// render the preview view
renderPreview(recipe) {
// clear the preview before adding the rest
this.previewEl.empty();
// we can't render what we don't have...
if (!recipe)
return;
if (this.settings.showImages) {
// add any files following the cooklang conventions to the recipe object
// https://cooklang.org/docs/spec/#adding-pictures
const otherFiles = this.file.parent.children.filter(f => (f instanceof obsidian.TFile) && (f.basename == this.file.basename || f.basename.startsWith(this.file.basename + '.')) && f.name != this.file.name);
otherFiles.forEach(f => {
// convention specifies JPEGs and PNGs. Added GIFs as well. Why not?
if (f.extension == "jpg" || f.extension == "jpeg" || f.extension == "png" || f.extension == "gif") {
// main recipe image
if (f.basename == this.file.basename)
recipe.image = f;
else {
const split = f.basename.split('.');
// individual step images
if (split.length == 2 && parseInt(split[1])) {
recipe.methodImages.set(parseInt(split[1]), f);
}
}
}
});
// if there is a main image, put it as a banner image at the top
if (recipe.image) {
const img = this.previewEl.createEl('img', { cls: 'main-image' });
img.src = this.app.vault.getResourcePath(recipe.image);
}
}
if (this.settings.showIngredientList) {
// Add the Ingredients header
this.previewEl.createEl('h2', { cls: 'ingredients-header', text: 'Ingredients' });
// Add the ingredients list
const ul = this.previewEl.createEl('ul', { cls: 'ingredients' });
recipe.ingredients.forEach(ingredient => {
const li = ul.createEl('li');
if (ingredient.amount !== null) {
li.createEl('span', { cls: 'amount', text: ingredient.amount });
li.appendText(' ');
}
if (ingredient.unit !== null) {
li.createEl('span', { cls: 'unit', text: ingredient.unit });
li.appendText(' ');
}
li.appendText(ingredient.name);
});
}
if (this.settings.showCookwareList) {
// Add the Cookware header
this.previewEl.createEl('h2', { cls: 'cookware-header', text: 'Cookware' });
// Add the Cookware list
const ul = this.previewEl.createEl('ul', { cls: 'cookware' });
recipe.cookware.forEach(item => {
ul.createEl('li', { text: item.name });
});
}
if (this.settings.showTotalTime) {
let time = recipe.calculateTotalTime();
if (time > 0) {
// Add the Timers header
this.previewEl.createEl('h2', { cls: 'time-header', text: 'Total Time' });
this.previewEl.createEl('p', { cls: 'time', text: this.formatTime(time) });
}
}
// add the method header
this.previewEl.createEl('h2', { cls: 'method-header', text: 'Method' });
// add the method list
const mol = this.previewEl.createEl('ol', { cls: 'method' });
let i = 1;
recipe.method.forEach(line => {
var _a, _b;
const mli = mol.createEl('li');
mli.innerHTML = line;
if (!this.settings.showQuantitiesInline) {
(_a = mli.querySelectorAll('.amount')) === null || _a === void 0 ? void 0 : _a.forEach(el => el.remove());
(_b = mli.querySelectorAll('.unit')) === null || _b === void 0 ? void 0 : _b.forEach(el => el.remove());
}
if (this.settings.showImages && recipe.methodImages.has(i)) {
const img = mli.createEl('img', { cls: 'method-image' });
img.src = this.app.vault.getResourcePath(recipe.methodImages.get(i));
}
i++;
});
}
formatTime(time) {
let minutes = Math.floor(time / 60);
let hours = Math.floor(minutes / 60);
minutes = minutes % 60;
let result = "";
if (hours > 0)
result += hours + " hours ";
if (minutes > 0)
result += minutes + " minutes ";
return result;
}
}
class CookLangSettings {
constructor() {
this.showImages = true;
this.showIngredientList = true;
this.showCookwareList = true;
this.showTotalTime = true;
this.showQuantitiesInline = false;
}
}
class CookSettingsTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
new obsidian.Setting(containerEl)
.setName('Preview Options')
.setHeading();
new obsidian.Setting(containerEl)
.setName('Show images')
.setDesc('Show images in the recipe (see https://cooklang.org/docs/spec/#adding-pictures)')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.showImages)
.onChange((value) => {
this.plugin.settings.showImages = value;
this.plugin.saveData(this.plugin.settings);
this.plugin.reloadCookViews();
}));
new obsidian.Setting(containerEl)
.setName('Show ingredient list')
.setDesc('Show the list of ingredients at the top of the recipe')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.showIngredientList)
.onChange((value) => {
this.plugin.settings.showIngredientList = value;
this.plugin.saveData(this.plugin.settings);
this.plugin.reloadCookViews();
}));
new obsidian.Setting(containerEl)
.setName('Show cookware list')
.setDesc('Show the list of cookware at the top of the recipe')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.showCookwareList)
.onChange((value) => {
this.plugin.settings.showCookwareList = value;
this.plugin.saveData(this.plugin.settings);
this.plugin.reloadCookViews();
}));
new obsidian.Setting(containerEl)
.setName('Show total time')
.setDesc('Show the total of all timers at the top of the recipe')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.showTotalTime)
.onChange((value) => {
this.plugin.settings.showTotalTime = value;
this.plugin.saveData(this.plugin.settings);
this.plugin.reloadCookViews();
}));
new obsidian.Setting(containerEl)
.setName('Show quantities inline')
.setDesc('Show the ingredient quantities inline in the recipe method')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.showQuantitiesInline)
.onChange((value) => {
this.plugin.settings.showQuantitiesInline = value;
this.plugin.saveData(this.plugin.settings);
this.plugin.reloadCookViews();
}));
}
}
class CookPlugin extends obsidian.Plugin {
constructor() {
super(...arguments);
this.cookFileCreator = () => __awaiter(this, void 0, void 0, function* () {
var _a, _b;
let newFileFolderPath = null;
const newFileLocation = this.app.vault.getConfig('newFileLocation');
if (!newFileLocation || newFileLocation === "root") {
newFileFolderPath = '/';
}
else if (newFileLocation === "current") {
newFileFolderPath = (_b = (_a = this.app.workspace.getActiveFile()) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.path;
}
else {
newFileFolderPath = this.app.vault.getConfig('newFileFolderPath');
}
if (!newFileFolderPath)
newFileFolderPath = '/';
else if (!newFileFolderPath.endsWith('/'))
newFileFolderPath += '/';
const originalPath = newFileFolderPath;
newFileFolderPath = newFileFolderPath + 'Untitled.cook';
let i = 0;
while (this.app.vault.getAbstractFileByPath(newFileFolderPath)) {
newFileFolderPath = `${originalPath}Untitled ${++i}.cook`;
}
const newFile = yield this.app.vault.create(newFileFolderPath, '');
return newFile;
});
// function to create the view
this.cookViewCreator = (leaf) => {
return new CookView(leaf, this.settings);
};
// this function provides the icon for the document
// I added a modification of the CookLang icon with no colours or shadows
this.addDocumentIcon = (extension) => {
obsidian.addIcon(`document-${extension}`, `
`);
};
}
onload() {
const _super = Object.create(null, {
onload: { get: () => super.onload }
});
return __awaiter(this, void 0, void 0, function* () {
_super.onload.call(this);
this.settings = Object.assign(new CookLangSettings(), yield this.loadData());
// register a custom icon
this.addDocumentIcon("cook");
// register the view and extensions
this.registerView("cook", this.cookViewCreator);
this.registerExtensions(["cook"], "cook");
this.addSettingTab(new CookSettingsTab(this.app, this));
// commands:
// - Create new recipe
// - Create recipe in new pane
// - Convert markdown file to `.cook`
this.addCommand({
id: "create-cook",
name: "Create new recipe",
callback: () => __awaiter(this, void 0, void 0, function* () {
const newFile = yield this.cookFileCreator();
this.app.workspace.getLeaf().openFile(newFile);
})
});
this.addCommand({
id: "create-cook-new-pane",
name: "Create recipe in new pane",
callback: () => __awaiter(this, void 0, void 0, function* () {
const newFile = yield this.cookFileCreator();
yield this.app.workspace.getLeaf(true).openFile(newFile);
})
});
// register the convert to cook command
this.addCommand({
id: "convert-to-cook",
name: "Convert markdown file to `.cook`",
checkCallback: (checking) => {
const file = this.app.workspace.getActiveFile();
const isMd = file.extension === "md";
if (checking) {
return isMd;
}
else if (isMd) {
// replace last instance of .md with .cook
this.app.vault.rename(file, file.path.replace(/\.md$/, ".cook")).then(() => {
this.app.workspace.activeLeaf.openFile(file);
});
}
}
});
});
}
reloadCookViews() {
this.app.workspace.getLeavesOfType('cook').forEach(leaf => {
if (leaf.view instanceof CookView) {
leaf.view.settings = this.settings;
if (leaf.view.recipe)
leaf.view.renderPreview(leaf.view.recipe);
}
});
}
}
module.exports = CookPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9saWIvY29kZW1pcnJvci5qcyIsInNyYy9tb2RlL2Nvb2svY29vay5qcyIsInNyYy9jb29rbGFuZy50cyIsInNyYy9jb29rVmlldy50cyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwiVGV4dEZpbGVWaWV3IiwiS2V5bWFwIiwic2V0SWNvbiIsIlRGaWxlIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciLCJQbHVnaW4iLCJhZGRJY29uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNB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