From a85c7a41232962dff7ad5958b4d34570edae0ee5 Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Thu, 23 Apr 2026 22:37:05 +0200 Subject: [PATCH 1/5] docs: improve docs site onboarding --- docs/docs/Advanced/APIOverview.md | 51 ++++++ docs/docs/Advanced/ScriptingGuide.md | 58 ++++++ docs/docs/Choices/CaptureChoice.md | 3 +- docs/docs/Examples/Capture_CanvasCapture.md | 86 +++++++++ docs/docs/Examples/index.md | 40 +++++ docs/docs/QuickAddAPI.md | 7 + docs/docs/UserScripts.md | 9 +- docs/docs/index.md | 81 +++++---- docs/docusaurus.config.js | 27 ++- docs/sidebars.js | 66 ++++--- docs/src/css/custom.css | 1 - docs/src/pages/index.module.css | 168 +++++++++++++++++- docs/src/pages/index.tsx | 74 +++++++- .../version-2.12.0/Advanced/APIOverview.md | 51 ++++++ .../version-2.12.0/Advanced/ScriptingGuide.md | 58 ++++++ .../version-2.12.0/Choices/CaptureChoice.md | 3 +- .../Examples/Capture_CanvasCapture.md | 86 +++++++++ ...Template_CreateMOCNoteWithLinkDashboard.md | 106 +++++++++++ .../version-2.12.0/Examples/index.md | 40 +++++ .../template_moc_link_dashboard_demo.png | Bin 0 -> 87793 bytes .../version-2.12.0/QuickAddAPI.md | 7 + .../version-2.12.0/UserScripts.md | 9 +- docs/versioned_docs/version-2.12.0/index.md | 80 +++++---- .../version-2.12.0-sidebars.json | 69 ++++--- 24 files changed, 1029 insertions(+), 151 deletions(-) create mode 100644 docs/docs/Advanced/APIOverview.md create mode 100644 docs/docs/Advanced/ScriptingGuide.md create mode 100644 docs/docs/Examples/Capture_CanvasCapture.md create mode 100644 docs/docs/Examples/index.md create mode 100644 docs/versioned_docs/version-2.12.0/Advanced/APIOverview.md create mode 100644 docs/versioned_docs/version-2.12.0/Advanced/ScriptingGuide.md create mode 100644 docs/versioned_docs/version-2.12.0/Examples/Capture_CanvasCapture.md create mode 100644 docs/versioned_docs/version-2.12.0/Examples/Template_CreateMOCNoteWithLinkDashboard.md create mode 100644 docs/versioned_docs/version-2.12.0/Examples/index.md create mode 100644 docs/versioned_docs/version-2.12.0/Images/template_moc_link_dashboard_demo.png diff --git a/docs/docs/Advanced/APIOverview.md b/docs/docs/Advanced/APIOverview.md new file mode 100644 index 00000000..88eb8062 --- /dev/null +++ b/docs/docs/Advanced/APIOverview.md @@ -0,0 +1,51 @@ +--- +title: API Overview +--- + +Use the QuickAdd API when a workflow needs scripted input, file operations, +formatting, model calls, or access from another plugin. + +If you only need to create a note or append text, start with +[Template Choices](../Choices/TemplateChoice) or +[Capture Choices](../Choices/CaptureChoice). Add the API when the workflow +needs logic. + +## Where the API is available + +| Context | Access pattern | Use it for | +| --- | --- | --- | +| Macro user script | `params.quickAddApi` | Scripted macro steps | +| Inline script | `this.quickAddApi` | Small transformations inside templates or captures | +| Other plugin | `app.plugins.plugins.quickadd.api` | Calling QuickAdd from plugin code | +| Templater script | `app.plugins.plugins.quickadd.api` | Prompting or running choices from Templater | + +## Common tasks + +| Task | Method family | Reference | +| --- | --- | --- | +| Ask for text, selections, dates, or grouped inputs | User input methods | [QuickAdd API Reference](../QuickAddAPI#user-input-methods) | +| Run another choice from a script | Choice execution | [Choice Execution](../QuickAddAPI#choice-execution) | +| Read selected text or clipboard content | Utility module | [Utility Module](../QuickAddAPI#utility-module) | +| Format dates | Date module | [Date Module](../QuickAddAPI#date-module) | +| Call configured AI providers | AI module | [AI Module](../QuickAddAPI#ai-module) | +| Read field suggestions from the vault | Field suggestions module | [Field Suggestions Module](../QuickAddAPI#field-suggestions-module) | + +## Recommended path + +1. Read the [scripting overview](./ScriptingGuide) if you have not written a + QuickAdd script before. +2. Copy a working pattern from the [examples overview](../Examples/). +3. Use the [QuickAdd API reference](../QuickAddAPI) for exact signatures and + edge-case behavior. + +## Minimal macro script + +```javascript +module.exports = async ({ quickAddApi }) => { + const title = await quickAddApi.inputPrompt("Book title"); + return `# ${title}`; +}; +``` + +The returned value can be used by later macro steps or inserted through format +syntax. diff --git a/docs/docs/Advanced/ScriptingGuide.md b/docs/docs/Advanced/ScriptingGuide.md new file mode 100644 index 00000000..1563659c --- /dev/null +++ b/docs/docs/Advanced/ScriptingGuide.md @@ -0,0 +1,58 @@ +--- +title: Scripting Overview +--- + +QuickAdd scripts are JavaScript files that run inside Obsidian. They can prompt +for input, call Obsidian APIs, read other plugins, and pass values back into a +Macro choice. + +## Which scripting feature should I use? + +| Need | Use | Why | +| --- | --- | --- | +| A reusable script with settings | User script | Best for larger workflows and shared code | +| A small transformation inside a template or capture | Inline script | Keeps tiny logic close to the format using it | +| Several script and choice steps in sequence | Macro choice | Coordinates order, variables, and abort behavior | +| A script users can configure from the QuickAdd UI | Script with settings | Lets non-coders change values without editing JavaScript | + +## Basic user script shape + +```javascript +module.exports = async (params) => { + const { app, quickAddApi, variables } = params; + const title = await quickAddApi.inputPrompt("Title"); + + variables.title = title; + return title; +}; +``` + +The `params` object gives scripts access to: + +- `app`: the Obsidian app instance +- `quickAddApi`: QuickAdd's prompt, utility, AI, and execution helpers +- `variables`: values shared across macro steps + +## How values move through a macro + +1. A choice or script asks for a value. +2. QuickAdd stores that value in `variables`. +3. Later template, capture, and script steps can reuse it. +4. If a prompt is cancelled, QuickAdd aborts the macro unless your script handles + the cancellation. + +Use named values like `{{VALUE:project}}` when several macro steps should share +one prompt. + +## Suggested learning order + +1. [Macro Choices](../Choices/MacroChoice) for how macro steps are assembled. +2. [User Scripts](../UserScripts) for complete scripting patterns. +3. [Scripts with Settings](./scriptsWithSettings) for configurable scripts. +4. [QuickAdd API Reference](../QuickAddAPI) for exact method details. + +## Debugging + +Use `console.log` while developing scripts, then check Obsidian's developer +console. Keep scripts small enough that each step can be tested independently +before adding it to a longer macro. diff --git a/docs/docs/Choices/CaptureChoice.md b/docs/docs/Choices/CaptureChoice.md index 6d8890c0..cde8d89d 100644 --- a/docs/docs/Choices/CaptureChoice.md +++ b/docs/docs/Choices/CaptureChoice.md @@ -103,7 +103,8 @@ When append-link is set to **Enabled (requires active file)** and capture runs from a Canvas card without a focused Markdown editor, the capture still writes and link insertion is skipped. -A dedicated Canvas walkthrough page will return in a future update. +For a step-by-step setup, see +[Capture: Canvas Capture](../Examples/Capture_CanvasCapture). ### Canvas Capture FAQ diff --git a/docs/docs/Examples/Capture_CanvasCapture.md b/docs/docs/Examples/Capture_CanvasCapture.md new file mode 100644 index 00000000..b37ec89e --- /dev/null +++ b/docs/docs/Examples/Capture_CanvasCapture.md @@ -0,0 +1,86 @@ +--- +title: "Capture: Canvas Capture" +--- + +Canvas capture lets a Capture choice write into a selected Canvas card or into a +specific card in a specific `.canvas` file. + +## When to use this + +Use Canvas capture when your workflow starts in a visual board, but you still +want QuickAdd's capture formats, variables, and hotkeys. + +Good fits: + +- Add a timestamped note to a selected brainstorming card. +- Append a task to a project card. +- Send repeated updates to one known Canvas card. + +## Capture to the selected card + +1. Create a Capture choice. +2. Enable **Capture to active file**. +3. Open a Canvas file. +4. Select exactly one supported card. +5. Set **Write position** to **Top of file**, **Bottom of file**, or + **After line...**. +6. Run the Capture choice. + +Supported selected-card targets: + +- Text cards +- File cards that point to Markdown files + +QuickAdd aborts with a notice if no card is selected, multiple cards are +selected, or the selected card is unsupported. + +## Capture to a specific card + +1. Create a Capture choice. +2. Turn off **Capture to active file**. +3. Set **Capture To** to a `.canvas` file. +4. Choose **Target canvas node**. +5. Pick the card you want QuickAdd to write to. +6. Set a supported write position. + +This is the best option for repeatable workflows where every capture should go +to the same Canvas card. + +## Write position support + +Canvas capture supports these write positions: + +- **Top of file** +- **Bottom of file** +- **After line...** + +Canvas capture does not support cursor-based write positions: + +- **At cursor** +- **New line above cursor** +- **New line below cursor** + +If **Capture to active file** is enabled and the write position is still +**At cursor**, QuickAdd aborts instead of writing to the wrong place. + +## Append-link behavior + +When append-link is set to **Enabled (requires active file)** and capture runs +from a Canvas card without a focused Markdown editor, the capture still writes. +QuickAdd skips link insertion because there is no active Markdown file to link +from. + +## Troubleshooting + +| Symptom | Likely cause | Fix | +| --- | --- | --- | +| Capture aborts before writing | No card or multiple cards are selected | Select exactly one supported card | +| Capture aborts with cursor-position wording | The write mode is cursor-based | Use top, bottom, or after-line placement | +| Nothing is written to a file card | The file card points to a non-Markdown file | Use a Markdown file card or a text card | +| The target picker is not shown | Capture target is not a `.canvas` file | Set **Capture To** to the Canvas file path | + +## Related docs + +- [Capture Choices](../Choices/CaptureChoice) +- [Format Syntax](../FormatSyntax) +- [Template: Create an MOC Note with a Link Dashboard](./Template_CreateMOCNoteWithLinkDashboard) diff --git a/docs/docs/Examples/index.md b/docs/docs/Examples/index.md new file mode 100644 index 00000000..176d308f --- /dev/null +++ b/docs/docs/Examples/index.md @@ -0,0 +1,40 @@ +--- +title: Examples +--- + +Use these examples when you want to copy a working pattern instead of starting +from a blank choice. + +| Workflow | Choice type | Setup | Prerequisites | What it creates | +| --- | --- | --- | --- | --- | +| [Add Journal Entry](./Capture_AddJournalEntry) | Capture | Beginner | Daily note or journal file | A timestamped journal entry | +| [Add a Task to a Kanban Board](./Capture_AddTaskToKanbanBoard) | Capture | Beginner | Obsidian Kanban plugin | A task in a board section | +| [Fetch Tasks from Todoist](./Capture_FetchTasksFromTodoist) | Capture and Macro | Intermediate | Todoist API token | Imported Todoist tasks | +| [Canvas Capture](./Capture_CanvasCapture) | Capture | Intermediate | An Obsidian Canvas file | Text added to a selected or targeted card | +| [Add an Inbox Item](./Template_AddAnInboxItem) | Template | Beginner | Inbox folder or note | A new inbox note | +| [Create an MOC Note with a Link Dashboard](./Template_CreateMOCNoteWithLinkDashboard) | Template | Intermediate | Base template file | A note with an embedded Base dashboard | +| [Automatic Book Notes from Readwise](./Template_AutomaticBookNotesFromReadwise) | Template and Macro | Advanced | Readwise export script | Book notes with highlights | +| [Book Finder](./Macro_BookFinder) | Macro | Intermediate | Book lookup script | A populated book note | +| [Movie and Series Script](./Macro_MovieAndSeriesScript) | Macro | Intermediate | TMDB API key | Media notes with metadata | +| [Move Notes with a Tag](./Macro_MoveNotesWithATagToAFolder) | Macro | Intermediate | Tagged notes | Notes moved into a target folder | +| [Zettelizer](./Macro_Zettelizer) | Macro | Intermediate | Headings in an existing note | New notes split from headings | +| [Toggl Manager](./Macro_TogglManager) | Macro | Advanced | Toggl integration | Preset time entries | + +## Pick by goal + +### Capture information faster + +Start with [Add Journal Entry](./Capture_AddJournalEntry) if you want the +simplest capture flow. Move to [Canvas Capture](./Capture_CanvasCapture) when +your target is a Canvas card instead of a Markdown note. + +### Create structured notes + +Start with [Add an Inbox Item](./Template_AddAnInboxItem) for a small template. +Use [Create an MOC Note with a Link Dashboard](./Template_CreateMOCNoteWithLinkDashboard) +when you want a generated note to include a live Base dashboard. + +### Run scripted workflows + +Start with [Book Finder](./Macro_BookFinder) to see the common macro pattern: +prompt for input, call a script, write a note, and open the result. diff --git a/docs/docs/QuickAddAPI.md b/docs/docs/QuickAddAPI.md index f98e0b39..d84d85d8 100644 --- a/docs/docs/QuickAddAPI.md +++ b/docs/docs/QuickAddAPI.md @@ -2,6 +2,13 @@ The QuickAdd API provides a powerful interface for automating tasks in Obsidian through scripts, macros, and inline scripts. The API offers methods for user interaction, file manipulation, AI integration, and more. +:::tip Start with the overview + +If you are choosing which API surface to use, read the +[API Overview](./Advanced/APIOverview) first. This page is the full reference. + +::: + ## Accessing the API The API can be accessed in several ways: diff --git a/docs/docs/UserScripts.md b/docs/docs/UserScripts.md index 2c6eea79..c33b6f26 100644 --- a/docs/docs/UserScripts.md +++ b/docs/docs/UserScripts.md @@ -1,8 +1,15 @@ # User Scripts +:::tip New to scripting? + +Start with the [Scripting Overview](./Advanced/ScriptingGuide) for the +decision path, then use this page as the detailed reference. + +::: + User scripts are JavaScript files that extend QuickAdd's functionality with custom code. They can be used within macros to perform complex operations, integrate with external APIs, and automate sophisticated workflows. -> 📚 **Obsidian API Reference**: This guide references the [Obsidian API](https://docs.obsidian.md/Home). Familiarize yourself with the [App](https://docs.obsidian.md/Reference/TypeScript+API/App), [Vault](https://docs.obsidian.md/Reference/TypeScript+API/Vault), and [Workspace](https://docs.obsidian.md/Reference/TypeScript+API/Workspace) modules for advanced scripting. +> **Obsidian API Reference**: This guide references the [Obsidian API](https://docs.obsidian.md/Home). Familiarize yourself with the [App](https://docs.obsidian.md/Reference/TypeScript+API/App), [Vault](https://docs.obsidian.md/Reference/TypeScript+API/Vault), and [Workspace](https://docs.obsidian.md/Reference/TypeScript+API/Workspace) modules for advanced scripting. ## Basic Structure diff --git a/docs/docs/index.md b/docs/docs/index.md index be7b6047..40707675 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -3,54 +3,65 @@ sidebar_position: 1 title: Getting Started --- -## Installation +QuickAdd adds one fast command for repeatable Obsidian workflows. Use it to +create notes from templates, capture text into existing notes, run scripts, or +organize several choices behind one menu. -**This plugin is in the community plugin browser in Obsidian**. You can search for it and install it there . +## Install QuickAdd -You can also do a [manual installation](./ManualInstallation). +Install QuickAdd from Obsidian's Community Plugins browser, then enable it. -## First steps +If you cannot use the plugin browser, follow the +[manual installation guide](./ManualInstallation). -The first thing you'll want to do is add a new choice. A choice can be one of four types. +## Choose the right choice type -- [Template Choice](./Choices/TemplateChoice) - Insert templates into your vault. Works together with Obsidian template syntax and popular _Templater_ plugin, augmenting them and adding more options. -- [Capture Choice](./Choices/CaptureChoice) - Quick capture your manually written information and save it. Daily notes, work log, to-read-and-watch-later list, etc. -- [Macro Choice](./Choices/MacroChoice) - Macros to augment your workflow. Use the full power of Javascript programming language and Obsidian functions to do anything your want. E.g. [create a personal movie database](./Examples/Macro_MovieAndSeriesScript) by writing a movie name and getting the movie notes fully customized and filled with correct film's up-to-date data. -- [Multi Choice](./Choices/MultiChoice) - Folders to better organize the previous 3 choices. Usability feature, not a new functionality. -- [Share QuickAdd Packages](./Choices/Packages) - Bundle choices and scripts into a portable `.quickadd.json` file so you can reuse automations across vaults. +| If you want to... | Use this | Start here | +| --- | --- | --- | +| Create a new note from a reusable file | Template choice | [Template Choices](./Choices/TemplateChoice) | +| Append text to a journal, log, task list, or existing file | Capture choice | [Capture Choices](./Choices/CaptureChoice) | +| Run one or more Obsidian commands, scripts, or choices | Macro choice | [Macro Choices](./Choices/MacroChoice) | +| Group choices into a nested menu | Multi choice | [Multi Choices](./Choices/MultiChoice) | +| Share configured workflows across vaults | Package | [Share QuickAdd Packages](./Choices/Packages) | -In your choices, you can use [format syntax](./FormatSyntax), which is similar to the Obsidian template syntax. +Most workflows start with either a Template choice or a Capture choice. Add a +Macro choice when you need scripting, multiple steps, or data from another +plugin or API. -You could, for example, use `{{DATE}}` to get the current date. +## First workflow -QuickAdd also features a powerful [suggester system](./SuggesterSystem) that provides intelligent, fuzzy-search suggestions for files, tags, headings, and more. +1. Create a Template choice or Capture choice in QuickAdd settings. +2. Add a name you will recognize in the command palette. +3. Configure the target file, folder, template, or capture format. +4. Run `QuickAdd: Run QuickAdd` from the command palette. +5. Assign a hotkey once the workflow behaves the way you want. -## I want to... +QuickAdd choices can use [format syntax](./FormatSyntax), including values like +`{{DATE}}`, `{{VALUE}}`, and `{{FIELD:status}}`. The +[suggester system](./SuggesterSystem) provides fuzzy search for files, tags, +headings, and fields. -### Be inspired +## Common paths -Take a look at some examples... +### I want examples first -- [Capture: Add Journal Entry](docs/Examples/Capture_AddJournalEntry.md) -- [Macro: Log book to daily journal](docs/Examples/Macro_LogBookToDailyJournal.md) -- [Template: Add an Inbox Item](docs/Examples/Template_AddAnInboxItem.md) -- [Template: Create an MOC note with a link dashboard](docs/Examples/Template_CreateMOCNoteWithLinkDashboard.md) -- [Macro: Move all notes with a tag to a certain folder](docs/Examples/Macro_MoveNotesWithATagToAFolder.md) -- [Template: Automatically create a new book note with notes & highlights from Readwise](docs/Examples/Template_AutomaticBookNotesFromReadwise.md) -- [Capture: Add a task to a Kanban board](docs/Examples/Capture_AddTaskToKanbanBoard.md) -- [Macro: Easily change properties in your daily note (requires MetaEdit)](docs/Examples/Macro_ChangePropertyInDailyNotes.md) -- [Capture: Fetch tasks from Todoist and capture to a file](docs/Examples/Capture_FetchTasksFromTodoist.md) -- [Macro: Zettelizer - easily create new notes from headings while keeping the contents in the file](docs/Examples/Macro_Zettelizer.md) -- [Macro: Obsidian Map View plugin helper - insert location from address](docs/Examples/Macro_AddLocationLongLatFromAddress.md) -- [Macro: Toggl Manager - set preset Toggl Track time entries and start them from Obsidian](docs/Examples/Macro_TogglManager.md) -- [How I Read Research Papers with Obsidian and Zotero](https://bagerbach.com/blog/how-i-read-research-papers-with-obsidian-and-zotero/) -- [How I Import Literature Notes into Obsidian](https://bagerbach.com/blog/importing-source-notes-to-obsidian) -- [Macro: Fetching movies and TV shows into your vault](docs/Examples/Macro_MovieAndSeriesScript.md) +Use the [examples overview](./Examples/) to pick a complete workflow by choice +type, difficulty, prerequisites, and outcome. -### Create powerful scripts and macros to automate my workflow +Good first examples: -Take a look at the [QuickAdd API](docs/QuickAddAPI.md), [format syntax](docs/FormatSyntax.md), [inline scripts](docs/InlineScripts.md), and [macros](docs/Choices/MacroChoice.md). +- [Capture: Add Journal Entry](./Examples/Capture_AddJournalEntry) +- [Template: Add an Inbox Item](./Examples/Template_AddAnInboxItem) +- [Macro: Book Finder](./Examples/Macro_BookFinder) +- [Capture: Canvas Capture](./Examples/Capture_CanvasCapture) -### Use QuickAdd even when Obsidian is minimized / in the background +### I want to automate with scripts -You got it. Take a look at [this AutoHotKey script](./Misc/AHK_OpenQuickAddFromDesktop). +Start with the [scripting overview](./Advanced/ScriptingGuide), then move to +[User Scripts](./UserScripts) and the [QuickAdd API reference](./QuickAddAPI) +when you need exact method details. + +### I want to call QuickAdd from outside Obsidian + +Use [Obsidian URI](./Advanced/ObsidianUri) for URI-triggered workflows, or the +[QuickAdd CLI](./Advanced/CLI) for shell scripts and external automation. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 17abed7f..cfe94a19 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -63,13 +63,7 @@ const config = { : {}), }, }, - blog: { - showReadingTime: true, - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - // editUrl: - // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', - }, + blog: false, theme: { customCss: require.resolve('./src/css/custom.css'), }, @@ -94,22 +88,22 @@ const config = { dropdownActiveClassDisabled: true, }, { - type: 'doc', - docId: 'index', + to: '/docs/', position: 'left', - label: '📚 Docs', + label: 'Docs', + activeBaseRegex: '^/docs/(next/|[0-9.]+/)?$', }, { - type: 'doc', - docId: 'QuickAddAPI', + to: '/docs/Advanced/APIOverview', position: 'left', - label: '🔧 API', + label: 'API', + activeBaseRegex: '^/docs/(next/|[0-9.]+/)?(Advanced/APIOverview|QuickAddAPI)/?$', }, { - type: 'doc', - docId: 'Examples/Macro_BookFinder', + to: '/docs/Examples/', position: 'left', - label: '💡 Examples', + label: 'Examples', + activeBaseRegex: '^/docs/(next/|[0-9.]+/)?Examples/', }, { href: 'https://github.com/chhoumann/quickadd', @@ -162,6 +156,7 @@ const config = { highlightSearchTermsOnTargetPage: true, explicitSearchResultPath: true, docsRouteBasePath: "/docs", + indexBlog: false, searchBarShortcutHint: false, }, ], diff --git a/docs/sidebars.js b/docs/sidebars.js index 4b9c8d28..4e8b9844 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -32,89 +32,95 @@ const sidebars = { { type: "doc", id: "index", - label: "🏠 Getting Started", + label: "Getting Started", }, { type: "category", - label: "📚 Core Concepts", + label: "Core Concepts", collapsed: false, items: [ { type: "doc", id: "Choices/TemplateChoice", - label: "📄 Template Choices", + label: "Template Choices", }, { type: "doc", id: "Choices/CaptureChoice", - label: "⚡ Capture Choices", + label: "Capture Choices", }, { type: "doc", id: "Choices/MacroChoice", - label: "🤖 Macro Choices", + label: "Macro Choices", }, { type: "doc", id: "Choices/MultiChoice", - label: "📁 Multi Choices", + label: "Multi Choices", }, { type: "doc", id: "Choices/Packages", - label: "đŸ“Ļ Share QuickAdd Packages", + label: "Share QuickAdd Packages", }, ], }, { type: "category", - label: "🔧 Features", + label: "Features", items: [ { type: "doc", id: "FormatSyntax", - label: "📝 Format Syntax", + label: "Format Syntax", }, { type: "doc", id: "GlobalVariables", - label: "🌐 Global Variables", + label: "Global Variables", }, { type: "doc", id: "InlineScripts", - label: "đŸ’ģ Inline Scripts", + label: "Inline Scripts", }, { type: "doc", id: "AIAssistant", - label: "🧠 AI Assistant", + label: "AI Assistant", }, { type: "doc", id: "TemplatePropertyTypes", - label: "📋 Template Property Types (Beta)", + label: "Template Property Types (Beta)", }, ], }, { type: "category", - label: "💡 Examples", + label: "Examples", collapsed: true, items: [ + { + type: "doc", + id: "Examples/index", + label: "Examples Overview", + }, { type: "category", - label: "📝 Capture Examples", + label: "Capture Examples", items: [ "Examples/Capture_AddJournalEntry", "Examples/Capture_AddTaskToKanbanBoard", "Examples/Capture_FetchTasksFromTodoist", "Examples/Capture_InsertBaseTemplateIntoActiveFile", + "Examples/Capture_CanvasCapture", ], }, { type: "category", - label: "📄 Template Examples", + label: "Template Examples", items: [ "Examples/Template_AddAnInboxItem", "Examples/Template_CreateMOCNoteWithLinkDashboard", @@ -123,7 +129,7 @@ const sidebars = { }, { type: "category", - label: "🤖 Macro Examples", + label: "Macro Examples", items: [ "Examples/Macro_BookFinder", "Examples/Macro_MovieAndSeriesScript", @@ -140,45 +146,55 @@ const sidebars = { }, { type: "category", - label: "🚀 Advanced", + label: "Advanced", collapsed: true, items: [ + { + type: "doc", + id: "Advanced/APIOverview", + label: "API Overview", + }, { type: "doc", id: "QuickAddAPI", - label: "📖 QuickAdd API", + label: "QuickAdd API Reference", + }, + { + type: "doc", + id: "Advanced/ScriptingGuide", + label: "Scripting Overview", }, { type: "doc", id: "UserScripts", - label: "📜 User Scripts", + label: "User Scripts Reference", }, { type: "doc", id: "Advanced/scriptsWithSettings", - label: "âš™ī¸ Scripts with Settings", + label: "Scripts with Settings", }, { type: "doc", id: "Advanced/onePageInputs", - label: "🧩 One-page Inputs", + label: "One-page Inputs", }, { type: "doc", id: "Advanced/ObsidianUri", - label: "🔗 Obsidian URI", + label: "Obsidian URI", }, ], }, { type: "category", - label: "â„šī¸ Other", + label: "Other", collapsed: true, items: [ { type: "doc", id: "ManualInstallation", - label: "💾 Manual Installation", + label: "Manual Installation", }, { type: "autogenerated", diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 4ac74a13..73dd32a9 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -96,7 +96,6 @@ pre { .menu__link--active { background-color: var(--qa-accent-soft); color: var(--ifm-color-primary); - font-weight: 600; } .navbar { diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index 74157de7..f172db58 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -27,7 +27,7 @@ ────────────────────────────────────────────────────────── */ .hero { - padding: clamp(5rem, 10vw, 8rem) 0 clamp(4rem, 8vw, 6.5rem); + padding: clamp(3.75rem, 8vw, 5.5rem) 0 clamp(3rem, 6vw, 4rem); text-align: center; position: relative; overflow: hidden; @@ -54,9 +54,9 @@ .heroLogo { display: block; - height: 96px; + height: 76px; width: auto; - margin: 0 auto 1.5rem; + margin: 0 auto 1.25rem; } .eyebrow { @@ -68,7 +68,7 @@ } .heroTitle { - font-size: clamp(2.5rem, 5.5vw + 0.5rem, 4rem); + font-size: clamp(2.4rem, 5vw + 0.5rem, 4rem); line-height: 1.05; font-weight: 600; letter-spacing: -0.028em; @@ -92,7 +92,7 @@ align-items: center; justify-content: center; gap: 0.75rem; - margin-top: 2.25rem; + margin-top: 2rem; flex-wrap: wrap; } @@ -100,7 +100,7 @@ display: inline-flex; align-items: center; gap: 0.5rem; - margin-top: 2.5rem; + margin-top: 1rem; padding: 0.5rem 0.875rem; background: var(--qa-canvas-raised); border: 1px solid var(--qa-line); @@ -109,6 +109,160 @@ color: var(--qa-ink-muted); } +.workflowPreview { + max-width: 920px; + margin: 2rem auto 0; + overflow: hidden; + text-align: left; + background: var(--qa-canvas-raised); + border: 1px solid var(--qa-line-strong); + border-radius: 14px; + box-shadow: 0 18px 60px rgba(24, 24, 27, 0.12); +} + +.previewChrome { + display: flex; + gap: 0.45rem; + padding: 0.85rem 1rem; + border-bottom: 1px solid var(--qa-line); +} + +.previewChrome span { + width: 0.68rem; + height: 0.68rem; + border-radius: 999px; + background: var(--qa-line-strong); +} + +.previewGrid { + display: grid; + grid-template-columns: 0.85fr 1.2fr 1fr; + min-height: 250px; +} + +.previewSidebar, +.previewCommand, +.previewNote { + padding: 1rem; +} + +.previewSidebar, +.previewCommand { + border-right: 1px solid var(--qa-line); +} + +.previewSidebar { + background: color-mix(in srgb, var(--qa-canvas) 72%, var(--qa-canvas-raised)); +} + +.previewSidebarTitle, +.previewCommandLabel, +.previewNoteTitle { + margin-bottom: 0.8rem; + color: var(--qa-ink-muted); + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.previewChoice, +.previewResult { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + padding: 0.7rem 0.75rem; + color: var(--qa-ink); + font-size: 0.875rem; + border: 1px solid transparent; + border-radius: 9px; +} + +.previewChoice + .previewChoice, +.previewResult + .previewResult { + margin-top: 0.45rem; +} + +.previewChoice:first-of-type, +.previewResult:first-child { + background: var(--qa-accent-soft); + border-color: var(--qa-line-strong); +} + +.previewChoiceType, +.previewResult span:last-child { + color: var(--qa-accent); + font-size: 0.72rem; + font-weight: 700; + text-transform: uppercase; +} + +.previewSearch { + margin-bottom: 0.9rem; + padding: 0.8rem 0.9rem; + color: var(--qa-ink); + background: var(--qa-canvas); + border: 1px solid var(--qa-line-strong); + border-radius: 9px; + font-family: var(--ifm-font-family-monospace); + font-size: 0.82rem; +} + +.previewLine, +.previewLineShort { + height: 0.7rem; + background: var(--qa-line); + border-radius: 999px; +} + +.previewLine { + width: 88%; +} + +.previewLineShort { + width: 58%; + margin-top: 0.75rem; +} + +.previewCapture { + margin-top: 1.2rem; + padding: 0.85rem; + background: var(--qa-canvas); + border: 1px solid var(--qa-line); + border-radius: 10px; +} + +.previewCapture span { + color: var(--qa-accent); + font-family: var(--ifm-font-family-monospace); + font-size: 0.75rem; + font-weight: 700; +} + +.previewCapture p { + margin: 0.45rem 0 0; + color: var(--qa-ink-muted); + font-size: 0.88rem; + line-height: 1.5; +} + +@media (max-width: 767px) { + .workflowPreview { + margin-top: 1.5rem; + } + + .previewGrid { + grid-template-columns: 1fr; + } + + .previewSidebar, + .previewCommand { + border-right: 0; + border-bottom: 1px solid var(--qa-line); + } +} + .kbd { display: inline-flex; align-items: center; @@ -473,6 +627,8 @@ margin-top: 3rem; display: flex; justify-content: center; + gap: 0.75rem; + flex-wrap: wrap; } /* ────────────────────────────────────────────────────────── diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index bc13198d..2b0a4dd8 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -211,7 +211,7 @@ const steps = [ { title: 'Create a choice', description: - 'Open settings and add a Template, Capture, or Macro — or combine them into a Multi.', + 'Pick Template, Capture, Macro, or Multi based on what you want to automate.', }, { title: 'Hit your hotkey', @@ -220,10 +220,72 @@ const steps = [ }, ]; +const workflowRows = [ + { + type: 'Capture', + label: 'Daily log', + detail: 'Append a timestamped entry to today\u2019s note.', + }, + { + type: 'Template', + label: 'Meeting note', + detail: 'Create a note with variables, prompts, and properties.', + }, + { + type: 'Macro', + label: 'Book lookup', + detail: 'Fetch metadata, write a note, and open it in place.', + }, +]; + // ────────────────────────────────────────────────────────── // Sections // ────────────────────────────────────────────────────────── +function WorkflowPreview(): React.JSX.Element { + return ( +
+
+ + + +
+
+
+
QuickAdd
+ {workflowRows.map((row) => ( +
+ {row.type} + {row.label} +
+ ))} +
+
+
Command palette
+
QuickAdd: Run Choice
+
+ {workflowRows.map((row) => ( +
+ {row.label} + {row.type} +
+ ))} +
+
+
+
Daily note
+
+
+
+ 10:42 +

Captured idea with source link and project tag.

+
+
+
+
+ ); +} + function Hero(): React.JSX.Element { return (
@@ -239,7 +301,7 @@ function Hero(): React.JSX.Element { Supercharge Obsidian with one hotkey.

- Templates, captures, macros, and AI — bound to a single command. + Templates, captures, macros, and AI, bound to a single command. QuickAdd turns repetitive note-taking tasks into keystrokes.

@@ -249,13 +311,14 @@ function Hero(): React.JSX.Element { - Install from Obsidian → + Install from Obsidian
+
@@ -354,6 +417,9 @@ function QuickStart(): React.JSX.Element { Read the documentation + + Browse examples +
diff --git a/docs/versioned_docs/version-2.12.0/Advanced/APIOverview.md b/docs/versioned_docs/version-2.12.0/Advanced/APIOverview.md new file mode 100644 index 00000000..88eb8062 --- /dev/null +++ b/docs/versioned_docs/version-2.12.0/Advanced/APIOverview.md @@ -0,0 +1,51 @@ +--- +title: API Overview +--- + +Use the QuickAdd API when a workflow needs scripted input, file operations, +formatting, model calls, or access from another plugin. + +If you only need to create a note or append text, start with +[Template Choices](../Choices/TemplateChoice) or +[Capture Choices](../Choices/CaptureChoice). Add the API when the workflow +needs logic. + +## Where the API is available + +| Context | Access pattern | Use it for | +| --- | --- | --- | +| Macro user script | `params.quickAddApi` | Scripted macro steps | +| Inline script | `this.quickAddApi` | Small transformations inside templates or captures | +| Other plugin | `app.plugins.plugins.quickadd.api` | Calling QuickAdd from plugin code | +| Templater script | `app.plugins.plugins.quickadd.api` | Prompting or running choices from Templater | + +## Common tasks + +| Task | Method family | Reference | +| --- | --- | --- | +| Ask for text, selections, dates, or grouped inputs | User input methods | [QuickAdd API Reference](../QuickAddAPI#user-input-methods) | +| Run another choice from a script | Choice execution | [Choice Execution](../QuickAddAPI#choice-execution) | +| Read selected text or clipboard content | Utility module | [Utility Module](../QuickAddAPI#utility-module) | +| Format dates | Date module | [Date Module](../QuickAddAPI#date-module) | +| Call configured AI providers | AI module | [AI Module](../QuickAddAPI#ai-module) | +| Read field suggestions from the vault | Field suggestions module | [Field Suggestions Module](../QuickAddAPI#field-suggestions-module) | + +## Recommended path + +1. Read the [scripting overview](./ScriptingGuide) if you have not written a + QuickAdd script before. +2. Copy a working pattern from the [examples overview](../Examples/). +3. Use the [QuickAdd API reference](../QuickAddAPI) for exact signatures and + edge-case behavior. + +## Minimal macro script + +```javascript +module.exports = async ({ quickAddApi }) => { + const title = await quickAddApi.inputPrompt("Book title"); + return `# ${title}`; +}; +``` + +The returned value can be used by later macro steps or inserted through format +syntax. diff --git a/docs/versioned_docs/version-2.12.0/Advanced/ScriptingGuide.md b/docs/versioned_docs/version-2.12.0/Advanced/ScriptingGuide.md new file mode 100644 index 00000000..1563659c --- /dev/null +++ b/docs/versioned_docs/version-2.12.0/Advanced/ScriptingGuide.md @@ -0,0 +1,58 @@ +--- +title: Scripting Overview +--- + +QuickAdd scripts are JavaScript files that run inside Obsidian. They can prompt +for input, call Obsidian APIs, read other plugins, and pass values back into a +Macro choice. + +## Which scripting feature should I use? + +| Need | Use | Why | +| --- | --- | --- | +| A reusable script with settings | User script | Best for larger workflows and shared code | +| A small transformation inside a template or capture | Inline script | Keeps tiny logic close to the format using it | +| Several script and choice steps in sequence | Macro choice | Coordinates order, variables, and abort behavior | +| A script users can configure from the QuickAdd UI | Script with settings | Lets non-coders change values without editing JavaScript | + +## Basic user script shape + +```javascript +module.exports = async (params) => { + const { app, quickAddApi, variables } = params; + const title = await quickAddApi.inputPrompt("Title"); + + variables.title = title; + return title; +}; +``` + +The `params` object gives scripts access to: + +- `app`: the Obsidian app instance +- `quickAddApi`: QuickAdd's prompt, utility, AI, and execution helpers +- `variables`: values shared across macro steps + +## How values move through a macro + +1. A choice or script asks for a value. +2. QuickAdd stores that value in `variables`. +3. Later template, capture, and script steps can reuse it. +4. If a prompt is cancelled, QuickAdd aborts the macro unless your script handles + the cancellation. + +Use named values like `{{VALUE:project}}` when several macro steps should share +one prompt. + +## Suggested learning order + +1. [Macro Choices](../Choices/MacroChoice) for how macro steps are assembled. +2. [User Scripts](../UserScripts) for complete scripting patterns. +3. [Scripts with Settings](./scriptsWithSettings) for configurable scripts. +4. [QuickAdd API Reference](../QuickAddAPI) for exact method details. + +## Debugging + +Use `console.log` while developing scripts, then check Obsidian's developer +console. Keep scripts small enough that each step can be tested independently +before adding it to a longer macro. diff --git a/docs/versioned_docs/version-2.12.0/Choices/CaptureChoice.md b/docs/versioned_docs/version-2.12.0/Choices/CaptureChoice.md index 8e7af615..96d58bab 100644 --- a/docs/versioned_docs/version-2.12.0/Choices/CaptureChoice.md +++ b/docs/versioned_docs/version-2.12.0/Choices/CaptureChoice.md @@ -103,7 +103,8 @@ When append-link is set to **Enabled (requires active file)** and capture runs from a Canvas card without a focused Markdown editor, the capture still writes and link insertion is skipped. -A dedicated Canvas walkthrough page will return in a future update. +For a step-by-step setup, see +[Capture: Canvas Capture](../Examples/Capture_CanvasCapture). ### Canvas Capture FAQ diff --git a/docs/versioned_docs/version-2.12.0/Examples/Capture_CanvasCapture.md b/docs/versioned_docs/version-2.12.0/Examples/Capture_CanvasCapture.md new file mode 100644 index 00000000..b37ec89e --- /dev/null +++ b/docs/versioned_docs/version-2.12.0/Examples/Capture_CanvasCapture.md @@ -0,0 +1,86 @@ +--- +title: "Capture: Canvas Capture" +--- + +Canvas capture lets a Capture choice write into a selected Canvas card or into a +specific card in a specific `.canvas` file. + +## When to use this + +Use Canvas capture when your workflow starts in a visual board, but you still +want QuickAdd's capture formats, variables, and hotkeys. + +Good fits: + +- Add a timestamped note to a selected brainstorming card. +- Append a task to a project card. +- Send repeated updates to one known Canvas card. + +## Capture to the selected card + +1. Create a Capture choice. +2. Enable **Capture to active file**. +3. Open a Canvas file. +4. Select exactly one supported card. +5. Set **Write position** to **Top of file**, **Bottom of file**, or + **After line...**. +6. Run the Capture choice. + +Supported selected-card targets: + +- Text cards +- File cards that point to Markdown files + +QuickAdd aborts with a notice if no card is selected, multiple cards are +selected, or the selected card is unsupported. + +## Capture to a specific card + +1. Create a Capture choice. +2. Turn off **Capture to active file**. +3. Set **Capture To** to a `.canvas` file. +4. Choose **Target canvas node**. +5. Pick the card you want QuickAdd to write to. +6. Set a supported write position. + +This is the best option for repeatable workflows where every capture should go +to the same Canvas card. + +## Write position support + +Canvas capture supports these write positions: + +- **Top of file** +- **Bottom of file** +- **After line...** + +Canvas capture does not support cursor-based write positions: + +- **At cursor** +- **New line above cursor** +- **New line below cursor** + +If **Capture to active file** is enabled and the write position is still +**At cursor**, QuickAdd aborts instead of writing to the wrong place. + +## Append-link behavior + +When append-link is set to **Enabled (requires active file)** and capture runs +from a Canvas card without a focused Markdown editor, the capture still writes. +QuickAdd skips link insertion because there is no active Markdown file to link +from. + +## Troubleshooting + +| Symptom | Likely cause | Fix | +| --- | --- | --- | +| Capture aborts before writing | No card or multiple cards are selected | Select exactly one supported card | +| Capture aborts with cursor-position wording | The write mode is cursor-based | Use top, bottom, or after-line placement | +| Nothing is written to a file card | The file card points to a non-Markdown file | Use a Markdown file card or a text card | +| The target picker is not shown | Capture target is not a `.canvas` file | Set **Capture To** to the Canvas file path | + +## Related docs + +- [Capture Choices](../Choices/CaptureChoice) +- [Format Syntax](../FormatSyntax) +- [Template: Create an MOC Note with a Link Dashboard](./Template_CreateMOCNoteWithLinkDashboard) diff --git a/docs/versioned_docs/version-2.12.0/Examples/Template_CreateMOCNoteWithLinkDashboard.md b/docs/versioned_docs/version-2.12.0/Examples/Template_CreateMOCNoteWithLinkDashboard.md new file mode 100644 index 00000000..c5ee9eac --- /dev/null +++ b/docs/versioned_docs/version-2.12.0/Examples/Template_CreateMOCNoteWithLinkDashboard.md @@ -0,0 +1,106 @@ +--- +title: "Template: Create an MOC Note with a Link Dashboard" +--- + +Use this pattern when you want QuickAdd to create a new map-of-content note +that already contains a live Base dashboard for both backlinks and outgoing +links. + +## Why this pattern + +A Template choice can create the note and insert the dashboard in one step. +The note stays markdown, while the embedded `.base` block gives you a live view +of how that note connects to the rest of your vault. + +This works well for maps of knowledge, hub notes, topic notes, and evergreen +indexes. + +## Setup + +1. Create a reusable `.base` template, for example + `Templates/MOC Link Dashboard.base`: + +```yaml +formulas: + note_link: "file.asLink()" +properties: + formula.note_link: + displayName: Note + file.folder: + displayName: Folder + file.mtime: + displayName: Updated +views: + - type: table + name: Backlinks + filters: + and: + - 'file.ext == "md"' + - "file.hasLink(this.file)" + - "file.path != this.file.path" + order: + - formula.note_link + - file.folder + - file.mtime + - type: table + name: Outgoing links + filters: + and: + - 'file.ext == "md"' + - "this.file.hasLink(file)" + - "file.path != this.file.path" + order: + - formula.note_link + - file.folder + - file.mtime +``` + +2. Create a markdown template, for example `Templates/MOC Link Dashboard.md`: + +````markdown +--- +tags: + - moc +--- + +# {{VALUE:moc_title}} + +## Link Dashboard + +Use the view picker in this embedded base to switch between backlinks and +outgoing links for this note. + +```base +{{TEMPLATE:Templates/MOC Link Dashboard.base}} +``` + +## Notes + +- Start linking this note to related ideas. +```` + +3. Create a **Template** choice with settings like these: + +- **Template Path**: `Templates/MOC Link Dashboard.md` +- **File Name Format**: `{{VALUE:moc_title}}` +- **Create in folder**: your MOC folder, for example `MOCs` +- **Open**: enabled +- **If the target file already exists**: `Create another file` +- **New file naming**: `Increment trailing number` + +4. Run the Template choice and enter a title such as `Alpha Project`. + +## What you get + +QuickAdd creates a new markdown note with an embedded Base block. +Inside the note: + +- `Backlinks` shows notes that link to the new MOC. +- `Outgoing links` shows notes the MOC links to. +- Both views use `this.file`, so the dashboard automatically scopes itself to + the note that was just created. + +After the note exists, add links in either direction and the dashboard updates +with the current graph around that note. + +![MOC link dashboard template demo](../Images/template_moc_link_dashboard_demo.png) diff --git a/docs/versioned_docs/version-2.12.0/Examples/index.md b/docs/versioned_docs/version-2.12.0/Examples/index.md new file mode 100644 index 00000000..176d308f --- /dev/null +++ b/docs/versioned_docs/version-2.12.0/Examples/index.md @@ -0,0 +1,40 @@ +--- +title: Examples +--- + +Use these examples when you want to copy a working pattern instead of starting +from a blank choice. + +| Workflow | Choice type | Setup | Prerequisites | What it creates | +| --- | --- | --- | --- | --- | +| [Add Journal Entry](./Capture_AddJournalEntry) | Capture | Beginner | Daily note or journal file | A timestamped journal entry | +| [Add a Task to a Kanban Board](./Capture_AddTaskToKanbanBoard) | Capture | Beginner | Obsidian Kanban plugin | A task in a board section | +| [Fetch Tasks from Todoist](./Capture_FetchTasksFromTodoist) | Capture and Macro | Intermediate | Todoist API token | Imported Todoist tasks | +| [Canvas Capture](./Capture_CanvasCapture) | Capture | Intermediate | An Obsidian Canvas file | Text added to a selected or targeted card | +| [Add an Inbox Item](./Template_AddAnInboxItem) | Template | Beginner | Inbox folder or note | A new inbox note | +| [Create an MOC Note with a Link Dashboard](./Template_CreateMOCNoteWithLinkDashboard) | Template | Intermediate | Base template file | A note with an embedded Base dashboard | +| [Automatic Book Notes from Readwise](./Template_AutomaticBookNotesFromReadwise) | Template and Macro | Advanced | Readwise export script | Book notes with highlights | +| [Book Finder](./Macro_BookFinder) | Macro | Intermediate | Book lookup script | A populated book note | +| [Movie and Series Script](./Macro_MovieAndSeriesScript) | Macro | Intermediate | TMDB API key | Media notes with metadata | +| [Move Notes with a Tag](./Macro_MoveNotesWithATagToAFolder) | Macro | Intermediate | Tagged notes | Notes moved into a target folder | +| [Zettelizer](./Macro_Zettelizer) | Macro | Intermediate | Headings in an existing note | New notes split from headings | +| [Toggl Manager](./Macro_TogglManager) | Macro | Advanced | Toggl integration | Preset time entries | + +## Pick by goal + +### Capture information faster + +Start with [Add Journal Entry](./Capture_AddJournalEntry) if you want the +simplest capture flow. Move to [Canvas Capture](./Capture_CanvasCapture) when +your target is a Canvas card instead of a Markdown note. + +### Create structured notes + +Start with [Add an Inbox Item](./Template_AddAnInboxItem) for a small template. +Use [Create an MOC Note with a Link Dashboard](./Template_CreateMOCNoteWithLinkDashboard) +when you want a generated note to include a live Base dashboard. + +### Run scripted workflows + +Start with [Book Finder](./Macro_BookFinder) to see the common macro pattern: +prompt for input, call a script, write a note, and open the result. diff --git a/docs/versioned_docs/version-2.12.0/Images/template_moc_link_dashboard_demo.png b/docs/versioned_docs/version-2.12.0/Images/template_moc_link_dashboard_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..6db5e4bb25d8175314910dd6e80a1003323d1c43 GIT binary patch literal 87793 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 z

zZLk3~DUNE&lp7|>)zKyj%%$F=DE4Tl)haHF&64TTb94H-QRHmuD2KS?4qHz#^ zj-esAovm2CT3C4|X3%>SzDc$C^-~FAz6@PoTU@YPhG^9U7yF11jt&%~JEWvWLd?o( zQXo^YC_E@W$<_GHkFqMjMh)de?7pqks?esCGx*hKUWbz89tLoj;6$Rxrl>M4Qwh3% z&d#4N_d26kNA%OlYkGkPguf9y|Mv&XXe!VSR;T+wgxok`r6VKNt_CfQ^aQN1(Wd9t zt5MI%tEN04Y4W^x7!>M=T`ez`(A_7F5>%&gn^}JeS=C$KJD(!^5?)L361Hk+r0omcw~tU+%Hzy+cwe zs{X3DfS!%9?EoIsHIhNGjZ|_wo`CP-qlndsZPag|TpNom?C2$u%dEl+7GdJk14G0a>>7 zbA$jDuf5bn^Ai-~7|H~bbyFQteq=X|+o&U#E?#1XtaIHj9YAM7W(N282g9PZGUKD% zjI`pk%T)_3ZRCb?5Dl9Y)GvT@oTH2}3s=5xI^DUm{usP_Nk zV9-8T+INPSkO|*UvZmG!4}}d44X@v#%(`ZOytlj_V(60MyV(dEacv;|^Kws;P{Yj3 zu1!Zc;~s>MI6NgphW(6c6%)K6$J0e-kUBUBK5&4NXM^3?-^92Gsb-*(hlE10~63zcx;dW@n zhht`WqWjoJiL|XkD;*u%R|7GPcfWq4pFfI%ntzp;3+=;s$9WQyLR{E{xA3?Qi&H+8 z|30DNc{mY7Z+{)_iU78UU0fN#&>;kuROxZ08X6vN?|JcgoxnSg&!%wp6pbF3DA+|= zp8SSxe>#1G#<_#db5r=c)280Z;oDN`HSMI6fdNQ~b^B-#udHQ?^5=Oe#N+GD)O)N? zB=98&xN#kAlnT1;neKjgsaN{-O07&4`Ye*wr^ktqCvJ2Q0ZQunCy*PkVp=@$ z?2|VTATt}zi{T~bFnx81D9Sz zWjdSrpj4S&X1M@oHZRm4S{uv^#(UkP{m_(Ue{*JL?6|>sJ7vDg!x3stIGe}jXojmS z@cypqeYYs=rb9-P`{E?&w-%`gnH4NwL@<~nRm^z0!4cKt5pnaD5e9{_qGA&W_P*%i zD91z&vwQ;Y&{(Tpb)~5&d2n%7Nv4`HghS$2X}6?^Rse=~g`@m&gevmg-*4km;Qt1YFn)!|1SvO~BOzz}iq+ZBKXmXaWMlu2NP)QcWUZ3u8c&{*GFVl>syz$>! zK$4&bl={7mKEBs*BO%RH$%S$lz0UBb`i)cjSGr^E|EN(`cU9RT)@4?$dMTR2>?Ww!U}% z?132Qg^CfBylEc*ZD;=WsvpGm{gK!mi2^k)S*7K`JurOgzu)r-XoUcnRV3fM`3r$s z#Vkcyqh!zwv>02Gs4=0mNq^8RDj;YLna^dg0eYb^gYminX&OjCK^iLyHq6oP;>>pg zF}U*(x;g+3gxPLa;`v={fB*FT(;7U2iElhN_~`@frBJI(hV=%hWT2=3L%}$J>^tO~ zs6B`!KtdKidTbxqy!D2yxAwgtnS#kQf>2ayG4>32n!d+=1TUy#>6ysO%Go)f|38%Y zlBJv;pqCPZ%Z6}Sh%tfJ$#kiK>=l$(5W3QyV#X9I&1_JV1^%E3FzIHAX)*vr!+R7+ z&Z+zt6FUVY4HFZ&Z&P$g2nmyUm0@uslwA)u@_(yjzRZ6Q@t^_7wu4pE^6S^%o&-0* ztqZrVf$l-*7rPls}01jKOTzY1)NpHa&5ZljWL|hSI8aG9|C|1zt08F+ujfPfw zjd}w^WAp<2)+{nllDl}>6_iP5zTIwu?y*l{`f4fQ!<5STrM zECXsq9rI52Yyxk8?S%IYcD?#i#fwS&sTx9*$qRl0H!a4%^bfGXHb&0f2KX` zF#$Qp5*Sqdosid7g-ES9y&YGAKGdOHjiNay3BwS{aQ@?tC{W54Mnb$oH7iHG5F&I9 zcbL@V&Pc;Bk|E&G*$iF5M;Zeo1WJv98k5Z(a?sBDNrlnN!$?W@`t2_;Yt;biDIP{KkcC45 zhZNBN;)!T_I4lgW{#|DTo)E_OKe5nBRd&Z zmwJ~bc3U(cgGdn$I%X=3Mw;;dch<>OB61=^>R4W84pk{B(~qRDb@hwXEG#U#hN5NF zUq5O2rB_b0(bCgEp>x7@8Ee*$28VVmf$?!RH`d~gL0j)(CczdCs$FVauZ4A&D7=mF=d-XfnOxfS0 zRGCOTwlq2Wi5`y~-GXTCmCQ!?wX2pe$YjOrefz5tE|+_8CrTz*iY&NMQN_i{bp z@D7v4pp3y~Yq%oi%Wy@$Bg=2W{~>?+`UUXD?j|4OWT=BMUeou}Ar!$}=kV}Nd-ONgvuAW_rgu$oS})&z73~^vpIK$kk?Hq9S`RW;G;?xH_Mf0?nMIs7 zlT(?uopyv3X#jV5!RNGbSh}>U7|A1@rcn07%OpXJZUZ%c!o#~)G&wmLW(gTV)${#( zhn&bpY~#td7W>VY`l`%BU1KT)N!8YoGc6Uy$|WlkLS~B>_Isfff)?jPr?g~Wtzf-E zMBlDlE(in7$z}iP2u`zGT^|&f^af0Bda}|6T71*bpZ{fAm3{p95k@S71&>WZQzggv ziNMAJzI;I*LU;_iWj!dsP~^0Da^M0hCT&0a3Bif{^@$i#k0!LYekW)Daa{>o2}Uvx zxt}DaALsfD72fq)-Z^SR=OrsM8DC4h^CUs_Vl4*0yvj~v!=kxRr>^v{FP7EQ z^}HkE^GcHZ8AWZ#W4HF`(dfGCBVGTt$2!%|FU+N0CJF3x&k^RY5U3rF=i9L;;A;~M zv9EOfs5IUm80!4d+n|&#w>ps{7*1yJKRrj} z8Lu|*60~dCw>z%~C5<0CxAxvCj4ytDX0oE+pcR~Bq?IWfHb3c`wHZ}kW;Wt|!M?nO zCa8!ZA`F!PoFh9`-_LYp8-ZIS`ZAGct9{bbm~m$jF;RTJ%TxS9uiDmXyQ94)sv_$` zXDsEWvTx>;-CGA!DUEmHQV9r;R(flaHdVpl0Nwfxb|`e8(G4XFhMMdPLZlx5qEuBz zEY5oHT${{RZld-&zCKNgv|2BBfkj;8ocgbQavSLr@})~$1nSclbF7*tB(EO9u*mQX z7!a5U3>AoEc`BJbz{3I1)kH@}1L;Hj&bk0&LN`q+6!<#=d&;Jj3eygvx0CS2Ic(E2 z006i{_yVRjU3S_Zv;1Na=AqLa&$~A`&rGQ4)PJA2_r?9X+yj+vD-YM^<6d>EV_uWt z2lA@|mM-H<1Z4^F4`qMP413lZv<5fhp;yLtk`C;1KH3vhB*e3u_ZzJWj#chvJ~+yq znsNU!@^7e|Yu$pgaGk8&?Co`--1nU#p)O3^g@+I(i@KBVe$iEBDD#5wx0$Huc{Xp3 z7`xdum1rd?9Q>2VD(QF%QS|#ld|w|7TB=r42~=qp*16Bm3EY(Y+rE9VIhveoAS0s5 zK7V0v)$lp0hY_2!O;?Z6=;*kYl!e-KJIGHuj(6}1%e3nDo8{PLZAVrsWNyXT4qwh; zo=(pE`-gEHJ8PPFq#YDXDXC9bT1h)p%+|}R$i2Gp4#!IpxFxe4Z|bYH{uH9ut8~sV zIur5TRW0+Lcza|QVeYoL6%xW$chI+O>42ElZ&(ql4}1C5@+y`vo`^V3yR66(`6gin zU{e^yG~|Rxs|0X5K6L2v@XHMjKW3!)J1d zM_V(J+{?em>{>4v8`3)UYF}CICmqNadiW1#U;O^V*FkE&#AiF0#>MI1$g);x%(-|8M@Cu{+rl{i|KiV+J^1lzdZyECy(n+i?%>EGq zmezWm)phVwI5!RDPtK#dB5?Hu-!AX)%$NF)%jLLq)_qo&KS+3QK7*;Kw=vDgxz~&R zaHQPZ5fDCb68@dGhfveO{jNC9>M;y>2}O;o=@hhRa6&n!z&c>kt=@w;d3b^v_=6yW z-oY$#dT&+jRt6xT+4Aq`1Pq0F25jumU= zkSxmN3$%3aYw9Y&i~{f6lCMb<;NtG(dN>sL!l^v0a;ijS{^y(Q-~Kl(ZTLVdG+Yt8SS z1%_F8E0D|E9Y31BTZGSNrB9&_Rd?XnqvS zBc=GZO%6Ujb{bcm-Q5WKJ?;n0sv4%wwS{GrBk>v+!<3gvC^>RH-L6Gn^o4wf+cHW( zN)X?RsyM1>stF<_Kkk(@lItR6vXZx6Z*b^kUGUD5w!G0vuGx>GYElQ7F2l>GtU;1=#9)bO>^kWe- z|KJ21NAC7`m0jjJO!l~TMSHy@MorgNO=W?ju?k`P#|r0*kCFh9qhVwhG#ZT2I~%Mu zM0=?aO(4gaWZO(`+!MWsjuCU!C~XvKur67gjosQp&j)aJBv#FCt6WTGr)d0$rNbLK z^IX>M89COoBdSbTC&luP@lv(eSzyk;^xE)(@h(}ne$!sVnl!6x$M|V4wi!<`$+l}U z-orbrNkbMF)yG#l?Zg$EVuLrwFHV9yI``i;1>GO9inH@7d72Pgd-U6>uH;Qu?uD$H zJXdDqlt-%~sUzBEwymXDd=ss*FnqZgf9Tmmb&utp2z=jNb=_*?>U{-z+}_aiEnnG- zH*TtCp8wV_YDJ1)EOIgphx^$Yv%D6K)$B#AWw9Ai8_Oig?wVmQ_HC~tG|c`*-|dZM zRFp4yW0f)+{%8UR>m7+Vu)yDO?(rTNOuZ3HC5IRA=~I>cvNC3{3&6b1pBBI+5JkXD zTf_S2+=?*(9FBT)M#}{&sg+D)qvX%8njji{B&rUAiYd(Ib znVjl*?eBs4T_>d1ufwv{au5AFof>+F6U&KR*?etYQYJ<7iNy4UY`Z%tj_Vg<_m+n{ zbXSpUrzb6}=n}d9Yc&LUh>#kcqdBLTA6%Py_9lU?)D{9FOpgt#Dfe>)ErQ)w6Y1tZ zPYrz^CibGz&@7ax__)PEk8`B_k=JfRBUMX5r^oK=%Pn z66tFK6*Yht!elFnT$WlegSqz>ZYP3FwLqr|Voo{OFyikCB$fPw@AF?;MT7=sr-G`* zic^4ww^L^0a7ve3oNw=2C~te+oazjHj_n;p;^JIq2C8~()B4Zz&_a#DIo zvB=(0ScU3({bAp@fY(Kp;Y{)5*k@IS^WGGr?&!^^p}}EStCt=C@2>}0jaOMWLoY)p zWjQu~?JnQYOZk_%jYLd6c&0zEd)>1)vg#Y&i#x0d0@P)aXPmU8QRk!ojLvoDxz=L~ z$9skwJQCO&%@5=U+{ts8ZS!OGB)8{Wuw|pza7ItV{NPI2xG=Vz`e>Eck^1g+H+k;=+~W4f z07iHPt*W~VbN-E&EGCs802`7igK~&3#g%i)aKzB~=(xZ}LPJBt)O2aS^I~%xcYPjl zbBrLOkQ(L`;5iPbFw*6!0m&l}N>(5-p#d4#do&=2%BWx-l5#tV<9AHqSwSn}MCVhL z#gpjmmHWgLc7ai|+KI|dzD${?f~1?L=GN`uw1>+j{<#r#lB9`IkB8V7KWHWnwx{$a zRgxc;3ATBVz=h{ z?GGdWSataS)CMs)yXFrIv)!?8W@-eEOB2Iz`a)bhW&>vByEoYuBz}QVvk1NkYa#m_ zvx07$Ol2uYasj(Z4`70y)Uzr6zBEe=p5x}XMC+rXu5KhL z#LAx696NZD#HFvy0-YujE&p_%jil}@L5 z-PO_mP``L`|2K;c5;}99Dt?Brin>QyNC_w1!LVk8NJ(L)apEs}HRv*JP(GY9}jopvgtEsFA;IVp84y@Rs^)4US?iA9d9-3tDul?Kyer4`kT>KUg`|1vV>l@ zs`*n$NFP>%YOLJriz>upiSAXVr|^^>*2ha_j0WdZvs##f!F^ijlIcF?Fg0jTR-K?6L2mIOoenF?O;REmY(q!}3l8PF|Y ztNce^#Sy__O!z4Wk6u7;>&x82=(}JwV`O0pA9J6OfhmZD0^&Ra{T-5=M=3$HX*@T>uMfmZ1Ox_gz~;xW}CkoPiR5%A1`d3f{>_+mvOkv!DBg`=40k2k7Tc5cl9?#Y3p&MV}*bM?HEH1t?~xaY0_5DmH@r zL=FQ`*vWFsxcN^Hpin4zrGEo;!3ex11fpXnJUG#PN7{j5BFh9c$+IAK_%E0VW$%FE zKnYOVPeAy$p03s0%~ofmVN9}ssSkJ_3s`g*K>~cc+%Yxj70~4H)Q#EFzrj1bc=5vY z+VTEs=2FU2p@UIFfNlew5h(B%`zoww)b(8GeqyGvnbh(|%gm#URatvMs*Tjz{l=V0 z%Y@AO4hDTmZ7d!mX4GF3uyP8-L4?4+z-ZR+gac%?63J5$sq_etZ5noa_*Tv#d`iOA zwUr^Uw-9HIc(s&F)edny(S>ZnhZ51013==TV=g7Pr21dE zc0=)XQLdayhMXomc!U=Op((h*5c1Cbm#P(_JP6NEu%=J`n100FgfUbC>@u`TGx=S1 zqMwDwD9rO>(~^cG`-`t%fegnpT9ETxRNdrQVB$&;Z=npdr2ZMOucH{0M5|Ij91g$( zg$aY!`rfG%D^RT{5zZ>TL2DqpVHYS=Heao&u3!YfiEmk*K&_V*wn7P!I zM$=CMxrTJqSC>i%)ejb-h7j1a5no7r_O{?4sklf|0oNMP?>>T^i%vdPrIa}TYANLB|CF15%#Zgt&%^A(^0|BArOXAA>s4y;4uC4 z52f5uhdrNuL1IsKbX4?e=xc%aGu2PeJTS2(^3eHgoa{f~yn@}r&icvR*z^3z#BMGr za>K_TbN2qexGmaY^nbAT9zap=>)#lPfKnB~LNC%qP(V5e2uSZBOH~wM=^!0MDIy@C zNC)X1mLecXM~X@>3n;xv2Px8Pp5MLiO(uCWlSwlFOy1<2xiiOeE@#=@-?u!^^Jz<* zfB}_TaUgWkfM@Wduxu;Ro4{0E|vx8PY5DkmVeCBv)(FAsKQELB(x9FA}{7(^w1 zqw_3)EeM1A12~L2wE!>}|7-)g*fDT;qoJimUWE@A3|fXk-LM9>Nib>t-I=fp9y4!% z?6?2jsv}suO%7bPw7|)C$b~MC@Q9_(+2k$iIvzkv?*DKW9#>)LccDb|6Ii?dHcbow0e!R8EtXoV8TsN6F4$w23;)hsS zUlsQ{v?}zCJ9Ai`cN4rPG+rr2G5zbn3}-keh^n-o0wXm{Gce9WC+=vcaR}vJL}<-8 zuF=R=CZEO%!LP$P#Y?1uD-{Rl)&En1j1j{0zW>Yu{$H&EIg*Fb2fi@Q{}%--@WB5^ zm*D)Px%s!|<{zESKRTO#bTuFa{V0@f=H+{->7aX2jA6P=vqp-AL5Kc8?-HkQSDKow!JM=gD^f$ET?_ z;dg>#&PNeM2r}WltIsh2hTxet&#J)iQ4lm4FxH(k2O4;v63o{jaYEVk)mgl0st!6< z2s}YRnBHDpd$2GmIOo_Ep#{#C{DEy|YU10Gn*)F>6#R~a;Wke9a68!4Jjyif+D?9B zgN(At0pYcch50uay2u5jK(@uLJ&H)>NO8zJNQ_wKg^&M0THD{g3G9-yK*urY>6JaG#JpYfr-lrqLF(5_9`e4_B;7g$pF&F%*+f(SfRoiSgHaP z2vEX?=r$1dkem)eQ`8dpomi=E4Y?MBCEP zMGKf-VBaF-h^Pal0T4@ZkSZ_b>f1mJ0Rl~BDwcy;%x$w)M2I9PiEPhu%z%iVytQ?~ zN!}eZIz{+uw+p_$bkBKx0&EDx9T#L418X_(a%uQgsH3?lfL<^uxr?W5Tt&oG{NKg2 z=fob;`hMgXouGfSJW-oeAE6PYx(1 zurD40Mgqb_Nr+ZZWbJB<{6>N2G~4!+E_!1DzGHY|E0@sPZFW1Hihy;AleN@<2gJ`fp^TjQJ@0w%nFnIUv6Ok5LpglhL;I6 zU?0Px`K#G>dIT%C>)C`WFbWoq7TF9@kCE6AE=Hip0~U+tY29YDq`nortV#xMG8zr) z@&HFAaxB0ybg9611EO)Q@q)6{>nr`cg&u@ATnJ%fMcXvLxs+vKxe9A**GM*cKI=EY z;&m7JrlWkVfpKD1n#=yIzGw4yH$cD#b-E7iu;D9z03Iv73M&Rw{b2T7zJ|uQ)Gx8s z$>d$hcxPILxB%V>i?Rpg?sIjN4@JKAF)x`~qEIiORv>8c0Vr~Z7wGUkCi4QSum!bY zNrGv<-80VmS5kQF+%bQj3*k|+&`&VxxLpTt74YX@m4MSjPgmnx@uQ}d<}?kCLUxs3 z{R2l_dHPAgA3pl>8|ef`cCN4tT=N>r=2QiOjYb4=s(=`Dr6BV?czVVlK^)rJh*Zq} z?+jKb<32p5B`{@U>H!}qz9-+`!3~gb0ty)fnM{@TLm*Gm9i`@V;KQ6Z(=;J$gbn|s>0QPlR*Se{J(;tk2K#riW zEFZ87K7BjWg3 zXZ$wczuAgWZOCJbgU3d0^Ru||);SKwpHkmwuq7Z4rXTZzqx4tB7p=D?dRRCi!Kdlji->Yqum{z>%y8boMWDT> zF{YsOD3HBStnD_}ah5z^oMR4ni_G zT{fy7q1J(aXoVypOdO06&kOL?Nx(w`R(CBJpvDHYjm`w=|8cJqpBFJSwPW z^W`ju4A{{u165ap@%!juS2VB>&W+V{{a9}1d-edRBNOHFNiV`1hPKfskh~HCwxR2$lxSM?rtU|6L;H?b2={U+ziYWx=HQld^vj7m6 zb<34@6PJlq$n8Ny)=J<`ko%ktobGqW^5pfC5?Frn!M0cXD^v2{q_zcniSTjZh+&NY zg2u$C=BOB=ZbNQkR(YV|bBT$Gm4<^F45je9Q*fee?IHuf%Jze5)A1|;$#7}jwdgU0 zOM(8yUaI%9jXQiMZne}b(g`|#Ol&55; z@_<+1atb=YzpzSoNT#*FeCm$$T+EDFAs>XNeN&!A{(Wl(LuY+7Q>A_}7**Mdl)W(a zTm{+9d1r*hGq-|B_!Foofw&GNbuZv{7>f_wvI8M})P0~Mr9Vi2VCqhF022K_KTFan z?V~$tv0iX;eLrel0L4c~(S;u%l7}dS_u`%|6B9cc-mRmrP$f&CP}Ne@*v!?*k9OB} zkk$EUVEd&-QApaybTUkoOyJRb7I!^7`O!$914rM z@TLD5sVIVtGG|NJsJ@>M6+~7w+=XzMgocK0AI``kOM!Nne~-uQWPg5@DTt8cg%3Wz zF_cFikEzpxNp|8)^ZeOGIq+IMgiP){`g-nAUOOrPam)wC)lUt^!b-{_pr#~T5Y~D( z9U9%MdSH)^?I^r&EvpWHv ziGb)Y9c`%Vm_Z1_Q&01bM2liXGn?Dw{y|U}v{2xrAPB}tMf>5d=E{K)ubJX#S0fRT z;U)wyDi5Ru=PvB70P6xq4c*&0=j(cv(;=q+^0uVp# z&du&G?sEiTZ|_fJk--9OC7gQh!|)QQCUCqifhF|*O^zwDx>=a!)o|Q3ez4!U;|Si_AY3gWmu;Zvy>MX7sGFM27}(JFoci`H9YJb<_2Dcy6=t3*bv>Y&(iR( zRwd#y;T$?3&DB)`;|PHZ%OdEtM@D?JG~9a7p&Uu%&q8!m6y!3MfZq6<-RX_E`Ewf{ zf<^>g$BnK$!AjsrR?g^adDvP`kMD9kBxBmhWA|~(a zqzXLzTgfkJ$;qcjCMupy=P+inwu7>_es7wHOW3H^!}(}$1Nc3k3)8_2=?hfxu)IqP z)9)+u!$un>1mCt(AS|6F`vR#K0!dp#(rr#-<0^OOPc9xAM~)VrdOWbS{r-*iUy{>N zQ$_jPw{PqADQsRsEOQ69%UhfBpY`2}S^IgUid9To%zL#Bq)*oU*xJ^Mrv3_bdWHl+ zvGWN}Zy*05tFvvzM5{~PnsGLud?EQK!gA@fMDXUzgiBKA1?50QKH)YK3a)hi0Rf00 z9V{~-)GX9}2~pR<|G*w0OQuxhftc5xebEqj<0l}pND&a7_kv6Y+~dD)bwh^=CVbIw zBny;+q3khOvi#zKfUXB{TS8uiCrF`zg5(VavGEL8B0h$COTeghaBCk}P|gKa(4QdZ z9B`BcQY+;$Wn;m`h14>EBl?yR@@s%KdI&}jDS>ckc!1f2#K8h{=(nWAXjL+BY%%>{8?;&ptP`NWRl|`E4PsWK*U&sz{lJlN2#%f5#ohwB zO8j$(4CF`ra@6Ua3XU^ljPne?Y$9rEmz7u`mx6f#6!$;A1g`|41(Lvm01N=&z_W65 z+k*>ZYZ!@P6mEgS@)QYfkp~LuJTSIkEhD7H%`#IYL;~)RT;wNSK#K?~AyWX!_BjDY z`LN3pVkiVc0i-LlG6*?ZDeXo())CFR=0i_6hv?T2Y9NsTK4FIQzfR$ql5ccMAOxXP zO}MMl|4Ba0>|-lQIfRM;yA{~RIZ$RS!IxcnWkOgFo>m?3HU<6; zOMZKM9fa=O5EOJp>qA&*s5pE9I~7pVKU6rj?Yq+J zRkt@Cf+8C}01@~pTnI;36w30gcxz{{m_}?Zv^GF3w0Z%gJJZ*3!cJM{3Z5bENKFHu zPRHuU3K@`Rp(`N3?>v^tn3KIpi|3OdxS)ecL zM$sHLoAD{ZqtL3@xg2U(T{2{`tvYn)1bQxnLs(jW?C@;d0{W9z;})2ou-JGBJV`3^w)zuga-!o4#gG^)tVW1w=)CP7fZU_D98cihpU=|1(f+eEO&rynC+i?rTA`zyFy=G0zWQ7`}WNz!3Y$51kbso zI=k!KMRyZ*w~>$zR9duZiMlvK5Kao#q{@OlG;9p#$z8H2`m#W-nqP;06SeH?5=A*K za4JDJ6Guroq+^3JQk0^ag3Gm>l3%s7tNbY?ahY>jXxVp^GIzn;H!E?A3bHvB+M%Ck zi;hgkO+EvcI$kF=TtG#yx=MdvQ36#moL&~giL#jJ5#m<6*LQRAvU2`|_9VV%sy0`> zI@@!m`?Mg)<5Z8=R$XSWXO!b;ix(~t5DGQZ1~W+F}=hK*9%247S~pjhu>sD zm*ehq`8BTczZYz1@I_l3+5+(G3a{$}DUz8x>GtBi6id#l`L(&!@pCZaOXH^ z_pqt9ut*0nIZx9|a_Q2j!di1#1H#ht!~e=@5>mqHtSkECoMdN$xy-jQl@jStZrY|n z?Um^0u%7%2Pg~?M7X`jV#$Yj2A@LFD$dNd$=g$o>$%u9z?;LGz`Jt7>fY^Xoz5(@j znrIizqka?Gj=KZo0$a5xOWlhGDjx=Y4U*D((Sfwr6`hSEv04lh~->( z>W-QcSt`;gffbHprI2uM#1qPo&m6%FMEh-@%&I>+iz{gnr=BWzI8Na1wsu4>Imd&X<~+A_Mi5F+oALy^CWBxh zHSV?zQPk_QZ2|K7e2q1ZzmYq)Ytzfm4`=1ATO`IuyDO3jj1X4TEi=XnZbOkj?`n-o zYv7U`-;GiE@vDYt3l&AMeLa&_*^X=W(X8>R-AMtsqd)}(k|*5_P#PMj|1Oh4DN@62(1K}PFh+Ez1O|Bl>{6jZTP)- zT_ed4sZpWQv@6<8UpEsUrqx6KmCa=8l@6HdKKJTf7Rn@jv8<;3ed+sjKI8tVrJ{RUK z-~_fM*dg~>OY*Szh`Hy?*=`l_-dEn~zuJlJ%j+@G^0>2t|6$m8xNXkD^=0`J)g`|9 zrPz&xuPL)X%;L`s_$m{A63e{iDSf6j*Jv7)4y<_kNu{@H+Z>FKx=M`;r(Zq}M>Fgk zf5L_-Z@PY1(i^N7&6xd_B7$GE88Womt{u`d0gYguRFPm`1 z;eHsb3}-{L5Z76P)00mV#i-DOH~rL#ElAvqrH$1`t0R^IzakN~-e)oL(e+NyvwsjkMpY&ARA{P$1rq(}s+ z4Qw3RCv0$z9q9%JOYA4ELgi-Ut~OGeA4pXIR-Ac5xqfGK%NL7_I5ctfd{#p~V!t|( z7L7Hy|0v(Nn0bfg_rHz^xTl)_6m>r7vgcz{jB9r!W;s_a+8`9g6iJYHEbwApm&iN` z@#eCBOjT_hu``yTTPHU?s)k*_=2N^={xH@aj*{)fi=3wgRq+01g;`l|6dp}Z zm~=h<n()C})qIlO)~Qggwmp$=@o?($(5)!}Rqqa$CG3xV zyeS&Y1P8vG-r0t7Fv(erGs^`3UNA(#U2+lC;pU`W(6LhZ_8I)%3vgSZoJm>wBh-ruG#Vnjkx5x52F!mOJ!H5F1d>6(5DCLJgmT9SdG`e81R zm=%Jt6pEXwVL6d0q0~Ng<{R3`y?m8F3Ci}|Z996goit0!SrBQZL5(1?Vq?wLdIJ)dY$E>Ey zg|FkvS&>s>zqS#(!o3+b>D7kFY^ZC7zTjR+7<4X`#kZ99>{zO_b$OAH| zddHOD7m6!{ufVMI%`Pry1C*$Rcwp+ZxLB<+@m^MJB?%e<^$}Ol*erEH2|$HD_yi`q z-$2P?W^0gvUy?K+`1r|_j8^*|8G^Ihm_<*DQS2Gz!<)qrefKblXp8Jbsb3(5+`U&U zKQq5+oRbg<+T4wOKBjXMd%h?>x$ES%;BkB`6e1C>yr9~@VM8EVf zYE0vh09c7CVNM>8UFSuCPxtLZa3~*=q1j$Tu2apm&%*Ptm3i8 zHH=sK^nX4_KlOk`QT^#|{b?>q#!g(_XMh^>Twar2K_z_{8|cwkzVDao@CzhG?M_U= zv%*q_tHj>&O9`4L^RDCW*|WLCZlNaMqP7PL{ld_`p!;HJNL+BsKrxDV9KiS>?@VfI zPSt?O#vwB$+Kz-qNZsW33oD^l@&X{H67Ztj0R+;*z3`8^(u0u6T}4|N?w8Q=f!qE) zdBFjRo^|u%pA@ZN2%FCuGWc@%3CN(dKH9*zt_wE@os`$G*-C8(F0#rb0bmh$pG%!f zew7Sk5Ksj(AgiaS9}M67OS)a}ke3ad z?axzh($<#_l`VhW86>+L1jJoh(c{Kg(t;#Y9#xq_laiNeL9Di7-a; z1oNK>u=QP~9yZh2c+f1CUuys!a+zl-18i%zb*ryM{a#~LQ5~QzAJ!q(;FkWI!o1NX z8bM7p1(O0yMz&_&*_TxqAE&UiNJSPZQ}}4n^YQn}YXq85OcRG^_WsCj{Q29coFyx}tE_4(cNa(e+)@Qyep9li?J$;<8HK2b=d9 z5eLC*Q28UvWk(tFMC(bv$K49mAiYUf7MvT%h@Hs$I+8ebK&6{d1hZ^(=Yr=33?A;* zvlL~8*NF~jYckIujkT1N098k>1rmG+xWcw~(N1FBKEOuVbMM!}I{^N_A4*Oe0@!ds zSbT!am${-xuK8!MfJz8puy0ndxgSuJ=nvu`IeqcW6HE@XYM)Mg{Vx2uAzjm;(=hk3 z&qjjQIb6f=R9SVadm-x8E;h8H^kB*R1Gj6guC<8y7uv~np+}0F&N(5$Pxz|-Oz*Ik z6M}St<^JkKeLWRBn%a`J+;+hBZj7SnP~NsGfZI_z91rfJZT@*> z7QbPRFWAJkU#&pYS7B$OqGWY%M*CgQEt}-SC;efV#FS@9?i@PYMUs+z<(^d=56b>; z&*=C2`CV3A38Y1}?1kPE4KEhjN8?bd)-0OddluszaiIt2HK}?>YCwC<`P70W|I?$* zydjTbUpFm+YXzK8M z(-#$Id{pVzp=Yr_?7PXQTDzF!K6jm@NWTp(tRdn(Z?%1iS-AY&Vt7eugi?<6)fQ`u zMsseMn@nCc4SqEdh4apWvCC=n)s1Yw>4PhR_3cxK1$BOKIqaTDdQ1Tzbv&*%m}M@% zgw6FkdMZw<9}X63AEivv2Ft(fXv9%_Ek7(kRm?qpU5RSlp#Ue<9NvpZ4i2<&y6qfN zJPI_l@hac}cURZ9O~4~c!V6pHU@Y*5OW|{T{AbiuR|3t?vjv$rBeHx&uN@7S?=}c+ zbB6N99_lm;bhnwJMqW(ZQ8=;f6SHtMCeb(HT;{MmH~wm7w)!f|@m?? zKl#h{#hDgcr}$)>^`~L&AR+c;I5&#Z#qb1R7Y2?S?B@Y~w8u4s?wciy+OZh1o4q2a zgk$>#%(=@fdcOkd+dv|H5&rgn7HmkpvOW>E(4pq2bo;`T*9i~9_`*YOGROjmNz|R|z zfT~@aD-K5UNS2<05+P?QRGzvxdq-+`#Z)a7}>+G8Uy!pz*otx z-?`Cn1A2qg|2Chc`U|3eZD4i4JqOOO;^1nGn0&(6T5|vQWxhoK8z9nL7{tJeLP!V} zcg1Mhb%c>(NJM!QYXf2JF!inb)Cq$?aNFwr_o&y>fxiVN?Fe3OJWEAs&rexO&ac{; z8u2>10{r@6U@iJ@+5K%m^ZC|cvYr)_EatB1L{3XPmZd`NDfU7yYZM&r%<;=4%Bwnb zEr!b$!8CLq0qK550c%Ha+%5gVd!|Q^9(hb7Y~uoCA8{ z51$KWISefO!NW%7Z@MfsoXH4T!^j@2U5&vpnN>Mf9k^w{0D!oH+d%PvS+KU%$mXcs zJ5iL!serXk1WT%G^^g{sTULnB!9=4L7L+#3M|AMrAcus14nSx8B!AR;y#I7) zl|b=pFDRa2roRR)L|*;lmzH5eIT|t;ACh9{WnJ;iH)(_Qi?m6IPXb=lWpeVq6e--N zoP5P|pMjJB@99^)PkrkeP54?HKVn8V-~%J8%(ykM#W(-)R^G|>^VidpUCG%#*d(W5 z6-Um>g6(}#;bvMvi22TXYzo{I@H?ypy}>wLPDBDPwp#E z1H(&KSeh1L$Wcw8WAfWlUqx{xK~OakmZX-Om?oincAvJ?T`?*V=pN`+0JI+Gu^>b{ z6Yh@+tN`k@L7g;oUjFU1)Zgg`-3VlIBi%Y{xE*r9%gAr4ebS`NK`e=?*ezpYauh#< zqXAc4lqC}4Qcwc$gvsJ8gsTXK*mXNWNCGLKyV+{=;@Ud%2ntc=YqEng@)Y#*oYlG6 zA|2O|s0+_SbRWI<*83|eEF1yGKtW)L)3_wv2WUd#$-m~%Q;2bdvj&DiN>Eb^BNI9U zOvE^f8*4RxRi{}~*G)xUKsH0Wlc>OPC&aY@%D8fk7Z^SQZJ2YLqUJMj@PRicP}SbjjQ8ee+e0|ea|~S zit72m{j=buI~xzw6N}E8%{DHux&gMvE?>9U<)Hz^7ct^{t7)Gif*$~7k+6c(i6bIc z`|0t7GdN+q^Fk7uIG^YIcmeyoI-II`upaZ9A?|LK(e66{rbHb+6sKe1G~Ut+U^pfr zBiqdri*@=z-nV(@Sk{vm612~HGSYLx83~( zp(iKNoH}h{HP06#qAr?C%mOO@g1`+-^2<#0AJf6n!n-^49w%&-$T^*<3G z#9W6}a0hOodz-+px={~d#Hv-kdRshOKo;$*u0Fdlsd1Zs|#4RAJl!?WFZRD_3 z*NICV+>8%&!QpcY2@rBGl)g;{-;N15N|e6^0%19Xhi{h@)$1Mcl00o1eIu-vBzBNr z)eIHK0Fz$yc_Jb$o8P~lC6k!Ly9YTDwU@&f{p~ThzHSL-R*7kGn=8=rn398?c{)WoN5%^@&`352zlN$iwIT zNbv%^#5LMAyb0xMMq0XRhc9c3A`Y>=Ybo+@e{4&CP^Daqew+E9SwPff{&~11FCaG2 zYrtgG5tj-@wZww?Mm|m&`KvD?vtS>qcouOG7d3DuC&}V9J-ry(b_t#$5`uuBn?U)3 zj4C8Xa24J&8gD1g{0!@*3}7o-+<+Yee(j%UzZ}hd4It8u(0scO7a*|rByC59I?-^6 zYnuY?Wf0<$vIW$E464#Aq1Rai&x%gS{vM;cuu2q5Cnis(+I8)&`yJk*C`&x4DXr9e zn9CqH7T{$aDisjZZH~vi?(z%Rt8m)^Nex=QL^#EeloU8(_V;GO;a<*g90fX6?ju%U zL%RPtz}OrE6k&N6Ax%EHhkSgnF^B1)j;%(z$`>8A7Vg+gxg) z4-If1L`G^~=2ZjW7hsJpG&}G>Q9)@ySCLZvdQd?}PEEa>c>8b9kv5pJQ6 zOKf?}i?g~HYjm?Fe(l8XgV7#bkTM4H`CHKaAPHQ9ZwKos?MXkj)45e6mlNto@H2BQ z1nY*k)EUX~fm{#v1$0D$VEgVAE}Ho?l=ninHW)swlRv(-h#%ocx&&n27Q0?%Sg>e& z(X{|mKG$oa;NF)a<)@jgDh}Xzlod7`>B9Q+V|fAAHf6mOE2jfIU6{qhF9k30A(cWK z4-{G8MuK+9m!wiZmI+2CLkGZK`w6g^SRmksR>Uq)saXRu2*G~L81yb zFI9Xk72AyrS^n%OMObX)<-_`2&>=3_xEwY@gv!4S^<=?*Sp&f5s1+S)jesct-XT^@ znMu>%gisIt9(dYW;Gvgilrts?JSnGIAotAa;`hj~#+m;NXXQ)e9COG{n!K&=yB{wQ$<$KX_kO3mibiQs1CK z1spJ!@0T-VB77lHPvBAa9~^>jl!)gGI0UKO;ADOA4YFDSpyB2Mi!OLQSnDMboxn-c zOS>Ngv|xjvOd;2H?usoK(Sj8wQj9i;LKf{LBZlH0OEt_XXv97ESy@{Z>EiE$N8{Gh z+}6;5WhKvT2p>-mgYbuL;5h7S!_;=*%>^2N*q26NG=xwGz9XDQpc(7lX-{NSTl0K2 zOa>WB$D~=^=c*6KuG^${(L9$h$bFKpeaUh)uyk51+cFnE41pyq?7@iRF)wy6qV zR_vzQ<<4JxLXp=37ragQV(mVp{Ia`{1XI6u`C zC}{oDlyRQ}&yuWnc<={|AcqWUD!zGk{^yt!~)Kjkub3cqf zsVB7!N~Ut{!ZV5&s~(xUJc7x{y7Fa=W~i&^#&y$4V3zFdXcMawg1RGZcK;prXKNU3 zHN;eM?Q`r~R4-rtx#^W+H1o`?M!Q6tFdpbEq;9{&A@!>m(r6I91Wda;boJQ_W2^-G z|9JP#0O?I9?lJh#&4n;ufNwzUeTO2N(5{i}r~#ME;>#9o_PW`Dg%SsqN-S?<)t|C~ ztzTV%!nU{0F^-zPy6oEzB8nV}jBZz225b|c?BbB)UIeA;ze-f4tz3xUSP&P0`-s+0UB)o=fx!5rpE^7YXgMueMn5^z>kqADQ<_~Vpjlht z+bJD1Zo2QE-5Dw28m}F+-~49CfvmrFph;1v+++Job{NnKjp=~DQW}v=${EKO_Y@Nt zl}KTxP2`xx0H+QXqHph*HsH`^ZB&zPe@x4JKW7gRQFOL*;Uv;lL#GD0h;RumL4}t_ z_QHtB`)RBlO*&Mo2RFdzE@MsWUa;)Nug;p_woI#f_j;>&oxXEy|1T{+%SqT~gI2^) z%WHpVr)vUD0eoy{Cl7^2Up&}3*lJfhC;R8X)DSV<2XH-}mk+W7%U1>-_cUUGQKgEx zO{8=G8FMctdFaUyQn)z{J9 zT0~!My9-&vJh=y4e37?|hBu#RV6LyWLcu=7mVnMc8NoM01;E_SBU=1TRHnxxkaTS` z=6Zz4S;QX>CvWd(i5n{A$q+-^_aTa6OXK=c!*KJk$iZ1u)$`mTtvUmF`ARTPGgFlx zN?Z=j^$S|k)x|R1Sm2lZ8#<#bdZ3D(yE`__hOrV7JX2{KQBg(m6NxItKi)dE3Jla! zBguMIYh1W?!#gnd)$9ra3oPd=nW!EN_mm#E2p&^fQV4GygQ7=BT-yop{2QwHxZg}K z?D!k*C!P8i-hZDW`Doth%hf8BY_gFqbkS_#aat7ER33BhOPsp7QYqgvk{m)idAxru zEcb)mYxaHtxF4qtL)TrnHUk&gFF(tZY?TCr{K+B`YV!V`iM5*8hQIFn6MTt^9-0@W zWUKkim*i)l-xKrPvF^vP1c!yWWHFRtbhL)OG{e;Hn*0(a*N9(nI9yM zRGd#16|3{wCttoE#4jXtEt%QNeR}yU0W(|@0ZlR%=fbH36g7Pg)@cL$uD)TJwrDSY zloucyN1HkeK-y0iw`Q07{U*e3&H3xH)<4#O?y>B1$(NGViQwMh&#rfZE7xpju@HEp? z6)8ba`DQC+L{_(Tt^#|`wX|Q z^?rLx$>^cB{*8l?Q7XTHF|5OK`#w%jExsO2I99~YSgb|K()g^uWTwRl?o zCVrXmKeGUb8xQ?2b3gn5eO?qc;Q|TsB^3vDZNo{f;WIhRsV;$%-3xcUNX1cXKe_D7 zG!0imD&Op;T?k0;BKP)cUX&9W9C=8RtW`$jus|E2PovsO>X+!3ZDBRNS61nS1sc@v zztSz8(w__$WWsDU%xV_GLc^7ngPqFSxpQrkQE;o>%@BBweU{&U8VW_j%Tt_ZyKb6EqE{9D4Z9w zI5T4wkj<_?X`rgO zMq&faaLi=(q^8cxTHhw`)Csn!aQ|ywa`#=>x;C-jK1CDg87A${)%~$&mv6h_<&HMK z>VKaxmuD#Q(3F{~4)=^i)Wat^a<*F!@y0>#f!vultL%t0ICcg#7HO`7G- z!Z~R3CVo^t(JP_+Z&}bdH9q5kU4zLT1@F%l=2yN7iqf?N(JY2Z(MV8y!L#>Qe$L>S z!gy=K;S9IqrEdNo*^WWEA$|dtVcg8WJ+7X(FsTRGDhZs!b!f#S?MfB$yTW!N&HS1% zHud3++N*m8VfBp9S) zLih71gyD+$)Rn7Sg+a?Q_a9xhQK6s*h4kB*wx4#h?LXGPypz0dw=1#tK=jI79+6uC zH|>VnUltu7znD_m>dJ-h`*>-hw>API>EuOS#Rl1j^qSe2nRQtD#S-!wsi^5$p3)8X zU$39;YIt{EBcduUOb#(Up}tjJ>To; zTZC$+q>&w53EH_#SMKqccWi`uvRYJF__|NWZ>NeI+pqYKQe~fClI#e!bJvKGPwP1* z3O*|fNUlAvj<#9zQ}T#|^`tp(>-WmUN8T!~)^=x~UZkl;j9d3M@|wo$^C>wr&-skM zQ$}bIo~=O6t7e?x2db56L7+8&3@Cg%CtpO=zpVPRpY3W;wU8uytCd?Y37p*u|< zU?~)mej=SOUH21}Y=(v&x@8mTj_H3KH!HjjUxLuxV$VsZKwmPd_kcu6B~bp5_rk~H z*W4cCI8jL%F5O-@$C3Ydnkl*7D=}4SK;<|4c7xS!xR{eOX6vrSiCjPMt}|{n#tYhe zUQ_sJ+!HDPMZs%Fc1)qJ_6~X|tvr}ifmVOxLJPrueoH$3{R_1M(*;lr$~&oDY36LX*6b|*Q21f~biyj8CvWEs>f)SM8*vA91YO-uN#L7L zZ|g9Av^aq!>sPN6B&l010YhffAS+B{G1|j1KlM+B@K5UTuaOJKlLFFPNs~oH@hTrr zF)!nF)reWoMqHs8m)XYWw(|-~Cxiy#2@em?MrVj**`7>**}H2vt9Jg^9m>?oS}!Kk z(9o=}hTk0p85+oT1M1&zS}s4h6FUv)-R)k$Nv1Y>Qe_rzh1Hcjy?(;L=*ch#(U7%3 zh})B?1Chy1BD6Y88Kbb-zSrn*6>m=;Xe)g5{bb)yR}ctH3jE7oMI3ba>|b7fdZu6% zq9)-8>{eQkyWo~PDu_F6A4p(P4lEB1O!3r z+i!L};G-3X{$}u3dkpPUFG9WD%b1x75_+XZAMCjo(VT@yR*=3x6lML?+S~ehr_~Xh z-#a8;?_hS~q^w61Cmk4h{TdymWuz_dFh4=VF0r}XM3nh=zVjLu6QZJ`W);oG!SWQ% z#pd=mb7A_-?qMe1a)#C6`voO`JL=yAH_x7YdSHpsr0EBh@db&i51k<=bz!W!Vrv78 zp#|zxXY&=dZS-lrHVik3G`b4aS(fbWv39R;Z+f6pCd+! zPK%?BR+GotY(1>^l%?OF(a45&ROnX7ioZm}!H$K{&LCjOfIH5R(VbKVJG7B(=%F1e z78>4JhN*;HGhSZZ)Ms+b`^BA`e-8|^K~lN~L*QnWTAZc=lX{6UlR^sl#rs#j(y!b+ z!pnnVTIk0`9gbdt+iDY`n2o^8T8)j`{5B-j7fa&DXcZRrOpDnPz(zF(-l*Z%P2p@PpTK9P&q7~_V5)GOl!uGfdhy(=FeX90+;J+giqhC%aQfLG>(sjt5c`! z>s`3C1^*YNTK}j>#6cxvG=-0P^T1PfnkjYdD_t_JZIR)zlRO2wuT=leiQlK^V+Ixj zqeu0+>!krY41<5Yf*Y1Z+Tt8_r9oL`td7Jlqu0!jgwDN@4%PLcdC{6osHLUlbNBM!Hhs|5)qU;5mo)yaz8)@%oUsc`M=1eUDJcB?s;6&_9E^uyg4%G} zFjayAja~2ld~TY*bl94pebh!_Yio{XlvGg-lk_~cY300ZR;ou%s(B+MJ2v`D+(3Kf zR(GrbvB@P1q2N~bFxP7*3M|-HB&XBps^(h$*$@63xy^#ysP&(p_TDVoih6o_T8rY= ziv*L2w#J!TigfO#v1LWfTEFzZFhGrUQLnsbM%&*B_%dkd)H^TkZnwG?P4N+zd@aey z@v!W?7JYWWu2bNpY||)HCiOUX|1q5>*C!Wr;+aL;UxNOdRAEm#6NULY+ZBVxCCkWX zm1tTnT{oH@rT1bhWxBtnkX08zLRLWi>bGlV-1TM?+p^kq0^-1H0A+<`U85RB)z^O9 zptzA6&Pqi$VvuSVMC{g`&6F~hGLqJ3!+s<8`nB+ymR{?}gdV5OB?eDYpKHC#7>_^r zQ44(yBj` zlZO#BKp?O5`wmp_RO0JR^A%h>O~tN%(YaSOVP@B2aC+9OiRAq)FG~hHJ~*@}kV8vI zNC@!wivedllcty4_miy8l74~ib#-;zTJiNvh=ha$4^)R9TRBsnWHqNHmul$)2A3~G!)#hihAHi)*+uvV_^aj7f8ig}D!K;-bdX=8*bQaSjWjZUsW;;n zUKCyOz9)38u{%ZD-k{%yDm<|-u!RB2fA}l7>HqQ{G7JIw1cD2j$k(r5ZO3akdb2}D z;@>BKsCA# z?n2Li9kn_v;N9=&==gQw5Wtn@mKKHk8Ltm;G<%?S1Hxv`FM5)vG#S@mEDDH$Ee0o9 zN=ZqnQvyjC?4h%PjEAVGDBFwD>7xS!Q6#^1aYv}Q#7ajz09ZO-0z8)N(QF`%0Y3Z@ zl05tf$THqG3cAB4xoiD%eQAKpyNTa+bPq7@#>Pg?*AAzQX%%mz-bnBsmC)RIa$d6s z_?>9C2To2-M=VJ6NVC>&CJynWq$I#OM7AX$s;*jT0s)F`s0IZXX=`OdYv2@8JP>qWa|n%n!qQI9%%rH4}N%UxSVV3 z)g^NvA5G5ByB_U1jOl?`);9)Xg}*j60p#omdDCD>1a=7&JfYWapY_@Ffmrydm1gJv z%mNg~NFn8&5MM?I4MW)Ll2r;@mh2CU8NxU$l2`)#mgVH+HnnQ70D}-`dA>#~E5H3C z&kCqJ45Xc0UFAV|kqj_Qnv7K}#OtN}3|X9h7dXdATvGvf{0r3Uz74@5R-*VzS?UahG3o}fdP-)q+#&!xcF+F!pEUEx(Yan zAnjb=0wDN1Y5}nxfbmRE#7LEMzMmiN$rj4MKVLU4?CRQx<9u1Qla2VjoZ9m+5A%|_$1tu4sW5G4L z-lyx6jX!mIPGR^AoJz~FDuIZIO0h*4bg(O@;xYpU$0ox2(AxUuS42;A;}~{aZ-SZZ z8;NUWj&cB)!e>rNNs$R8O^x{Q#{iO(Bq2zShMNwU;pRRRKE8f_Kv8jhK64M|z8@|X zns+5$zjo~*ycAGK-weWTgZ0--KL*UP1Ar}{&J0vgx=;9;J))7Z*Z(8$Bi{u%j!D2& zzfBSI+iTd$ic*S$XcyRod~jPo|Gow#C8y%2=^1wbqhL@FbRyJh_w=d2izByFzG+?(S|W=@6v5Q@T4ul)C8#>Fy9|=?3X;1c^O) z{`<_l`_AsWGdufbXZD*js3`Y!o#%1<@)t(CCjQ!NSV3W-sY*m#oHWlABZAnx;ZP+l zEJWnMhxX!y4WKY3ed1H-82uRo5%Af@v)Fgc#} z$ED~0*Ms2#jvsOfV)vk;(Y#Sn5j!&9P7@#}kEH-4s# z35Q$1YGZ93b&vW4`)9mi`S-71(P9x;)QpUb;1mrD?|y}+*eD`gN^vH8fSQs21ieAY zcnh#(P^ulbkSB4~J%}kM_f$8~*9XoOXi^IMimR_qeA+ubb53Y@YY%&;zzzIe4_mB_oAtXlOjA+ZbQ3K#FJ{ zA_1`42qe3caD#LU^ArWmUY9f(x!`P1V<8s%rRmEL-4^nCs?8F*e+iJkmN#MonwMF| zmKX8_Ceru+{?OgqpirXH1dynG6kXEoc+=NaF+dyqqpjk-x;i+7IRDKrEXV~E8L@qS zNSe>VV`|{yhAbOBDZ4v5;t9Aj@~bAuT#v7;7`OyXK<*x2?hmN{Jg8_8R4Wiew^_OH z^#^!)0Tc?h87;wBZO{Rg(1ZpEJ@{=hqR%PeGI~l#VIp^cJOE|(fqSQ$n?Zk~F%o-h zS6b@9`gVJ|hRcJAd5eZQA!|2Vz5ukX?7Z}xb|B{B8@N5daUyr%vYX%O5Xu4|i&+=2 zR`w&SP3XJ3xq&bp>{F)qg(H9%m$Z8g_cUpmcKG&6>!Y0>92{JhfCf}PB0HPSthu?V8?K$UpWKW1N8 zwXm6cTVb%@fP)+Gb%TMvoSAH6#l^Io9n{yTrI5#13})eYpit-;#H=v!-8*BGJah*s zV4e;@o^_VkCxh3EL?SppH|GK5Kj0bagGVJ5wlzkVy;jjMkngC*O6Sp(v)n zWDHLC$<4K#?aHY?FH(WQw&NHq@<45C^<-U|{{$8DdW!gM95EO)i2^?N{{~XHbqA)W ztJzXbL^IJ`xd&s0rzX=OV8GuV%k%*hE*{cP(g5$t{NA;7aInHaL(57I*8&A%oiHJn zbx6kNChgZ5-)O%=gcC}PQpMhTf>e|CX{zgY_F(qV?FG^p=m1;mk`2cJFm{|-rLHZ3 zLmCWjf9MvMfmY*NU-IT^1EcLB*oFc2{{uV?^ZZHP(PR_WPaX8u0z=w>;g;ax-UGu4 z^)a#W1dw4-|L3;g5GU88@GjFgFxcjxT?N1^CBR2Umo(pQvcukuI3tA-pc9y66n#ST zlV^Xzm;9!=yvP7f!}lUIdHqvU7^G|~MrcVJW)TRE8R7othH{S*CK%?cU>1}mo1LAd zWw7$siz61m@q&%S4TKJq?{Jju!exx(*+A5?(SR43pJ-VdFTMoL>6Ryao&pEjy8n{E z+4l5XSR*)4*aVDJ7v@_Reh>8#gytJLg5cBJ7hRluWMFvwCyZdq>Ldh(zM_%5s?)+o zBgbTOTF^*=xWq56v{rTz`-c;J4;~n~1M5z$j~MDRod5Rz5%8eZMn?Py69W@R1iLkO zfJZ7NudIw;wgpJcrb89_gy|m)$nH^1 z&>$W`Yr&GFXaRYud`%VLo5lPu|C*P7$p789`k#K!VBhMhA^6C^(F+p!zMdHGEZ7R_ z%S#Rl`d!m=tppz1>3`FB>C=>+db7r-#_#b?d2LYv$fR+LrQURabKULAQuOR4M++CQ95~fdBB`N zff`053Dm#34YvDxd!AsE7@f3^64nZkx=0u1@pEg&p*D+>rgfI-Cyym2*uOz8LHs7BpjU=XmnWEGW^xNympfbOC9 zVXeiD;n(F^XkX76Fd3;Vr za^=~|%FZvjShM4KyVb`PO2z*+>Pc9rfi&|0f#V+!VHr_gE8LI@+oVtYxV;GXotJCG z74u!%o@$9?xWw*G+=)Ma%~?EG#nzVtO#DRtl3XbqL$6@#xZy1J4TruK z2*6TNSzMjk%uKD+Nd8kEAF>^g2og`|rB8i&4@w`;`f-f_ID7(bD{vhjfq`+(ddRv2 z-~o&EVAgpAB={5&87N-^Qg09&IRv&=HzTRddmzPP%N-Ya)?cHVIBN$B8=&p#?*Y7D z1Fknv*w|e@ECjSd&8Gb#t;iXZL&lv?_ht4H&&T36Bz6m6Z#F&v3!JRwg#s|m^+xr} zv!1!DsEh+H5$H)-{xJRJ3907+!)QJ_70<{W*kD-QM(^;!$Rhq`5&3ZL`SLhwIj9c< z7x!HWCG={juxAt-7`Z=zn?H&F{-qKdOzk>%vheV_AV*8i1?fI)n#UrY;}eQ5D;Tw_ zG)gd>-voWvF$3aerm((c3O7!mpc_eNd;R+LekC;H4iHIB3bue@OuT##WalP=yh9L( z42|rxl>h|3X7sQq2zz?k5ih#N+8;k!KxhKE>8{&Xz`6U6l_tur28fo+N1@Q$4F)hK z|7jLF)+!@^>WGQfsV*3dM|{*eA~H2UVJ$wU`G^g5DlUN!b*Lb=FD?fcuY8kbQHV3O zXF5*j9mCXMcf@{$glf{Tl#sV0zhkcY zYp0p~;c$_H7U!&Zxns2oKj3t;!p}e5hz&8d(pgG(_L7+Xv1q+mFyqM56KK+Mfkp{j zg@hTF5okm7u&ec;n;fZ}1*QNICKjW|h;GR$Mt$O@gb_iQM4OP#A)f2zOvD64mURnc*5`+apw8 zOOM8805HCA2!%$}89h7fj*)tmP(E4AYn8;fYE&?oimY&b_AnXjnnf>Bq-h{d;+uWz zPL7NF1*l;O@!~t&xBy&sG$Sjc3mT~zD-2p^mzMO(KBg>qkwF@xfzV)$K#L^s9*i9I zigHQ=zq^(MPK1OxAiv15ICmTlw3f^4ms)-gj8|c07vKB5Z|%v6>R)KgAY_;`xL z;BT}-6iSKto9@A3oL|PwlCU>ld8Q9Rk)i!>mivCY99K=9uViGcoXY zf$A@eUDuVifWKSYn$L%IMdqV#JIgI;OU6uo%@vNR6k}6S4d}Pk+x_W2ov5um{bI>u z)Y?c|8(1U|ry{2qWpnh5jI(96werDcDMDN+@(uEVHbL6TDkTl`#q#y_QoIs+vc!m^ z`$)jqQT8UC*5oHmX~RwrwAx%QvqG93VuFXAZ7p;&Y2XSLGBRl=M>ehV#IC_KfyI|D zmve|8mX;p4CC%3R(Vk74tHC@|pxocRvrzsA6VgbMNwz!whQwcm!amC0R=DPfRxz{X zM@!-}kEXoa^@zca;m`*;&0T!`8czWmg~5pkJ)7HDED7%&`lZ|_*YcUIt&mF|ZaZF9 zSg8i)>``UKI9$Eqs*gnn=04Fg{u?_u0onFu7GHW;|9BhmdYQX9Re7T{G*=7Hoe(b2ZqQ=v zCTCZ%qx=k8R56jfwog{K1z@e2bl1|#*x7x5Wr(C*Ju!a!x_wnYL-h!}c|kY&0K7>~ zN;-1|ix;nS2S^i~j+kHtp~D-1byB@WgIk|Os!+>=wdMlXt(b(}Py+c}mC<1CBdDb> z0r_ye^rYzMY`~BJ1mQNyZ&)_)yi`@u79)~cup=Hop!{pji-|geA0H#}kYbHfA|2OB z!@JO}I0ru$auAGib8{EJg@!#4a>2MJbwct7!(A~`&Jin!2?h7P!a;2+tC_vMJwQTr zMC(i^F{|$X{mVNE;fKnin9FsF={@76A|)Y-V-MA_uKP7cyEkmBb{VJ6q z&Lyorhg2gDM3t!JhDYtPb9=H5FvU^fv>Fh`Fd@m>&iZ<;S#EWT7OAg8UHxzFXR$Ge zwdjN;Y18EIHz?5v2%@0SKr1rZKSP|Iz=&0Tt&qKTc5ZGliL;AL0}7b8lWZz#+m3GP zTreY}<&zPE#+%d(h;R=Q;a^Lr@4sbyl<*iYj8@BN^0X0{if)fROmNrR+UTAfvorpN zTys9IeMCfckHw<8);E82cISmE0X0dG7XAR~XRq@f*Ea}1lq9nrlSKh?_hx+Yau zPj=7#3kuWA)g$BZKXB%^>U9rF{t@{0Rr7h)#@T|U`uVC{4>b;=X4pC9c-2@l5@)TL z*v93NnT~UPA(uzL###3CI2j%NhM8%6U+0w+Hd1hg`oH^5(@1x?2aJm=`I)J9Yi-Y! zkL%ADQM)0z zI9+r&Jv(MZcRpVs$@yjBk<_rGQ<8?lobd4xpB}H6@^MqFK1p2`=#$<*#E@wuWc;#Ij;gZ6r6W~<6WklVG?rTI{oPWu;oyW5-Msk#F^Bn!Jl z;xbv1j=0lx%rDx8O*JrHC6%XWer4Nx{r$4uRr%A$gEU4h^-y`lXLtNxj$l-i_yb&A z#Kue0)7s$Yk|OI^&0O84}bR-OEIhWT+{`PnKWk-F`G@~sV%u5{R7 zZpej{2&%uc$@p7|0@k`;PQH%--~>;W%CzLyH%uHz!Nz2UKWb|+xrhWIA{je-(h69E zN0S;W?LIt#uDnMwwYRgg zQ%I$+2R+C!&Ao&Be3-*@f(=={LGso2<{-ij>UK30_yTf(hWEP)LFciOMp{h2Wd6} zLjmJ7m^h^(2Uwv?!B1d6%b~%z`_0G}FcC-kL0Mt?Fy5qb4jLO9JOU|rI-IS{&m2Gq z6M3TrzO%U$l{|d|)^Ee@F*U6C7VUv>!S z_=wt8WE}Fdo4J`26^W{j=M4p3_n*FPY{+AjJy=xI@wWmqUyGQfFQLX$8bxlDrS7MG zPdYmsmZlXZ;^naMEE3{7y0rMX8kDUsDJ~)Qq7h8nxuHdlM9gMnI$}sYqNRcEtgydf z=YAMymoREr^FP|e;QTaMn^V;Jt=4*5gJlU0Cdx?5H!U5@XZ`5tsbWs+e81s#`ZVca zq)xY_DhYkJyh1~%eJiCeRL|Swm4+ENDM?Xtl&TM(qk9_OWvW0cT>XmvaH|^Fdde%O zLNl`38(wpSxd*(CA8u7qTnezjft5gq<%8zP=4m__ff&3)>#d}y$w8o+%@4Ps8^tT6 z<`za^82w$(*^+2-BElE$C2@Oq_^so_8ST9cF_P2O@^x%6%*NWnAz?K(=b&o6D=Jlp zkv3O-w(k&w1=YD%umQQL?}B zICYJ-H4j77OSu&GQR4gJg67+l45+WwtmWc2`!z{9iOlB?;-M}x;7XB)vV;Vt5GfLh zlXFOdzJJC@@Wgi71Stq&ztOf)?i8u&%qO9J0hR`kA<0^jl?XThf{MGrNP!EJ_u)kn z(My?~vk?(NkH! zv5MT3wP%gdRZac@zOw&)$}co+$y`OmDHcQTo1^Qm5Xi~9&Zw`Gi$pqRKq@kGRf1KXuO#cbXo+f>%nuMX#{q5*c6+y2#M=Wx>E37 zsArOeK;3xS7IiRwyx2UjRF8f=!FugT=f?2Y(!VhZUN(t;*H-ueYB6rF!}ahQyR0!d z{!dfK-dJkh(4VtIS+ULi`W!!iEwHmYP-OS@cMk0qTI)5Ia;aSnBFP>=((?K9821aj zxglnnKq0vPj^^ZRMQW|LSd{6(#ppSjAOIM`*kSHHch6CM++{Aakh^nnG%a#5^F18R3I6=@3zVX*Ghc30YJU8lS zKlEH@ck0kjoMSsu&-fJ=gvvhfYaU)u_XDqY3qM7!m0}rVlrn8bu6hVnn5yeh59AZe zlbf1=d=P3cvzgYj;h9i|*xu@&S_qV$yn41*F=2@PvPj4Q4gyWHGu92uil1e8CMNE^ zO@~7L)BB{XkhNm19Ymzy>VuD`U(;vpU{8hl={zE?OC0JSd{WbTZ;+pSunpSkk;UN4 zt{~n#t%T0~?L7a<4+=Dl&9XO+c!Y|S?#ULdNr&r4q%7z58~4_F=V z0OraM%~a8h9SjgI1^u~@6bh|V@YsT}Jf1>bRu=wE7sy-byK{Ch1!x9fChfONqr4yGlFt{3P?xAFBtbNcyX#FO<9IBK;VfP3ZRDLCV`~z#RU!|SJOy! zK^<khL#knF$81&kEXdXX(T3_xdc$L_^TLdMOI;<4~`KTgZow(tc{9%$%&Qm?R zk5}H~(}KH7qMBmrxDrT;1qSU#TPN}dE*ot^rM{ECA8rROsb@lIGpVnwG&~jM?{?G5 zFAUmZW0l@>jV&w4D<`nSUMI}|m38aYNcEyH62y8|C24l{Xw*q_J;jbIv0=_km%uce zAvMr`=Rn0@v7vU@rF*>SY0q6d_bw??O5vfE3|5E8Nh_Deg+nusmEs^UU5;}Ny^JD{ zl-yX+P@i&rihT?JW3_|NceJ7b?2GbJ>|W019oh(QHPs<2Hgae+uX8njbiS>k0ylS} zY>e!`Kb(Iu8@UOqaz1z3SEeRlnVHx#h}75por}D<;1|P7z7o}H_Wd*$`c2QB=-KM= zZ9?YVe`5hplkjOI0c)+|hQ~T-&u*)S+CTDY66NM=my)vl=MQByzS%mcV?GAkL8w^$^HowDRKuEJ|I&bJb%nv5V! zmQD5Hu#L-1rWl10PzRgK9DT5Y5Ys#dK}%KZLiW+xzev3r6Hn5Yy88SVR}RG<*qEs*56O|nVUDyG7XVX6ok4?D zRgvgM=zfKdRI{O^91De|sY>w=2=ulEE+QE&0Or_ifV@&X{ZqTs(r^`ub}^zXy-y)6 zE$xEZWXKtSgNX3(31xOxaR4QT9f;W+2Ox36E4Jhd8VTB|WnTwp53VhoEnqx}k81M+ zZA(Ybv=jR%B@PDU24*}Gqw-fW>w`6)0eaaH4R9NekQdy>(YRGI@SYb!`XpEk_L!)h zGPm_3Mj5@^-`bjk@PB4x7FJx+&>CqS-G_><-JNvWWjiuV5=+aHiS1UbQw}NDM2vyJ zv3MZo^ZWjyZ@l#-;x*huZ#yfj>0xO#&uRyr)&TtAVq{=Kn?7hnWa;tq#Lo8W{tw#y z5st+xWb<=9A(&+j*ACTvaV6C|u?h+Gxe|FCOIrJ)u%fgbclTLl{I*mMYe_GCg@^Hhv+U-5lXfSbn9v zi5R<%wiq!DC{VkYuBl9jhCm>!;v?i2k+WxbNcH8w(f8~2pE&y4h2FI_BhEw6E*6TF z@5K+1mB&Nsj|Hlw$mqXpF^!ELs;UWjd6ZdEKVFGbQs8JUf=QmvJhF)rUv~)rpcn=3 zJ~jg!!FsjO7Zln6ff>Rj<)5`qj*QtOnzM#p&( zkhoQKtey4cHx;M9i+z+?T57W8WAC2QpHY^ITXc8DSe+>zrj;ZXlqz%mcm9(iK~!}8 zV!Sk_T(@O#>i7{oLAZ>af{u?QIFex}^!*oYubIo^Nn7-c=1`%sT{WZIBpO9pE-o0U zik_^Qi!FL$;(xB&%rgrIU@4FKUCd2P^2zq&@{b*8EQEp4GBWe7$S&++qif5Svxz&e zI~Q%*tq;T>!0XYetzK%8l_-SL8MxyR`=ctLoAO{g`4dYJ8&t7uU!PDfy*T!E()}`@ z)9xWZHry#c8}drxB^HU1*>SEj%fS~$6J_WLeW@ysRx*vC-=Z@Ro zI<(`6IqjZjyKK|O+|PrFFGC^lbD%lVyoK5HuffeRXLTBKUmBYJjEr=j-4gZXGUl7_ z|HyX{yq^yFeVl|1XV`^mPBj@s6a?B!IK&`W27*i=x=3Sx zbqHPI!sZr(^HynjOhKQFidk#Y@J_qZI10Q7xGLy;j+RD@1pJap5?Gjh#8cJP={$8w zfX!U3(Bl~)*S*_3C;{Y^$+ocu(EP1|O~1)e!T#h^VDXTq8m3>hJ)3yN5|VLk6hT~5 zo6O}Du`P;`(HeMjDc|SvzZ4=lIkbZ-PvM{?ZQeyx|1@6!tQ7}@91U2~L2;mG|UY^0cl7hfL?<8FA?WxyQ4zYY(34)%-?J5x}<(hp&>qS z$cqWo>;3Vv92D_%US%q3itG^y=(4D^nrYlVD4fv2`_7{Y=8r6N%5CIUUS!=|*e6aXzs| z*Opc;uhdem7cFkXxjG1v{)9`d;quX(+y zrDY(9GEh8;Y{+aXg(J2Mn5)q90J)CEAvq@RqQo;|W$SDbG5I~TGR>n*96b#?C}fes z3b|2kfPw6i} zkFZYCq%sFC1ziE-szifzjz5Xff)8kh7VFMjLrcQA2Z)axP5XNWq9Ah0%2A zaOjk!yL_Z#^he|x=_2Q%D+95DNhhosB5$H0lD@uev-=V7R69F6#S~Fw@Ag_10#ERe zmdD9P*`5p1cFut2ONI+pjp7Jt5W}a?Z%T3THRBnfuWu&aaL zSQZx#@7sensZ$Ugi-qa$YXT1`CeQ})ew-nu>y|Sfy;o1()}tJnKx?cYi!>%{e?1w6 z-HDR&p*X57=IxicuK34FNJOBz#K7QZ&5st=l>%;8GVg_{x7|4UN2YsvmbI1_6fI0` zqvXH%n(<({u#QZdU*{wBBGfgGUT>NgYkAf-I{D!fR{DtR(w&Y2??!|BGcDV@UjC!H zTBpa8agPhAdW*s|oE>i6=S)((*%kw(n~fju6{WDRAeaa>745@@S{OUf&uQsp;s+RI#kpn zP`Xi5glKN`qc|=DCI`8>xfcYY!h#^Mx{&$fApMW(>WNJLd$YQWYc(*sr>j&b0eCkJ zbd%V=p=ToTbIy!Kq*|oBqk0BKj=sMQP!=>v}~nWq1um09?wS8pq8{ zZNrA=b8B6i6h6MD7yoLlN9GI?jGn+lBB4x>7ESbrH>rDA0O zpvzDMpM_rnaCxfeWVH7TF7mg7f4CEcIvF5vj{m$SfuKfbi*2tr6h3pFbY0EXP`o%3 zBqcw>2cv-~4|H@ol>f6|v}1m4x55Szg9jvfxJE8N4bMxc|54}U(3elNJS!>rVc`F< z#o^^&@qglwFf(;!mF>2{SdsEUUviHRGh~hPzU!)Sr;Zn~jZ* zd-QcVQ|;U}F$RGX138`aaFVsTw>d|xH_o+aS-=UARB772*I~EXK4n5LxkIe8Uoc6g zvR^7iyT^bu4RV?9<7TEEH49Ju@|U4^fMbvq#Oi9Cpbcr6Xl9ZKu9Z)cfK472SA;9 z4s4tt=|}M%-qXv=L>Tm=W+q*{77lJ<|4{*Il-B?-17xc-)YKrKP4!SyL_{PY;Q8## zar7LIkWd?NiS+dJY;5Q%qa!2W+?oQv7i7o1Q^^_%&V4%x%o!jVfS;e=u+?43rB2su zf+xR&jSwFn9OLC+_DR13J^~slsv#DWfIaZQf@~R9!2uTY550FFRTu4*oTQirlJq>t zPbjZUNI+};1eEtL3Mzop9C@b8w@}Kt7>I#NZB`86DI1lNeJM9$eFi6F_ulJHJmIqCwp6w3GP12-UZbns2I%VQtx;L0o(9~V zkgRkiueC!uRpO6j-gWkjJdF;}5AL13zId;A1t31467VM>rf65_pyt=0pWK*eZq92p zl4g7`Q)0L)@Jauwa{n*;Pt%dc%cI^ik zLHg*YNIAA&9w=iPr6sy8KIG#EK-+}&m0k%us=nJ7c6Bv(X01{3pT*3;u!`9qN);o6 z+CP6)lKdT-)<5Jq#NXqAlJs?urX<>nxB^VA02*EZH3?NS2{Y<1JERRr%)bYjs|9?b z;F$p&lpm1EgF>^zj;OwC5T9Zu4)(d`4!N8SUXug^OkiDvh z6xl3wU^!hpna*bR=FOWagSR>(;CY95xnAxlh3HJyf`H)8hl}XQ$hQQWL*yV{VL$_k z2y3FT673E=+7{;KZlEm{yd{S|tpx?tHztZ$OQwK||L_ft!n-ww8gg5vxM7h=Fy@Po zTVt#cPl|hAG0)dGylkSnr1YX7a-(pBft~#lG!>eJLXvqTG^)sy-?%#zddKl(9S9>P z(f0p9`=mFQwY9Bgb)98mwwspO(B{8ayJSE(F2+0Zw;0Fa__FsQ3RWF$x{`Hbt>{~a z_O8Rp&C)@k&Rt_rye7k?RAy8#a?AlT?gM6U-i76lybUgso)Ex?Jb~O>O9;6*Ss9+^ z9EiYYtM0%`VQ$k_Cw&;G%Ws5J+I@aJ4bVvdnVuj86HDmcI54mG?wK0-}Vj z5{$$#`BoagFn+)=d7G=|ZFGNg49FIcC z*Dv1oAH!ff06b}%$EhKekcQPnCxAC_aBwV}C>Mc@^p!dG!> zdtUv+LD@niE@t*rXy4y{&`=>@_wXQp9$DJSQ_p}@s?&BHkN5zTus8NKo3}HgYP{@h zY=^4Pjc-m;6_rLQv(}8-Djfb^l8wr3xn2Pa@pb#)E{?;axO(c3#!TNvvf(<|EqR^^T$LaGGjFC~s#;l!U+DTxJXl0U z)6aDS4AK{z7boTQc9QK7$w1g^2IOD%r|6itAkp;xc(5?yC%&9C0Lf6Z9)bFV{=R&8 z=6_o zEv&MTtGPvqZ>t+5FpSiG7oY9_SOaFuaW@cWa=;surL{(Y>%EE~533%zR@NiE~@I;ByE=ZRAd6TwgX2BVv#>P1v=34}TK!9lCgx#}x>dU`4r$Q}D!G~{MU^oLatpYuAu+^c(PCNs3qwM?Q0oj8La;+iIEEhNv-Hy9YK)he^ zO7k2oR6eD@I^6Q6v7upLQCeQIkrorbNk??8MI6#g-yaU&uP!Iz3oR}o;q=P1>+@^V zwO>7e_|zMWLTlF^7@)EAHteWX$R{J`-=Qlds#Gp5{M`JNi{KnjvF)Sz#^-=NR*rhf zfcMF^dnXI7Z1R}k9hA}gy*l6~+sbrtwr;u0T|F8$|96+c9RKGlkvK988NAhC1&Z- z$+xlp!YBQ1C+Pq&F_t}w;U-8$6a&4a)_ycQ^Xq0H#^ebz+4P$R@t@2hg!?7kT}FUv zVmCh)eOe80?p~x2u#hWfuwCHq2v*TI^x7D}fm>R3^9#>;9{ZdP{$RCMBk4Cr-0rCm zw)C$b!lXd2<$RoMb$rho^eEP)c0IU!Wc~AqvdgD(FK+D4aqaE_Zn)31HX#Z z;vw53x%}I3+G1eyt!HmfdXM36umImrgvA-=v6$Q|>>$0v^!KL}6{iLg!gh(Zm3{nF z0xhGC?z}erf|??{zuwA`x$WOrpYRUb&d2$F>ee@fxu3*T0(d^n43`)-sL0Dtu`mcr zMDaShy90$`*cf0uVNoM7koXx@6cb2Xx?-! zd@vo+J~<+pc6XsWm3|%gtENRB*V_AL5q1P`@gD3Gr^0M@&tE?Pj)x@#XT*1Pxs)T? zJyR5^mB7>IU8$(4l6O;DlG*&?Bc)n(PtPVP2Bo#WK>RZ!ZXsZYqoThgoDW`-*+?q70%Bb6Zkb#^e7v03i}Cuxpqg8dABOq^U? z+dpf+31u)!l1XCxZj|xUh{DzOn{Z4qC=)>$u^}nuCIif>EK7taL^;SC-uaEZ=%!|0 zTI zfsh160>Kw3R+(^2AX)ecoQ|>DP8*oI8(@dU!c3a>Fc)=uvjHcE#AI7nM19TY06F@s zi>7;ESvA;Ke9{*55XQ*q*HXF~K^8cLpxdjXC!T3$}@djt-jz zG*do%zF3`WqE|wps%TdXIYF*%Xm$8PmvICwt&{N%5HB;7uq27mA@L#5DIb2XEbpes z>A3-kmC;4CU&t#X#J}R?8?{{>EgW)aORcE*V{_!y^HmSL5D55byYF9EGewV)`HYvW zH1b2RF(rBTn~oGak^4vJSsK540CgS(jAGZQ-MznlArd0G1ofnJxGY^&lmUC*MmsI0 z+=tZj7aBPbAXH_zY^CohRk5ZH9Dt7Vct0lQ^)`VZ#FZ>-HNf|zQB#S^jTkEa_~0>W z@Mm<{AJ$I1E{bmzAS_3(TjsJ=Q&Kc(n(x!)2I<9)Iu{r7inm|?!SVW^s{FY@M8N)B z@ILUXCwO`@S!Q=)t&E`mHx{50A2af8=$+F!%SCglj7*s>rc}Vl=X_@C4fN>jIeyd4tOZ@ZGTeOHLgqCh)b2dP0ux%^oOlnC=ju-$oTm$DMBe9r3#h@hYO|{L zN(?5Qri=U)P@jHw5mK#!QzHU@XK5z!` zF1DmHP4yJ1CU4#y=0e!b<&>xt+q@rFffkdhINaomL2ai!MY#0xv`1}gYrOI>vFX$A zZ6n=!wU}x1;~AeYGYAchg%(a+R%IM~I6?FWEn)l%qxVRBsUnKCzyzb}pm`b_)HQv4r#aHALq*yyJu*xRIg6Vvnr=Y}MRg2yVVZiF7P zlZp2Vt_|4wCpC?3_nR*+(gFl4O0VguZJTsY$+8gt!gwbPGSiRLHE3_MP9Y6zE)O*>X{( zqi?ObHPt|Co_3j*()U4XjdC6IcnAs3Ra(F9DTRy}nU|%x?kFC1cs=J}nra^75>63R>90Q_0yPs*NU3H}-YKy;MZI8nw8- zRiL_olz$cUV&AC-0dja1@$us-B9EM)N@!G+0XUoXM7PhP2<|EAa-Bm_oW8U*3ZP0} z#erxS5CPT~Lh-h#H3dsWEdWh>es@?+_L8|*TDt01anxlM8Ypaja?pn1rOUT^cMh$j zPVe@3`Dolh?tYxa?&cBJh^aT~pQoo>j5B@MZuKN2{8niFz4=SZcQW&sBAb06-{H)Y z+KKc%SACF(-5g$7G5s*ruFYFm+3aeHq7h*|`$uVv#qQ4!u`7VNxN7^a#ZuP9T(Xjm%I9j)-iVc6#zg_I-S|3UE5 znu#*O!z(Dw{xZAZy60nyn;jG@6)<|IA}5!^1KIJZr+RKr;&5hh+Zep_r~HJqh@Hc~ z$vjqv^(z92vC3k#v7DpRs#9 zwClZ}bw#}x6sG56>G*4fg2p6@H-~vlNW!*@lAim1AQ-m5g8sK)^f;>`%&`M!Reu4c z%5#`E?o@n*GP{Z5rOy())%j6@TFOSdu5rFkqg-FA zT8`}8<4~3n^;#bLp}gj~F{^oaIiQ^XeWx)=zz8b8{tq8Q!uBWL5aHHPd{%CD^zG<3 zC;0qE#jd$D#Si+ejYj{`+(fh_H)X6%EdvBpYFcwDlt7JSZt7yXUGr06uKBIFkU}At z^nVkO1T!s9nK>?1q$;?h`vr+>XfIPVM)=4YPc4j;vngEYNhS-?ZXuD38>~6r9}vi8 z)_*5%r+}P9|1x8}{Hxv7TlML8zbx;6>uw+ij9ep2dnB(vRaT^)ZaN;XzIF;sUcbI2 z;7E#DcE-WA;k8jz`rV9iKXKPQ|2jkSAM@F)JJvZyvZ=iYl1`0Hgy+lxTY&9@O9jka z(#gRv8I;fTAS{!H2KU6OcpheW_GHo$2)41N8;ma#&-<%{%DJ!lC1IMUf7bgSXoXU} zDN)M{D`r}+7Fvuz#A)l`gC>aJt&V+z;vKcbIR{Fyjs@$8`(J?ofrE)$D3qunkMq3WNL(S+R^F%BcL1Zq?;^ zP)X4gLE7u-;{!H(K7Rhq5?VwuP6|_#f=6IGRZoi$NXo5$+?%9S^A=CjYj!T!u^R@7 zIL!dY2Lnk&QTl61nLEu95_Y797povp4MoJzXZ!=KyEMGyz5}pqnvT#`MgHFSFNLF@ znKVVuSa5wvP~`mmeB4ktNQVJcIyaK_APDL2-JLe#cTJiB_uCz=A;c4Ydq~Ttqe7Z@THga-S7}3}!NamfxJ2f5*ymy8Yh27c+Si zVw%NyLu%*n=g0OCw1SJ~B{84%(xjZHb{>7+1Z)3$s)FOechRD6z*s9%#{R>4pG2YY zRz?&+QW5!Eo=CI6LgIx{#9Vbzy1SIOKvDOE=%XdWIN8XUu4-+K5Ty%5HQPTm`T1}5 zhYd<=XP_KTu|9pV;};y8A8Go`^Qwu;0@JH=!<-^Ucu8uPLsSH+I=>qDru`%(3Uv4Bq?MX|`#q?n?CCX1? zSKjx6L!GXu(n9Sc6Cb4+%QH_92 z^}1gc!~(y5|FS7-m;SDaRsiZ7!w$>C`_wR_&VU@nTnoS%7_>U{eYH8P!_jv^g4NQF zFN}8P^@Ir1n0M9UqFx`Xk$wY(c{yB>VFDN9fX_h-0p97);=`ae@2s?ms10yNmLI%J ztTNfd0c6|`I2Z(nw}^-!De+5YCNV+zroHx%+8(oEnpgVCbq+-;n3n>!FgZj(z^4YKK}s6#0HeyO*(T8(5SCu3&xTf&(MMz|;4 z#|XsWZIP&K9#`jsN5QCLIMF z%5k)mM0l}PglSNd1OX1tWti3lfbN0WKa5Y3!AM_d22{h86UA5qkuNyDF>vjFjy^J? zVK>uTLr`a#q>J6Yy|&d->qY-^YiZaLJi2js2y&ThKGJLK0xp2&q+$-VDaaYjVfdg# z9A>)y2aFy_>ye!}2c=b!8|Y;%Ad}A+RLqN~{OTM3Yn-)B=xn?dp_hRU#~cBAG@1ta=-r5D+Oyh_~8=Hb|*v2Pp{HmSLqrK z<5ah;KHgU<0nhd%OqsHknrGA+P>X-ae zf^RFYfBPbEi<>A3KAI_&2{UO!)@e!t9IzPlAEp=(glRvMt&)9I*4Ma>@6^4vs+TVZ z>9H^K^O#zW#6z*R72cBxY@Csyyu=#As=qN80hGLr2C$CTT4T@ z@qJ}O3I%N<3`SQjR8hcNMiws1zZ?0pOxz~ZQdkP@+LdXgaBR9@>7PlxCDRYVk6i`k zvb^vjv^o`Q&#{^HF7-d!6Sk*0IyDpxY`W{E3mn||7MmAz_r(%p>+(j_1YBCRwC(h?HVp>&6E z?$_U5-`VGkGtSxHIQx%1zHhHT)>ydkg*oRlpXa`>`-;!t;zNHd@k3F6ED*E01sIP4 zAcayF8+?Z+N!2e!J5|$-`dXmu8)pYQuOOQt4lS~{8tLtGn7PHWfRv!@R(Fu$U5O{BObtI>cH@TYcc(? zkV#i=>fjN6FV1-&((ABt;7uuMxs!TO#v{9kk~}QVK;AqoJTU=1!v@H>FR>hnj7*|E ztUQJ^I11yTIHIc74z{LT+<*)$5W=75-k?Ml$1{9O{8ponj}w=$C78tgXIw^-1|;#w zx)JqL_)Dr#3kezga+bJ>3s!XMIFfOA2QvjCZWzd07I7@Kt^;IC`d>1!wRETB zXc8V3+jiGV#ZfU$>aI$#$IZShsM~l`c;fP=?|qG{FEQSON`H#;r;^w0_U9G!B_jU^ zbwx%-)?-G2gRABpdo2M^OG-M?tK4C_=f2ne=v8*GtEG;O-0SQc#ZAs#OH;-dU&;a& zhuGNi=X4#=RU0;9JmC=|3MqePZq78vPrbPPzP7(Wzy<1<+=lun_0=6x3s;=#BgWr- z3m?(8)nKR(gL=z&8uK^T0#?XWgDy;j3JVK~P?<@QD~d&b-7y)g$EQWVM@ANZ-TBo! z?enzT)%XQGlpE?9tSeD%qvGP?%iJ%$-9gZ#@U%Nd1HAikfPT|ux%?}Sg_V^fTlZC8 zUmpup4-+?4J-O23?Or=TfR((A47<1DcmugOA*Gy={b*AYx6jh-8K%P0`Z|;09`gg) zF}j!sCB7R^s6Ar`<-Y$VsXW|upf#AgMthR{n`P@@CnvwbMXGP-vZz7+d#sV4T#SK! z^`zsXOqAp+cX%z+9Bb7ZK!+nHAEk4;Nzjm#@y{$S0%`y)L!Iza}_g82>S2&s?`w zghgjAR_I^G3q5r&2@r42-R~~SaKz79%lo3XxaI>6r#o;1n)K; zR=~k(YHRP#fJqKyx?O;>dP!{x?n?-E4O|GA{6I_Av)#(R_5m_txVS#BHJ^wbNDQrm zg0w`dk~|=~o3C38L|_u3EiEmX0TA~VxiJXY)UIGHIMmhO&)QEbg}9Dv@+=bRZ9=hb z$h?O1sAslszpzDYRc_{*(10$(Q{klCc`|&>A z3-^cT9+H*7Z)_x%y9#zh-k{xd{yp2&0HKkry47)`w9(G=J~5 zF#bN_HYRE6G$_AXn44@gMCQtesNN@f=Hc8Yyfw~Hx>t~5No*nTw1#8w;vbx zABGJYWvU}Eg*Vs=46m=R2VT4nAm?BjJf@(AxR(c3Ca~q3p6tx`^z`KZ=InU=yhIOZPT9&loHk1NGHtblM7X8QMC zW4eY=>CrMXTf^dks%qGW321eX9)0ial~bLo64|Fqij|PIw%!1%ro-q9coa~|+?@f0 z$p>ol{5dObXBZ}wfnPC11%0TlP8uy57z3IzT-D#t_t`)|LKffxa`vDjzU*-~EvN}_ zXP|hBcNzjBlSHUFUDx=ymUFi-9&Jfr-1H1c1|Iu;%@)3be#^CNbGi<%BO5A1nj?kR z{2Js2(`o*Q9YM(BErfR*Zr090a*%=gvxnu77mLZ>EeuLbSw+R~jp>KbrbtMG738!N z+%4DyP9cs6Xiu;`QTy6-kBm6MgaOEbE{=`~em-k(S!;o`nicwdvOX?@AUp$OsU7g= z13Ri-8nAaRN8Ei0w9km)H{4aLEHXDJG{92oiEl)HetG~{>%MbbmK%!pjG3NmZ>NPE z%!Mvh7|ak86En3m0b$G$P43APG7jS)_e$?JelVF=F4e28(7y$f{fMp2-+%YH#CA{> zYeFrcnf>|mXCNxBVS-Djxha(d&Jy9!Dg@Glv7`9SGhkRReE}P4K5#5hcdVWzr=XaF z6lP#YcXf1F9buuN!RUV+p$QrRtKi=d1=wsCcrgpA3@ma%?Y}RB8GCOcL#)I>Jd;7= zr;-vT>csC&GY>u7-9LT$L^(WN?;^in;gE2)ss=U;!3x2t2hm@?eXD@X*kWZ!heH*W zL3~Q?6|a(#(kXrp?C=GAeGs#}v$na}|8E@B>;Q#ZRI@C9AK3q-yWao1>mTA?{jd9h zUE0)VYXpqSZy?AU&cxw{)%A5g+X;3BoEcc%rx36Ow^yf6A-%9&d7%JNN*VAN;gn0B z*StSt3^ITkr+^cLOD6|d$S$mEReH0XCa`|Z%g#0w5qSxA*C(z|i}!yz00a|qTV7T+ zozKZ!RW;!tMn_MNM&>3ma+Z(}znXpD&wxgoZq~FbSoDA=%GkHT62{KoWrX`PBpnN8 z;|4M~uV3OmKwHPIO5C)vV5RK z0bwJqG5|yXH)*{Qxju7TxDNgel0-IO!A{fzw+fAb8TuJ3Q&ZTq^57bUyp9xpu@bpM zk}DiWzd%ynITxdIczj%2RVC`O03P38&NoY!c*9%2~$Zo;U2)Q;vVUanpg(r zw!l0E#iVjz>y2Cn`cRE=sGFRjB|iaQK{wEExk*UetOpa+3hp03uoe604bgiLO%9%o zRg&*YJBks0*w6rXs6O+VZT2DM3bD$ufC6pD8VWTIc`zc^hv+6awVKbj1b~x>hlj_q z2o$Cq4VK|rN-IS%8+s0TC{H^zZGL=YO{s<3K}003S*-j8Z29iv(KUmE?3%6AScfhE zTx}bY6_{99h?GN^2E$RX3ek@XV^Ad-N!}r1{|RR|5kZK=gj7Dx2OQY1r4W_pC_~31 z1bm%DnADA^ZSF+JFP5aHjzgU!2$Mx0aI}1@(eJO4Vhb^Lgv2!Mx+Gxey$1ECud|6^ zhi`xwV}utR061($wi6=St}G{zcndM4w6L~RG22loQ8PlJr#CSCOyFIO-) z`K46jRtJRmtbR?!GQuE6ed1>u4_6nN3dY57{PP@q`8{6%M$)+tLpdm|jc*xWV_`E# zRT^@FSXu3T&?j}eJFb3v45p9e_g@U_WBViyX2`z9V__S<>w1lr(Uc&n1wILg?Cvy# z*FBJJRDV4sB7GDJ=E?BL!4wpm9eZGq!t2Hg9+`W4CZ!uyK9!BpM~?lq@M|zO@QavS zo37(>%&4p5dt?YU`V-Cd?CjrLx--)jATuDsAtWROGAxix%Am3nq&?E;V_hM3iur>$ z#h@D|FcH~<44E&FIvV2Mva{NfGzPH-kYRY(gGCUE%tS$aKP_xiz0AOl4a8xRsnrXa zx~tA37)$XYig>azeh=IWR~q`m^W6Yi)#<)3H&g9RL3 zS2@oB8FQ(D?zW_$2=_CnWD@FGD37IwuEAKf$^_!rj^}X1l)3m^Hj)Idy}yHInKlhG z-=HEC6Gj_Kj4+HhsCj2VfT&6sYO)-nzDY!T|7{f<0o0C^sNevL&qn11IUf)Ygj{p? zW(aI)d2!U{C1B^+&73By!u};+g$z*au*{MJ)-ZqBwTjL=q>r9e#*KE+VH|-MBwWWr z379oOGoc(No+Inz9;DP>4o;w9{At?qVT6oERF7cWA#I5GB!w~}iTOo8oFJ?`+$Fd? z(5(GiAYXfmjf}$2fEaJ9cF9_sY6A_oTXzTQg0rz7$>CCGg*bgl=O3 zqx!J0V#|I|h*I3l2SK@j+=gYeHNiq0qGZ#7^bZP*;ebrPVFgS}BWSTm2wuWImgldn zVh0^-vDX@=AS96rdb+#6@rk;Dg2rNL*jtH^a2%_b^@$Z)K?9Vuf4G3NtXGpTgR*`v~qL zWH#{1v_OeEGe6WPIWpMVO5MNPm~67Tw@jU&=$JTQI$|4Ov9!5xBLP%2rv)HuVQL#Z zNNrd)ucyaXNMX?l=ned2!p&@gQ1)?1xXGx<;F6Ife0!1osG$c8S zJ8Fu|k%T&NE7=7uK1mdM{x5ItFlcc(&kqW{ztfA(3xMFObzbDyEXL<=^xu#MHD6tN z-7}l3w!(`kf%ZL@yF{nT0}GQ}Fszp#qZGxK*e~^yOd&YOI%dlyGt1f&1PmhH4LgWl zr;sjBK|cEUyez)Cq6Y-M(Je2bRPd#W)?`ug?jU!x^~G&hRr z7U&#wDdE5}yKbK%LcuiZ`T|8?f07!nXgHkfQ#)CZBoc{PC?wzHr0l`DpLZI@pYZC{ zEB|<#=Hqe{42*l=NRzPw1qvxd#B|Pu4P%#TfOWIT5JWTNgViL!0PO67gb?<(lnt)& zl&F~y*wC=utk>jObKoXPO*2R>o$zJHvE<1#6X*+Z9G47Hnp`(C@`X$`cjvJAu=VKz z(T&}4k)MUry3i?S-6JF{Q?X%Ba(-6_p4Z{?2p?)+W-XB!u6n3fVDe)OE^&qUo-P1E-3sR3*IJ0v1=nI4Qa5}^LX-kzr81og% z1P-Fy8o^c}pR;E^@Gobm2KZU@7jf75kg3EF4JgUxEk=t~7*XCF7+G60XVh5@dsZH#VBF)yzP$$u zkSP9G&GgonmCa|?KoXi6gE&e*ABGdK;H!m>5@J?nKH8C@84?ro<(hmj?~juLI4Csb zas7}JY_F;zMn3^ydd5m7-O{#kEESjtxwOyXp6hF9By(Cws@5>T< z?Svk-FMvAlU~L1F&=t=2i8*X#VaOhlmzV#|Y%F7n%Ml7#;*hfdj;d=(pRe!}u*aR8NRA+%q+NLq+*~>>Z z$aB8%i;vzJq?fYs1$+ZI|0xF|KS(y8K1}LhM^4DPU^Yf>Mee-?4e{whBwHMoik-;1 zIHycs9TCz3n(h_jIi&=KCD5#c&dDCUWROQ4wvGWDtsV~8^DXPJTnndy=oQqaQDTvs-SY{TM-w-^oK)3|` z6hx|u;ft0R!cGZ1GckVMM)xWdN5*5STu2UkhRN|`LObE|kgYH>Sr9_MO(lZ}qbR;c zZr*SC1%;B3>u(~$I>5ua<*TZyCM=YD^y{6O&}^Wf?0VqO6XDerUi(Hpj9U%%e!y?v zs}{(iBrf36{N7BTlpE#m{|x-B0@a`nd@U=PF@ERn`oiC({6ZhhLDh|xQmF~k!B@hCIMJdfhQ z997QMai=XpvRi_M!`mNj(AujYBj~q^Bi`@_RjrdE6C-mmRq%`id=5OU^f*S}4V0{R zBkD?^W-DmW*KL12cTn!3{`uWTwJL=<>Yw;sXNDl+Hr-)Q)G;c-G3H>{)0nU`ZtiWC z0K${9!p?gTE)8u4q;Fx_f)xv6;2Wx#VeE{S2M-<;Upv?sliz=22A3<5Q~{U<;F$;h z(NGn@!zz9hmK`HHmJ1z`f+*rUw(()BJn%2b&sTsE;a`;G7-Fmb{`3ElX7C^X9t1|f z_QJ)5RV6p*09o+y#n$Y>JBSAco3luq=oJ$}ggFf-Tk8Ym=Ylaqu7P}I`I?dwm zv`UTgaK$4JL=mfs3q@=mDEqh}k;vYD8+P(}D?s}INB~sP7aC6IxnEmb2C%n4<0R~T zf~^F;{8J#Wg{ow_*+=gT8$0M7FTm0YZr$*vnZyI4#_B^^_c{{O`h%=*MjZY=?Zw&H z8z109CBJ8G(F+EB^|I4_VLK0`b-T4WPaw%Momv??PA~4*MAja~MEgB33u#e02Dj@D z1}Xc;oT9ygcqSug9X|vynsD!VB9PqND@??%{n2tL7Xm?uNlCK>+@1rI2ZHckfWH~M z=8^bJ30q$GHA+Y8oGb+8l4PYo5SrEEjqh&3u&1Qz*l1Dl{?0|Swd$cBQ`z%d6hD0S zQZ*VvW$nYOs!+)X<|cytAXh<*a@U!at9Vn2Dbe-yiP=?p`nl3T!u$5o(Oj#s?XuKO zsONEp{LsLVa~H@{;;@-5E-nHxzdtddJ%o2F7XViXV=sk$dbsPR)ty`S*J*YTLZ+h% zJ86c9=h6blY(MOe?@yi%joi1WEKlWR*SS{m051tg9r51Oha2pQw0|#S&jXi@7iDv%s?1*-qW7JA}@m>Gy;f60zf>kcWGrM z(___EY7&+0?d^aU_?>Uos;H=}3Bxgng%t}BMc5a(ULHsS06Yqk zBd$Uzd>NnCKjddeg;`C0em=Br71~u|7&;J)10BK&)b22s0fYuQ#TjZ%=p5fyRYAB+ z+tNeB)*mhZ^!LKqJd6y z>N{k1S_9^c%A<+dyROI=_%E#ZI2A@p=aLzf=cb0&B^B1d%B4fr4LI0_ZhSAR2wogJ zfm7J-(Z~K!Uy*FcfCuKf^MDTZp++xw2aj)UZtqQIYnSyfp@J%F#(m8TF`Jvc4x1qb zhVDEfFiH0_O})!)kttDnJ{azp4?vb4=m2xdb*e2@1ZzHibOo&45N1w1TwGi{Ji-8u zAWZ9S#{$xHHy#-ju~}dv5p^9gqeGOFk(Y3yA;L$>%Qpe!gHRlfJ*a1?ResVzDwKj` z)=jAx**6UJWMpJGVhD9DE-pk0ARTnc?1ZI85Zn)O5AhH$6nlwC4@OpWdQ90v`O>J` z-`}5ug9EUTnhRX>XHc-DDY0}wiwj&p1RzmW(VicF9ESw)hGC7>P}aa8(dZqtS&)zi ztjDl;g)G6zxj70W#1X7*52)cifg=~=FB8~T%_j@!Oi1K{bvqZ!KtpaH!M#ONUCc52 zZHf;_Zuv`}3UpeI81P4idA?X`4Op9a0jV=Jy)-{( znhAsA<-6@cY~zcYBbR0OOL3odh>D3$Q~_n%v&mdRfkUiusOQW6QQKno(_F09{MXUw z$Ws1gM$47AKTd}Axz2x2Ng6ec>MD9>@~^dofK)^$M5@G8Q&|RCpIcD^vO#Li5{6xG z-v|sjD7T?a^h1zjXbkHd=`t>1=rIc>3;=K~U9L?+%wT*Zwu|zts0=UA+o1@@sfv>Y zsF%3}FQBs09{QuDy_oBWn8(LnAM=}k=qKVg%OBJ`urpsda9do`68f7p5slkAmati_ z#f^?@Qn4A`qE^U#5yX+FOka{nfLyF!$B8V3gNh!5;R?}_OeW;PPnlBY?sP3a19RQ6$&e@11`0zSH`-GeYb>#BGXxx|4cS@SzJw>Cu^su&PKOV+ednd5s|*a z*#30eMoQ=$b33EDI76Ed2c6>wBSaI?d)1vES$}-U!E{taSHoVe&liF5yrJ%m#TYtI z?O&|nBf_nMDM?@_EFx}8enEln{{8z*`-s9RO9M;m6^Fot}UkpWhJs@Mov(jA{+ zyg=R*Yof;HE_wXmPFVd2EE7qz061}|H`kiSCnt&LZ`M%82VA40Jk{Vpg8Hbmgx>mz zfq}u^weDxR;_WgL^t%Tzdv}+3isFDtR;JY=RENI*&LMBZ^~M4@E@1!CC32ZIsW_+` z?12i#pl?-0?xoDC5DFG7BkWtGz$wTuZk{%4%bF3D27UL&8KwgSWN=%~mClIg8H8BJ zFc@w*x=*{EVeR6ZrM!`5;J*DiO%m;f%VX)@RZXFO9nZ@>j?0{HftE&A&*y4(Gi}YU zlD1=>YO}ai{)mEyjpH*>1E!Omgf+F8RN$&y{ zA4C3CkQbtT+;lq4Z2dqNNWYvp(}t?qw~Le4o+DF8qKQfG;Ek>OL2`xKs1ik}VOw5} znd`rM`;4UVgH_ekhRP2&0Lg@qA?3kA9}|e*+$nbH)knSsoPe3}iV~6xMzrw8UD$2` z6-$7~g94A%tcukE!@0^+aEeVh<8+fHTdKC!hrM=z{%1yeEKT?{HTWEgZ+%OYK3seR z4fvRML29W4NnNZTqnoY3qtm`I?u@`m-DL?q!|Kc6;xs?H0^aBb zvc@o#0yPI30oJtiIW3;l?C*@@MOoYL3dcI%PM)6~w6-t#eaCvQ)7DEf%CO!y4 z-#p$r=Twk!(EHR7*6YMbjY3g~8T-teuA)@iUqvoj$Yaconwyz9I9G3X1}#bnwpR3i zgEayOgJOrX^e=wJHzugNNz2GSLG-9=GcdNtTFJ@qzaA$wJv|L*l$iL{m>hsUyyUP= z-Oq~P52xIaK?WL&-WC*3!sOy&ViJmj7*7ES>gL*W?qKo`fRx0f>oN|E-H;85dY_L^ z$L1Xb+*|f1qX^$H|NQ;?M=&qR7|VZnU;Zr2In<$7Wdsb2V-aKn&YsTUo*tp?$O(3J zzShz4dHuQu(4$plw6&M&onB8($wtwiPcO4gZ|(0Td_Gya5(NGLA<}>Fj<5?Hd6!(? z^#mKotR;4hNqd?=B`=OGra9z;I%54>m?XFm2-o1ue9HOA*g5v4f+VIXIhY_@L@ZZ= zW2(*NG(iJTy0Fs|oANJNLR#hNzmLcr!GBl1Y)uK8B?>G=`A~`Apl#Tgw?9D-q7n}Y z`=!^eY8FmKrD;xM)BR70Mc2Ps}N-CSa2u<*K(X;N#Ip1-J{#;XKh776GD*` z5~|eO0I_^LC(PPzh{`li6~WnESZH<6O@tK%(#eCDWZl*VMSV3!-!f~yJvp(5`4eRQ zd`vQ0NVR}4U+QBkz~ji3veaKkguDz5(3a{<>>qUm_Y%gUOwevBWlM)rO1ghaii(L2 z^CXV&W86DQS+g`rZfol(GC%cQ`*hdQ{Lkf(Ky2C8WE{hIiz6m3KDigSp|$;@v9+Mk=~fWUBh<%84Mo)9QuTyv>#i1O|gSW&Rm8K zKB5z-&E4;+syRC!_#@pO^n*2YhvcF5dsEceU`~8`dm_IQLYfMXup7pEX*6YRgx}@jEpG1o~X_d-&3)JsUVb+V?Oo}D$?KoHY)mw zN`41oE87E&Fkg!IypGcu;<&F2P72nk?oI{pO_Wkk{!R! ziqA~Y&eJzMXz{kFT}fk`oz`tF^Mx27po0_mWHq6Dd%j9#hHGBpFgAp+FAxbw)}VLJ zZfsO_>lTPr=gW62c>q!H=7lR7^2bS>CC0n1Y2s{dbFYqL@xSTyPxqajJs!(Sj3dHJ z#ZK<3dAPE4kjxFfAi|!Wb#;o`71ljR2d==g;9duxz1G2Ph5W2GRyI5vrpM zh<@5>t9|!W1qouI^*h|#Yn_04`+mtUMewk(n*C`6Od&-@#co|9qHRek@(>{prm`1%v84*c7anfWv`{h7k6KxT1Fwp z3)^$vdazmCVzs;NH^#|iZ|iK4@`z`1DTPBsj88o@SwZco(00%It;B+F7*AOtzYS(` zBAC)bs3P}(c^=;naDkFYMt10)Xg@IhDF;>Shr5S^8CQPhtJ^xmPdj_*4Cf-T2$+*R zKi)gN&P8eP{T?s4yn@fmXywCuV+?|iy?lI7D?P2E3~kDreM>#{-_?25cJ4Fd+Xec$ zd-5zTMLac($N>w4CZlDXw8V)|t58Yx8H`t0j7Xl&csD&R&CjQw^T22KQ*#^B9=-eA z>Ot6Zin^k2f{5p+XP)mNdSgf$ee>iVpW~YcNh<`LjH44%Q-vNKIHeo_e&u$sIsHw$ zP4<)1Py@0Wpc&5Fnil5fA&w)k061O3WAZQSXxo|l=YpOjf)i6nJ9R#vFEr2q`fqq~ z(?mr_$G1P+?xlS8C*Q-SISTv&B{d|DXTKjkf~6T=wHse=zuTwrz0$PHX`Cl)(Ad=U z;Zfv1J^jjD9}D<#rD2!y%a~>GsC472;W@ErnI7bgj{4c5n3&*kseNtFC*o^0(gkBm zj(o(nvK?7e#1P{gx%GeYd%}>~F~lSe*p?$dKG$&yIQSNoHg9K={^!-!^@NSy^p~I7 zEg|HKaMG4-cB+j>Y-*SZ8tg4xwuKTc3sNz``GlEDn)CErC zXT>@?I=~7Y`td^m94Fl~GBOaHPcV_rhL?KgxW1tQ#CBlF_6LhXsC@)x+gzP=MTG~qx_$^PNh#A`0r1$n+jU%BFm^*52k$5gYFSKC#zkq0M z;)KVgpk_&;iz_uM;v@;1|ZR zdImEJYe4eg7)-0G+J&atb!+-`p#vQv@qlDe1=EW4=2}2|5hh@H66vPKwr6JNn=+!~ z+hh~o?$bSA?>~v^=jXmassmvZL_xV`Uzm+;8LeYZzCF{vkl&|+^(1J}SVM62T#(n+ z+Bj>j|M=_CkEp09jMxvJlLk-9eC@5RsSv-+AJYFR{A|T(VRqb8#L<$J2t|AL4$r5*HH^ph&WBSczE`6 z&3}NgC?zSGa|LSy^yv@+L4^#x${g4m!<0|J@A3jX5^^Agd+jqVh!!BmE#<+}dPKaC z>A!?p89=yQT3UjsGO_kBoXwx)-thc`1wdHxS1{&z@BlM$#2eNA3YcPzO-~_51g+eMKX-=U=j}Fn}o`$tJEy=;QUk|vNBW8_3up8uJ0TVmD|MR9R1tzbOp0$=T~1f_(nM;@1#WX;fgKIMCDL33tMt&s>jljgy6=t!R>qj&2#? z0p3i*>f+KW2&&p#TB2>ShT#E_^`1ZX1r!+gs(D!Cz^i7XzVi^c1yG3*A)Nv7d?+3yXOG?Uk39u*0TFDbs2RFq ze0-2eIzvv5Av4ypfB5y!Yl4s73g*UHXw+GJE?9JYE99E&Z>l?NGGGt z8>7_$^YAaW<(d1d722hrEg<*hX=Ct-MUcN;xyCrjq;7+@=?A-~UUF+6UL9v=ieCYc zkkc3_;k^893xJ>t@vi>c()kCx0!tkx6I^4<26Si-Emce!L45|1X|g>I$#TxNDvP%d zuo|1t_d{ZAM9)FNnq=`tc8nu_hzcM|>DMK8Gge?aNn1esOcb`8vZM|AS$V`OF8CK* zQWx0~0nU{VBp&x`0h$v+f=(T@MG720UFdNEz=qOTXRaIQXW@l@Fx~;Epx(Tnq)ylq zx+}#cY6-F=H*8$sr457mz66VD0>IL88$mxo9$EN=w64+QGu(G5xL8ZJkG_9$ScCzr z?QA146G{nEP3oWXp`V(`rI6B?u<`>(lHIBil$jw#-R64)%8ZOuJ1~BcObTZ&E5^*( z{URmnid=d!a%OJp)`px$V?uTkF6Vlp9DHza}gh!TkGBkeXrx<>&2iQ7Shz2%s zjz6QUz4#_qnU-f5S@u4DiVv)+>e-3$+L@hU@bw@*MhJv*l}O-V_!5Sn|AY0-w7;}^ zknL`qB`%~z{0{J2yZk%0_{f9%O$N23?Ms~6=oE3dw6*CAW;T}V>(y} z{@?MSO2R)JSTK=K8g)zfya?lGl~UZ*DJz`@`=#H9n-y~cahVBeT{X@SFxb59()s04 zt)K`fD5-Dxe?nu-*7MkX$bVEKBWfj9h)dQj?9Q^Z&SrM4m)pcMtFr~?DJGR@PS*;} zB6eR~jIxf{a@WY%?ZdJFj|-Yy^{-iMZaO}B{H{h-Yu&4wII-u7S5#TRAiBrTBfW)a zqO%_%mUehdOv*l1eT{+7?t-MMDlQsHy}iUKN~~^CpP4d5R7@ini?TlbvE8IV0tY=B ziw8(#cu`rO!bWwM3^ecYqgwOw8@x*~PUM~nPyL-lCZ|Tb-47s@H zay_!LzSlfP*vyJI>xe|y!Q>sL;@M~6iN z`XgtDtx^|U*-F&vcWIU#nOPtMtb>Gzb>mSk4Kuy^pDX9B3wk`JTU?23Zo#nq-_lo2 zZk=`_?8?h47l_cxKw5QuK(DwolALzoSx_fX=9)hk=BKGxe5NnJvuaG854FS)1LV95 zr9m$l_F*wDV6a@^+He>UQX(VeEiH@9uOK1KZVu?I5kbG0?LP5uI(++qtXB4PK8ZF2~DjO~4YHY;|O{^w_-iI8OYv zHug|9RMSFsAQBQH!dHbs*hdI>7wnZJc(PEMgYW>Et`;Ezmfojk$xQB0X;}5A8u9Tr z9h^-2wZ4Gnf?N-XxjT^O-2oFes;5cJ8gk!M7G|fZ1)t4gM|gW1Tm>ltV>cfIevAlq zLgi73K~sH+6-gJFGP>9yvI~{RFd4sdoFM^s84O#5F7=?!0R)QGEbU}@lKx3Xw-3o9 z+psP;T;w(YO-b8ofIyvd$^B&rH%~mL^d%xCmTvN9IWEzD8$G?LC+2c}xT#C0WXS4$ zcZzSff?Uj;pLt<;l@-h_b`Ct8W#p_ALgjnbCc=tSb51O5l1FMKq#?!7o%=Akl+)be zHCMk%c>bzhW7Bj|fM?E@pdg~W94d-|;@lm`fkjZRfiHvs?C79}p{AjMopl?W7LC7x z1!@O7$hKx@XA!j+7)8F1Sn08a<8o`H2y5yO6hnHzieC%*T*bd=fP(IDedf230M zEf{ytz%(3&l0Tm^iW`Z+O98i_Lmr6GBFh^v0R^{SEM`fVJ@$9^u|c^9{{3*9+DJg6Rz%c49kF1Zy3yB&Si?KbeSKogMs2tPsAD!)$uS$l0eu=J0-hMT$A@9b+$tmRH zQZA@~8S0Jn!}gQ6g;w)40fcM?31fK@xypJX6$=pbYn4GZL0WP1hbe=B*-5^!UhjFe zce@oYOTeWNTvwHwY`1eZ-7=e+zxB2bRhn90I03Mdu(2A8nYvRtS29llb`R<*Jb(Z>-HUVbn%ccUZmXCK`&|1Bv7~j*&rfN#ZDN58!usI z1tf)Ts^a;FHs3Lr5U$$Yy8i+?B+NR23hqK6fzy94_b@VZp~QW-c!KFIQF&C zqPY6afS~3L9-)DONc7R4X|`@KNCkAW)R7*|BaE18tiR1$DP z}E`a1KQAH+IVG2i(k!C7jv?BD}~`#{T=J%EeVRHDmRB z{x7Yg>gwvg_Y>(qeQE-R8`-L3Nr-I}_&5z?>FMcIPaeDPP^zV_$!t)tO5Pm4crx)2 z%<-Seu!vhwrVxiR6B8bhJ|9a4`2m`pI0GinUd9QgPv!+Vm{z zlLZTH7dkpRt67H!i^EYC^>Htp)go9PJoxsxj5r=z^c5m!Ek%g!(fgkH#$FK825f}L zCb|Dm2>)Rl)+xxrh-9Dz?$!KF4Q2rnBleM#Q*IJ(_CFvtkqUs{Wq7V$1Z*q0~Fii9)`y*w6dxT zL_xH&3AA)EqB05p{pEkg-B7Fo?x!@|%qg1p@83H*I?91C2f}h>hG$Kr;U-&QF#*Nh z)%6JM&=5j*045Rt3mfq_@Oo3(27Unti(2;T8Zwn^LO!)LTi7^4u9$F1d=w6kN<9fa z719Bphz<)!kRiS$H#sp8z_%2cVd3z9{ei}N(;fh|C8wgV6-M;k!ab z*KeOAG)hyt&)i%U@d@-k+SzFLWW2iw#SnuJlPps&Q3WT>^3+#MHC0eS%-0b&rb zzr^9)Zrn!^yWly4QHQ;-lp|=-*6$xrT2MTYP?^iq1{O6)mJy646)FNCE5m%nk#<74#1NVPigB|&6v`m0B{(cO}4S4TFYG3#!K z^?y{TrpQ+SqjnW$%%;n;Ul5@nd$rEDnwglKe0Z`LEA1x-?LF^LP}7iBQq4YmKJ5Y7YxLujw6h zw#7Sp3ZieLuJlB_>tV_?j5FnT^=C2JzUh!~QT9hDWfjcCc2-{zWrB^(Fr_iVU56pd z-T2G_<_RP4)&Q063hoAs67uT480i4!ro_*spYioU!&}$Qsp{m3RF#=36Y2A#&8x#o zzabxEvuq)susCn|k6{xd3W8rLV4RUV@+1wY2&-vWLMN0K z9gd)wNwdeeyL%4GM>AU4SRnT?@WhbvY=NuBN+Qrt5@*8o?nSWjv3QYr?|gwfWcFer z(nB)NgmJ6+{COeXhlhRQ-#p+O*_sY;8;*aC$I5n0aE9ndmQ~b8{FFGi0a?$0(7CNT zyUTm0wNt_Ou4A2}j~$1$ALlZT;Y833_B|m*a~H`bVUSIz9!D6F4+!onFgleOGCg$i zvnqmNyE9*w_nxfW0HAuR4yx~9(~ZkbPc}ttK2^lG4p12~MgH&u=b{ZuII~mC`{s8D zB|WHH%{m97{9?)B5IjbawTBG=rIQniwXx`W@ikUd`9kF z(GoHO10km3cS>@Um&=!8I0bxF^ZAL2x!mm*sK;qIWZ}g42k@@YY(T_3jnCZ#d89V*gf+#n0+%zh@KODU3oXSvM5 zIsXn!1x^w6K(N#k#MeZZ_eI0rfX=-Hld2NKB}vZm_PrO^))%t8w$_L8Zrdj{-{lB- z%MH6oRGveE{x3eKmAFYFGg4wK5U;`v#)vX*o$)CyG<1{2No9w&{Ovz=V;Hl&H02|XG*EN z`N>m!o#uZh5t6G4ziN7b?`Cv(**FjengTz0M7ZKw$jDzGm?a-yN z7W!M_TG%2*Ly+F+#7ipA-&I{i)Kg?`GcH;aFD1V4z1SRXc;S(2C-&$QY@k-Lqu?4Y zcZahw6GJCPp*8+TjZGIaY~y~7cf(`CYCv%lmG|0vug5zGo@TmPEAnRHyR70z;7h_d zR+^jL)(YoxuKIVgkC3_c(wEXl`1@cB8di@x8=atOz!Ayy@MtW-9gz%wSPFD)-GWO< z3A8=JOPzyk8L-4k64hFt#Z0RC}bXdmH^v|GKbm&Cm|L8&2;=AB~=;c z+G)qHU@AaytYGF zHFiHzzLI4z-JKHE515u-^zLRbO0UJFy17fUm?mhN#h9!LXV4c0w63UC)keC>Lg3Ig zYMrnR#n2KL^gl4S-NJj;t|*Iob;r<-?Z&$JwQILZ5t)K=!oNYnBg<=XV_%l<2F~Nf zQ{RRUzamAfu*AB#&>?KgA7A}5s zFp*$K^aHy|QE*oxS7w5qc8s^|q1}`-oI-Vadh^~3c;?m`<+?6z+XyRL)h)Z)87bqw z{q&i6qY$vAGS0xMSO}6*;7a447B0Xn{KtUo;ICEh%NRr5*9EwEWnfN zU}P;s@>Zh2{8F=Yg)){r``?Y=$w2@FQ2c2{XH&keW*ovVL>A21K~1nqprtRm>W_Tm z*7Kw@0)Zc0Ou_XnFolPDBF~^`Q8bk5t>L?8*W<&DU(e*V{&YJ96;)2bV55hV?)9Z0 zf$he`KsCP+>uw)(L!l!DwyJykyw>IE8x9z`&Q8rlt`K?(XrzmFGNbgax1Y>l1Lk!h-uq)XUoC0~6CE8Hj z{5}5s-&;Obb{xjeoofjNwS*=LAIkM=IXR)0#%!W2y!jy}kv0=3P>K0>bLs8MpacuP z))~eP+l13I&BUFN>}%vNSnFLkds`ty)h%D*mU!*z2k}_6D=EzqLQQki9O>^Bdjg2! z{R*j=ZC&`?Ag~+WnFB$Qn5TPaAjjJtR6g9l!f;AsZUVxM`h+u9aq{GE z;4#qNRZ;z*Fa$E#PbVm&CBNMd$F#b5ST+^65?=2kDz?goEq-P%v}vHrNR%vz7&0=a zK~~wG?kE$Z-0KVQwXkXl>T1TZg0u5$D)~Vu-JzNsptVE@uB2<+S#VLrDF!Ty0_7a1--O!nMw^a8;~e7;UKY zK7P-k^#MerDy1|J-FJSz^8xyi$HX`ny@@BSnbw@GJI6?Hj)o%vS?R zA>D!`$3#4ag#Fny3xc@`sp97K!dI=S?Urxg!A1tdpo^2o^70)AMamuUV+!9`P=_J`$ zjQWN_hDt)Rdzb6d)ftu7H|KI##qxHrG&=rMG&yO`C5*)`h1;2remMzSR!|aYoG}pJ zR*;qsj#2KsWt^IsnHiPbATAK5sdQ%Y=Z2=^&W`&*06Nz2N!#ixF8b#!rGVGX;oGxCm+NP0;bsJ4oA07_|Qyq zpki*WnvW%Qa7A=s5t^+6VpQk^>rF3I5e@6? 📚 **Obsidian API Reference**: This guide references the [Obsidian API](https://docs.obsidian.md/Home). Familiarize yourself with the [App](https://docs.obsidian.md/Reference/TypeScript+API/App), [Vault](https://docs.obsidian.md/Reference/TypeScript+API/Vault), and [Workspace](https://docs.obsidian.md/Reference/TypeScript+API/Workspace) modules for advanced scripting. +> **Obsidian API Reference**: This guide references the [Obsidian API](https://docs.obsidian.md/Home). Familiarize yourself with the [App](https://docs.obsidian.md/Reference/TypeScript+API/App), [Vault](https://docs.obsidian.md/Reference/TypeScript+API/Vault), and [Workspace](https://docs.obsidian.md/Reference/TypeScript+API/Workspace) modules for advanced scripting. ## Basic Structure diff --git a/docs/versioned_docs/version-2.12.0/index.md b/docs/versioned_docs/version-2.12.0/index.md index 96a53583..40707675 100644 --- a/docs/versioned_docs/version-2.12.0/index.md +++ b/docs/versioned_docs/version-2.12.0/index.md @@ -3,53 +3,65 @@ sidebar_position: 1 title: Getting Started --- -## Installation +QuickAdd adds one fast command for repeatable Obsidian workflows. Use it to +create notes from templates, capture text into existing notes, run scripts, or +organize several choices behind one menu. -**This plugin is in the community plugin browser in Obsidian**. You can search for it and install it there . +## Install QuickAdd -You can also do a [manual installation](./ManualInstallation). +Install QuickAdd from Obsidian's Community Plugins browser, then enable it. -## First steps +If you cannot use the plugin browser, follow the +[manual installation guide](./ManualInstallation). -The first thing you'll want to do is add a new choice. A choice can be one of four types. +## Choose the right choice type -- [Template Choice](./Choices/TemplateChoice) - Insert templates into your vault. Works together with Obsidian template syntax and popular _Templater_ plugin, augmenting them and adding more options. -- [Capture Choice](./Choices/CaptureChoice) - Quick capture your manually written information and save it. Daily notes, work log, to-read-and-watch-later list, etc. -- [Macro Choice](./Choices/MacroChoice) - Macros to augment your workflow. Use the full power of Javascript programming language and Obsidian functions to do anything your want. E.g. [create a personal movie database](./Examples/Macro_MovieAndSeriesScript) by writing a movie name and getting the movie notes fully customized and filled with correct film's up-to-date data. -- [Multi Choice](./Choices/MultiChoice) - Folders to better organize the previous 3 choices. Usability feature, not a new functionality. -- [Share QuickAdd Packages](./Choices/Packages) - Bundle choices and scripts into a portable `.quickadd.json` file so you can reuse automations across vaults. +| If you want to... | Use this | Start here | +| --- | --- | --- | +| Create a new note from a reusable file | Template choice | [Template Choices](./Choices/TemplateChoice) | +| Append text to a journal, log, task list, or existing file | Capture choice | [Capture Choices](./Choices/CaptureChoice) | +| Run one or more Obsidian commands, scripts, or choices | Macro choice | [Macro Choices](./Choices/MacroChoice) | +| Group choices into a nested menu | Multi choice | [Multi Choices](./Choices/MultiChoice) | +| Share configured workflows across vaults | Package | [Share QuickAdd Packages](./Choices/Packages) | -In your choices, you can use [format syntax](./FormatSyntax), which is similar to the Obsidian template syntax. +Most workflows start with either a Template choice or a Capture choice. Add a +Macro choice when you need scripting, multiple steps, or data from another +plugin or API. -You could, for example, use `{{DATE}}` to get the current date. +## First workflow -QuickAdd also features a powerful [suggester system](./SuggesterSystem) that provides intelligent, fuzzy-search suggestions for files, tags, headings, and more. +1. Create a Template choice or Capture choice in QuickAdd settings. +2. Add a name you will recognize in the command palette. +3. Configure the target file, folder, template, or capture format. +4. Run `QuickAdd: Run QuickAdd` from the command palette. +5. Assign a hotkey once the workflow behaves the way you want. -## I want to... +QuickAdd choices can use [format syntax](./FormatSyntax), including values like +`{{DATE}}`, `{{VALUE}}`, and `{{FIELD:status}}`. The +[suggester system](./SuggesterSystem) provides fuzzy search for files, tags, +headings, and fields. -### Be inspired +## Common paths -Take a look at some examples... +### I want examples first -- [Capture: Add Journal Entry](docs/Examples/Capture_AddJournalEntry.md) -- [Macro: Log book to daily journal](docs/Examples/Macro_LogBookToDailyJournal.md) -- [Template: Add an Inbox Item](docs/Examples/Template_AddAnInboxItem.md) -- [Macro: Move all notes with a tag to a certain folder](docs/Examples/Macro_MoveNotesWithATagToAFolder.md) -- [Template: Automatically create a new book note with notes & highlights from Readwise](docs/Examples/Template_AutomaticBookNotesFromReadwise.md) -- [Capture: Add a task to a Kanban board](docs/Examples/Capture_AddTaskToKanbanBoard.md) -- [Macro: Easily change properties in your daily note (requires MetaEdit)](docs/Examples/Macro_ChangePropertyInDailyNotes.md) -- [Capture: Fetch tasks from Todoist and capture to a file](docs/Examples/Capture_FetchTasksFromTodoist.md) -- [Macro: Zettelizer - easily create new notes from headings while keeping the contents in the file](docs/Examples/Macro_Zettelizer.md) -- [Macro: Obsidian Map View plugin helper - insert location from address](docs/Examples/Macro_AddLocationLongLatFromAddress.md) -- [Macro: Toggl Manager - set preset Toggl Track time entries and start them from Obsidian](docs/Examples/Macro_TogglManager.md) -- [How I Read Research Papers with Obsidian and Zotero](https://bagerbach.com/blog/how-i-read-research-papers-with-obsidian-and-zotero/) -- [How I Import Literature Notes into Obsidian](https://bagerbach.com/blog/importing-source-notes-to-obsidian) -- [Macro: Fetching movies and TV shows into your vault](docs/Examples/Macro_MovieAndSeriesScript.md) +Use the [examples overview](./Examples/) to pick a complete workflow by choice +type, difficulty, prerequisites, and outcome. -### Create powerful scripts and macros to automate my workflow +Good first examples: -Take a look at the [QuickAdd API](docs/QuickAddAPI.md), [format syntax](docs/FormatSyntax.md), [inline scripts](docs/InlineScripts.md), and [macros](docs/Choices/MacroChoice.md). +- [Capture: Add Journal Entry](./Examples/Capture_AddJournalEntry) +- [Template: Add an Inbox Item](./Examples/Template_AddAnInboxItem) +- [Macro: Book Finder](./Examples/Macro_BookFinder) +- [Capture: Canvas Capture](./Examples/Capture_CanvasCapture) -### Use QuickAdd even when Obsidian is minimized / in the background +### I want to automate with scripts -You got it. Take a look at [this AutoHotKey script](./Misc/AHK_OpenQuickAddFromDesktop). +Start with the [scripting overview](./Advanced/ScriptingGuide), then move to +[User Scripts](./UserScripts) and the [QuickAdd API reference](./QuickAddAPI) +when you need exact method details. + +### I want to call QuickAdd from outside Obsidian + +Use [Obsidian URI](./Advanced/ObsidianUri) for URI-triggered workflows, or the +[QuickAdd CLI](./Advanced/CLI) for shell scripts and external automation. diff --git a/docs/versioned_sidebars/version-2.12.0-sidebars.json b/docs/versioned_sidebars/version-2.12.0-sidebars.json index 59e494ac..7c194dfb 100644 --- a/docs/versioned_sidebars/version-2.12.0-sidebars.json +++ b/docs/versioned_sidebars/version-2.12.0-sidebars.json @@ -3,97 +3,104 @@ { "type": "doc", "id": "index", - "label": "🏠 Getting Started" + "label": "Getting Started" }, { "type": "category", - "label": "📚 Core Concepts", + "label": "Core Concepts", "collapsed": false, "items": [ { "type": "doc", "id": "Choices/TemplateChoice", - "label": "📄 Template Choices" + "label": "Template Choices" }, { "type": "doc", "id": "Choices/CaptureChoice", - "label": "⚡ Capture Choices" + "label": "Capture Choices" }, { "type": "doc", "id": "Choices/MacroChoice", - "label": "🤖 Macro Choices" + "label": "Macro Choices" }, { "type": "doc", "id": "Choices/MultiChoice", - "label": "📁 Multi Choices" + "label": "Multi Choices" }, { "type": "doc", "id": "Choices/Packages", - "label": "đŸ“Ļ Share QuickAdd Packages" + "label": "Share QuickAdd Packages" } ] }, { "type": "category", - "label": "🔧 Features", + "label": "Features", "items": [ { "type": "doc", "id": "FormatSyntax", - "label": "📝 Format Syntax" + "label": "Format Syntax" }, { "type": "doc", "id": "GlobalVariables", - "label": "🌐 Global Variables" + "label": "Global Variables" }, { "type": "doc", "id": "InlineScripts", - "label": "đŸ’ģ Inline Scripts" + "label": "Inline Scripts" }, { "type": "doc", "id": "AIAssistant", - "label": "🧠 AI Assistant" + "label": "AI Assistant" }, { "type": "doc", "id": "TemplatePropertyTypes", - "label": "📋 Template Property Types (Beta)" + "label": "Template Property Types (Beta)" } ] }, { "type": "category", - "label": "💡 Examples", + "label": "Examples", "collapsed": true, "items": [ + { + "type": "doc", + "id": "Examples/index", + "label": "Examples Overview" + }, { "type": "category", - "label": "📝 Capture Examples", + "label": "Capture Examples", "items": [ "Examples/Capture_AddJournalEntry", "Examples/Capture_AddTaskToKanbanBoard", "Examples/Capture_FetchTasksFromTodoist", - "Examples/Capture_InsertBaseTemplateIntoActiveFile" + "Examples/Capture_InsertBaseTemplateIntoActiveFile", + "Examples/Capture_CanvasCapture" ] }, { "type": "category", - "label": "📄 Template Examples", + "label": "Template Examples", "items": [ "Examples/Template_AddAnInboxItem", + "Examples/Template_CreateMOCNoteWithLinkDashboard", "Examples/Template_AutomaticBookNotesFromReadwise" ] }, { "type": "category", - "label": "🤖 Macro Examples", + "label": "Macro Examples", "items": [ "Examples/Macro_BookFinder", "Examples/Macro_MovieAndSeriesScript", @@ -110,45 +117,55 @@ }, { "type": "category", - "label": "🚀 Advanced", + "label": "Advanced", "collapsed": true, "items": [ + { + "type": "doc", + "id": "Advanced/APIOverview", + "label": "API Overview" + }, { "type": "doc", "id": "QuickAddAPI", - "label": "📖 QuickAdd API" + "label": "QuickAdd API Reference" + }, + { + "type": "doc", + "id": "Advanced/ScriptingGuide", + "label": "Scripting Overview" }, { "type": "doc", "id": "UserScripts", - "label": "📜 User Scripts" + "label": "User Scripts Reference" }, { "type": "doc", "id": "Advanced/scriptsWithSettings", - "label": "âš™ī¸ Scripts with Settings" + "label": "Scripts with Settings" }, { "type": "doc", "id": "Advanced/onePageInputs", - "label": "🧩 One-page Inputs" + "label": "One-page Inputs" }, { "type": "doc", "id": "Advanced/ObsidianUri", - "label": "🔗 Obsidian URI" + "label": "Obsidian URI" } ] }, { "type": "category", - "label": "â„šī¸ Other", + "label": "Other", "collapsed": true, "items": [ { "type": "doc", "id": "ManualInstallation", - "label": "💾 Manual Installation" + "label": "Manual Installation" }, { "type": "autogenerated", From 805224f0204e9341ddacf0843e6098e9c980dce9 Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Fri, 24 Apr 2026 07:24:02 +0200 Subject: [PATCH 2/5] codex: address PR review feedback (#1172) --- docs/docusaurus.config.js | 9 ++-- .../components/VersionAwareDocNavbarItem.tsx | 42 +++++++++++++++++++ docs/src/theme/NavbarItem/ComponentTypes.tsx | 7 ++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 docs/src/components/VersionAwareDocNavbarItem.tsx create mode 100644 docs/src/theme/NavbarItem/ComponentTypes.tsx diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index cfe94a19..f3d1cd2d 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -88,19 +88,22 @@ const config = { dropdownActiveClassDisabled: true, }, { - to: '/docs/', + type: 'custom-versionAwareDoc', + docId: 'index', position: 'left', label: 'Docs', activeBaseRegex: '^/docs/(next/|[0-9.]+/)?$', }, { - to: '/docs/Advanced/APIOverview', + type: 'custom-versionAwareDoc', + docId: 'QuickAddAPI', position: 'left', label: 'API', activeBaseRegex: '^/docs/(next/|[0-9.]+/)?(Advanced/APIOverview|QuickAddAPI)/?$', }, { - to: '/docs/Examples/', + type: 'custom-versionAwareDoc', + docId: 'Examples/Macro_BookFinder', position: 'left', label: 'Examples', activeBaseRegex: '^/docs/(next/|[0-9.]+/)?Examples/', diff --git a/docs/src/components/VersionAwareDocNavbarItem.tsx b/docs/src/components/VersionAwareDocNavbarItem.tsx new file mode 100644 index 00000000..80f27c96 --- /dev/null +++ b/docs/src/components/VersionAwareDocNavbarItem.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import {useLocation} from '@docusaurus/router'; +import {useLayoutDoc} from '@docusaurus/plugin-content-docs/client'; +import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; + +type Props = { + activeBaseRegex?: string; + docId: string; + docsPluginId?: string; + label?: string; + mobile?: boolean; + position?: 'left' | 'right'; +}; + +export default function VersionAwareDocNavbarItem({ + activeBaseRegex, + docId, + docsPluginId, + label, + ...props +}: Props): React.JSX.Element | null { + const location = useLocation(); + const doc = useLayoutDoc(docId, docsPluginId); + + if (doc === null) { + return null; + } + + return ( + + activeBaseRegex + ? new RegExp(activeBaseRegex).test(location.pathname) + : location.pathname === doc.path + } + label={label ?? doc.id} + to={doc.path} + /> + ); +} diff --git a/docs/src/theme/NavbarItem/ComponentTypes.tsx b/docs/src/theme/NavbarItem/ComponentTypes.tsx new file mode 100644 index 00000000..980297ca --- /dev/null +++ b/docs/src/theme/NavbarItem/ComponentTypes.tsx @@ -0,0 +1,7 @@ +import ComponentTypes from '@theme-original/NavbarItem/ComponentTypes'; +import VersionAwareDocNavbarItem from '../../components/VersionAwareDocNavbarItem'; + +export default { + ...ComponentTypes, + 'custom-versionAwareDoc': VersionAwareDocNavbarItem, +}; From a1712f792ca77e92b0550650aa45ada69d34e775 Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Fri, 24 Apr 2026 07:29:31 +0200 Subject: [PATCH 3/5] codex: address PR review feedback (#1172) --- docs/src/pages/index.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index f172db58..d3dadfc8 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -184,7 +184,7 @@ margin-top: 0.45rem; } -.previewChoice:first-of-type, +.previewChoice:nth-child(2), .previewResult:first-child { background: var(--qa-accent-soft); border-color: var(--qa-line-strong); From fa370bf23f04ff9220c0b3fb90a21a904c12890a Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Fri, 24 Apr 2026 07:35:59 +0200 Subject: [PATCH 4/5] codex: address PR review feedback (#1172) --- docs/docusaurus.config.js | 2 +- docs/src/pages/index.module.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index f3d1cd2d..3bc6d1d2 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -92,7 +92,7 @@ const config = { docId: 'index', position: 'left', label: 'Docs', - activeBaseRegex: '^/docs/(next/|[0-9.]+/)?$', + activeBaseRegex: '^/docs/(next/|[0-9.]+/)?(?!(Advanced/APIOverview|QuickAddAPI|Examples/)).*', }, { type: 'custom-versionAwareDoc', diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index d3dadfc8..f1779de5 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -152,6 +152,7 @@ } .previewSidebar { + background: var(--qa-canvas); background: color-mix(in srgb, var(--qa-canvas) 72%, var(--qa-canvas-raised)); } From d541ede3a6a62dfaf2df64c9b8388c58da785622 Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Fri, 24 Apr 2026 07:40:00 +0200 Subject: [PATCH 5/5] codex: fix CI failure on PR #1172 --- .../components/VersionAwareDocNavbarItem.tsx | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/src/components/VersionAwareDocNavbarItem.tsx b/docs/src/components/VersionAwareDocNavbarItem.tsx index 80f27c96..c8777ea3 100644 --- a/docs/src/components/VersionAwareDocNavbarItem.tsx +++ b/docs/src/components/VersionAwareDocNavbarItem.tsx @@ -1,6 +1,5 @@ import React from 'react'; import {useLocation} from '@docusaurus/router'; -import {useLayoutDoc} from '@docusaurus/plugin-content-docs/client'; import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; type Props = { @@ -15,16 +14,11 @@ type Props = { export default function VersionAwareDocNavbarItem({ activeBaseRegex, docId, - docsPluginId, label, ...props }: Props): React.JSX.Element | null { const location = useLocation(); - const doc = useLayoutDoc(docId, docsPluginId); - - if (doc === null) { - return null; - } + const path = getVersionedDocPath(location.pathname, docId); return ( activeBaseRegex ? new RegExp(activeBaseRegex).test(location.pathname) - : location.pathname === doc.path + : location.pathname === path } - label={label ?? doc.id} - to={doc.path} + label={label ?? docId} + to={path} /> ); } + +function getVersionedDocPath(pathname: string, docId: string): string { + const versionMatch = pathname.match(/^\/docs\/(next|[0-9.]+)(?=\/|$)/); + const docsBase = versionMatch ? `/docs/${versionMatch[1]}` : '/docs'; + + if (docId === 'index') { + return `${docsBase}/`; + } + + return `${docsBase}/${docId}`; +}