From a18cbaf8978eefe9b56bb2b49c62dbe1e023baec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=A4=A9=E6=B5=A9?=
Date: Thu, 14 May 2026 15:36:26 +0800
Subject: [PATCH] vault backup: 2026-05-14 15:36:26
---
.obsidian/app.json | 4 +-
.obsidian/community-plugins.json | 13 +-
.obsidian/graph.json | 22 +
.obsidian/plugins/export-graph-view/main.js | 22 +
.../plugins/export-graph-view/manifest.json | 11 +
.../plugins/export-graph-view/styles.css | 119 +
.obsidian/plugins/mermaid-tools/data.json | 792 +++++
.obsidian/plugins/mermaid-tools/main.js | 2633 +++++++++++++++++
.obsidian/plugins/mermaid-tools/manifest.json | 11 +
.obsidian/plugins/mermaid-tools/styles.css | 149 +
.obsidian/workspace.json | 34 +-
README.md | 67 +
动画.gif | Bin 0 -> 693404 bytes
未命名.canvas | 8 +
14 files changed, 3869 insertions(+), 16 deletions(-)
create mode 100644 .obsidian/graph.json
create mode 100644 .obsidian/plugins/export-graph-view/main.js
create mode 100644 .obsidian/plugins/export-graph-view/manifest.json
create mode 100644 .obsidian/plugins/export-graph-view/styles.css
create mode 100644 .obsidian/plugins/mermaid-tools/data.json
create mode 100644 .obsidian/plugins/mermaid-tools/main.js
create mode 100644 .obsidian/plugins/mermaid-tools/manifest.json
create mode 100644 .obsidian/plugins/mermaid-tools/styles.css
create mode 100644 README.md
create mode 100644 动画.gif
create mode 100644 未命名.canvas
diff --git a/.obsidian/app.json b/.obsidian/app.json
index 9e26dfe..76fcd24 100644
--- a/.obsidian/app.json
+++ b/.obsidian/app.json
@@ -1 +1,3 @@
-{}
\ No newline at end of file
+{
+ "showLineNumber": false
+}
\ No newline at end of file
diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json
index 574a981..e4494a1 100644
--- a/.obsidian/community-plugins.json
+++ b/.obsidian/community-plugins.json
@@ -1,11 +1,10 @@
[
+ "export-graph-view",
+ "mermaid-tools",
"obsidian-git",
- "obsidian-tasks-plugin",
- "pdf-plus",
-<<<<<<< HEAD
- "advanced-canvas",
"obsidian-plantuml",
-=======
->>>>>>> origin/main
- "tasks-calendar-wrapper"
+ "pdf-plus",
+ "obsidian-tasks-plugin",
+ "tasks-calendar-wrapper",
+ "advanced-canvas"
]
\ No newline at end of file
diff --git a/.obsidian/graph.json b/.obsidian/graph.json
new file mode 100644
index 0000000..e21a18d
--- /dev/null
+++ b/.obsidian/graph.json
@@ -0,0 +1,22 @@
+{
+ "collapse-filter": true,
+ "search": "",
+ "showTags": false,
+ "showAttachments": false,
+ "hideUnresolved": false,
+ "showOrphans": true,
+ "collapse-color-groups": true,
+ "colorGroups": [],
+ "collapse-display": true,
+ "showArrow": false,
+ "textFadeMultiplier": 0,
+ "nodeSizeMultiplier": 1,
+ "lineSizeMultiplier": 1,
+ "collapse-forces": true,
+ "centerStrength": 0.518713248970312,
+ "repelStrength": 10,
+ "linkStrength": 1,
+ "linkDistance": 250,
+ "scale": 1,
+ "close": false
+}
\ No newline at end of file
diff --git a/.obsidian/plugins/export-graph-view/main.js b/.obsidian/plugins/export-graph-view/main.js
new file mode 100644
index 0000000..3e63080
--- /dev/null
+++ b/.obsidian/plugins/export-graph-view/main.js
@@ -0,0 +1,22 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
+if you want to view the source, please visit the github repository of this plugin
+*/
+
+var v=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var F=(c,t)=>{for(var i in t)v(c,i,{get:t[i],enumerable:!0})},O=(c,t,i,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of k(t))!C.call(c,s)&&s!==i&&v(c,s,{get:()=>t[s],enumerable:!(e=E(t,s))||e.enumerable});return c};var A=c=>O(v({},"__esModule",{value:!0}),c);var L={};F(L,{default:()=>b});module.exports=A(L);var M={exportFormat:"mmd",includeOrphans:!1,includeAttachments:!1,lastExported:"",includeWeights:!1,relationshipStrategy:"tags",weightThreshold:1,subgraphs:!1,direction:"TD",maxEPerV:10,enableAutoBridge:!0,manualBackoff:!1,maxNodes:40,maxRelationships:60,maxTags:10};var h=require("obsidian"),N=class extends h.PluginSettingTab{constructor(t,i){super(t,i),this.plugin=i}display(){let{containerEl:t}=this;t.empty(),this.plugin.settings.viewMode?this.plugin.settings.viewMode==="singleGraph"?this.singleGraph(t):this.plugin.settings.viewMode==="fullGraph"&&this.fullGraph(t):this.singleOrFull(t)}singleOrFull(t){let i=t.createDiv({cls:"egv-choice-container"});i.createEl("h2",{text:"Change default settings",cls:"egv-choice-header"}),i.createEl("p",{text:"Select the focus you want to tweak settings on",cls:"egv-choice-description"});let e=i.createDiv({cls:"egv-cards-container"}),s=e.createDiv({cls:"egv-choice-card"});s.createDiv({cls:"egv-card-icon single-parent-icon"}),s.createEl("h3",{text:"Single-parent focus"}),s.createEl("p",{text:"Snapshot relationships from a single tag or note"});let n=new h.ButtonComponent(s.createDiv({cls:"egv-card-button-container"})).setButtonText("Change settings").setCta().onClick(async()=>{this.plugin.settings.viewMode="singleGraph",await this.plugin.saveSettings(),this.display()}),a=e.createDiv({cls:"egv-choice-card"});a.createDiv({cls:"egv-card-icon full-graph-icon"}),a.createEl("h3",{text:"Full vault focus"}),a.createEl("p",{text:"Snapshot your vault from a wider angle"});let o=new h.ButtonComponent(a.createDiv({cls:"egv-card-button-container"})).setButtonText("Change settings").setCta().onClick(async()=>{this.plugin.settings.viewMode="fullGraph",await this.plugin.saveSettings(),this.display()})}singleGraph(t){let i=t.createDiv({cls:"single-div"});new h.ButtonComponent(i).setIcon("arrow-left").setTooltip("Back to main choices").onClick(async()=>{this.plugin.settings.viewMode=void 0,await this.plugin.saveSettings(),this.display()}),i.createEl("h2",{text:"Single parent graph settings"});let e=t.createDiv({cls:"sg-div"});new h.Setting(e).setName("Parent node type").setDesc("Set your graph to draw from either your chosen tag or chosen note").addDropdown(s=>s.addOption("singleTag","Tag").addOption("singleNote","Note").setValue(this.plugin.settings.relationshipStrategy||"singleTag").onChange(async n=>{this.plugin.settings.relationshipStrategy=n,await this.plugin.saveSettings(),this.display()})),this.plugin.settings.relationshipStrategy==="singleTag"?new h.Setting(e).setName("Parent tag").setDesc("Enter the tag to use as your graph parent (without #)").addText(s=>s.setPlaceholder("Enter tag").setValue(this.plugin.settings.rootTag||"").onChange(async n=>{this.plugin.settings.rootTag=n,await this.plugin.saveSettings()})):this.plugin.settings.relationshipStrategy==="singleNote"&&new h.Setting(e).setName("Parent note").setDesc("Enter the title of the note to use as your graph parent").addText(s=>s.setPlaceholder("Enter note title").setValue(this.plugin.settings.rootNote||"").onChange(async n=>{this.plugin.settings.rootNote=n,await this.plugin.saveSettings()})),this.displayFormatSettings(t)}fullGraph(t){let i=t.createDiv({cls:"fgh"});new h.ButtonComponent(i).setIcon("arrow-left").setTooltip("Back to main choices").onClick(async()=>{this.plugin.settings.viewMode=void 0,await this.plugin.saveSettings(),this.display()}),i.createEl("h2",{text:"Full graph settings"});let e=t.createDiv({cls:"full-div"});new h.Setting(e).setName("Relationship between notes").setDesc("Choose how your notes are organised").addDropdown(s=>s.addOption("tags","by tags").addOption("internalLinks","by internal links").addOption("folders","by folders").setValue(this.plugin.settings.relationshipStrategy||"tags").onChange(async n=>{this.plugin.settings.relationshipStrategy=n,await this.plugin.saveSettings(),this.display()})),new h.Setting(e).setName("Include orphan notes").setDesc("Whether to include notes with no relationship to other notes by default").addToggle(s=>s.setValue(this.plugin.settings.includeOrphans).onChange(async n=>{this.plugin.settings.includeOrphans=n,await this.plugin.saveSettings()})),this.displayFormatSettings(t)}displayFormatSettings(t){let i=t.createDiv({cls:"formset-div"});i.createEl("h3",{text:"Export format settings"}),new h.Setting(i).setName("Export format").setDesc("Choose either a .mmd (Mermaid) or .dot (Graphviz) file").addDropdown(e=>e.addOption("mmd",".mmd").addOption("dot",".dot").setValue(this.plugin.settings.exportFormat).onChange(async s=>{this.plugin.settings.exportFormat=s,await this.plugin.saveSettings(),this.display()})),new h.Setting(i).setName("Include attachments").setDesc("Whether to include any non-markdown files by default").addToggle(e=>e.setValue(this.plugin.settings.includeAttachments).onChange(async s=>{this.plugin.settings.includeAttachments=s,await this.plugin.saveSettings()})),new h.Setting(i).setName("Include relationship weights").setDesc("Store relationship importance metadata in the exported file").addToggle(e=>e.setValue(this.plugin.settings.includeWeights).onChange(async s=>{this.plugin.settings.includeWeights=s,await this.plugin.saveSettings()})),this.plugin.settings.exportFormat==="dot"?this.displayDotSettings(i):this.plugin.settings.exportFormat==="mmd"&&this.displayMermaidSettings(i)}displayDotSettings(t){let i=t.createDiv({cls:"dotsetdiv"});i.createEl("h4",{text:"DOT format settings"}),new h.Setting(i).setName("Weight threshold").setDesc("Only include important relationships above a minimum score").addSlider(e=>e.setLimits(0,10,1).setValue(this.plugin.settings.weightThreshold||0).setDynamicTooltip().onChange(async s=>{this.plugin.settings.weightThreshold=s,await this.plugin.saveSettings()})),new h.Setting(i).setName("Subgraph clustering").setDesc("Whether to cluster notes by their common tag or folder").addToggle(e=>e.setValue(this.plugin.settings.subgraphs||!1).onChange(async s=>{this.plugin.settings.subgraphs=s,await this.plugin.saveSettings()}))}displayMermaidSettings(t){let i=t.createDiv({cls:"mmdsetdiv"});i.createEl("h4",{text:"Mermaid settings"}),new h.Setting(i).setName("Direction").setDesc("Mermaid layout").addDropdown(e=>e.addOption("TD","Top down").addOption("LR","Left right").addOption("RL","Right left").addOption("BT","Bottom top").setValue(this.plugin.settings.direction||"TD").onChange(async s=>{this.plugin.settings.direction=s,await this.plugin.saveSettings()})),new h.Setting(i).setName("Max relationships per node").setDesc("Optionally limit the number of relationships to render on elements").addSlider(e=>e.setLimits(0,20,1).setValue(this.plugin.settings.maxEPerV||0).setDynamicTooltip().onChange(async s=>{this.plugin.settings.maxEPerV=s,await this.plugin.saveSettings()})),this.plugin.settings.viewMode!=="singleGraph"&&this.backoffStrategy(i)}backoffStrategy(t){let i=t.createDiv({cls:"backoff-div"});new h.Setting(i).setName("Enable auto graph reduction").setDesc("NOTE: Turning this off may produce unreadable Mermaid graphs").addToggle(e=>e.setValue(this.plugin.settings.enableAutoBridge).onChange(async s=>{this.plugin.settings.enableAutoBridge=s,await this.plugin.saveSettings(),this.display()})),this.plugin.settings.enableAutoBridge===!0&&(new h.Setting(i).setName("Manual limit configuration").setDesc("Enable manual configuration of graph limits (advanced)").addToggle(e=>e.setValue(this.plugin.settings.manualBackoff||!1).onChange(async s=>{this.plugin.settings.manualBackoff=s,await this.plugin.saveSettings(),this.display()})),this.plugin.settings.manualBackoff===!0&&(new h.Setting(i).setName("Max elements").setDesc("Limit the number of elements included").addSlider(e=>e.setLimits(10,100,5).setValue(Math.min(this.plugin.settings.maxNodes||40,100)).setDynamicTooltip().onChange(async s=>{this.plugin.settings.maxNodes=s,await this.plugin.saveSettings()})),new h.Setting(i).setName("Max relationships").setDesc("Limit the relationships included").addSlider(e=>e.setLimits(10,75,5).setValue(Math.min(this.plugin.settings.maxRelationships||60,75)).setDynamicTooltip().onChange(async s=>{this.plugin.settings.maxRelationships=s,await this.plugin.saveSettings()})),new h.Setting(i).setName("Max tags").setDesc("Limit the number of tags included").addSlider(e=>e.setLimits(5,50,1).setValue(Math.min(this.plugin.settings.maxTags||10,50)).setDynamicTooltip().onChange(async s=>{this.plugin.settings.maxTags=s,await this.plugin.saveSettings()}))))}};var p=require("obsidian"),T=class extends p.Modal{constructor(t,i){super(t),this.plugin=i}onOpen(){let{contentEl:t}=this;t.empty(),t.addClass("egv-export-modal");let i=t.createDiv({cls:"egv-file-row"}),e=new p.Setting(i).setName("File name").setClass("egv-filename-setting"),s=new p.TextComponent(e.controlEl).setValue(this.filename).onChange(d=>this.filename=d),n=new p.ButtonComponent(i).setButtonText("Export").setCta().onClick(()=>this.export()),a=t.createDiv({cls:"egv-section"});a.createEl("h3",{text:"Graph type"});let o=new p.Setting(a).setName("Graph scope").addDropdown(d=>d.addOption("fullGraph","Full graph").addOption("singleGraph","Single parent graph").setValue(this.plugin.settings.viewMode||"notSet").onChange(async y=>{this.plugin.settings.viewMode=y,await this.plugin.saveSettings(),this.strategy(a)}));this.strategy(a);let g=t.createDiv({cls:"egv-section"});g.createEl("h3",{text:"Format settings"}),new p.Setting(g).setName("Export format").addDropdown(d=>d.addOption("mmd",".mmd").addOption("dot",".dot").setValue(this.plugin.settings.exportFormat).onChange(async y=>{this.plugin.settings.exportFormat=y,await this.plugin.saveSettings(),this.mmdOrDot(g)})),this.mmdOrDot(g)}strategy(t){let i=t.querySelector(".options-div");i&&i.remove();let e=t.createDiv({cls:"options-div"});this.plugin.settings.viewMode==="singleGraph"?(new p.Setting(e).setName("Parent type").addDropdown(s=>s.addOption("singleTag","Tag").addOption("singleNote","Note").setValue(this.plugin.settings.relationshipStrategy).onChange(async n=>{this.plugin.settings.relationshipStrategy=n,await this.plugin.saveSettings(),this.singleOrFull(e)})),this.singleOrFull(e)):(new p.Setting(e).setName("Relationship type").addDropdown(s=>s.addOption("tags","By tags").addOption("internalLinks","By links").addOption("folders","By folders").setValue(this.plugin.settings.relationshipStrategy).onChange(async n=>{this.plugin.settings.relationshipStrategy=n,await this.plugin.saveSettings()})),new p.Setting(e).setName("Include orphans").setDesc("Include notes with no relationships to other notes").addToggle(s=>s.setValue(this.plugin.settings.includeOrphans).onChange(async n=>{this.plugin.settings.includeOrphans=n,await this.plugin.saveSettings()})))}singleOrFull(t){let i=t.querySelector(".single-diplay-div");i&&i.remove();let e=t.createDiv({cls:"single-display-div"});this.plugin.settings.relationshipStrategy==="singleTag"?new p.Setting(e).setName("Parent tag").setDesc("Enter tag without #").addText(s=>s.setValue(this.plugin.settings.rootTag||"").onChange(async n=>{this.plugin.settings.rootTag=n,await this.plugin.saveSettings()})):new p.Setting(e).setName("Parent note").setDesc("Enter note title").addText(s=>s.setValue(this.plugin.settings.rootNote||"").onChange(async n=>{this.plugin.settings.rootNote=n,await this.plugin.saveSettings()}))}mmdOrDot(t){let i=t.querySelector(".format-div");i&&i.remove();let e=t.createDiv({cls:"format-div"});this.plugin.settings.exportFormat==="mmd"?new p.Setting(e).setName("Mermaid layout").addDropdown(s=>s.addOption("TD","Top down").addOption("BT","Bottom to top").addOption("LR","Left to right").addOption("RL","Right to left").setValue(this.plugin.settings.direction||"TD").onChange(async n=>{this.plugin.settings.direction=n,await this.plugin.saveSettings()})):this.plugin.settings.exportFormat==="dot"&&(new p.Setting(e).setName("Weight threshold").setDesc("Only include important relationships with a minimum score").addSlider(s=>s.setLimits(1,10,1).setValue(this.plugin.settings.weightThreshold||10).setDynamicTooltip().onChange(async n=>{this.plugin.settings.weightThreshold=n,await this.plugin.saveSettings()})),new p.Setting(e).setName("Use subgraphs").addToggle(s=>s.setValue(this.plugin.settings.subgraphs||!1).onChange(async n=>{this.plugin.settings.subgraphs=n,await this.plugin.saveSettings()})))}export(){if(!this.filename){new p.Notice("Please enter a filename");return}this.plugin.exportGraph(this.filename),this.close()}onClose(){let{contentEl:t}=this;t.empty()}};var m=require("obsidian");function w(c){return c.replace(/[^a-zA-Z0-9]/g,"_")}function D(c){return c.replace(/"/g,'\\"')}var x=class{constructor(t,i){this.app=t,this.settings=i}buildGraph(){let t={nodes:[],relationships:[]};return this.harvestVault(t),this.settings.exportFormat==="dot"?this.runDotSettings(t):this.runMMDSettings(t),t}harvestVault(t){let i={cache:this.app.metadataCache,vault:this.app.vault,nodes:new Map,relationships:[],settings:this.settings,getN(){return Array.from(this.nodes.keys()).filter(e=>e.endsWith(".md")).length},getT(){return Array.from(this.nodes.values()).filter(e=>e.type==="tag").length},getK(){let e=new Map;return this.relationships.forEach(n=>{let a=this.nodes.get(n.target),o=this.nodes.get(n.source);(a==null?void 0:a.type)==="tag"&&(o==null?void 0:o.type)==="note"&&(e.has(n.source)||e.set(n.source,0),e.set(n.source,e.get(n.source)+1))}),Array.from(e.values()).reduce((n,a)=>n+a,0)/Math.max(1,e.size)},getOptimalN(e=150){let s=this.getT(),n=this.getK();return Math.floor(Math.sqrt(2*e*s/Math.max(1,n)))},isTearing(e=150){if(this.settings.viewMode==="singleGraph"||this.settings.enableAutoBridge===!1)return!1;let s=this.getN(),n=this.getT(),a=this.getK(),o=0,g=new Map;this.relationships.forEach(r=>{let l=this.nodes.get(r.target),f=this.nodes.get(r.source);(l==null?void 0:l.type)==="tag"&&(f==null?void 0:f.type)==="note"&&(g.has(r.target)||g.set(r.target,[]),g.get(r.target).push(r.source))}),g.forEach(r=>{r.length>1&&(o+=r.length*(r.length-1)/2)});let d=100,y=Math.min(e,75);return s>d||o>y||s+o>150||n>50}};switch(this.reapNotes(i),this.reapTags(i),this.reapLinks(i),this.reapFolders(i),this.settings.includeAttachments&&this.clusterAttachments(i),this.settings.relationshipStrategy){case"tags":this.tagNetwork(i);break;case"internalLinks":this.linkNetwork(i);break;case"folders":this.plantFolders(i);break;case"singleTag":this.singleTagNetwork(i);break;case"singleNote":this.singleNoteNetwork(i);break}t.nodes=Array.from(i.nodes.values()),t.relationships=i.relationships}reapNotes(t){let i=t.vault.getMarkdownFiles();for(let e of i)t.nodes.set(e.path,{id:(0,m.normalizePath)(e.path),name:e.basename,type:"note"})}reapTags(t){var s;let i=t.vault.getMarkdownFiles(),e=new Set;for(let n of i){let a=t.cache.getFileCache(n),o=[];if((s=a==null?void 0:a.frontmatter)!=null&&s.tags){let g=a.frontmatter.tags;Array.isArray(g)?o.push(...g):typeof g=="string"&&o.push(g)}o.forEach(g=>{e.add(g),t.nodes.has(g)||t.nodes.set(g,{id:g,name:g,type:"tag"}),t.relationships.push({source:n.path,target:g,weight:1})})}}reapLinks(t){let i=t.vault.getMarkdownFiles();for(let e of i){let s=t.cache.getFileCache(e);s!=null&&s.links&&s.links.forEach(n=>{let a=t.vault.getAbstractFileByPath(n.link+".md");a&&a instanceof m.TFile&&t.relationships.push({source:e.path,target:a.path,weight:1})})}}reapFolders(t){let i=t.vault.getAllLoadedFiles().filter(e=>e instanceof m.TFolder);for(let e of i)t.nodes.set(e.name,{id:e.name,name:e.name,type:"folder"}),e.children.forEach(s=>{s instanceof m.TFile&&s.extension==="md"&&t.relationships.push({source:s.path,target:e.name,weight:1})})}clusterAttachments(t){let i=t.vault.getFiles();for(let e of i)if(e.extension!==".md"){t.nodes.set(e.path,{id:(0,m.normalizePath)(e.path),name:e.basename,type:"attachment"});let s=t.vault.getMarkdownFiles();for(let n of s){let a=t.cache.getFileCache(n);a!=null&&a.embeds&&a.embeds.forEach(o=>{(o.link===e.path||o.link===e.basename)&&t.relationships.push({source:n.path,target:e.path,weight:1})})}}}tagNetwork(t){console.log("Before tagNetwork:",t.nodes.size,"nodes,",t.relationships.length,"relationships");let i=new Map,e=[];t.nodes.forEach((n,a)=>{(n.type==="note"||n.type==="tag")&&i.set(a,n)}),t.relationships.forEach(n=>{let a=t.nodes.get(n.target),o=t.nodes.get(n.source);(a==null?void 0:a.type)==="tag"&&(o==null?void 0:o.type)==="note"&&e.push(n)}),t.settings.exportFormat==="mmd"&&({...t,nodes:new Map(i),relationships:[...e]}.isTearing()?(console.log("Singularity detected - applying backoff strategy"),this.backoffSingularity(i,e,t)):console.log("Graph size within acceptable limits")),t.settings.includeOrphans||this.prune(i,e);let s=i.size+e.length;console.log("After tagNetwork:",i.size,"nodes,",e.length,"relationships",`(${s} total elements)`),s>200&&console.warn("Graph may still be too large for optimal Mermaid rendering"),t.nodes=i,t.relationships=e}linkNetwork(t){let i=new Map,e=[];t.nodes.forEach((s,n)=>{s.type==="note"&&i.set(n,s)}),t.relationships.forEach(s=>{let n=t.nodes.get(s.target),a=t.nodes.get(s.source);(n==null?void 0:n.type)==="note"&&(a==null?void 0:a.type)==="note"&&e.push(s)}),t.settings.includeOrphans||this.prune(i,e),t.nodes=i,t.relationships=e}plantFolders(t){let i=new Map,e=[];t.nodes.forEach((s,n)=>{(s.type==="note"||s.type==="folder")&&i.set(n,s)}),t.relationships.forEach(s=>{let n=t.nodes.get(s.target),a=t.nodes.get(s.source);(n==null?void 0:n.type)==="folder"&&(a==null?void 0:a.type)==="note"&&e.push(s)}),t.settings.includeOrphans||this.prune(i,e),t.nodes=i,t.relationships=e}singleTagNetwork(t){let i=this.settings.rootTag||"",e=new Map,s=[];if(i&&t.nodes.has(i))e.set(i,t.nodes.get(i));else{new m.Notice(`Tag "${i}" not found in your vault`);return}t.relationships.forEach(n=>{let a=t.nodes.get(n.target),o=t.nodes.get(n.source);(n.target===i&&(o==null?void 0:o.type)==="note"||n.source===i&&(a==null?void 0:a.type)==="note")&&(n.target===i&&o?e.set(n.source,o):n.source===i&&a&&e.set(n.target,a),s.push(n))}),t.nodes=e,t.relationships=s}singleNoteNetwork(t){var a;let i=this.settings.rootNote||"",e=new Map,s=[],n=(a=Array.from(t.nodes.entries()).find(([o,g])=>g.type==="note"&&g.name===i))==null?void 0:a[0];if(!n){new m.Notice(`Note "${i}" not found in your vault`);return}e.set(n,t.nodes.get(n)),t.relationships.forEach(o=>{if(o.source===n){let g=t.nodes.get(o.target);g&&(e.set(o.target,g),s.push(o))}else if(o.target===n){let g=t.nodes.get(o.source);g&&(e.set(o.source,g),s.push(o))}}),t.nodes=e,t.relationships=s}backoffSingularity(t,i,e){let s=e.settings.maxNodes||40,n=e.settings.maxRelationships||60,a=e.settings.maxTags||10;console.log("Starting backoff task");let o=new Map;i.forEach(r=>{let l=e.nodes.get(r.target);(l==null?void 0:l.type)==="tag"&&(o.has(r.target)||o.set(r.target,[]),o.get(r.target).push(r.source))});let g=Array.from(o.entries()).sort((r,l)=>l[1].length-r[1].length).slice(0,a).map(([r])=>r),d=new Map;g.forEach(r=>{var l;(l=o.get(r))==null||l.forEach(f=>{d.set(f,(d.get(f)||0)+1)})});let y=new Set(Array.from(d.entries()).sort((r,l)=>l[1]-r[1]).slice(0,s-g.length).map(([r])=>r));t.clear(),i.length=0,g.forEach(r=>{let l=e.nodes.get(r);l&&t.set(r,l)}),y.forEach(r=>{let l=e.nodes.get(r);l&&t.set(r,l)});let S=new Set;e.relationships.forEach(r=>{var l,f;if(t.has(r.source)&&t.has(r.target)&&S.size{let l=`${r.source}-${r.target}`;t.has(r.source)&&t.has(r.target)&&!S.has(l)&&S.size{e.add(n.source),e.add(n.target)});let s=new Map;t.forEach((n,a)=>{e.has(a)&&s.set(a,n)}),t.clear(),s.forEach((n,a)=>t.set(a,n))}runDotSettings(t){this.settings.includeWeights&&this.settings.weightThreshold&&(t.relationships=t.relationships.filter(i=>i.weight>=this.settings.weightThreshold)),this.settings.subgraphs&&this.clusterSubgraphs(t)}clusterSubgraphs(t){t.nodes.forEach(i=>{i.subgraph=i.type})}runMMDSettings(t){if(this.settings.maxEPerV){let i=[],e=new Map,s=[...t.relationships].sort((n,a)=>a.weight-n.weight);for(let n of s){let a=e.get(n.source)||0;a{let s=w(e.id);i+=` ${s}["${D(e.name)}"]
+`}),t.relationships.forEach(e=>{let s=w(e.source),n=w(e.target);i+=` ${s} --> ${n}
+`}),i}runDotPrinter(t){let e=`digraph ${this.app.vault.getName()} {
+`;if(e+=` rankdir=LR;
+`,e+=` node [shape=box, style=rounded];
+`,this.settings.subgraphs){let s=new Map;t.nodes.forEach(n=>{let a=n.subgraph||n.type;s.has(a)||s.set(a,[]),s.get(a).push(n)}),s.forEach((n,a)=>{e+=` subgraph cluster_${w(a)} {
+`,e+=` label="${a}";
+`,e+=` style=rounded;
+`,e+=` color="#cccccc";
+`,n.forEach(o=>{let g=w(o.id),d=o.type==="attachment"?'fillcolor="#ffcc80", style="filled,rounded"':'fillcolor="#e3f2fd", style="filled,rounded"';e+=` "${g}" [label="${D(o.name)}", ${d}];
+`}),e+=` }
+`})}else t.nodes.forEach(s=>{let n=w(s.id),a=s.type==="attachment"?'fillcolor="#ffcc80", style="filled,rounded"':'fillcolor="#e3f2fd", style="filled,rounded"';e+=` "${n}" [label="${D(s.name)}", ${a}];
+`});return t.relationships.forEach(s=>{let n=w(s.source),a=w(s.target),o=this.settings.includeWeights&&s.weight>1?` [weight=${s.weight}]`:"";e+=` "${n}" -> "${a}"${o};
+`}),e+="}",e}};var u=require("obsidian"),b=class extends u.Plugin{async onload(){await this.loadSettings(),this.whisperer=new x(this.app,this.settings),this.addRibbonIcon("inspection-panel","Export graph view",()=>{new T(this.app,this).open()}),this.addCommand({id:"export-graph",name:"Export graph to file",callback:()=>{new T(this.app,this).open()}}),this.addSettingTab(new N(this.app,this))}async loadSettings(){this.settings=Object.assign({},M,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}async exportGraph(t=""){try{let i=this.whisperer.buildGraph(),e;if(t)e=(0,u.normalizePath)(t);else{let n=this.app.vault.getName();e=(0,u.normalizePath)(`${n}-graph-data`)}this.settings.lastExported=e,await this.saveSettings();let s;return this.settings.exportFormat==="mmd"?s=await this.exportMermaid(i,e):s=await this.exportDot(i,e),new u.Notice(`Success! Exported to ${(0,u.normalizePath)(this.showWhereExported(s))}`,5e3),s}catch(i){return new u.Notice(`There's a problem: ${i.message}`),null}}async exportMermaid(t,i){let e=this.whisperer.runMMDPrinter(t),s=(0,u.normalizePath)(`${i}.mmd`);return await this.app.vault.create(s,e),s}async exportDot(t,i){let e=this.whisperer.runDotPrinter(t),s=(0,u.normalizePath)(`${i}.dot`);return await this.app.vault.create(s,e),s}showWhereExported(t=""){let i;if(t)i=(0,u.normalizePath)(t);else{let s=this.app.vault.getName();i=(0,u.normalizePath)(`${s}-graph-data`)}return`${this.app.vault.getName()}/${i}`}};
+
+/* nosourcemap */
\ No newline at end of file
diff --git a/.obsidian/plugins/export-graph-view/manifest.json b/.obsidian/plugins/export-graph-view/manifest.json
new file mode 100644
index 0000000..296532f
--- /dev/null
+++ b/.obsidian/plugins/export-graph-view/manifest.json
@@ -0,0 +1,11 @@
+{
+ "id": "export-graph-view",
+ "name": "Export Graph View",
+ "version": "1.2.2",
+ "minAppVersion": "0.15.0",
+ "description": "Export your vault's graph view to mermaid and dot format.",
+ "author": "Sean McGhee",
+ "authorUrl": "https://www.seantiz.com",
+ "fundingUrl": "https://github.com/sponsors/seantiz",
+ "isDesktopOnly": false
+}
diff --git a/.obsidian/plugins/export-graph-view/styles.css b/.obsidian/plugins/export-graph-view/styles.css
new file mode 100644
index 0000000..9124f4a
--- /dev/null
+++ b/.obsidian/plugins/export-graph-view/styles.css
@@ -0,0 +1,119 @@
+.quick-export-button,
+.export-button {
+ font-size: 16px;
+ padding: 20px;
+}
+
+.metadata-section {
+ text-align: center;
+ margin-top: 20px;
+ padding: 15px;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+}
+
+.metadata-section p {
+ margin: 5px 0;
+ font-size: 0.9em;
+}
+
+.help-text {
+ font-size: 12px;
+ border-bottom: none;
+ margin-top: 20px;
+}
+
+.root-notice {
+ font-size: 12px;
+}
+
+.section-button-section {
+ text-align: right;
+ margin-top: 50px;
+}
+
+.view-button-section {
+ display: flex;
+ justify-content: space-around;
+ margin-top: 20px;
+}
+
+.egv-choice-container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 20px;
+ }
+
+ .egv-choice-header {
+ text-align: center;
+ margin-bottom: 10px;
+ }
+
+ .egv-choice-description {
+ text-align: center;
+ margin-bottom: 30px;
+ color: var(--text-muted);
+ }
+
+ .egv-cards-container {
+ display: flex;
+ gap: 30px;
+ justify-content: center;
+ flex-wrap: wrap;
+ }
+
+ .egv-choice-card {
+ background-color: var(--background-secondary);
+ border-radius: 10px;
+ padding: 25px;
+ min-width: 250px;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ transition: transform 0.2s, box-shadow 0.2s;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ cursor: pointer;
+ max-width: 350px;
+ }
+
+ .egv-choice-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
+ }
+
+ .egv-choice-card h3 {
+ margin-top: 15px;
+ margin-bottom: 10px;
+ text-align: center;
+ }
+
+ .egv-choice-card p {
+ flex-grow: 1;
+ color: var(--text-muted);
+ margin-bottom: 20px;
+ text-align: center;
+ }
+
+ .egv-card-icon {
+ height: 60px;
+ margin: 0 auto 15px;
+ background-size: contain;
+ background-position: center;
+ background-repeat: no-repeat;
+ width: 60px;
+ }
+
+ .single-parent-icon {
+ background-image: url('data:image/svg+xml;utf8,');
+ }
+
+ .full-graph-icon {
+ background-image: url('data:image/svg+xml;utf8,');
+ }
+
+ .egv-card-button-container {
+ text-align: center;
+ }
+
+ .egv-card-button-container button {
+ width: 100%;
diff --git a/.obsidian/plugins/mermaid-tools/data.json b/.obsidian/plugins/mermaid-tools/data.json
new file mode 100644
index 0000000..54ec0e0
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/data.json
@@ -0,0 +1,792 @@
+{
+ "elements": [
+ {
+ "id": "ce8a0064-979c-4d60-a26c-89a3b1802216",
+ "categoryId": "flowchart",
+ "description": "a simple flowchart with top to down direction",
+ "content": "flowchart TD\nStart --> Stop",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "81190b75-35a7-45af-a8d4-94e69ee69980",
+ "categoryId": "flowchart",
+ "description": "a simple flowchart with left to right direction",
+ "content": "flowchart LR\nStart --> Stop",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "e13cedc2-1b11-48d7-bba6-78e307e1cb57",
+ "categoryId": "flowchart",
+ "description": "A node with round edges",
+ "content": "id1(Some text)",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "8e7188cf-932f-452d-89e2-0c5adc0b1dcb",
+ "categoryId": "flowchart",
+ "description": "A stadium-shaped node",
+ "content": "id1([Some text])",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "74abe0f5-d7cd-4830-a37b-0489d7449328",
+ "categoryId": "flowchart",
+ "description": "A node in a cylindrical shape",
+ "content": "id1[(Database)]",
+ "sortingOrder": 5,
+ "isPinned": false
+ },
+ {
+ "id": "5fd59c6c-0c37-46c4-a959-bff6446af538",
+ "categoryId": "flowchart",
+ "description": "Circle",
+ "content": "id1((Some text))",
+ "sortingOrder": 6,
+ "isPinned": false
+ },
+ {
+ "id": "e58fe5be-675f-44b0-a337-830d36d2684c",
+ "categoryId": "flowchart",
+ "description": "Rhombus",
+ "content": "id1{Some text}",
+ "sortingOrder": 7,
+ "isPinned": false
+ },
+ {
+ "id": "417a32f2-b1af-4b94-a370-0d69e96f35b4",
+ "categoryId": "flowchart",
+ "description": "Hexagon",
+ "content": "id1{{Some text}}",
+ "sortingOrder": 8,
+ "isPinned": false
+ },
+ {
+ "id": "17487f2b-d361-49ff-bb9f-b51b32ce9d92",
+ "categoryId": "flowchart",
+ "description": "Parallelogram skewed right",
+ "content": "id1[/Some text/]",
+ "sortingOrder": 9,
+ "isPinned": false
+ },
+ {
+ "id": "0c09e005-999c-4f69-8c22-33c22e82d9d8",
+ "categoryId": "flowchart",
+ "description": "Parallelogram skewed left",
+ "content": "id1[\\Some text\\]",
+ "sortingOrder": 10,
+ "isPinned": false
+ },
+ {
+ "id": "6122256d-84a4-495c-8f9f-1d6836068691",
+ "categoryId": "flowchart",
+ "description": "Trapezoid",
+ "content": "A[/Some text\\]",
+ "sortingOrder": 11,
+ "isPinned": false
+ },
+ {
+ "id": "6d31176d-fac1-49c5-8058-4e4dc2c6e5dd",
+ "categoryId": "flowchart",
+ "description": "Trapezoid upside down",
+ "content": "A[\\Some text/]",
+ "sortingOrder": 12,
+ "isPinned": false
+ },
+ {
+ "id": "410f9e4d-4629-45f7-949f-f798a9a0b6b9",
+ "categoryId": "flowchart",
+ "description": "Double circle node",
+ "content": "id1(((Some text)))",
+ "sortingOrder": 13,
+ "isPinned": false
+ },
+ {
+ "id": "e144a699-ba5e-43ea-8729-0d7f1b9e34d2",
+ "categoryId": "flowchart",
+ "description": "A link with arrow head",
+ "content": "A-->B",
+ "sortingOrder": 14,
+ "isPinned": false
+ },
+ {
+ "id": "6340f678-124b-4a42-9f47-6015412d1b98",
+ "categoryId": "flowchart",
+ "description": "An open link",
+ "content": "A --- B",
+ "sortingOrder": 15,
+ "isPinned": false
+ },
+ {
+ "id": "0586c4d4-4dc1-4ce1-867d-57e43a932f0b",
+ "categoryId": "flowchart",
+ "description": "Text on links",
+ "content": "A-- This is the text! ---B",
+ "sortingOrder": 16,
+ "isPinned": false
+ },
+ {
+ "id": "eb1e584b-5aaf-46f5-bfc9-44b3c406dc2d",
+ "categoryId": "flowchart",
+ "description": "A link with arrow head and text",
+ "content": "A-->|text|B",
+ "sortingOrder": 17,
+ "isPinned": false
+ },
+ {
+ "id": "ca8afaf7-7505-4f22-b95b-9a5cff53cad6",
+ "categoryId": "flowchart",
+ "description": "Dotted link",
+ "content": "A-.->B",
+ "sortingOrder": 18,
+ "isPinned": false
+ },
+ {
+ "id": "4dffe292-4204-4da3-911d-1025a05ad46c",
+ "categoryId": "flowchart",
+ "description": "Thick link",
+ "content": "A ==> B",
+ "sortingOrder": 19,
+ "isPinned": false
+ },
+ {
+ "id": "5ad57178-87bb-488b-b138-b3084d5364c5",
+ "categoryId": "flowchart",
+ "description": "Invisible link",
+ "content": "A ~~~ B",
+ "sortingOrder": 20,
+ "isPinned": false
+ },
+ {
+ "id": "b9e7daaa-5915-4a1c-a481-96ac137d16f9",
+ "categoryId": "flowchart",
+ "description": "Link with circle edge",
+ "content": "A --o B",
+ "sortingOrder": 21,
+ "isPinned": false
+ },
+ {
+ "id": "a053922d-c961-4e28-b1d2-6321b249c0ae",
+ "categoryId": "flowchart",
+ "description": "Link with cross edge",
+ "content": "A --x B",
+ "sortingOrder": 22,
+ "isPinned": false
+ },
+ {
+ "id": "187bf51e-e384-4a39-803c-78bb18b78c8b",
+ "categoryId": "flowchart",
+ "description": "Subgraph",
+ "content": "subgraph one\na1-->a2\nend",
+ "sortingOrder": 14,
+ "isPinned": false
+ },
+ {
+ "id": "9857856d-2fd4-4e0d-b058-76855215da37",
+ "categoryId": "sequenceDiagram",
+ "description": "a simple sequence diagram",
+ "content": "sequenceDiagram\nAlice->>John: Hello John, how are you?\nJohn-->>Alice: Great!\nAlice-)John: See you later!",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "47c587ff-c1e1-41f3-9e29-3bc54cce4cb1",
+ "categoryId": "sequenceDiagram",
+ "description": "a simple sequence diagram with actors",
+ "content": "sequenceDiagram\nactor Alice\nactor John\nAlice->>John: Hello John, how are you?\nJohn-->>Alice: Great!\nAlice-)John: See you later!",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "2ae592c0-806e-4640-945f-2dbc576ccdf1",
+ "categoryId": "classDiagram",
+ "description": "sample class",
+ "content": "class Duck{\n +String beakColor\n +swim()\n +quack()\n }",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "467423fe-2d69-49f4-83ca-9314227a2cc6",
+ "categoryId": "classDiagram",
+ "description": "sample class",
+ "content": "class BankAccount\n BankAccount : +String owner\n BankAccount : +Bigdecimal balance\n BankAccount : +deposit(amount)\n BankAccount : +withdrawal(amount)",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "c8275c79-b289-4d75-9ae5-65c3267e94d5",
+ "categoryId": "classDiagram",
+ "description": "generic class",
+ "content": "class Square~Shape~{\n int id\n List~int~ position\n setPoints(List~int~ points)\n getPoints() List~int~\n }\n \n Square : -List~string~ messages\n Square : +setMessages(List~string~ messages)\n Square : +getMessages() List~string~",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "8b09aee4-6260-4ec6-970c-c67168d4ac76",
+ "categoryId": "classDiagram",
+ "description": "inheritance",
+ "content": "classA <|-- classB",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "4ec30fef-b3cc-4bcc-8f4a-fda668776a36",
+ "categoryId": "classDiagram",
+ "description": "composition",
+ "content": "classC *-- classD",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "ea60828f-8ab8-4c4e-88a3-bbaf77a10472",
+ "categoryId": "classDiagram",
+ "description": "aggregation",
+ "content": "classE o-- classF",
+ "sortingOrder": 5,
+ "isPinned": false
+ },
+ {
+ "id": "99c0ed8a-8d15-4c1e-b315-4bbb3cabfd64",
+ "categoryId": "classDiagram",
+ "description": "association",
+ "content": "classG <-- classH",
+ "sortingOrder": 6,
+ "isPinned": false
+ },
+ {
+ "id": "9bc99a1a-c6f0-4a43-98aa-d18be64bdde7",
+ "categoryId": "classDiagram",
+ "description": "solid link",
+ "content": "classI -- classJ",
+ "sortingOrder": 7,
+ "isPinned": false
+ },
+ {
+ "id": "71380dcd-4c29-4907-86d9-36bb822df062",
+ "categoryId": "classDiagram",
+ "description": "dependency",
+ "content": "classK <.. classL",
+ "sortingOrder": 8,
+ "isPinned": false
+ },
+ {
+ "id": "6855b6ca-61ee-46d1-b937-085c56f96c2d",
+ "categoryId": "classDiagram",
+ "description": "realization",
+ "content": "classM <|.. classN",
+ "sortingOrder": 9,
+ "isPinned": false
+ },
+ {
+ "id": "702caa95-72a3-449f-9da2-a406f9996be0",
+ "categoryId": "classDiagram",
+ "description": "dashed link",
+ "content": "classO .. classP",
+ "sortingOrder": 10,
+ "isPinned": false
+ },
+ {
+ "id": "fa3c801c-d9ec-4506-a501-28472e7b8c78",
+ "categoryId": "classDiagram",
+ "description": "two-way relation",
+ "content": "Animal <|--|> Zebra",
+ "sortingOrder": 11,
+ "isPinned": false
+ },
+ {
+ "id": "f590de96-2011-4df5-bef1-a068832bff8a",
+ "categoryId": "classDiagram",
+ "description": "sample class diagram",
+ "content": "classDiagram\n Animal <|-- Duck\n Animal <|-- Fish\n Animal <|-- Zebra\n Animal : +int age\n Animal : +String gender\n Animal: +isMammal()\n Animal: +mate()\n class Duck{\n +String beakColor\n +swim()\n +quack()\n }\n class Fish{\n -int sizeInFeet\n -canEat()\n }\n class Zebra{\n +bool is_wild\n +run()\n }",
+ "sortingOrder": 12,
+ "isPinned": false
+ },
+ {
+ "id": "b16b29d7-3ecb-45fa-9327-eac5239bd953",
+ "categoryId": "stateDiagram",
+ "description": "a sample state diagram",
+ "content": "stateDiagram-v2\n [*] --> Still\n Still --> [*]\n \n Still --> Moving\n Moving --> Still\n Moving --> Crash\n Crash --> [*]",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "ef56afbc-aa32-4708-a191-3481d673e08a",
+ "categoryId": "stateDiagram",
+ "description": "a sample state diagram with left-to-right direction",
+ "content": "stateDiagram-v2\n direction LR\n [*] --> Still\n Still --> [*]\n \n Still --> Moving\n Moving --> Still\n Moving --> Crash\n Crash --> [*]",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "b04c48f5-2bb4-4fc2-be33-03f6597e2499",
+ "categoryId": "stateDiagram",
+ "description": "node with description",
+ "content": "s2 : This is a state description",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "3dedb769-542f-40dd-99c3-98dd0ed974e6",
+ "categoryId": "stateDiagram",
+ "description": "a transition",
+ "content": "s1 --> s2",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "530b0984-485f-4bad-9d6e-80f5398fc01b",
+ "categoryId": "stateDiagram",
+ "description": "a transition with label",
+ "content": "s1 --> s2: A transition",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "bcec3d91-0232-4e6a-82ed-6581356d6183",
+ "categoryId": "stateDiagram",
+ "description": "composite state",
+ "content": "\n [*] --> First\n state First {\n [*] --> second\n second --> [*]\n }",
+ "sortingOrder": 5,
+ "isPinned": false
+ },
+ {
+ "id": "1dcba01a-ac61-4171-8fc9-a616eaed11f2",
+ "categoryId": "stateDiagram",
+ "description": "diagram with choice",
+ "content": "stateDiagram-v2\n state if_state <>\n [*] --> IsPositive\n IsPositive --> if_state\n if_state --> False: if n < 0\n if_state --> True : if n >= 0",
+ "sortingOrder": 6,
+ "isPinned": false
+ },
+ {
+ "id": "57ad4f8a-33cd-43b5-8910-910edf8e7dec",
+ "categoryId": "stateDiagram",
+ "description": "diagram with fork",
+ "content": "stateDiagram-v2\n state fork_state <>\n [*] --> fork_state\n fork_state --> State2\n fork_state --> State3\n \n state join_state <>\n State2 --> join_state\n State3 --> join_state\n join_state --> State4\n State4 --> [*]",
+ "sortingOrder": 7,
+ "isPinned": false
+ },
+ {
+ "id": "4e9935b8-d200-4b71-a054-e959765e7825",
+ "categoryId": "stateDiagram",
+ "description": "a diagram with concurrency",
+ "content": "stateDiagram-v2\n [*] --> Active\n \n state Active {\n [*] --> NumLockOff\n NumLockOff --> NumLockOn : EvNumLockPressed\n NumLockOn --> NumLockOff : EvNumLockPressed\n --\n [*] --> CapsLockOff\n CapsLockOff --> CapsLockOn : EvCapsLockPressed\n CapsLockOn --> CapsLockOff : EvCapsLockPressed\n --\n [*] --> ScrollLockOff\n ScrollLockOff --> ScrollLockOn : EvScrollLockPressed\n ScrollLockOn --> ScrollLockOff : EvScrollLockPressed\n }",
+ "sortingOrder": 8,
+ "isPinned": false
+ },
+ {
+ "id": "26791328-43e6-430f-ad2e-76821214a95d",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "a sample entity relationship diagram",
+ "content": "erDiagram\n CUSTOMER ||--o{ ORDER : places\n ORDER ||--|{ LINE-ITEM : contains\n CUSTOMER }|..|{ DELIVERY-ADDRESS : uses",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "cb07fc4d-ae9b-4da3-a938-3a1b0ab0c2ac",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "an entity",
+ "content": " CUSTOMER {\n string name\n string custNumber\n string sector\n }",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "dcae6673-6476-4466-a97a-8a0732574801",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "one-to-many relationship",
+ "content": "A ||--|{ B : label",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "c2ad1cfb-ea4e-4d69-8bf4-b85ecc5b9134",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "many-to-many relationship",
+ "content": "A }|--|{ B : label",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "118f56be-db56-49a7-80ab-3326f7336f3d",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "one-to-one relationship",
+ "content": "A ||--|| B : label",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "bec578a5-0e42-4d24-a0dd-12b4fc25daa5",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "many-to-one relationship",
+ "content": "A }|--|| B : label",
+ "sortingOrder": 5,
+ "isPinned": false
+ },
+ {
+ "id": "32d99372-8321-44dd-80c3-1a080644fa5c",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "zero/one-to-one relationship",
+ "content": "A |o--|| B : label",
+ "sortingOrder": 6,
+ "isPinned": false
+ },
+ {
+ "id": "2113de04-a4ee-4436-a3ab-435650b23414",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "one-to-one/zero relationship",
+ "content": "A ||--o| B : label",
+ "sortingOrder": 7,
+ "isPinned": false
+ },
+ {
+ "id": "30293f49-1289-4976-88d9-34d75c0a6852",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "zero-or-more-to-one relationship",
+ "content": "A }o--|| B : label",
+ "sortingOrder": 8,
+ "isPinned": false
+ },
+ {
+ "id": "dc49bc4c-2ea6-495d-9d38-28c33e078f77",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "one-to-zero-or-more relationship",
+ "content": "A ||--o{ B : label",
+ "sortingOrder": 9,
+ "isPinned": false
+ },
+ {
+ "id": "5c53fcab-e772-4dcd-ab06-fc941fa168fa",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "zero-or-more-to-many relationship",
+ "content": "A }o--|{ B : label",
+ "sortingOrder": 10,
+ "isPinned": false
+ },
+ {
+ "id": "89b04b4e-1e06-4b5c-ae55-fa28f6e08b0b",
+ "categoryId": "entityRelationshipDiagram",
+ "description": "many-to-zero-or-more relationship",
+ "content": "A }|--o{ B : label",
+ "sortingOrder": 11,
+ "isPinned": false
+ },
+ {
+ "id": "98ae0edc-7b11-4fcb-b049-94684070b79e",
+ "categoryId": "userJourneyDiagram",
+ "description": "a sample user journey diagram",
+ "content": "journey\n title My working day\n section Go to work\n Make tea: 5: Me\n Go upstairs: 3: Me\n Do work: 1: Me, Cat\n section Go home\n Go downstairs: 5: Me\n Sit down: 5: Me",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "452612b5-f9c4-4406-b150-6d1ffdf52bb4",
+ "categoryId": "userJourneyDiagram",
+ "description": "a step in user journey",
+ "content": " Step Title: 5: ActorName",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "d1b92887-20a1-4430-b26d-4d41aad84da6",
+ "categoryId": "ganttChart",
+ "description": "simple gantt chart",
+ "content": "gantt\n title A Gantt Diagram\n dateFormat YYYY-MM-DD\n section Section\n A task :a1, 2014-01-01, 30d\n Another task :after a1 , 20d\n section Another\n Task in sec :2014-01-12 , 12d\n another task : 24d",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "00ddbe10-684f-4d8c-9e4c-7e933c6f3392",
+ "categoryId": "ganttChart",
+ "description": "rich gantt chart",
+ "content": "gantt\n dateFormat YYYY-MM-DD\n title Adding GANTT diagram functionality to mermaid\n excludes weekends\n \n section A section\n Completed task :done, des1, 2014-01-06,2014-01-08\n Active task :active, des2, 2014-01-09, 3d\n Future task : des3, after des2, 5d\n Future task2 : des4, after des3, 5d\n \n section Critical tasks\n Completed task in the critical line :crit, done, 2014-01-06,24h\n Implement parser and jison :crit, done, after des1, 2d\n Create tests for parser :crit, active, 3d\n Future task in critical line :crit, 5d\n Create tests for renderer :2d\n Add to mermaid :1d\n Functionality added :milestone, 2014-01-25, 0d\n \n section Documentation\n Describe gantt syntax :active, a1, after des1, 3d\n Add gantt diagram to demo page :after a1 , 20h\n Add another diagram to demo page :doc1, after a1 , 48h\n \n section Last section\n Describe gantt syntax :after doc1, 3d\n Add gantt diagram to demo page :20h\n Add another diagram to demo page :48h",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "ede911d1-d519-494a-845a-33a2347a4b41",
+ "categoryId": "ganttChart",
+ "description": "milestones example",
+ "content": "gantt\n dateFormat HH:mm\n axisFormat %H:%M\n Initial milestone : milestone, m1, 17:49,2min\n taska2 : 10min\n taska3 : 5min\n Final milestone : milestone, m2, 18:14, 2min",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "9c641239-521b-4e7d-8680-41400e20eb49",
+ "categoryId": "pieChart",
+ "description": "sample pie chart",
+ "content": "pie title /r/obsidianmd posts by type\n \"Graphs\" : 85\n \"Dashboards\" : 14\n \"Tips\" : 1",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "90fbf382-435d-495b-8c14-a1b758602fec",
+ "categoryId": "pieChart",
+ "description": "sample pie chart with values shown in legend",
+ "content": "pie showData title /r/obsidianmd posts by type\n \"Graphs\" : 85\n \"Dashboards\" : 14\n \"Tips\" : 1",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "4b42a05a-b81e-47ab-a23b-3d6beee6a68f",
+ "categoryId": "requirementDiagram",
+ "description": "sample requirements diagram",
+ "content": " requirementDiagram\n\n requirement test_req {\n id: 1\n text: the test text.\n risk: high\n verifymethod: test\n }\n \n element test_entity {\n type: simulation\n }\n \n test_entity - satisfies -> test_req",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "e0407d51-0c91-45bb-b7d1-6eb669382bd8",
+ "categoryId": "requirementDiagram",
+ "description": "sample requirements diagram",
+ "content": "element customElement {\n type: customType\n docref: customDocRef\n }",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "6f808e9d-4bcc-423e-8372-2283940e285d",
+ "categoryId": "requirementDiagram",
+ "description": "a requirement with high risk",
+ "content": "functionalRequirement myReq {\n id: reqId\n text: someText\n risk: High\n verifymethod: analysis\n }",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "09458e5f-b3af-4f5e-a43f-c96d585bcaee",
+ "categoryId": "requirementDiagram",
+ "description": "sample requirements diagram",
+ "content": "interfaceRequirement myReq2 {\n id: reqId\n text: someText\n risk: Medium\n verifymethod: demonstration\n }",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "5581967d-eb25-4cd5-b161-eb9345585012",
+ "categoryId": "requirementDiagram",
+ "description": "sample requirements diagram",
+ "content": "designConstraint myReq3 {\n id: reqId\n text: someText\n risk: Low\n verifymethod: test\n }",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "4df85f3a-0a21-46ef-94b2-1f7ac20659ba",
+ "categoryId": "gitGraph",
+ "description": "simple git graph",
+ "content": "gitGraph\n commit\n commit\n branch develop\n checkout develop\n commit\n commit\n checkout main\n merge develop\n commit\n commit",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "241c6930-88da-438a-85c9-dc1ca8f4b3e1",
+ "categoryId": "gitGraph",
+ "description": "tagged commit",
+ "content": "commit id: \"Normal\" tag: \"v1.0.0\"",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "6d1bb248-32bd-4c7f-af21-a276e52d5bf6",
+ "categoryId": "gitGraph",
+ "description": "reverse commit",
+ "content": "commit id: \"Reverse\" type: REVERSE",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "65a0b460-cf18-4c7b-a39a-cc8c4ad11578",
+ "categoryId": "gitGraph",
+ "description": "highlighted commit",
+ "content": "commit id: \"Highlight\" type: HIGHLIGHT",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "7cd136f5-4519-49d3-90d8-f845c59f606f",
+ "categoryId": "gitGraph",
+ "description": "reverse commit",
+ "content": "commit id: \"Reverse\" type: REVERSE",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "69d9ed7f-aebd-4dda-a920-05f486dfddba",
+ "categoryId": "gitGraph",
+ "description": "git graph with cherry-pick",
+ "content": "gitGraph\n commit id: \"ZERO\"\n branch develop\n commit id:\"A\"\n checkout main\n commit id:\"ONE\"\n checkout develop\n commit id:\"B\"\n checkout main\n commit id:\"TWO\"\n cherry-pick id:\"A\"\n commit id:\"THREE\"\n checkout develop\n commit id:\"C\"",
+ "sortingOrder": 5,
+ "isPinned": false
+ },
+ {
+ "id": "ddc3aff8-b403-4ef7-a8ca-b3dbe8a75272",
+ "categoryId": "mindmap",
+ "description": "a simple mindmap",
+ "content": "mindmap\n Root\n A\n B\n C",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "fc3097e2-fc2c-463e-ac54-e6a91c8573e9",
+ "categoryId": "mindmap",
+ "description": "square",
+ "content": "id[I am a square]",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "76e932cc-e140-41f5-96e4-eef5225569ad",
+ "categoryId": "mindmap",
+ "description": "rounded square",
+ "content": "id(I am a rounded square)",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "2943cf70-a543-4847-99da-5428de6cb5df",
+ "categoryId": "mindmap",
+ "description": "circle",
+ "content": "id((I am a circle))",
+ "sortingOrder": 4,
+ "isPinned": false
+ },
+ {
+ "id": "b8cc4c57-a8b1-462e-8558-ddd780339d98",
+ "categoryId": "mindmap",
+ "description": "bang",
+ "content": "id))I am a bang((",
+ "sortingOrder": 5,
+ "isPinned": false
+ },
+ {
+ "id": "9ab2c4b7-e2c3-42cd-a846-3fcc36cb0868",
+ "categoryId": "mindmap",
+ "description": "cloud",
+ "content": "id)I am a cloud(",
+ "sortingOrder": 6,
+ "isPinned": false
+ },
+ {
+ "id": "be1122b5-fdd0-4958-b305-7f08b2fd3e76",
+ "categoryId": "mindmap",
+ "description": "hexagon",
+ "content": "id{{I am a hexagon}}",
+ "sortingOrder": 7,
+ "isPinned": false
+ },
+ {
+ "id": "2cf43034-8777-405c-935d-81a27aba2f64",
+ "categoryId": "mindmap",
+ "description": "default",
+ "content": "I am the default shape",
+ "sortingOrder": 8,
+ "isPinned": false
+ },
+ {
+ "id": "b3e18945-295e-4a29-a954-fd3e1c80caff",
+ "categoryId": "mindmap",
+ "description": "sample mindmap",
+ "content": "mindmap\n root((mindmap))\n Origins\n Long history\n Popularisation\n British popular psychology author Tony Buzan\n Research\n On effectiveness
and features\n On Automatic creation\n Uses\n Creative techniques\n Strategic planning\n Argument mapping\n Tools\n Pen and paper\n Mermaid",
+ "sortingOrder": 9,
+ "isPinned": false
+ },
+ {
+ "id": "6af01e26-c328-448f-9c0e-7293ccf65ad0",
+ "categoryId": "timeline",
+ "description": "sample timeline",
+ "content": "timeline\n\t\ttitle History of Social Media Platform\n\t\t2002 : LinkedIn\n\t\t2004 : Facebook\n\t\t\t : Google\n\t\t2005 : Youtube\n\t\t2006 : Twitter",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "58536caa-6860-457b-8fd8-96f132530355",
+ "categoryId": "timeline",
+ "description": "timeline with grouping",
+ "content": "timeline\n\t\ttitle Timeline of Industrial Revolution\n\t\tsection 17th-20th century\n\t\t\tIndustry 1.0 : Machinery, Water power, Steam
power\n\t\t\tIndustry 2.0 : Electricity, Internal combustion engine, Mass production\n\t\t\tIndustry 3.0 : Electronics, Computers, Automation\n\t\tsection 21st century\n\t\t\tIndustry 4.0 : Internet, Robotics, Internet of Things\n\t\t\tIndustry 5.0 : Artificial intelligence, Big data,3D printing",
+ "sortingOrder": 2,
+ "isPinned": false
+ },
+ {
+ "id": "6c7b156f-319b-46c1-a0f7-e62be3571fc9",
+ "categoryId": "timeline",
+ "description": "timeline with Forest theme. see the docs for additional themes",
+ "content": "%%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%%\n\t\ttimeline\n\t\t\ttitle History of Social Media Platform\n\t\t\t 2002 : LinkedIn\n\t\t\t 2004 : Facebook : Google\n\t\t\t 2005 : Youtube\n\t\t\t 2006 : Twitter\n\t\t\t 2007 : Tumblr\n\t\t\t 2008 : Instagram\n\t\t\t 2010 : Pinterest",
+ "sortingOrder": 3,
+ "isPinned": false
+ },
+ {
+ "id": "db1924f2-1c69-4e15-a665-74a062d12cd4",
+ "categoryId": "quadrantChart",
+ "description": "sample quadrant chart",
+ "content": "quadrantChart\n\t\ttitle Reach and engagement of campaigns\n\t\tx-axis Low Reach --> High Reach\n\t\ty-axis Low Engagement --> High Engagement\n\t\tquadrant-1 We should expand\n\t\tquadrant-2 Need to promote\n\t\tquadrant-3 Re-evaluate\n\t\tquadrant-4 May be improved\n\t\tCampaign A: [0.3, 0.6]\n\t\tCampaign B: [0.45, 0.23]\n\t\tCampaign C: [0.57, 0.69]\n\t\tCampaign D: [0.78, 0.34]\n\t\tCampaign E: [0.40, 0.34]\n\t\tCampaign F: [0.35, 0.78]",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "f8259530-5179-4548-a42c-e672a7c28ac0",
+ "categoryId": "quadrantChart",
+ "description": "themed quadrant chart",
+ "content": "%%{init: {\"quadrantChart\": {\"chartWidth\": 400, \"chartHeight\": 400}, \"themeVariables\": {\"quadrant1TextFill\": \"#ff0000\"} }}%%\n\t\tquadrantChart\n\t\t x-axis Urgent --> Not Urgent\n\t\t y-axis Not Important --> \"Important ❤\"\n\t\t quadrant-1 Plan\n\t\t quadrant-2 Do\n\t\t quadrant-3 Delegate\n\t\t quadrant-4 Delete",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "8a28b8a2-f058-414b-b82a-900153d11a2f",
+ "categoryId": "c4Diagram",
+ "description": "sample C4 diagram (compatible with PlantUML)",
+ "content": "C4Context\n\t\ttitle System Context diagram for Internet Banking System\n\t\tEnterprise_Boundary(b0, \"BankBoundary0\") {\n\t\t Person(customerA, \"Banking Customer A\", \"A customer of the bank, with personal bank accounts.\")\n\t\t Person(customerB, \"Banking Customer B\")\n\t\t Person_Ext(customerC, \"Banking Customer C\", \"desc\")\n \n\t\t Person(customerD, \"Banking Customer D\", \"A customer of the bank,
with personal bank accounts.\")\n \n\t\t System(SystemAA, \"Internet Banking System\", \"Allows customers to view information about their bank accounts, and make payments.\")\n \n\t\t Enterprise_Boundary(b1, \"BankBoundary\") {\n \n\t\t\tSystemDb_Ext(SystemE, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n \n\t\t\tSystem_Boundary(b2, \"BankBoundary2\") {\n\t\t\t System(SystemA, \"Banking System A\")\n\t\t\t System(SystemB, \"Banking System B\", \"A system of the bank, with personal bank accounts. next line.\")\n\t\t\t}\n \n\t\t\tSystem_Ext(SystemC, \"E-mail system\", \"The internal Microsoft Exchange e-mail system.\")\n\t\t\tSystemDb(SystemD, \"Banking System D Database\", \"A system of the bank, with personal bank accounts.\")\n \n\t\t\tBoundary(b3, \"BankBoundary3\", \"boundary\") {\n\t\t\t SystemQueue(SystemF, \"Banking System F Queue\", \"A system of the bank.\")\n\t\t\t SystemQueue_Ext(SystemG, \"Banking System G Queue\", \"A system of the bank, with personal bank accounts.\")\n\t\t\t}\n\t\t }\n\t\t}\n \n\t\tBiRel(customerA, SystemAA, \"Uses\")\n\t\tBiRel(SystemAA, SystemE, \"Uses\")\n\t\tRel(SystemAA, SystemC, \"Sends e-mails\", \"SMTP\")\n\t\tRel(SystemC, customerA, \"Sends e-mails to\")\n \n\t\tUpdateElementStyle(customerA, $fontColor=\"red\", $bgColor=\"grey\", $borderColor=\"red\")\n\t\tUpdateRelStyle(customerA, SystemAA, $textColor=\"blue\", $lineColor=\"blue\", $offsetX=\"5\")\n\t\tUpdateRelStyle(SystemAA, SystemE, $textColor=\"blue\", $lineColor=\"blue\", $offsetY=\"-10\")\n\t\tUpdateRelStyle(SystemAA, SystemC, $textColor=\"blue\", $lineColor=\"blue\", $offsetY=\"-40\", $offsetX=\"-50\")\n\t\tUpdateRelStyle(SystemC, customerA, $textColor=\"red\", $lineColor=\"red\", $offsetX=\"-50\", $offsetY=\"20\")\n \n\t\tUpdateLayoutConfig($c4ShapeInRow=\"3\", $c4BoundaryInRow=\"1\")",
+ "sortingOrder": 1,
+ "isPinned": false
+ },
+ {
+ "id": "d476fcb2-171b-407b-a14c-fc229928f3c5",
+ "categoryId": "sankeyDiagram",
+ "description": "",
+ "content": "sankey-beta\n %% source,target,value\n Electricity grid,Over generation / exports,104.453\n Electricity grid,Heating and cooling - homes,113.726\n Electricity grid,H2 conversion,27.14",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "fd51101c-845f-41cc-98ea-cf3d9064f4fe",
+ "categoryId": "xyChart",
+ "description": "a sample XYChart diagram",
+ "content": "xychart-beta\n title \"Sales Revenue\"\n x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]\n y-axis \"Revenue (in $)\" 4000 --> 11000\n bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]\n line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "4d105a15-f99c-47da-909b-9cf95a3b0d0f",
+ "categoryId": "packet",
+ "description": "a sample packet diagram",
+ "content": "packet-beta\ntitle UDP Packet\n0-15: \"Source Port\"\n16-31: \"Destination Port\"\n32-47: \"Length\"\n48-63: \"Checksum\"\n64-95: \"Data (variable length)\"\n",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "016f803e-9b70-40a9-9ba5-aed11358011f",
+ "categoryId": "kanban",
+ "description": "a sample kanban diagram",
+ "content": "kanban\n Todo\n [Create Documentation]\n docs[Create Blog about the new diagram]\n [In progress]\n id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]\n id9[Ready for deploy]\n id8[Design grammar]@{ assigned: 'knsv' }\n id10[Ready for test]\n id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' }\n id66[last item]@{ priority: 'Very Low', assigned: 'knsv' }\n id11[Done]\n id5[define getData]\n id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'}\n id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' }\n\n id12[Can't reproduce]\n id3[Weird flickering in Firefox]",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "64c83d61-8d0f-49a1-a719-a333e59d3063",
+ "categoryId": "block",
+ "description": "a sample block diagram",
+ "content": "block-beta\ncolumns 1\n db((\"DB\"))\n blockArrowId6<[\" \"]>(down)\n block:ID\n A\n B[\"A wide one in the middle\"]\n C\n end\n space\n D\n ID --> D\n C --> D\n style B fill:#969,stroke:#333,stroke-width:4px\n",
+ "sortingOrder": 0,
+ "isPinned": false
+ },
+ {
+ "id": "9ae060df-8b48-4c98-a735-3dbe736b2fcc",
+ "categoryId": "architecture",
+ "description": "a sample architecture diagram",
+ "content": "architecture-beta\n group api(cloud)[API]\n\n service db(database)[Database] in api\n service disk1(disk)[Storage] in api\n service disk2(disk)[Storage] in api\n service server(server)[Server] in api\n\n db:L -- R:server\n disk1:T -- B:server\n disk2:T -- B:db\n",
+ "sortingOrder": 0,
+ "isPinned": false
+ }
+ ],
+ "customCategories": [],
+ "selectedCategoryId": "block",
+ "defaultCategorySortOrders": {},
+ "categoryModifications": {}
+}
\ No newline at end of file
diff --git a/.obsidian/plugins/mermaid-tools/main.js b/.obsidian/plugins/mermaid-tools/main.js
new file mode 100644
index 0000000..829d903
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/main.js
@@ -0,0 +1,2633 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
+if you want to view the source, please visit the github repository of this plugin
+*/
+
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+ for (var name in all)
+ __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+ if (from && typeof from === "object" || typeof from === "function") {
+ for (let key of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key) && key !== except)
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+ }
+ return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// main.ts
+var main_exports = {};
+__export(main_exports, {
+ TRIDENT_ICON_NAME: () => TRIDENT_ICON_NAME,
+ default: () => MermaidPlugin
+});
+module.exports = __toCommonJS(main_exports);
+var import_obsidian7 = require("obsidian");
+
+// src/elements/sampleDiagrams.ts
+var sampleDiagrams = {
+ EntityRelationshipDiagram: `erDiagram
+ CUSTOMER ||--o{ ORDER : places
+ ORDER ||--|{ LINE-ITEM : contains
+ CUSTOMER }|..|{ DELIVERY-ADDRESS : uses`,
+ ClassDiagram: `class BankAccount
+ BankAccount : +String owner
+ BankAccount : +Bigdecimal balance
+ BankAccount : +deposit(amount)
+ BankAccount : +withdrawal(amount)`,
+ Flowchart: "flowchart LR\nStart --> Stop",
+ GanttChart: `gantt
+ title A Gantt Diagram
+ dateFormat YYYY-MM-DD
+ section Section
+ A task :a1, 2014-01-01, 30d
+ Another task :after a1 , 20d
+ section Another
+ Task in sec :2014-01-12 , 12d
+ another task : 24d`,
+ GitGraph: `gitGraph
+ commit
+ commit
+ branch develop
+ checkout develop
+ commit
+ commit
+ checkout main
+ merge develop
+ commit
+ commit`,
+ PieChart: `pie title /r/obsidianmd posts by type
+ "Look at my awesome graph" : 85
+ "Look at my cool dashboard" : 14
+ "Moved from Notion, liking it" : 1`,
+ RequirementDiagram: ` requirementDiagram
+
+ requirement test_req {
+ id: 1
+ text: the test text.
+ risk: high
+ verifymethod: test
+ }
+
+ element test_entity {
+ type: simulation
+ }
+
+ test_entity - satisfies -> test_req`,
+ SequenceDiagram: `sequenceDiagram
+Alice->>John: Hello John, how are you?
+John-->>Alice: Great!
+Alice-)John: See you later!`,
+ StateDiagram: `stateDiagram-v2
+ [*] --> Still
+ Still --> [*]
+
+ Still --> Moving
+ Moving --> Still
+ Moving --> Crash
+ Crash --> [*]`,
+ UserJourneyDiagram: `journey
+ title My working day
+ section Go to work
+ Make tea: 5: Me
+ Go upstairs: 3: Me
+ Do work: 1: Me, Cat
+ section Go home
+ Go downstairs: 5: Me
+ Sit down: 5: Me`,
+ Mindmap: `mindmap
+ Root
+ A
+ B
+ C`,
+ Timeline: `timeline
+ title History of Social Media Platform
+ 2002 : LinkedIn
+ 2004 : Facebook
+ : Google
+ 2005 : Youtube
+ 2006 : Twitter`,
+ QuadrantChart: `quadrantChart
+ title Reach and engagement of campaigns
+ x-axis Low Reach --> High Reach
+ y-axis Low Engagement --> High Engagement
+ quadrant-1 We should expand
+ quadrant-2 Need to promote
+ quadrant-3 Re-evaluate
+ quadrant-4 May be improved
+ Campaign A: [0.3, 0.6]
+ Campaign B: [0.45, 0.23]
+ Campaign C: [0.57, 0.69]
+ Campaign D: [0.78, 0.34]
+ Campaign E: [0.40, 0.34]
+ Campaign F: [0.35, 0.78]`,
+ C4Diagram: `C4Context
+ title System Context diagram for Internet Banking System
+ Enterprise_Boundary(b0, "BankBoundary0") {
+ Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
+ Person(customerB, "Banking Customer B")
+ Person_Ext(customerC, "Banking Customer C", "desc")
+
+ Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.")
+
+ System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
+
+ Enterprise_Boundary(b1, "BankBoundary") {
+
+ SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
+
+ System_Boundary(b2, "BankBoundary2") {
+ System(SystemA, "Banking System A")
+ System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.")
+ }
+
+ System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
+ SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
+
+ Boundary(b3, "BankBoundary3", "boundary") {
+ SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.")
+ SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
+ }
+ }
+ }
+
+ BiRel(customerA, SystemAA, "Uses")
+ BiRel(SystemAA, SystemE, "Uses")
+ Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
+ Rel(SystemC, customerA, "Sends e-mails to")
+
+ UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red")
+ UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5")
+ UpdateRelStyle(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10")
+ UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50")
+ UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20")
+
+ UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")`,
+ SankeyDiagram: `sankey-beta
+
+ %% source,target,value
+ Electricity grid,Over generation / exports,104.453
+ Electricity grid,Heating and cooling - homes,113.726
+ Electricity grid,H2 conversion,27.14`,
+ XyChart: `xychart-beta
+ title "Sales Revenue"
+ x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
+ y-axis "Revenue (in $)" 4000 --> 11000
+ bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
+ line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]`,
+ Packet: `packet-beta
+title UDP Packet
+0-15: "Source Port"
+16-31: "Destination Port"
+32-47: "Length"
+48-63: "Checksum"
+64-95: "Data (variable length)"
+`,
+ Kanban: `kanban
+ Todo
+ [Create Documentation]
+ docs[Create Blog about the new diagram]
+ [In progress]
+ id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]
+ id9[Ready for deploy]
+ id8[Design grammar]@{ assigned: 'knsv' }
+ id10[Ready for test]
+ id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' }
+ id66[last item]@{ priority: 'Very Low', assigned: 'knsv' }
+ id11[Done]
+ id5[define getData]
+ id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'}
+ id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' }
+
+ id12[Can't reproduce]
+ id3[Weird flickering in Firefox]`,
+ Block: `block-beta
+columns 1
+ db(("DB"))
+ blockArrowId6<[" "]>(down)
+ block:ID
+ A
+ B["A wide one in the middle"]
+ C
+ end
+ space
+ D
+ ID --> D
+ C --> D
+ style B fill:#969,stroke:#333,stroke-width:4px
+`,
+ Architecture: `architecture-beta
+ group api(cloud)[API]
+
+ service db(database)[Database] in api
+ service disk1(disk)[Storage] in api
+ service disk2(disk)[Storage] in api
+ service server(server)[Server] in api
+
+ db:L -- R:server
+ disk1:T -- B:server
+ disk2:T -- B:db
+`
+};
+
+// src/elements/architecture.ts
+var architectureElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "architecture",
+ description: "a sample architecture diagram",
+ content: `architecture-beta
+ group api(cloud)[API]
+
+ service db(database)[Database] in api
+ service disk1(disk)[Storage] in api
+ service disk2(disk)[Storage] in api
+ service server(server)[Server] in api
+
+ db:L -- R:server
+ disk1:T -- B:server
+ disk2:T -- B:db
+`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/blockDiagram.ts
+var blockDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "block",
+ description: "a sample block diagram",
+ content: `block-beta
+columns 1
+ db(("DB"))
+ blockArrowId6<[" "]>(down)
+ block:ID
+ A
+ B["A wide one in the middle"]
+ C
+ end
+ space
+ D
+ ID --> D
+ C --> D
+ style B fill:#969,stroke:#333,stroke-width:4px
+`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/c4Diagram.ts
+var c4DiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "c4Diagram",
+ description: "sample C4 diagram (compatible with PlantUML)",
+ content: `C4Context
+ title System Context diagram for Internet Banking System
+ Enterprise_Boundary(b0, "BankBoundary0") {
+ Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
+ Person(customerB, "Banking Customer B")
+ Person_Ext(customerC, "Banking Customer C", "desc")
+
+ Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.")
+
+ System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
+
+ Enterprise_Boundary(b1, "BankBoundary") {
+
+ SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
+
+ System_Boundary(b2, "BankBoundary2") {
+ System(SystemA, "Banking System A")
+ System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.")
+ }
+
+ System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
+ SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
+
+ Boundary(b3, "BankBoundary3", "boundary") {
+ SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.")
+ SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
+ }
+ }
+ }
+
+ BiRel(customerA, SystemAA, "Uses")
+ BiRel(SystemAA, SystemE, "Uses")
+ Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
+ Rel(SystemC, customerA, "Sends e-mails to")
+
+ UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red")
+ UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5")
+ UpdateRelStyle(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10")
+ UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50")
+ UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20")
+
+ UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/classDiagram.ts
+var classDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "sample class",
+ content: `class Duck{
+ +String beakColor
+ +swim()
+ +quack()
+ }`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "sample class",
+ content: `class BankAccount
+ BankAccount : +String owner
+ BankAccount : +Bigdecimal balance
+ BankAccount : +deposit(amount)
+ BankAccount : +withdrawal(amount)`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "generic class",
+ content: `class Square~Shape~{
+ int id
+ List~int~ position
+ setPoints(List~int~ points)
+ getPoints() List~int~
+ }
+
+ Square : -List~string~ messages
+ Square : +setMessages(List~string~ messages)
+ Square : +getMessages() List~string~`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "inheritance",
+ content: "classA <|-- classB",
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "composition",
+ content: "classC *-- classD",
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "aggregation",
+ content: "classE o-- classF",
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "association",
+ content: "classG <-- classH",
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "solid link",
+ content: "classI -- classJ",
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "dependency",
+ content: "classK <.. classL",
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "realization",
+ content: "classM <|.. classN",
+ sortingOrder: 9,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "dashed link",
+ content: "classO .. classP",
+ sortingOrder: 10,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "two-way relation",
+ content: "Animal <|--|> Zebra",
+ sortingOrder: 11,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "sample class diagram",
+ content: `classDiagram
+ Animal <|-- Duck
+ Animal <|-- Fish
+ Animal <|-- Zebra
+ Animal : +int age
+ Animal : +String gender
+ Animal: +isMammal()
+ Animal: +mate()
+ class Duck{
+ +String beakColor
+ +swim()
+ +quack()
+ }
+ class Fish{
+ -int sizeInFeet
+ -canEat()
+ }
+ class Zebra{
+ +bool is_wild
+ +run()
+ }`,
+ sortingOrder: 12,
+ isPinned: false
+ }
+];
+
+// src/elements/entityRelationshipDiagram.ts
+var entityRelationshipDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "a sample entity relationship diagram",
+ content: `erDiagram
+ CUSTOMER ||--o{ ORDER : places
+ ORDER ||--|{ LINE-ITEM : contains
+ CUSTOMER }|..|{ DELIVERY-ADDRESS : uses`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "an entity",
+ content: ` CUSTOMER {
+ string name
+ string custNumber
+ string sector
+ }`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-many relationship",
+ content: `A ||--|{ B : label`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "many-to-many relationship",
+ content: `A }|--|{ B : label`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-one relationship",
+ content: `A ||--|| B : label`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "many-to-one relationship",
+ content: `A }|--|| B : label`,
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "zero/one-to-one relationship",
+ content: `A |o--|| B : label`,
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-one/zero relationship",
+ content: `A ||--o| B : label`,
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "zero-or-more-to-one relationship",
+ content: `A }o--|| B : label`,
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-zero-or-more relationship",
+ content: `A ||--o{ B : label`,
+ sortingOrder: 9,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "zero-or-more-to-many relationship",
+ content: `A }o--|{ B : label`,
+ sortingOrder: 10,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "many-to-zero-or-more relationship",
+ content: `A }|--o{ B : label`,
+ sortingOrder: 11,
+ isPinned: false
+ }
+];
+
+// src/elements/flowchart.ts
+var flowchartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "a simple flowchart with top to down direction",
+ content: `flowchart TD
+Start --> Stop`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "a simple flowchart with left to right direction",
+ content: "flowchart LR\nStart --> Stop",
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A node with round edges",
+ content: "id1(Some text)",
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A stadium-shaped node",
+ content: "id1([Some text])",
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A node in a cylindrical shape",
+ content: "id1[(Database)]",
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Circle",
+ content: "id1((Some text))",
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Rhombus",
+ content: "id1{Some text}",
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Hexagon",
+ content: "id1{{Some text}}",
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Parallelogram skewed right",
+ content: "id1[/Some text/]",
+ sortingOrder: 9,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Parallelogram skewed left",
+ content: "id1[\\Some text\\]",
+ sortingOrder: 10,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Trapezoid",
+ content: "A[/Some text\\]",
+ sortingOrder: 11,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Trapezoid upside down",
+ content: "A[\\Some text/]",
+ sortingOrder: 12,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Double circle node",
+ content: "id1(((Some text)))",
+ sortingOrder: 13,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A link with arrow head",
+ content: "A-->B",
+ sortingOrder: 14,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "An open link",
+ content: "A --- B",
+ sortingOrder: 15,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Text on links",
+ content: "A-- This is the text! ---B",
+ sortingOrder: 16,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A link with arrow head and text",
+ content: "A-->|text|B",
+ sortingOrder: 17,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Dotted link",
+ content: "A-.->B",
+ sortingOrder: 18,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Thick link",
+ content: "A ==> B",
+ sortingOrder: 19,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Invisible link",
+ content: "A ~~~ B",
+ sortingOrder: 20,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Link with circle edge",
+ content: "A --o B",
+ sortingOrder: 21,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Link with cross edge",
+ content: "A --x B",
+ sortingOrder: 22,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Subgraph",
+ content: "subgraph one\na1-->a2\nend",
+ sortingOrder: 14,
+ isPinned: false
+ }
+];
+
+// src/elements/ganntChart.ts
+var ganttChartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "ganttChart",
+ description: "simple gantt chart",
+ content: `gantt
+ title A Gantt Diagram
+ dateFormat YYYY-MM-DD
+ section Section
+ A task :a1, 2014-01-01, 30d
+ Another task :after a1 , 20d
+ section Another
+ Task in sec :2014-01-12 , 12d
+ another task : 24d`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "ganttChart",
+ description: "rich gantt chart",
+ content: `gantt
+ dateFormat YYYY-MM-DD
+ title Adding GANTT diagram functionality to mermaid
+ excludes weekends
+
+ section A section
+ Completed task :done, des1, 2014-01-06,2014-01-08
+ Active task :active, des2, 2014-01-09, 3d
+ Future task : des3, after des2, 5d
+ Future task2 : des4, after des3, 5d
+
+ section Critical tasks
+ Completed task in the critical line :crit, done, 2014-01-06,24h
+ Implement parser and jison :crit, done, after des1, 2d
+ Create tests for parser :crit, active, 3d
+ Future task in critical line :crit, 5d
+ Create tests for renderer :2d
+ Add to mermaid :1d
+ Functionality added :milestone, 2014-01-25, 0d
+
+ section Documentation
+ Describe gantt syntax :active, a1, after des1, 3d
+ Add gantt diagram to demo page :after a1 , 20h
+ Add another diagram to demo page :doc1, after a1 , 48h
+
+ section Last section
+ Describe gantt syntax :after doc1, 3d
+ Add gantt diagram to demo page :20h
+ Add another diagram to demo page :48h`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "ganttChart",
+ description: "milestones example",
+ content: `gantt
+ dateFormat HH:mm
+ axisFormat %H:%M
+ Initial milestone : milestone, m1, 17:49,2min
+ taska2 : 10min
+ taska3 : 5min
+ Final milestone : milestone, m2, 18:14, 2min`,
+ sortingOrder: 2,
+ isPinned: false
+ }
+];
+
+// src/elements/gitGraph.ts
+var gitGraphElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "simple git graph",
+ content: `gitGraph
+ commit
+ commit
+ branch develop
+ checkout develop
+ commit
+ commit
+ checkout main
+ merge develop
+ commit
+ commit`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "tagged commit",
+ content: `commit id: "Normal" tag: "v1.0.0"`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "reverse commit",
+ content: `commit id: "Reverse" type: REVERSE`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "highlighted commit",
+ content: `commit id: "Highlight" type: HIGHLIGHT`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "reverse commit",
+ content: `commit id: "Reverse" type: REVERSE`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "git graph with cherry-pick",
+ content: `gitGraph
+ commit id: "ZERO"
+ branch develop
+ commit id:"A"
+ checkout main
+ commit id:"ONE"
+ checkout develop
+ commit id:"B"
+ checkout main
+ commit id:"TWO"
+ cherry-pick id:"A"
+ commit id:"THREE"
+ checkout develop
+ commit id:"C"`,
+ sortingOrder: 5,
+ isPinned: false
+ }
+];
+
+// src/elements/kanban.ts
+var kanbanElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "kanban",
+ description: "a sample kanban diagram",
+ content: `kanban
+ Todo
+ [Create Documentation]
+ docs[Create Blog about the new diagram]
+ [In progress]
+ id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]
+ id9[Ready for deploy]
+ id8[Design grammar]@{ assigned: 'knsv' }
+ id10[Ready for test]
+ id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' }
+ id66[last item]@{ priority: 'Very Low', assigned: 'knsv' }
+ id11[Done]
+ id5[define getData]
+ id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'}
+ id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' }
+
+ id12[Can't reproduce]
+ id3[Weird flickering in Firefox]`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/mindMap.ts
+var mindMapElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "a simple mindmap",
+ content: `mindmap
+ Root
+ A
+ B
+ C`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "square",
+ content: `id[I am a square]`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "rounded square",
+ content: `id(I am a rounded square)`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "circle",
+ content: `id((I am a circle))`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "bang",
+ content: `id))I am a bang((`,
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "cloud",
+ content: `id)I am a cloud(`,
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "hexagon",
+ content: `id{{I am a hexagon}}`,
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "default",
+ content: `I am the default shape`,
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "sample mindmap",
+ content: `mindmap
+ root((mindmap))
+ Origins
+ Long history
+ Popularisation
+ British popular psychology author Tony Buzan
+ Research
+ On effectiveness
and features
+ On Automatic creation
+ Uses
+ Creative techniques
+ Strategic planning
+ Argument mapping
+ Tools
+ Pen and paper
+ Mermaid`,
+ sortingOrder: 9,
+ isPinned: false
+ }
+];
+
+// src/elements/packet.ts
+var packetElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "packet",
+ description: "a sample packet diagram",
+ content: `packet-beta
+title UDP Packet
+0-15: "Source Port"
+16-31: "Destination Port"
+32-47: "Length"
+48-63: "Checksum"
+64-95: "Data (variable length)"
+`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/pieChart.ts
+var pieChartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "pieChart",
+ description: "sample pie chart",
+ content: `pie title /r/obsidianmd posts by type
+ "Graphs" : 85
+ "Dashboards" : 14
+ "Tips" : 1`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "pieChart",
+ description: "sample pie chart with values shown in legend",
+ content: `pie showData title /r/obsidianmd posts by type
+ "Graphs" : 85
+ "Dashboards" : 14
+ "Tips" : 1`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/quadrant.ts
+var quadrantElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "quadrantChart",
+ description: "sample quadrant chart",
+ content: `quadrantChart
+ title Reach and engagement of campaigns
+ x-axis Low Reach --> High Reach
+ y-axis Low Engagement --> High Engagement
+ quadrant-1 We should expand
+ quadrant-2 Need to promote
+ quadrant-3 Re-evaluate
+ quadrant-4 May be improved
+ Campaign A: [0.3, 0.6]
+ Campaign B: [0.45, 0.23]
+ Campaign C: [0.57, 0.69]
+ Campaign D: [0.78, 0.34]
+ Campaign E: [0.40, 0.34]
+ Campaign F: [0.35, 0.78]`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "quadrantChart",
+ description: "themed quadrant chart",
+ content: `%%{init: {"quadrantChart": {"chartWidth": 400, "chartHeight": 400}, "themeVariables": {"quadrant1TextFill": "#ff0000"} }}%%
+ quadrantChart
+ x-axis Urgent --> Not Urgent
+ y-axis Not Important --> "Important \u2764"
+ quadrant-1 Plan
+ quadrant-2 Do
+ quadrant-3 Delegate
+ quadrant-4 Delete`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/requirementDiagram.ts
+var requirementDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: ` requirementDiagram
+
+ requirement test_req {
+ id: 1
+ text: the test text.
+ risk: high
+ verifymethod: test
+ }
+
+ element test_entity {
+ type: simulation
+ }
+
+ test_entity - satisfies -> test_req`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: `element customElement {
+ type: customType
+ docref: customDocRef
+ }`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "a requirement with high risk",
+ content: `functionalRequirement myReq {
+ id: reqId
+ text: someText
+ risk: High
+ verifymethod: analysis
+ }`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: `interfaceRequirement myReq2 {
+ id: reqId
+ text: someText
+ risk: Medium
+ verifymethod: demonstration
+ }`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: `designConstraint myReq3 {
+ id: reqId
+ text: someText
+ risk: Low
+ verifymethod: test
+ }`,
+ sortingOrder: 4,
+ isPinned: false
+ }
+];
+
+// src/elements/sankeyDiagram.ts
+var sankeyDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "sankeyDiagram",
+ description: "",
+ content: `sankey-beta
+ %% source,target,value
+ Electricity grid,Over generation / exports,104.453
+ Electricity grid,Heating and cooling - homes,113.726
+ Electricity grid,H2 conversion,27.14`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/sequenceDiagram.ts
+var sequenceDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "sequenceDiagram",
+ description: "a simple sequence diagram",
+ content: `sequenceDiagram
+Alice->>John: Hello John, how are you?
+John-->>Alice: Great!
+Alice-)John: See you later!`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "sequenceDiagram",
+ description: "a simple sequence diagram with actors",
+ content: `sequenceDiagram
+actor Alice
+actor John
+Alice->>John: Hello John, how are you?
+John-->>Alice: Great!
+Alice-)John: See you later!`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/stateDiagram.ts
+var stateDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a sample state diagram",
+ content: `stateDiagram-v2
+ [*] --> Still
+ Still --> [*]
+
+ Still --> Moving
+ Moving --> Still
+ Moving --> Crash
+ Crash --> [*]`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a sample state diagram with left-to-right direction",
+ content: `stateDiagram-v2
+ direction LR
+ [*] --> Still
+ Still --> [*]
+
+ Still --> Moving
+ Moving --> Still
+ Moving --> Crash
+ Crash --> [*]`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "node with description",
+ content: `s2 : This is a state description`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a transition",
+ content: `s1 --> s2`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a transition with label",
+ content: `s1 --> s2: A transition`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "composite state",
+ content: `
+ [*] --> First
+ state First {
+ [*] --> second
+ second --> [*]
+ }`,
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "diagram with choice",
+ content: `stateDiagram-v2
+ state if_state <>
+ [*] --> IsPositive
+ IsPositive --> if_state
+ if_state --> False: if n < 0
+ if_state --> True : if n >= 0`,
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "diagram with fork",
+ content: `stateDiagram-v2
+ state fork_state <>
+ [*] --> fork_state
+ fork_state --> State2
+ fork_state --> State3
+
+ state join_state <>
+ State2 --> join_state
+ State3 --> join_state
+ join_state --> State4
+ State4 --> [*]`,
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a diagram with concurrency",
+ content: `stateDiagram-v2
+ [*] --> Active
+
+ state Active {
+ [*] --> NumLockOff
+ NumLockOff --> NumLockOn : EvNumLockPressed
+ NumLockOn --> NumLockOff : EvNumLockPressed
+ --
+ [*] --> CapsLockOff
+ CapsLockOff --> CapsLockOn : EvCapsLockPressed
+ CapsLockOn --> CapsLockOff : EvCapsLockPressed
+ --
+ [*] --> ScrollLockOff
+ ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
+ ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
+ }`,
+ sortingOrder: 8,
+ isPinned: false
+ }
+];
+
+// src/elements/timeline.ts
+var timelineElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "timeline",
+ description: "sample timeline",
+ content: `timeline
+ title History of Social Media Platform
+ 2002 : LinkedIn
+ 2004 : Facebook
+ : Google
+ 2005 : Youtube
+ 2006 : Twitter`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "timeline",
+ description: "timeline with grouping",
+ content: `timeline
+ title Timeline of Industrial Revolution
+ section 17th-20th century
+ Industry 1.0 : Machinery, Water power, Steam
power
+ Industry 2.0 : Electricity, Internal combustion engine, Mass production
+ Industry 3.0 : Electronics, Computers, Automation
+ section 21st century
+ Industry 4.0 : Internet, Robotics, Internet of Things
+ Industry 5.0 : Artificial intelligence, Big data,3D printing`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "timeline",
+ description: "timeline with Forest theme. see the docs for additional themes",
+ content: `%%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%%
+ timeline
+ title History of Social Media Platform
+ 2002 : LinkedIn
+ 2004 : Facebook : Google
+ 2005 : Youtube
+ 2006 : Twitter
+ 2007 : Tumblr
+ 2008 : Instagram
+ 2010 : Pinterest`,
+ sortingOrder: 3,
+ isPinned: false
+ }
+];
+
+// src/elements/userJourneyDiagram.ts
+var userJourneyDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "userJourneyDiagram",
+ description: "a sample user journey diagram",
+ content: `journey
+ title My working day
+ section Go to work
+ Make tea: 5: Me
+ Go upstairs: 3: Me
+ Do work: 1: Me, Cat
+ section Go home
+ Go downstairs: 5: Me
+ Sit down: 5: Me`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "userJourneyDiagram",
+ description: "a step in user journey",
+ content: ` Step Title: 5: ActorName`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/xyChart.ts
+var xyChartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "xyChart",
+ description: "a sample XYChart diagram",
+ content: `xychart-beta
+ title "Sales Revenue"
+ x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
+ y-axis "Revenue (in $)" 4000 --> 11000
+ bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
+ line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/defaultElements.ts
+var defaultElements = [
+ ...flowchartElements,
+ ...sequenceDiagramElements,
+ ...classDiagramElements,
+ ...stateDiagramElements,
+ ...entityRelationshipDiagramElements,
+ ...userJourneyDiagramElements,
+ ...ganttChartElements,
+ ...pieChartElements,
+ ...requirementDiagramElements,
+ ...gitGraphElements,
+ ...mindMapElements,
+ ...timelineElements,
+ ...quadrantElements,
+ ...c4DiagramElements,
+ ...sankeyDiagramElements,
+ ...xyChartElements,
+ ...packetElements,
+ ...kanbanElements,
+ ...blockDiagramElements,
+ ...architectureElements
+];
+
+// src/core/defaultCategories.ts
+var DEFAULT_CATEGORIES = [
+ {
+ id: "flowchart",
+ name: "Flowchart",
+ defaultWrapping: "flowchart LR",
+ wrappings: ["flowchart LR", "flowchart TD"],
+ isCustom: false,
+ sortOrder: 0
+ },
+ {
+ id: "sequenceDiagram",
+ name: "SequenceDiagram",
+ defaultWrapping: "sequenceDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 1
+ },
+ {
+ id: "classDiagram",
+ name: "ClassDiagram",
+ defaultWrapping: "classDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 2
+ },
+ {
+ id: "stateDiagram",
+ name: "StateDiagram",
+ defaultWrapping: "stateDiagram-v2",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 3
+ },
+ {
+ id: "entityRelationshipDiagram",
+ name: "EntityRelationshipDiagram",
+ defaultWrapping: "erDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 4
+ },
+ {
+ id: "userJourneyDiagram",
+ name: "UserJourneyDiagram",
+ defaultWrapping: "journey",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 5
+ },
+ {
+ id: "ganttChart",
+ name: "GanttChart",
+ defaultWrapping: "gantt",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 6
+ },
+ {
+ id: "pieChart",
+ name: "PieChart",
+ defaultWrapping: "pie",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 7
+ },
+ {
+ id: "requirementDiagram",
+ name: "RequirementDiagram",
+ defaultWrapping: "requirementDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 8
+ },
+ {
+ id: "gitGraph",
+ name: "GitGraph",
+ defaultWrapping: "gitGraph",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 9
+ },
+ {
+ id: "mindmap",
+ name: "Mindmap",
+ defaultWrapping: "mindmap",
+ wrappings: ["mindmap"],
+ isCustom: false,
+ sortOrder: 10
+ },
+ {
+ id: "timeline",
+ name: "Timeline",
+ defaultWrapping: "timeline",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 11
+ },
+ {
+ id: "c4Diagram",
+ name: "C4Diagram",
+ defaultWrapping: "C4Context",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 12
+ },
+ {
+ id: "quadrantChart",
+ name: "QuadrantChart",
+ defaultWrapping: "quadrantChart",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 13
+ },
+ {
+ id: "sankeyDiagram",
+ name: "SankeyDiagram",
+ defaultWrapping: "sankey-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 14
+ },
+ {
+ id: "xyChart",
+ name: "XyChart",
+ defaultWrapping: "xychart-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 15
+ },
+ {
+ id: "kanban",
+ name: "Kanban",
+ defaultWrapping: "kanban",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 16
+ },
+ {
+ id: "architecture",
+ name: "Architecture",
+ defaultWrapping: "architecture-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 17
+ },
+ {
+ id: "block",
+ name: "Block",
+ defaultWrapping: "block-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 18
+ },
+ {
+ id: "packet",
+ name: "Packet",
+ defaultWrapping: "packet-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 19
+ }
+];
+
+// src/core/categoryService.ts
+var CategoryService = class {
+ constructor() {
+ this.categories = [];
+ this.categories = [...DEFAULT_CATEGORIES];
+ }
+ static getInstance() {
+ if (!CategoryService.instance) {
+ CategoryService.instance = new CategoryService();
+ }
+ return CategoryService.instance;
+ }
+ getCategories() {
+ return [...this.categories].sort((a, b) => a.sortOrder - b.sortOrder);
+ }
+ getCategoryById(id) {
+ return this.categories.find((cat) => cat.id === id);
+ }
+ getCategoryByName(name) {
+ return this.categories.find((cat) => cat.name === name);
+ }
+ addCategory(category) {
+ if (this.categories.some((cat) => cat.id === category.id)) {
+ throw new Error(`Category with ID '${category.id}' already exists`);
+ }
+ this.categories.push(category);
+ }
+ updateCategory(category) {
+ const index = this.categories.findIndex((cat) => cat.id === category.id);
+ if (index === -1) {
+ throw new Error(`Category with ID '${category.id}' not found`);
+ }
+ this.categories[index] = category;
+ }
+ deleteCategory(id) {
+ var _a;
+ if (!((_a = this.getCategoryById(id)) == null ? void 0 : _a.isCustom)) {
+ throw new Error("Cannot delete default categories");
+ }
+ this.categories = this.categories.filter((cat) => cat.id !== id);
+ }
+ loadCategories(customCategories, defaultCategorySortOrders = {}) {
+ const defaultCategories = DEFAULT_CATEGORIES.map((cat) => ({
+ ...cat,
+ sortOrder: defaultCategorySortOrders[cat.id] !== void 0 ? defaultCategorySortOrders[cat.id] : cat.sortOrder
+ }));
+ const customCats = customCategories.filter((cat) => cat.isCustom);
+ this.categories = [...defaultCategories, ...customCats];
+ }
+ getCustomCategories() {
+ return this.categories.filter((cat) => cat.isCustom);
+ }
+ getWrappingData(categoryId) {
+ var _a;
+ const category = this.getCategoryById(categoryId);
+ if (!category)
+ return null;
+ return {
+ defaultWrapping: category.defaultWrapping,
+ wrappings: (_a = category.wrappings) != null ? _a : null
+ };
+ }
+ getNextSortOrder() {
+ return Math.max(...this.categories.map((cat) => cat.sortOrder), -1) + 1;
+ }
+};
+
+// src/core/elementService.ts
+var MermaidElementService = class {
+ constructor() {
+ this.categoryService = CategoryService.getInstance();
+ }
+ static DefaultElements() {
+ return defaultElements;
+ }
+ saveElement(element, plugin) {
+ const elementExists = plugin.settings.elements.some((el) => el.id === element.id);
+ if (elementExists) {
+ const index = plugin.settings.elements.findIndex((el) => el.id === element.id);
+ if (index !== -1) {
+ plugin.settings.elements[index] = element;
+ }
+ } else {
+ this.fixSortOrder(element, plugin);
+ plugin.settings.elements.push(element);
+ }
+ plugin.saveSettings();
+ }
+ fixSortOrder(element, plugin) {
+ const elementsFromSameCategory = plugin.settings.elements.filter((el) => el.categoryId === element.categoryId);
+ if (elementsFromSameCategory.some((el) => el.sortingOrder === element.sortingOrder)) {
+ element.sortingOrder = elementsFromSameCategory.length;
+ }
+ }
+ getSampleDiagram(categoryId) {
+ const category = this.categoryService.getCategoryById(categoryId);
+ if (!category) {
+ console.warn(`[Mermaid Tools] No category found for ID: ${categoryId}, using default sample`);
+ return this.wrapForPastingIntoEditor(this.wrapWithMermaidBlock("flowchart TD\nStart --> End"));
+ }
+ const sampleKey = category.name;
+ const sample = sampleDiagrams[sampleKey];
+ if (sample) {
+ return this.wrapForPastingIntoEditor(this.wrapWithMermaidBlock(sample));
+ }
+ console.warn(`[Mermaid Tools] No sample diagram found for category: ${category.name}, using default sample`);
+ return this.wrapForPastingIntoEditor(this.wrapWithMermaidBlock("flowchart TD\nStart --> End"));
+ }
+ wrapForPastingIntoEditor(text) {
+ return `${text}
+`;
+ }
+ wrapWithMermaidBlock(text) {
+ return `\`\`\`mermaid
+${text}
+\`\`\``;
+ }
+ wrapAsCompleteDiagram(element) {
+ const wrapping = this.categoryService.getWrappingData(element.categoryId);
+ if (!wrapping) {
+ console.warn(`[Mermaid Tools] No wrapping data found for category: ${element.categoryId}`);
+ return element.content;
+ }
+ const contentAlreadyWrapped = wrapping.wrappings ? wrapping.wrappings.some((w) => element.content.contains(w)) : element.content.contains(wrapping.defaultWrapping);
+ if (contentAlreadyWrapped) {
+ return element.content;
+ }
+ const wrappedContent = wrapping.defaultWrapping + "\n" + element.content;
+ const firstWord = wrapping.defaultWrapping.trim().split(/\s+/)[0];
+ const validDiagramTypes = [
+ "flowchart",
+ "graph",
+ "sequenceDiagram",
+ "classDiagram",
+ "stateDiagram-v2",
+ "erDiagram",
+ "journey",
+ "gantt",
+ "pie",
+ "requirementDiagram",
+ "gitGraph",
+ "mindmap",
+ "timeline",
+ "quadrantChart",
+ "C4Context",
+ "sankey-beta",
+ "xychart-beta",
+ "packet-beta",
+ "kanban",
+ "block-beta",
+ "architecture-beta"
+ ];
+ if (!validDiagramTypes.includes(firstWord)) {
+ console.warn(`[Mermaid Tools] Potentially invalid diagram type "${firstWord}" in category ${element.categoryId}. This may cause rendering errors.`);
+ }
+ return wrappedContent;
+ }
+};
+
+// src/core/textEditorService.ts
+var NoActiveCursorError = class extends Error {
+ constructor() {
+ super();
+ this.message = "Mermaid Tools: Error getting cursor position. Make sure you are in editing mode and have an active cursor in file content.";
+ }
+};
+var TextEditorService = class {
+ constructor() {
+ this._elementService = new MermaidElementService();
+ }
+ insertTextAtCursor(editor, content) {
+ if (!editor)
+ throw new NoActiveCursorError();
+ content = this._elementService.wrapForPastingIntoEditor(content);
+ const cursor = editor.getCursor();
+ editor.replaceRange(content, cursor);
+ const lines = content.split("\n");
+ const newCursor = {
+ line: cursor.line + lines.length - 1,
+ ch: lines.length === 1 ? cursor.ch + lines[0].length : lines[lines.length - 1].length
+ };
+ editor.setCursor(newCursor);
+ editor.focus();
+ }
+};
+
+// src/settings/settings.ts
+var MermaidPluginSettings = class {
+ static DefaultSettings() {
+ const settings = new MermaidPluginSettings();
+ settings.elements = defaultElements;
+ settings.customCategories = [];
+ settings.selectedCategoryId = "flowchart";
+ settings.defaultCategorySortOrders = {};
+ settings.categoryModifications = {};
+ return settings;
+ }
+};
+
+// src/trident-icon.ts
+var import_obsidian = require("obsidian");
+function addTridentIcon() {
+ (0, import_obsidian.addIcon)(TRIDENT_ICON_NAME, getSanitizedSvg());
+}
+function getSanitizedSvg() {
+ var sanitized = (0, import_obsidian.sanitizeHTMLToDom)(tridentIcon);
+ var tempContainer = createDiv();
+ tempContainer.appendChild(sanitized);
+ return tempContainer.innerHTML;
+}
+var tridentIcon = ``;
+
+// src/ui/settingsTab.ts
+var import_obsidian4 = require("obsidian");
+
+// src/ui/editMermaidElementModal.ts
+var import_obsidian2 = require("obsidian");
+var EditMermaidElementModal = class extends import_obsidian2.Modal {
+ constructor(app, _plugin, _mermaid, _element, _categoryService) {
+ super(app);
+ this._plugin = _plugin;
+ this._mermaid = _mermaid;
+ this._element = _element;
+ this._categoryService = _categoryService;
+ }
+ async onOpen() {
+ const { contentEl } = this;
+ contentEl.addClass("mermaid-tools-edit-element-modal");
+ contentEl.createEl("h2", { text: "Edit element" });
+ const renderContainerEl = contentEl.createDiv();
+ const renderEl = renderContainerEl.createEl("pre", { text: "rendered diagram" });
+ if (!this._mermaid)
+ this._mermaid = await (0, import_obsidian2.loadMermaid)();
+ renderEl.id = "mermaid-edit-element-modal";
+ const elementCategoryContainerEl = contentEl.createDiv();
+ elementCategoryContainerEl.createEl("label", { text: "Category" });
+ const elementCategoryEl = elementCategoryContainerEl.createEl("select");
+ const categories = this._categoryService.getCategories();
+ for (const category of categories) {
+ const option = elementCategoryEl.createEl("option", { text: category.name });
+ option.value = category.id;
+ }
+ elementCategoryEl.value = this._element.categoryId;
+ elementCategoryEl.onchange = (e) => {
+ this._element.categoryId = elementCategoryEl.value;
+ };
+ const elementDescriptionContainerEl = contentEl.createDiv();
+ elementDescriptionContainerEl.createEl("label", { text: "Description" });
+ const elementDescriptionEl = elementDescriptionContainerEl.createEl("input", { value: this._element.description, type: "text" });
+ elementDescriptionEl.style.minWidth = "50%";
+ elementDescriptionEl.onchange = (e) => {
+ this._element.description = elementDescriptionEl.value;
+ };
+ const elementContentContainerEl = contentEl.createDiv();
+ elementContentContainerEl.createEl("label", { text: "Content" });
+ const elementContentEl = elementContentContainerEl.createEl("textarea", { text: this._element.content });
+ elementContentEl.style.height = "200px";
+ elementContentEl.style.width = "100%";
+ elementContentEl.onchange = async (e) => {
+ this._element.content = elementContentEl.value;
+ const { svg: svg2 } = await this._mermaid.render(renderEl.id, this._plugin._mermaidElementService.wrapAsCompleteDiagram(this._element));
+ renderEl.innerHTML = svg2;
+ renderContainerEl.appendChild(renderEl);
+ };
+ const saveButtonEl = contentEl.createEl("button", { text: "Save" });
+ saveButtonEl.onclick = (e) => {
+ this.save();
+ };
+ const { svg } = await this._mermaid.render(renderEl.id, this._plugin._mermaidElementService.wrapAsCompleteDiagram(this._element));
+ renderEl.innerHTML = svg;
+ renderContainerEl.appendChild(renderEl);
+ }
+ save() {
+ this._plugin._mermaidElementService.saveElement(this._element, this._plugin);
+ this.close();
+ }
+};
+
+// src/ui/editCategoryModal.ts
+var import_obsidian3 = require("obsidian");
+var EditCategoryModal = class extends import_obsidian3.Modal {
+ constructor(app, plugin, existingCategory, onSave) {
+ super(app);
+ this.plugin = plugin;
+ this.categoryService = CategoryService.getInstance();
+ this.onSave = onSave;
+ this.isNewCategory = !existingCategory;
+ if (existingCategory) {
+ this.category = { ...existingCategory };
+ } else {
+ this.category = {
+ id: "",
+ name: "",
+ defaultWrapping: "",
+ wrappings: null,
+ isCustom: true,
+ sortOrder: this.categoryService.getNextSortOrder()
+ };
+ }
+ }
+ onOpen() {
+ const { contentEl } = this;
+ contentEl.addClass("mermaid-tools-edit-category-modal");
+ contentEl.createEl("h2", {
+ text: this.isNewCategory ? "Create Custom Category" : "Edit Category"
+ });
+ new import_obsidian3.Setting(contentEl).setName("Category ID").setDesc("Unique identifier for this category (lowercase, no spaces)").addText((text) => text.setPlaceholder("my-custom-category").setValue(this.category.id).onChange((value) => {
+ this.category.id = value.toLowerCase().replace(/\s+/g, "-");
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Category Name").setDesc("Display name for this category").addText((text) => text.setPlaceholder("My Custom Category").setValue(this.category.name).onChange((value) => {
+ this.category.name = value;
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Default Wrapping").setDesc('Default mermaid syntax to wrap elements (e.g., "flowchart TD", "sequenceDiagram")').addText((text) => text.setPlaceholder("flowchart TD").setValue(this.category.defaultWrapping).onChange((value) => {
+ this.category.defaultWrapping = value;
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Additional Wrappings (Optional)").setDesc('Comma-separated list of alternative wrappings (e.g., "flowchart LR, flowchart TB")').addText((text) => text.setPlaceholder("flowchart LR, flowchart TB").setValue(this.category.wrappings ? this.category.wrappings.join(", ") : "").onChange((value) => {
+ if (value.trim()) {
+ this.category.wrappings = value.split(",").map((w) => w.trim()).filter((w) => w);
+ } else {
+ this.category.wrappings = null;
+ }
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Sort Order").setDesc("Determines the order in which categories appear").addText((text) => text.setPlaceholder("0").setValue(this.category.sortOrder.toString()).onChange((value) => {
+ const num = parseInt(value);
+ if (!isNaN(num)) {
+ this.category.sortOrder = num;
+ }
+ }));
+ const buttonContainer = contentEl.createDiv("modal-button-container");
+ buttonContainer.style.display = "flex";
+ buttonContainer.style.justifyContent = "flex-end";
+ buttonContainer.style.gap = "10px";
+ buttonContainer.style.marginTop = "20px";
+ const cancelButton = buttonContainer.createEl("button", { text: "Cancel" });
+ cancelButton.onclick = () => this.close();
+ const saveButton = buttonContainer.createEl("button", {
+ text: this.isNewCategory ? "Create" : "Save",
+ cls: "mod-cta"
+ });
+ saveButton.onclick = () => this.save();
+ }
+ save() {
+ if (!this.category.id.trim()) {
+ alert("Category ID is required");
+ return;
+ }
+ if (!this.category.name.trim()) {
+ alert("Category name is required");
+ return;
+ }
+ if (!this.category.defaultWrapping.trim()) {
+ alert("Default wrapping is required");
+ return;
+ }
+ const commonDiagramTypes = [
+ "flowchart",
+ "graph",
+ "sequenceDiagram",
+ "classDiagram",
+ "stateDiagram-v2",
+ "erDiagram",
+ "journey",
+ "gantt",
+ "pie",
+ "requirementDiagram",
+ "gitGraph",
+ "mindmap",
+ "timeline",
+ "quadrantChart",
+ "C4Context",
+ "sankey-beta",
+ "xychart-beta",
+ "packet-beta",
+ "kanban",
+ "block-beta",
+ "architecture-beta"
+ ];
+ const wrapping = this.category.defaultWrapping.trim().split(/\s+/)[0];
+ if (!commonDiagramTypes.includes(wrapping)) {
+ const shouldContinue = confirm(`Warning: "${wrapping}" is not a recognized Mermaid diagram type. This may cause rendering errors. Are you sure you want to continue?`);
+ if (!shouldContinue) {
+ return;
+ }
+ }
+ if (this.isNewCategory && this.categoryService.getCategoryById(this.category.id)) {
+ alert(`A category with ID '${this.category.id}' already exists`);
+ return;
+ }
+ try {
+ this.onSave(this.category);
+ this.close();
+ } catch (error) {
+ alert(`Error saving category: ${error.message}`);
+ }
+ }
+};
+
+// src/ui/settingsTab.ts
+var MermaidToolsSettingsTab = class extends import_obsidian4.PluginSettingTab {
+ constructor(_app, _plugin) {
+ super(_app, _plugin);
+ this._app = _app;
+ this._plugin = _plugin;
+ }
+ async display() {
+ await renderSettings(this.containerEl, this._plugin);
+ }
+};
+async function renderSettings(containerEl, plugin) {
+ const mermaid = await (0, import_obsidian4.loadMermaid)();
+ const categoryService = CategoryService.getInstance();
+ categoryService.loadCategories(plugin.settings.customCategories, plugin.settings.defaultCategorySortOrders);
+ containerEl.empty();
+ containerEl.createEl("h1", { text: "Mermaid Tools Settings" });
+ containerEl.createEl("h2", { text: "Manage Elements & Categories" });
+ const buttonsContainer = containerEl.createDiv();
+ buttonsContainer.style.marginBottom = "20px";
+ buttonsContainer.style.display = "flex";
+ buttonsContainer.style.gap = "10px";
+ const addElementButton = buttonsContainer.createEl("button", { text: "Add Element" });
+ addElementButton.addClass("mod-cta");
+ addElementButton.onclick = () => {
+ const newElement = {
+ id: crypto.randomUUID(),
+ description: "New element",
+ content: `flowchart TD
+Start --> Stop`,
+ categoryId: "flowchart",
+ sortingOrder: 0,
+ isPinned: false
+ };
+ const modal = new EditMermaidElementModal(plugin.app, plugin, mermaid, newElement, categoryService);
+ modal.open();
+ modal.onClose = () => {
+ renderSettings(containerEl, plugin);
+ };
+ };
+ const addCategoryButton = buttonsContainer.createEl("button", { text: "Add Category" });
+ addCategoryButton.addClass("mod-cta");
+ addCategoryButton.onclick = () => {
+ const modal = new EditCategoryModal(plugin.app, plugin, null, (category) => {
+ try {
+ if (category.sortOrder === void 0 || category.sortOrder === null) {
+ category.sortOrder = categoryService.getNextSortOrder();
+ }
+ categoryService.addCategory(category);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ } catch (error) {
+ console.error("Error adding category:", error);
+ }
+ });
+ modal.open();
+ };
+ createIntegratedCategorySection(containerEl, plugin, categoryService, mermaid);
+}
+function saveAllCategoryChanges(plugin, categoryService) {
+ plugin.settings.customCategories = categoryService.getCustomCategories();
+ const defaultCategories = categoryService.getCategories().filter((cat) => !cat.isCustom);
+ defaultCategories.forEach((cat) => {
+ plugin.settings.defaultCategorySortOrders[cat.id] = cat.sortOrder;
+ });
+ plugin.saveSettings();
+}
+function createIntegratedCategorySection(containerEl, plugin, categoryService, mermaid) {
+ const allCategories = categoryService.getCategories().sort((a, b) => a.sortOrder - b.sortOrder);
+ allCategories.forEach((category) => {
+ const categoryContainer = containerEl.createDiv();
+ categoryContainer.addClass("mermaid-tools-category-section");
+ categoryContainer.style.marginBottom = "20px";
+ categoryContainer.style.border = "1px solid var(--background-modifier-border)";
+ categoryContainer.style.borderRadius = "8px";
+ categoryContainer.style.padding = "15px";
+ const categoryHeader = categoryContainer.createDiv();
+ categoryHeader.style.display = "flex";
+ categoryHeader.style.alignItems = "center";
+ categoryHeader.style.justifyContent = "space-between";
+ categoryHeader.style.marginBottom = "10px";
+ categoryHeader.style.cursor = "pointer";
+ const categoryTitle = categoryHeader.createDiv();
+ categoryTitle.style.display = "flex";
+ categoryTitle.style.alignItems = "center";
+ categoryTitle.style.gap = "10px";
+ const expandIcon = categoryTitle.createSpan();
+ expandIcon.innerHTML = "\u25BC";
+ expandIcon.style.fontSize = "12px";
+ expandIcon.style.transition = "transform 0.2s";
+ const categoryName = categoryTitle.createEl("h3", { text: category.name });
+ categoryName.style.margin = "0";
+ categoryName.style.fontSize = "16px";
+ const categoryInfo = categoryTitle.createSpan();
+ const elementCount = plugin.settings.elements.filter((el) => el.categoryId === category.id).length;
+ categoryInfo.textContent = `(${elementCount} elements)`;
+ categoryInfo.style.color = "var(--text-muted)";
+ categoryInfo.style.fontSize = "12px";
+ const categoryControls = categoryHeader.createDiv();
+ categoryControls.style.display = "flex";
+ categoryControls.style.gap = "2px";
+ const addElementButton = categoryControls.createEl("button");
+ addElementButton.title = "Add element to this category";
+ addElementButton.style.background = "none";
+ addElementButton.style.border = "none";
+ addElementButton.style.cursor = "pointer";
+ addElementButton.style.padding = "4px";
+ addElementButton.style.display = "flex";
+ addElementButton.style.alignItems = "center";
+ addElementButton.style.borderRadius = "3px";
+ addElementButton.innerHTML = ``;
+ addElementButton.onmouseenter = () => addElementButton.style.backgroundColor = "var(--background-modifier-hover)";
+ addElementButton.onmouseleave = () => addElementButton.style.backgroundColor = "transparent";
+ addElementButton.onclick = (e) => {
+ e.stopPropagation();
+ const newElement = {
+ id: crypto.randomUUID(),
+ description: "New element",
+ content: `flowchart TD
+Start --> Stop`,
+ categoryId: category.id,
+ sortingOrder: plugin.settings.elements.filter((el) => el.categoryId === category.id).length,
+ isPinned: false
+ };
+ const modal = new EditMermaidElementModal(plugin.app, plugin, mermaid, newElement, categoryService);
+ modal.open();
+ modal.onClose = () => {
+ renderSettings(containerEl, plugin);
+ };
+ };
+ const moveUpButton = categoryControls.createEl("button");
+ moveUpButton.title = "Move category up";
+ moveUpButton.style.background = "none";
+ moveUpButton.style.border = "none";
+ moveUpButton.style.cursor = "pointer";
+ moveUpButton.style.padding = "4px";
+ moveUpButton.style.display = "flex";
+ moveUpButton.style.alignItems = "center";
+ moveUpButton.style.borderRadius = "3px";
+ moveUpButton.innerHTML = ``;
+ moveUpButton.onmouseenter = () => moveUpButton.style.backgroundColor = "var(--background-modifier-hover)";
+ moveUpButton.onmouseleave = () => moveUpButton.style.backgroundColor = "transparent";
+ moveUpButton.onclick = (e) => {
+ e.stopPropagation();
+ const categories = categoryService.getCategories().sort((a, b) => a.sortOrder - b.sortOrder);
+ const currentIndex = categories.findIndex((cat) => cat.id === category.id);
+ if (currentIndex > 0) {
+ const temp = categories[currentIndex - 1].sortOrder;
+ categories[currentIndex - 1].sortOrder = category.sortOrder;
+ category.sortOrder = temp;
+ categoryService.updateCategory(categories[currentIndex - 1]);
+ categoryService.updateCategory(category);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ }
+ };
+ const moveDownButton = categoryControls.createEl("button");
+ moveDownButton.title = "Move category down";
+ moveDownButton.style.background = "none";
+ moveDownButton.style.border = "none";
+ moveDownButton.style.cursor = "pointer";
+ moveDownButton.style.padding = "4px";
+ moveDownButton.style.display = "flex";
+ moveDownButton.style.alignItems = "center";
+ moveDownButton.style.borderRadius = "3px";
+ moveDownButton.innerHTML = ``;
+ moveDownButton.onmouseenter = () => moveDownButton.style.backgroundColor = "var(--background-modifier-hover)";
+ moveDownButton.onmouseleave = () => moveDownButton.style.backgroundColor = "transparent";
+ moveDownButton.onclick = (e) => {
+ e.stopPropagation();
+ const categories = categoryService.getCategories().sort((a, b) => a.sortOrder - b.sortOrder);
+ const currentIndex = categories.findIndex((cat) => cat.id === category.id);
+ if (currentIndex < categories.length - 1) {
+ const temp = categories[currentIndex + 1].sortOrder;
+ categories[currentIndex + 1].sortOrder = category.sortOrder;
+ category.sortOrder = temp;
+ categoryService.updateCategory(categories[currentIndex + 1]);
+ categoryService.updateCategory(category);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ }
+ };
+ const editButton = categoryControls.createEl("button");
+ editButton.title = "Edit category";
+ editButton.style.background = "none";
+ editButton.style.border = "none";
+ editButton.style.cursor = "pointer";
+ editButton.style.padding = "4px";
+ editButton.style.display = "flex";
+ editButton.style.alignItems = "center";
+ editButton.style.borderRadius = "3px";
+ editButton.innerHTML = ``;
+ editButton.onmouseenter = () => editButton.style.backgroundColor = "var(--background-modifier-hover)";
+ editButton.onmouseleave = () => editButton.style.backgroundColor = "transparent";
+ editButton.onclick = (e) => {
+ e.stopPropagation();
+ const modal = new EditCategoryModal(plugin.app, plugin, category, (updatedCategory) => {
+ try {
+ categoryService.updateCategory(updatedCategory);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ } catch (error) {
+ console.error("Error updating category:", error);
+ }
+ });
+ modal.open();
+ };
+ const deleteButton = categoryControls.createEl("button");
+ deleteButton.title = "Delete category";
+ deleteButton.style.background = "none";
+ deleteButton.style.border = "none";
+ deleteButton.style.cursor = "pointer";
+ deleteButton.style.padding = "4px";
+ deleteButton.style.display = "flex";
+ deleteButton.style.alignItems = "center";
+ deleteButton.style.borderRadius = "3px";
+ deleteButton.innerHTML = ``;
+ deleteButton.onmouseenter = () => deleteButton.style.backgroundColor = "var(--background-modifier-hover)";
+ deleteButton.onmouseleave = () => deleteButton.style.backgroundColor = "transparent";
+ deleteButton.onclick = (e) => {
+ e.stopPropagation();
+ const elementsInCategory = plugin.settings.elements.filter((el) => el.categoryId === category.id);
+ if (elementsInCategory.length > 0) {
+ alert(`Cannot delete category '${category.name}' because it contains ${elementsInCategory.length} element(s). Please move or delete these elements first.`);
+ return;
+ }
+ const confirmMessage = category.isCustom ? `Are you sure you want to delete the category '${category.name}'?` : `Are you sure you want to delete the default category '${category.name}'? This action cannot be undone.`;
+ if (confirm(confirmMessage)) {
+ try {
+ categoryService.deleteCategory(category.id);
+ if (category.isCustom) {
+ plugin.settings.customCategories = categoryService.getCustomCategories();
+ }
+ plugin.saveSettings();
+ renderSettings(containerEl, plugin);
+ } catch (error) {
+ console.error("Error deleting category:", error);
+ if (!category.isCustom) {
+ alert(`Cannot delete default category: ${error.message}`);
+ }
+ }
+ }
+ };
+ const elementsContainer = categoryContainer.createDiv();
+ elementsContainer.addClass("mermaid-tools-elements-container");
+ elementsContainer.style.display = "none";
+ let isCollapsed = true;
+ categoryHeader.onclick = () => {
+ isCollapsed = !isCollapsed;
+ elementsContainer.style.display = isCollapsed ? "none" : "block";
+ expandIcon.style.transform = isCollapsed ? "rotate(-90deg)" : "rotate(0deg)";
+ };
+ expandIcon.style.transform = "rotate(-90deg)";
+ renderCategoryElements(category, plugin, elementsContainer, mermaid, categoryService);
+ });
+}
+function renderCategoryElements(category, plugin, parentEl, mermaid, categoryService) {
+ const elements = plugin.settings.elements.filter((e) => e.categoryId === category.id).sort((a, b) => a.sortingOrder - b.sortingOrder);
+ if (elements.length === 0) {
+ const emptyMessage = parentEl.createDiv();
+ emptyMessage.textContent = "No elements in this category";
+ emptyMessage.style.color = "var(--text-muted)";
+ emptyMessage.style.fontStyle = "italic";
+ emptyMessage.style.padding = "10px";
+ return;
+ }
+ elements.forEach((element, index) => {
+ const settingContainer = parentEl.createDiv("mermaid-tools-element-container");
+ settingContainer.style.marginBottom = "10px";
+ settingContainer.style.padding = "10px";
+ settingContainer.style.backgroundColor = "var(--background-secondary)";
+ settingContainer.style.borderRadius = "5px";
+ const setting = new import_obsidian4.Setting(settingContainer);
+ setting.setName(element.description);
+ setting.addExtraButton((cb) => {
+ cb.setIcon("edit").setTooltip("edit element").onClick(() => {
+ const modal = new EditMermaidElementModal(plugin.app, plugin, mermaid, element, categoryService);
+ modal.open();
+ modal.onClose = () => {
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ };
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("copy").setTooltip("create a duplicate of this element").onClick(() => {
+ const duplicate = {
+ id: crypto.randomUUID(),
+ categoryId: element.categoryId,
+ description: element.description + " (copy)",
+ content: element.content,
+ sortingOrder: plugin.settings.elements.filter((el) => el.categoryId === element.categoryId).length,
+ isPinned: element.isPinned
+ };
+ plugin._mermaidElementService.saveElement(duplicate, plugin);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("arrow-up").setTooltip("move element up in the sidebar").onClick(() => {
+ if (index > 0) {
+ const temp = elements[index - 1].sortingOrder;
+ elements[index - 1].sortingOrder = element.sortingOrder;
+ element.sortingOrder = temp;
+ plugin.settings.elements = plugin.settings.elements.filter((el) => el.categoryId !== category.id).concat(elements);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ }
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("arrow-down").setTooltip("move element down in the sidebar").onClick(() => {
+ if (index < elements.length - 1) {
+ const temp = elements[index + 1].sortingOrder;
+ elements[index + 1].sortingOrder = element.sortingOrder;
+ element.sortingOrder = temp;
+ plugin.settings.elements = plugin.settings.elements.filter((el) => el.categoryId !== category.id).concat(elements);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ }
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("trash-2").setTooltip("delete element").onClick(() => {
+ plugin.settings.elements = plugin.settings.elements.filter((e) => e.id !== element.id);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ });
+ });
+ });
+}
+
+// src/ui/toolbarView/mermaidToolbarView.ts
+var import_obsidian6 = require("obsidian");
+
+// src/ui/toolbarView/viewHelpers.ts
+var import_obsidian5 = require("obsidian");
+var TOOLBAR_ELEMENT_CLASS_NAME = "mermaid-toolbar-element";
+var TOOLBAR_ELEMENTS_CONTAINER_CLASS_NAME = "mermaid-toolbar-elements-container";
+var TOOLBAR_ELEMENTS_CONTAINER_ID = "mermaid-toolbar-elements-container-id";
+async function createMermaidToolbar(topRowButtons, items, selectedCategoryId, onCategoryChanged, onElementClick, categoryService) {
+ const container = document.createElement("div");
+ const topRow = container.createDiv();
+ topRow.addClass("mermaid-toolbar-top-row");
+ const elementsContainer = container.createDiv();
+ elementsContainer.addClass(TOOLBAR_ELEMENTS_CONTAINER_CLASS_NAME);
+ elementsContainer.setAttr("id", TOOLBAR_ELEMENTS_CONTAINER_ID);
+ createDropdown(topRow, elementsContainer, items, selectedCategoryId, onCategoryChanged, onElementClick, categoryService);
+ createTopRowBtns(topRow, topRowButtons);
+ await recreateElementsSection(elementsContainer, selectedCategoryId, items, onElementClick, categoryService);
+ return container;
+}
+function createTopRowBtns(parentEl, buttons) {
+ buttons.forEach((btn) => {
+ const b = new import_obsidian5.ButtonComponent(parentEl).setClass("clickable-icon").setIcon(btn.iconName).setTooltip(btn.tooltip).onClick(btn.callback);
+ });
+}
+function createDropdown(parentEl, elementsContainer, items, selectedCategoryId, onSelectionChanged, onElClick, categoryService) {
+ const categories = categoryService.getCategories();
+ const dropdown = new import_obsidian5.DropdownComponent(parentEl);
+ categories.forEach((category) => {
+ dropdown.addOption(category.id, category.name);
+ });
+ dropdown.setValue(selectedCategoryId);
+ dropdown.onChange((val) => {
+ onSelectionChanged(val);
+ recreateElementsSection(elementsContainer, val, items, onElClick, categoryService);
+ });
+}
+async function recreateElementsSection(sectionContainer, categoryId, items, onElClick, categoryService) {
+ sectionContainer.innerHTML = "";
+ const elemService = new MermaidElementService();
+ const mermaid = await (0, import_obsidian5.loadMermaid)();
+ const filteredSortedItems = items.filter((i) => i.categoryId === categoryId).sort((a, b) => a.sortingOrder - b.sortingOrder);
+ filteredSortedItems.forEach(async (elem, index) => {
+ const el = createToolbarElement(sectionContainer);
+ el.id = `mermaid-toolbar-element-${elem.categoryId}-${index}`;
+ const diagram = elemService.wrapAsCompleteDiagram(elem);
+ console.log(mermaid.detectType(diagram));
+ const { svg } = await mermaid.render(el.id, diagram);
+ el.title = elem.description;
+ el.innerHTML = svg;
+ el.onclick = (e) => onElClick(elem.content);
+ sectionContainer.appendChild(el);
+ });
+}
+function createToolbarElement(parentEl) {
+ const itemEl = parentEl.createEl("pre");
+ itemEl.addClass(TOOLBAR_ELEMENT_CLASS_NAME);
+ return itemEl;
+}
+
+// src/ui/toolbarView/mermaidToolbarButtons.ts
+var MermaidToolbarButton = class {
+ constructor(tooltip, iconName, callback) {
+ this.tooltip = tooltip;
+ this.iconName = iconName;
+ this.callback = callback;
+ }
+};
+
+// src/ui/toolbarView/mermaidToolbarView.ts
+var _MermaidToolbarView = class extends import_obsidian6.ItemView {
+ constructor(leaf, plugin) {
+ super(leaf);
+ this.topRowButtons = [
+ new MermaidToolbarButton("insert Mermaid code block with sample diagram", "code-2", () => this.insertTextAtCursor(this._plugin._mermaidElementService.getSampleDiagram(this._plugin.settings.selectedCategoryId))),
+ new MermaidToolbarButton("open Mermaid.js documentation web page", "external-link", () => window.open("https://mermaid.js.org/intro/")),
+ new MermaidToolbarButton("open settings", "settings", () => {
+ this.app.setting.open();
+ this.app.setting.openTabById("mermaid-tools");
+ })
+ ];
+ this._plugin = plugin;
+ this.items = plugin.settings.elements;
+ this.categoryService = CategoryService.getInstance();
+ this.categoryService.loadCategories(plugin.settings.customCategories, plugin.settings.defaultCategorySortOrders);
+ this.containerEl.children[1].addClass("mermaid-toolbar-container");
+ }
+ async onOpen() {
+ await this.recreateToolbar(this._plugin.settings.selectedCategoryId);
+ }
+ async onClose() {
+ }
+ async recreateToolbar(selectedCategoryId) {
+ const container = this.containerEl.children[1];
+ container.empty();
+ const toolbarElement = await createMermaidToolbar(this.topRowButtons, this.items, selectedCategoryId, async (newCategoryId) => {
+ this._plugin.settings.selectedCategoryId = newCategoryId;
+ this._plugin.saveSettings();
+ await this.recreateToolbar(this._plugin.settings.selectedCategoryId);
+ }, (text) => this.insertTextAtCursor(text), this.categoryService);
+ container.appendChild(toolbarElement);
+ }
+ insertTextAtCursor(text) {
+ this._plugin.insertTextAtCursor(text);
+ }
+ getViewType() {
+ return _MermaidToolbarView.VIEW_TYPE;
+ }
+ getDisplayText() {
+ return _MermaidToolbarView.VIEW_DESCRIPTION;
+ }
+ getIcon() {
+ return TRIDENT_ICON_NAME;
+ }
+};
+var MermaidToolbarView = _MermaidToolbarView;
+MermaidToolbarView.VIEW_TYPE = "mermaid-toolbar-view";
+MermaidToolbarView.VIEW_DESCRIPTION = "Mermaid Toolbar";
+
+// main.ts
+var TRIDENT_ICON_NAME = "trident-custom";
+var MermaidPlugin = class extends import_obsidian7.Plugin {
+ constructor() {
+ super(...arguments);
+ this._mermaidElementService = new MermaidElementService();
+ this._textEditorService = new TextEditorService();
+ }
+ async onload() {
+ await this.loadSettings();
+ addTridentIcon();
+ this.registerView(MermaidToolbarView.VIEW_TYPE, (leaf) => new MermaidToolbarView(leaf, this));
+ this.app.workspace.on("active-leaf-change", (leaf) => {
+ var _a, _b;
+ this.activeEditor = (_b = (_a = this.app.workspace.activeEditor) == null ? void 0 : _a.editor) != null ? _b : this.activeEditor;
+ });
+ this.addRibbonIcon(TRIDENT_ICON_NAME, "Open Mermaid Toolbar", () => {
+ this.activateView();
+ });
+ this.addCommand({
+ id: "open-toolbar",
+ name: "Open Toolbar View",
+ callback: () => {
+ this.activateView();
+ }
+ });
+ this.addSettingTab(new MermaidToolsSettingsTab(this.app, this));
+ }
+ async onunload() {
+ this.app.workspace.detachLeavesOfType(MermaidToolbarView.VIEW_TYPE);
+ }
+ async loadSettings() {
+ this.settings = Object.assign({}, MermaidPluginSettings.DefaultSettings(), await this.loadData());
+ this.addNewCategories();
+ }
+ addNewCategories() {
+ if (!this.settings.elements.some((x) => x.categoryId === "mindmap")) {
+ this.settings.elements.push(...mindMapElements);
+ console.log("[Mermaid Tools] added Mindmap elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "timeline")) {
+ this.settings.elements.push(...timelineElements);
+ console.log("[Mermaid Tools] added Timeline elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "quadrantChart")) {
+ this.settings.elements.push(...quadrantElements);
+ console.log("[Mermaid Tools] added QuadrantChart elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "c4Diagram")) {
+ this.settings.elements.push(...c4DiagramElements);
+ console.log("[Mermaid Tools] added C4 diagram elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "packet")) {
+ this.settings.elements.push(...packetElements);
+ console.log("[Mermaid Tools] added Packet elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "kanban")) {
+ this.settings.elements.push(...kanbanElements);
+ console.log("[Mermaid Tools] added Kanban elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "block")) {
+ this.settings.elements.push(...blockDiagramElements);
+ console.log("[Mermaid Tools] added Block elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "architecture")) {
+ this.settings.elements.push(...architectureElements);
+ console.log("[Mermaid Tools] added Architecture diagram elements");
+ }
+ }
+ async saveSettings() {
+ await this.saveData(this.settings);
+ await this.activateView();
+ }
+ async activateView() {
+ var _a;
+ this.app.workspace.detachLeavesOfType(MermaidToolbarView.VIEW_TYPE);
+ if (this.app.workspace === null)
+ return;
+ await ((_a = this.app.workspace.getRightLeaf(false)) == null ? void 0 : _a.setViewState({
+ type: MermaidToolbarView.VIEW_TYPE,
+ active: true
+ }));
+ this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(MermaidToolbarView.VIEW_TYPE)[0]);
+ }
+ insertTextAtCursor(text) {
+ this._textEditorService.insertTextAtCursor(this.activeEditor, text);
+ }
+};
+
+/* nosourcemap */
\ No newline at end of file
diff --git a/.obsidian/plugins/mermaid-tools/manifest.json b/.obsidian/plugins/mermaid-tools/manifest.json
new file mode 100644
index 0000000..15fc37e
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/manifest.json
@@ -0,0 +1,11 @@
+{
+ "id": "mermaid-tools",
+ "name": "Mermaid Tools",
+ "version": "1.3.0",
+ "minAppVersion": "1.4.0",
+ "description": "Improved Mermaid.js experience for Obsidian: visual toolbar with common elements & more",
+ "author": "dartungar",
+ "authorUrl": "https://dartungar.com",
+ "fundingUrl": "https://www.paypal.com/paypalme/dartungar",
+ "isDesktopOnly": false
+}
diff --git a/.obsidian/plugins/mermaid-tools/styles.css b/.obsidian/plugins/mermaid-tools/styles.css
new file mode 100644
index 0000000..73ce877
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/styles.css
@@ -0,0 +1,149 @@
+.mermaid-toolbar-container, .mermaid-toolbar-container * {
+ max-width: 100%;
+ max-height: 100%;
+}
+
+.mermaid-toolbar-top-row {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.mermaid-toolbar-elements-container {
+ padding-top: 1rem;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+
+.mermaid-toolbar-element {
+ font-size: var(--font-ui-small);
+ cursor: pointer;
+ padding: 2px 2px 2px 5px;
+ border-radius: 3px;
+ flex: 1 0 auto;
+}
+
+.mermaid-toolbar-element:hover {
+ background-color: var(--interactive-hover);
+}
+
+.mermaid-tools-element-category-header::before {
+ content: "▼ ";
+ font-size: 70%;
+ padding-bottom: 2px;
+}
+
+.mermaid-tools-element-category-header.collapsed::before {
+ content: "▶ ";
+ font-size: 70%;
+ padding-bottom: 2px;
+}
+
+.mermaid-tools-element-container {
+ padding-top: 6px;
+ border-bottom: var(--border-width) solid var(--color-base-35);
+}
+
+.mermaid-tools-edit-element-modal > div {
+ margin-bottom: 0.5rem;
+}
+
+.mermaid-tools-edit-element-modal label {
+ margin-right: 1rem;
+}
+
+/* Custom Category Management Styles */
+.mermaid-tools-category-management {
+ margin-bottom: 2rem;
+ padding: 1rem;
+ border: 1px solid var(--color-base-25);
+ border-radius: 8px;
+ background-color: var(--color-base-00);
+}
+
+.mermaid-tools-category-management h3 {
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+ color: var(--text-accent);
+}
+
+.mermaid-tools-category-management button.mod-cta {
+ margin-bottom: 1rem;
+}
+
+/* Edit Category Modal Styles */
+.mermaid-tools-edit-category-modal {
+ min-width: 500px;
+}
+
+.mermaid-tools-edit-category-modal .setting-item {
+ padding: 8px 0;
+ border: none;
+}
+
+.mermaid-tools-edit-category-modal .setting-item-info {
+ flex-grow: 1;
+ margin-right: 12px;
+}
+
+.mermaid-tools-edit-category-modal .setting-item-name {
+ font-weight: 600;
+ color: var(--text-normal);
+}
+
+.mermaid-tools-edit-category-modal .setting-item-description {
+ color: var(--text-muted);
+ font-size: var(--font-ui-smaller);
+}
+
+.mermaid-tools-edit-category-modal input,
+.mermaid-tools-edit-category-modal textarea {
+ width: 100%;
+ padding: 4px 8px;
+ border: 1px solid var(--color-base-30);
+ border-radius: 4px;
+ background-color: var(--color-base-00);
+ color: var(--text-normal);
+}
+
+.mermaid-tools-edit-category-modal input:focus,
+.mermaid-tools-edit-category-modal textarea:focus {
+ border-color: var(--color-accent);
+ outline: none;
+ box-shadow: 0 0 0 2px var(--color-accent-2);
+}
+
+.modal-button-container {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+ margin-top: 20px;
+ padding-top: 16px;
+ border-top: 1px solid var(--color-base-25);
+}
+
+.modal-button-container button {
+ padding: 6px 16px;
+ border: 1px solid var(--color-base-30);
+ border-radius: 4px;
+ background-color: var(--color-base-10);
+ color: var(--text-normal);
+ cursor: pointer;
+ font-size: var(--font-ui-small);
+}
+
+.modal-button-container button:hover {
+ background-color: var(--color-base-20);
+}
+
+.modal-button-container button.mod-cta {
+ background-color: var(--color-accent);
+ color: var(--text-on-accent);
+ border-color: var(--color-accent);
+}
+
+.modal-button-container button.mod-cta:hover {
+ background-color: var(--color-accent-hover);
+}
\ No newline at end of file
diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json
index 633bd48..a339da7 100644
--- a/.obsidian/workspace.json
+++ b/.obsidian/workspace.json
@@ -13,12 +13,12 @@
"state": {
"type": "markdown",
"state": {
- "file": "部门五月份任务规划.md",
- "mode": "preview",
+ "file": "README.md",
+ "mode": "source",
"source": false
},
"icon": "lucide-file",
- "title": "部门五月份任务规划"
+ "title": "README"
}
}
]
@@ -94,6 +94,7 @@
"state": {
"type": "backlink",
"state": {
+ "file": "README.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@@ -103,7 +104,7 @@
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
- "title": "反向链接"
+ "title": "README 的反向链接列表"
}
},
{
@@ -112,11 +113,12 @@
"state": {
"type": "outgoing-link",
"state": {
+ "file": "README.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
- "title": "出链"
+ "title": "README 的出链列表"
}
},
{
@@ -154,13 +156,13 @@
"state": {
"type": "outline",
"state": {
- "file": "conflict-files-obsidian-git.md",
+ "file": "README.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
- "title": "conflict-files-obsidian-git 的大纲"
+ "title": "README 的大纲"
}
},
{
@@ -172,6 +174,16 @@
"icon": "git-pull-request",
"title": "Source Control"
}
+ },
+ {
+ "id": "7a3485b22ac1573e",
+ "type": "leaf",
+ "state": {
+ "type": "mermaid-toolbar-view",
+ "state": {},
+ "icon": "trident-custom",
+ "title": "Mermaid Toolbar"
+ }
}
],
"currentTab": 5
@@ -189,14 +201,20 @@
"templates:插入模板": false,
"command-palette:打开命令面板": false,
"bases:新建数据库": false,
+ "export-graph-view:Export graph view": false,
+ "mermaid-tools:Open Mermaid Toolbar": false,
"obsidian-git:Open Git source control": false,
"pdf-plus:PDF++: Toggle auto-copy": false,
"pdf-plus:PDF++: Toggle auto-focus": false,
"pdf-plus:PDF++: Toggle auto-paste": false
}
},
- "active": "2076822cdefbb8a3",
+ "active": "b0ba3684f585064f",
"lastOpenFiles": [
+ "未命名.canvas",
+ "诀别书钢琴谱.pdf",
+ "动画.gif",
+ "README.md",
"部门五月份任务规划.md",
"conflict-files-obsidian-git.md"
]
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f9c4205
--- /dev/null
+++ b/README.md
@@ -0,0 +1,67 @@
+## 项目名称
+
+### 姿态传感器
+
+## 运行条件
+
+> 列出运行该项目所必须的条件和相关依赖
+
+* Python==3.14
+* OpenOCD
+* CLion
+* Arm-none-eabi-gcc
+
+## 运行说明
+
+> 说明如何运行和使用你的项目,建议给出具体的步骤说明
+
+1. 下载所有运行条件中提到的文件
+2.
+
+![[动画.gif]]
+
+## 测试说明
+
+> 如果有测试相关内容需要说明,请填写在这里
+
+## 技术架构
+
+```mermaid
+flowchart TB
+
+A["Eclipse ThreadX API"]
+
+subgraph M["ThreadX Services"]
+direction LR
+
+subgraph L[" "]
+direction TB
+T1["Thread Services"]
+T2["Counting Semaphores"]
+T3["Event Flags"]
+T4["Byte Memory Pools"]
+end
+
+subgraph R[" "]
+direction TB
+T5["Messaging Queues"]
+T6["Mutexes"]
+T7["Block Memory Pools"]
+T8["Application Timers"]
+end
+
+end
+
+B["Eclipse ThreadX Core Scheduler"]
+
+A --> M
+M --> B
+```
+
+
+
+
+
+## 协作者
+
+> 高效的协作会激发无尽的创造力,将他们的名字记录在这里吧
diff --git a/动画.gif b/动画.gif
new file mode 100644
index 0000000000000000000000000000000000000000..be9d281db9bba786334dbd23747b31c76ab4ac4d
GIT binary patch
literal 693404
zcmb5#Wl$Ya*C^=V8r&TYa&UKdcL^Tc9YXM62X{ZXI|O%k5AJTk-61D8?>9Byy)|>^
zR?VuXyH|DX{imyU_wMSwWaVY}_)XVfilDqceWLt}q9U!ODJiZd&B4M31NG_OsaIH7
zqJKxGf7_@3G%HgDxX1%sqya7*0B34|GXUU74X~jBe5D4+QUJKf0gU7T;Qt#107wG>
zG5~GmKw0s5ZLSpY;~q@b!KRDW^8u>cDm8`cruR%
z3oIupuBEE3rK+!|s;;N0ZKSDfrm63MwSE^E-j>-tm%6;>xxQ4pJvO?Z{`8-zh-=%FB*RN{Wn$14YF72giE)$GCdMJ9?zsxn`T&r|Ov}E9$2St7oyRfPo6>0J(Gu
z*>rMwFu6h|xl$InYA%IwHI-urjY~I`OE-l}H>GPY;M)Lm;1pliS*k`gPjIL)ylB
z`uc0u>O=9$b;I(>$l})Y^5(CV?b+3xf9C#K`>*}~m9OqBuPq<1wcV{3KCb6Hu4g^{
z-<~(JUv~?h&ugEaI-j1qo?g2Dd4BDFed~F7{ZIb*(sT3Dd-OcE_`EXweAxAT*Y^C}
z_VU{H^7h}lUfvd7-q!xh`petK>-*OG$A7$iY`(p3KEG}~JZ|4V?B3q)-&`GEot<7B
zU0omC-S6E$?mj;6JiYwK^Xty*+uqCT(bMzQge|vj+`QLbZd;eeK<9`>B
z|DW;q@8AD(kN>s7zZ?aSd=r*IE5fE=FdPG*kS$kVI2=vDX}396Uo;v|
zAsIy?-%vcB4AiVN9B;534r4K&$d+%kQg-5VcPp}T!2fA{g`;sWd|onLB$v!!G|^PC
zP^MO-V2R{jxm2Z_ezqBv4CMCO^`dFi<*r(5v{|S$nrx}rNU+?Q$cav4TruzJd+j1f
zuifblgh3%w(zV+eh`>&7np`qb?}-8^<|?%}ST=>T+P6%#-I_OKNk)??cQl<&m1-_r
zcBQVc$CPVN<|=o#TxQlgpQlZ5%O_JCe5VQR>TJ6`7)wT(s_F8cstL)IBQL(^cKE&8
zXum_2!T)?s@eM*`PSuTsZ7#s+gYc`T`~8`AWiSt2y)5Z&KDD@4rMLI*-%ldcUjuKB
za7Y6dj*7{GP9}@ugc{rg37%rJ-0eqS420v|PayDr!)}6c^kQ
zC8?_U^5A?Uyv$N7%K-plb^-(Cm`oUpz*?r1juu=J@}D4zaJK`W<6m6{
zDpg=%TO3m?Bnbz5v~8y%a8Zb4vIG{(C8i}Fn4lD>g9c!n`phr!<*B!#B-lv;#mIIG
z6Pu9G{cdYI*%(tKTW(w!zhMRYF=FA4O(3CDDQYD;OJk32aF60cB{ny*^wr#L%6-bxJXa{Z`oAv(8P_5A`41s`RXM`%v)&`W>QcgN-(TlrVgao%_1
zzYYbOTqZLpU^LZV74H3KZ1q8$b+ta?6k?1n`F(MeXkMnPTUcCbO|`fbNQ1s6@(OSu
zX6*t@WW8V!9!_C`Gof7s#HXaa?EWi2@oE9NJ@Z
zht5>*0HYlVkU;nclMRq9u)ps`HU!fg4xVeEon(xCX*}5ATLctA4{iu2hN}4<$~bms
z6OVe0GL;dRDFX8EuDsz%_^Rmb^C7xu>t;6B&_z>x(75Eo=j)7_4I?5^sxotuK^6b1
zV{Uf3HlFHulj62Qibmb;TGx88%t<=UhY7PI)Li<_r&1=I--tR*?%|XWm`I*_y;6U-
zWGA97Yy2Zbbn4AHH%)4?w+0!}SKInT{Jqqlfgnax@g}bL6glc|GOW4UZj=Gl>+`zd
zO~u2|WJz^_g31Zppn<^@JkEgyi|^rIM0V|?i)nF_`l1V{p|Wg!gV|}5CYhryb2O!_
zx-tkkh-tZVnKi9A!5wNru+^cmu<`?ODRn)L+DJy1$6_07!c01klyQ;_o6F%M4YauC
z6dO7(fo#)pe$7>u9gMgPW;FrzskK(Z_GG^&W(W9}oba0?e`CF;#mHC`{W(85Jvn9u
zXa(vccp#$H;WF=B#+m25e41ifM#9dALNwsBgvWeOl=(D6Sz-qX6@-TZ0sTNu5z0H-
zI}CD_nT;8$C5&2C+)LHW*aeH_a*y{4X<2cXj16
zhYo~?WqjW#Ya><}e#?{^Z1vRRcevi;`4njn>LT+LgyKeMy_-Zb3dPsALER*W4$&%i
zpUTOLg=SzR!V38>x@B6H
zMUw(;v7k*uk;eK5$aPCrl02c|Owzm>1OxjW-kPan9sp`%6=JZ7W?oGFzL@noFEI(5
zMpl?6T}EfIS;%KgCGHhfjZj>&{$Cx(H8UCZ?w*m$>{O%f{m^NSIhMv}(E6q)vhm!?
zlnt@;1nrS5M(%$aC2)u2u7fWpu3gN-q39aWLAS5
zcMoC4FkpUZsL#DC1mY^W3VPwdz++z2jc|?Okb9mRm>A}y>W$VK3TPvr3zQ}l;f7n~
zvb7I4pW*z`4LgdWp6PFhKzo0$p*`s6RG%qqf}mP$tLV2Mf*9Ke|D*AF^TNcr=OZNP-Na|tCyS(*0^IX-`
zeJ!geDEUeCWkB%gIxIbMH$C}fM9`Qv;>U*q-VdH}1IQh9q|mXlg!i;F6pE)CsvS{NXR7!1}(fDDu?u6Y^vL_v1vh_iZ@-&l9@L
z`^dEr)v@XiDK4`=FTZ*r&v}2}-v7-52m+z`0%3In;k^P8GXjy@0#R23(Ov>E2!gQq
zf^c+$@VtTuGJ=S_01Os>CXc1zRu~42ldeSa>&>{Uub50HnbO($WR#c!6{?
zK>BSU!&Q*+3&?~Z%#1J0LO0CH3q%j~V`$W$DiNdz3{G-^D`bOneF@eEB0=XP%V&g8
zjfG3Sgoqrg@TCYaLy+kAsL?-b?rszhdc|~R*f^1iV82ZB~
zgFu{op^QLyC$CW82|~b0xCB8&_Twj4u@Hb)lyD$(SVm-vS9DuObVpls*J^YR0Vr!M
z61W#h5d@Nd0Tlp)K^aj(1QC*LQ6ah!j2YpItD&AR(W@D;>us@{tFhaBk^R7!?B}2a
zoZv6O*so*3*+;=A88IOzF*7e=QwgDph_O3f@h=(iZ*B1(Hqm>)IBM}2a#xU7IkJgY
zOgQjUVZPm(W?FcIBo61`*|?_@r3a{NgmIU(6$x%#mjsH{9$N-ssmJ4J3S5m*p5
zh@V87n4(6Qs==SCRS_$+mQ1#nLZY5(xRz@CnrgBJ`VyH+QjkiFnPvk{vujV&(NRoFAD6t^hyYCdcEZ6o4};+cO3DGmB3#vh^?xY?6}1
zqN=^K+Q3;UCz(GhFzV$o^>q`%f#Dura4Y3mW8mzG3Q*Tt)-UT!=des2n-In}7TDc{
zNpQ|Oq&8p)&K4*E3*{!EkRFx;9BD0tGle>7Vs8(9bYn!Qr^;
z1!Ns*_?78|9TN9GevkkSyZ4{F0+_dubAAsSmCW$Z6aO?IYEV}M8~IOgRf*?w?ucn#5glrpCQKZ
zt;9mVbhj;KhTnG<>_cZ->hx9`M^Kv0SE?hI)iRzV5|N*L!h%?rM5G7fk6iYRz6?St
zSEdEbcI6AdlMiDhEZ2!h@E^-llS}H-g<0{AAeapy%`Z!|iN7DKU_S}rv5vly3l2Oh
z3q~%q$t=Y;E!ULGIUHwQr4P&X0VQ;V6uyL}R7MX3LKEZ%3nx^x0JG%~D{04q1y*6o
z^&?9%D}TtBU;VCBM=UzCss6f}Kntwgx(jCY4rPs$s7y%8mQJQ_t7?3aWgv*6KP~@_
zoLt}G#1{eW>%yF_0P3EAb)Z1iREwQ6D-=Ymol=YVO_aRK5z2{JH#J*Z7*Ufkq4#JP
z%)R^bdLn`h8|mCE>Qe&jQAG?xWYu{`(r=>jeTC@H?{&z;Kkpf;W{^{7*C7G(0u{8G
z<-@kQUr$2N-@}{RqB!Y;Ti2`E7Y!ZcCa-@mtwi%j`
z&O=4A63~!Z%EzFUH)0s0Q<$UuS&2hL&huh{wd~^+c&`<#tBpyORahH&-d@ddjEP54
z`DC2PAMI7DUQt{WaFI5JcVl$`T^N;!@ZwKxP`)9q(K#y7ai!;NYPwaiS)oSJRR^}A
zvjkCTzEuO@*8a(k$<_8`;x>N%wv{h!Y+hBqZ=Ylgf=eb7vNKz0A#xQ6D7D__EGm56
z*~H1C#Fg|BoyCeB`3wamQE~e|A*WR#jpto7Hl4Ilo!K3o#uUi(1QqVPjcZj61Cs@p
z=W)5wU5Xu*)s?>XnI7}}AT0ez%&a=BjW#@_c59T7l&FqP{r1G@W)@(-@lCf9K@VFw
z(x<>2ME>sM$ezISCcep-E8oTta@1T41*kO`iO{#W@(ZEt*#Ka&VDcoN=E14h;PRgQ6-IGwI?uM(7uxE
zwd3Ba(b=~GRj^YN6|{+!956c^=v5^d*)Hr5E94i-srwUx-ZdmwHS$@0NX9Tlj>KQV
zuvXhJ%*;N572I(S-F*~Qx2{kN0JdxkjBDoiTW{1pz9n6}4+|-dvyTmBO+sf6N38o)
ze9o>T-RLdes2B2WtgCKdZ(|hzPFVP6uM>?xq11&>j?4Lux1!cjX4Mw^jg8y)AqZhc
zlZ5hhWvX_iu}w^!olgBC@k5&OM48G#FzC1Oo?i9KioEcfGn`Qtnm(J#{B7vJCFBL1
zn|VMjyYBM8o$|Uj{Pm$!`b_fU)zJHW^B1gt$=|Lps6XG~x@XmWW|hISJ5#e*IYnrn
z{Z57E2)grew|wz)=E(l!5l{P)`gbJwm67|;A6G-BH$E@`mxCOg|V^Mm}l(9AoXvfonF-XQ?2r65qfTp
z-Ehg!afz-!1@H45j1lPP=8~0T!I#)2{OKXy#)q_49=?|O
zXHDUCNq2ghSHpxFYQ20bHQV1OH)p*zC%($jr{>Rk(^hP~uuq_4S#$Tss@F#T%6tS-
zo`N!nsBtp6x*@hBY2;&ayd%!gZ%Otl+S=*8y`A7<8v&CzBHFLbIZw
ziv$ngj1JPumMrb7D2zwt?1MK4;G2D-a^JQ`bE;$^2`n@4ZIkdESBGOLM@cJlmN_8Q
z_YMc;;WXmtSKmX_o@&XNBrKH>h`ii@b=)yy)p305@|SIp;d!lVZWAxxs8ZWDvdYeP
zr+y5UDBp|VQG)7N)RQ2_lQ_B+u*&A@e)*11PJB!#b!TVs)ut;`H=_O)NoP&dWN=>X
zX~o28Z2HQD(s@TfX`%2s6Z5iT$N4~RY)h_JqwvKTS=g|X*J$p=%nWGK*lQYcu^1PY
z_GfCr_;Q^EG^gUV)^oXw7P5urwL^Aw%o2RC{rxE5YA^T7FMWe%`s!{5^{VH4-*kce
z<=%bn#bdzt9iyDKuIr8M>u=9H0Ytmd=vT1h--*%kq69XPR4-BTJb43J_{naUL~gC<
zj^5&K34dH7OdV%j+`^zk?y40|_Lc8wcFudyminBqXe#gSYH!WM&%Idg*H!LKTCez2
z&jo&c6WX~Cgxu@nKS*33O6_>a{CL36eUNE=Q0m=M`RlGm{@5w}xTW)`qq?E{!%@HY
zv3Bdx;px#Ne%&n3Dn|UXq3Jq+J?mB^GMDjO-)71Z_-w)#z3&%a#xOlu8P{S6`u+9{
z23E$cgF=7Y>z+K*_ny+`l?wEu1lPeTQ_y$KQq>^b>k(|C@7(GGTQ-QE3E0lR_$B1q
zJ%5dO#&3U?$~dR*c~NgW>n>k00KWI@oyhn-L8oDNxsbmk!k(~G`>Z@UA#OvdhM};$
zsa6dev@N;QzehquKvO@Wn^<$JdqKZ`y)fBV9Pt5GUbAo5{-I7WcPKA&58eTb4x
zl}?4i8FW4f=g!-Noc@?{zo}v9>=8#hml1>iEpYe4YwJ^g444fMoeV>bMs06^$iaso
z8!#Io4jTZA#TAhN#^gXJufr^_2oYzk%Xl==gfSaSL|5QQ4&5`6u*#HSN_^GGr-tIP
zZ-H%BJCVE`yX6|A-Y`-F9vi3TbgurKPNd}ZO|9tMOTv5k7Qvqp
znN+6}dwYq}$ndBQvU6d`qcU-X-)Qx%mdF);tVtdWG)&>@I9H`y4m}>UyU~g0(QKTW
z!Rc}p*2}trE=;#~qA1=(s3xc%LOZVLs<#_zYaenC&dSUCIOT=3*`O=nA))gY$dP!}
zHdSws_p@%y9^?c#j$OuIEH7M2&Qd>Hf)iNsa^IYa;E+OHrBGDeR7XQ)gl0!T6gc#f
zBQg%P@^pEjcMZEjFir}LKZiIJnOhH&CbvCc8e4aohGHmAJh1=@V|FpuqIqaBr%L#O
zfsi=C>nP&rX~>k_g=FT49cEA2?mK$}kuecUNpu?Y-3Z?F)b+32C(b*y`#gT$S;Apsm@gi6fJyi+$0tawHv_PXZ1e{*q>||(3#^*^qrRAok@@v
z3AMSjaRl&lB!6AON>0v$_6;M(?~0YxlpR}-mN}TKE;tNbM`>CO-4)-lrZ$I^J{vN!
z+t(ZXPQzWEzCT_ER&$?DH?f}HTtt>(J$E&A=I_Hj(1^QQ%CU?^U8r;pQPH{-r8h`;
zX#`?xoKL~FPiB0HbjDTC(v`Q=;y{vAB3ukBC-PF$m8><5BP+gQxoLY|*YtPjAt)
zhj^U>Ug5YmS~>-r83QgqRz^U~ECk(he^7CBu+1Sz_F;9oSu_b`MrY2H2cBx|Cn8}>
zORxv2N?Jb2DufN>@wljq4OB>;)8Nr)92%S?UCEO#y&M8-My~-3Pf3X?&G&ivC7Nm_
z_M>7dir{Ki*VcGh;|ZoEvQF>cdEv$_4NKDRT*ua(Q=W%wp&!bFDA|oOmhKn1SBg1!
z$lcTnDA_jvIMwKW#Co26)`Awhxq(ON&6mq@QYn-yk>#N4y$FFl`tfUs#A6as9h1i}
zrQ8kmV9pkRm+z*1%+{RB7NaA`sYE5Mr=`?EJk74qfGOk+8yByw{$cLigZ>5fqbe2zu^K9CZce}EZEF=r~rr1IXz
zkyu{G#6T^$sn*7aU2e(FaL{koeYcntr|H;UWDSf$KzaU$m{B|1D!~I%>+{o5~U@D
z@gABoXtz(ey{hppaZW#4n1j2)^J%R^M|kIHipF8cG2ItjZH{4n6}O~Pa9fb2tp#D0bIU@Gdc(1x
zZ3Zd-xO+rzleI{s_mtbyLf)9r@3mZTi_O_WK7zE31a5~~m{V-t-%uN=BK%p8B&(b{
zTN@ef4)r+C#i9kjaw%y6ji2fs`OAzavf3RQX)TK-tlDyN@&cNfP8B?hY{UYpM3X54
zi)Es4c50w?Mey=sxvXWWB#B^)8*A|f+dNJ51rJ}kZh2>97$Tn7jV#ovy>KwcAI5(RngER~z
z?a%53%eYJ2+c^emhLa7Jhpi6Zv>GB`xmp^fe@Z!aZkOsmRHUeO3bs9o8evad5)n#rocOuj_1}$wO!3S;28r&=u(orJU&1M+FAt&?w0SU5K`Yva
zrV9Ix_P(a1rIb&;AoWEaqd~ptUbsX(3P48hW|%F3TjdZQ%cXD!Qy
zoIOTFi3IdSnM{%;7|C0WFzsaqV}$|W^jYq5pkb}J$5;AKkq
zInBi-XU~tHiyaoB^>m?>aXUouV>BB1(ahQ2=&jfhRpgN)4m42pI;mG5o7BG)NfQt{
z=rUF8H&AI;UPh(MJlr`8BV?RMToCE0R^0gzBrAgpBH-#;R=igmQZuxu!xR~iG6n1M
zL$uojiQm6TNf7jMzS_tVnkfbvO()nwCa?R#4rVH~rzy%RTnZwMJ$k;ZovcfEIi}AQ
zQB!m_D?U4Sm7Z-pABHurzT%00W9NoFvaYjG%&-mc*t`roPlfGA3amrccg>)dK+-Ss
zDCCU(M*sV#voFyavq3zKWG9#PJNr5}m~^My(%#__b~<&ku=QtAWAZ|{YA^AUhL=%p
z&R45VzTdcoL-zJ)Muxh8i8hJb8t2;cgq>)A5A*wr%W7N_O)c3MH8j{}C63LNrl=i4
zeouL|KUbD)tzOeVjd@A4LJ!dH+LFatNS!3ZqFFJi&240zFaxrW@YW|L*`3C9Mv1R^
zRqs&B(CYJkz@2Z?;%;L9O4ApG)VQbRg?vN*WjMwK9$Zfps9z8BF)ish`n=_{^6hWe
z&y`2c?~b20^p$VgQ?7TTS(%aXAveUsE5Q1njn()^csyF0r#kVf{_opA<9=Bl`4a)w
zrhjjl@EYGRp^Kg~&a{D_m98BpbOw1>Q1|#kgJ~Ux+}6M8#~*nOj|-iFoSIbkBM1qHKT5U!dUz9&;|i4T!P;59pv!0@gI6(&+h#^rr5@v
z&4>5c-jdNd8-45T!DPD-(lADTPjf`rU=Va8-f%LiIe^fbke@oH=S7Uo->whALef1_
zYzMJ(ld4bh0FRL>;i`Uc-?vD}uNxsFICoc4exjNFd{ESbBR`O6ShAk8iHO(_S==q(
zN4${qm5SaskZ%@;9TYZ6fxUV6IV-HA8^WLOPjue
z0aO1*%%CG`I`2d4Za&RtJ7#ZN0bh;GF_=>K>^3%>Uen4FKQoEN%xEknpyT0)?-Z7E
z%pfB1s0R}w9^|2vh+fthYmCWa^dqbEdrDb&{vc755Sc}v%fM(P39&ylQ0{y*CT7@}
ziB=qXOw3N!L_;o?x}ADJII?&wg{cDZL*{~VJUw(gBSoHALO!)=+_hdVWnc_^IG+0;
z-_$Ugg`==ICZD@Lo+mX?tTh2!HD2H`!AP%ACNNP_JW<)CP-8z)wy1DwI`03`S_L~<
zhok6>JW<1?=oO*xoHI2H;H68**Y}YwKz#fKiTdv(b2?+%*Ap}
z(3XeAGOm_s8G|)EMRd8Yh{fyT-
zH6*IL3RZ3`oE{g-J!q=i+bG=9s@Q&*PJvZnz?}K!+kNa2r#cipIx8-)(2tsxVaAmz
zmk_zX%BJWMCAZ($mc`0vP~0C#fnyTftcKK`p_)s;sY8;IxXK}+3F1~nd~70kvOwkB
zLwSK2qTob@{fry8Ntn1n@QJ2zaF$bgp!U#?dht|xG!jR=s-A_Bs}L$zt1A*njOyUQ
zegl<9klLtBg_^S3Lj6gSU4crB6L5Di+dGa~I)t@5snWhVGs8B&M1VF4HLb9Kr#%Hp
zoM=MRV3ho7m^~1Z5GfYn(9v`Q?Amcn^=gV%OXg!WQ4Oc)_Pl3Dt!tr`=(Emhbuy20
znM`MaO9&R@MFbT&c4EBh%`|T04D2n~74@4nl9v@|{Ay1{yGP2#g{H>Vf=(h21>;B;kz>X3E{>
zjOaqJ9ZmMaAx&v&)3bIpJ>P_oT3^QO^!jwbJZ+qVQG*=-Kb181obM!KXOLCq5FyE;
zz%=YNbj~?4GNo+u0&?iUCEeyEy^^J}rln~Y-Nius8xk~nX(GOoUvGxXzX^m78JQQ&
zdo5GdFI;pYvtSIyh29hDtrR6biimKTMgJ^hO^6FM7v~Rr%BWD2Jb5%?E0YLs-vBeXT-q#=Bc+Drh4`kkaL`D_?T#0ZBWj
z96k538GB-ypRx<~sJ_HSM9Xr>!vNL6aGe5n{eHDxIAMjED{@DC1X2ZBPWw}I@SZI)
zKh0h=6NhY2?;<*$jU8RwAt3YqL{cai$i^B5M~2HsCB;Yj#&rge
z2_w8?)3kBpC(8$DD;MfxORM7mu4D7G8Vk>HtI}gTo+|4wtG=XTy@q3_C#&*-V+X4$
zN2{`9FD4VBX+jQZ+ob7&OctPNy&p0goU(OionRTnKWUxB|?+D8#A$t|;_nF&O#5Q))hP26K6`WO-0*qJTxF>*ec;PI?=SM2HJ*hvJF
zM(VOc+DKJb5ffC6B+?R6?+J>m{z_LqL9(GWLN_OA7eL_t41I};1RMO*XR--c4x;v33e^mQ%8v%kJ#+RIH{CCCp
zlAlR_JuL3^=GrR`ojq8pXPZcK@N}6_&qAs@#GlKd^X|ZvZnV;Nz+ct~2x5q=
zJ*?Lx!kMA(~UTS9(o
z-Y7hjBrVZ=WcGr1t?M92Ke=C=J5TzfY>X72tb|=X?QLv?+u|t)4#lXsKBb32y6^8q
z$sNNK4m_@1yO?;=hlLyYB}?Y@>q}K(@-A@8cARJnTd~I+3kP(ZMemuX^LG=MbOl#(
z6)j^W(iSO!w}!6v{%+4AukfFBA~K=q>qf;kYKCI?JzWKILmu6#CAMDg*%@AMd!5VY
z17y;wXM2|~QsR|am@MX{U{!!hL_0WQ;s6j?hC{p^l1;33OF49hv=@OPr79)5Dk-O_
zHEfXW(U2f5j&J@J>g_x4k@|%-?TcbM{?Q@*nXZW64;<8hJUX~#;5XRE`VZf}@N$(e
zvCaw~S~GsZ#rTkuT*??V2Y-gKS?kI1GQS@UAB%l{vfD?~KWQ&1{9_;FjClSmu$C>B
ztvWCN*;1`aY4!IX{L^^!XO9jNTlr@PzihX6Yu_4j9Df%k4XMZV>!kMk-3mERFFlBd
zSZF{HMd>eMOTtS`}^?aN9$a`-45?Py2``XzprI~fwn)MRZFhuK9Ams
zK%{GWKSdCslhv78-B3s<13oA$XpshCpeutmMq-F~-7dzaBJgz)LG>92x5dL`
zFf@e@r&vX$Xy_PhLIj+LlVRxNht+cP)H11aQW9%m&5wd~{|rZ1}VnpVrJz1_``4w*2PY2YU;x
z7iwcUuC&_PzTaP6zVqJf_HSTWzdyB3lBJNNHP>j}ocw~UX6&$|)S-x@EPf&&U>7@-VkJ
z073|-0&oF_Z%#T&iIUKCFCnsjY(OjlX{ksKRm22KE>UbqKZ1}0o-!U;V=*Kcdb-I-
z9-34-G5M>CmD*=K4J|-2c_O8j_~s>LawY-?U@;mm`AObOjv!u@
zh&m!FL0wVafN+aPKu7(D_Ow>vr7+3VJ?fA
z8cp?e0MyWyeD>Vzna->cuo9a#YX|r3)O}@0Km=B9DwyL$6}98R_!$@_HUcwwX!2ftcr2Rf*AEu-qi}B7k5?k
zQ|z3B73JI;ew;I1i3-^jT?IHh9%ifXMmBUKX?JtDl%Bhj6_+&Z4MO@EcBY^?3K01`
z89#yPKrT~eJ9mYJ>Bv#1F4wRXnR^}I4vb}S1d(Fjg#LQA
zzu|aK{awDc1phXNmCP`)>DtmEVTXp)%ULoaOA98{q4#37HXUZO-Gd{`iFlg7sz>0w
zMzXol!1$<@SmAyR?`O|9_b=F2z>t8`ZU?k)CO#F9PJjlK)Rz_$kf{}9s68{*C_Q?L
z{TQ@rsQH!0!Wv!3$Y|Ew!apPmC30aCnXI>N!10V*7h*V#+dYof0=61SDS^sVE%r~+R3dDC9!Gke0
ze!6}`$GfnCvn^$i+<~@;_n4P20Na*Cx`!+h`cq_m&O=jK)S3S^orR!o;`TlE
z45b~L6U^?bRFcRSD0S!B3F4g>jame#OYRqJR1_&KB092}Aa}MrytOpSQFlaIn;*m<0Dl330dcH`1WUp_eIFUY#a&1|PhI4S$<;hezEA_Z
zixN?$(@=0+VyU68N0E#iY{Nd13A%`o9Byoza35TvLq1p9Vam7Ga6fJVyg7aDc*{w1(+1%1gC;rL
z2nMOVyQ03rXP8Ma{}WV0jyz^Dr(f{2!p$-#R4nJzK;^C1I$8vNaqb{bzR4^QF}T1VNfLe;g3G_kJW>1d(Z
z3*j8&l81mwU%Vq}Mw`rGKbMvl#@H${%4=UcAour^#6xHaijx*;%``@jnv_B+Y^w*r
zSSjqcB?NPzd{&1!Jb8Q{87%j^`aU}o2Sfas@9j@!WxXgMk1<=8*B3|EiK*5)*6%RTX$(pwMWPfD^VMJ
zSgma%!Yo$bHa3npc*UMjFZ2=^w@x)$JC;8eI|pxUUb=l}=-rC)Eb`sDO=|5r7G{-5
z+1PsgSMH&Y^iyw^ap!fuwWm~@)%U(i|Je$z2Vz;z8VJL*3+0T_`zGx2^)(vzZxW~v
zEr2Z)FogpHXd8IYa?vIbN=x5V#F9v6i;!e8JJ(nppk<*Bt0*+BpDNM$K0di1!*oEn
z@Y1s;%pOOXwZEBxK_fG0>2Ak#NQtdiOEbfsq}OU*QO(B$uK{r9F*u~xY@ZU@uLp?$`)=X2UhwKaOnE4?#B
z;j-B8w>WmktnD^u;p>96*T)(oP~5Ztz-%i>E-;q{KT}A&m6|N)G@lE3NMZCpRllZP
zFy0;$5wAJZUeH}E4rta>a@31!N?mG!^fZSUeLgn|mtHO#;I0c%wlKQySS|8#vi!k(
zVaZ86G{nQxv=Dr;lH0Mi+~et=M|$bl>$Kii!_zXze06S@wXyNk{A;A<>YHlo=5ZKL
z2mbh#_rgZYRlxW91JVtj`_7&8Zr+~nHO_l)oxAX(jD0YWvmlgZ8dAtjKY-=7l-h8w
z$g0gt9V?S<)C)iWyQ&^D);lugik6G}Fr*pqJIY{lo*ETTmt-A#d^?>r>#R3ZAZlG%bA{J0iDjmp#vFgjr~x7CTuT`2@K+GL1$kl`%^9Yv
z*jKzV#vr;dbpY_n@A#v=jDOL)36XW%%kh%{)8?Mqx-UGS9%RD2=G>M3tUqFnKbRT>
zCvsg2i5)DGUi#CTurmHRb!XjQtlA!`MtDf?wfm09V+B$*I~HHnq8mT&d8It|zh?aK
zmHkrYG1Dv3T|oW^M)k+S>R-rVbMK!I&pgImQPGWIQOIN355|)pqO(iA0aqZcD^Csrkj`{V(o6-5h0RH7LtN=^cvjiG#1KseoX8x3au_e
z&k90I>=Ya!8rt4{`!3qC0s7Mlx=gsa8ZxE`W$5WHW|}st3|yrjY0Mf0j+1Gi{2q?6
zE*8rwmOkuO1qFU?fxq`2zLOq-)ha=7+I&F)NofIQEoFr^rIrxU?`cZ%iFBfM%Bbdo
zsO|z4E)8rwbQ;Ay%|lwER9w$SW6Y?T}a=e0&FN`vNE9WDNGyQXF4{cS}tU!C1g3HVoM@seKL#tW5z~S
zFIF5-$p=GF)BuIoD6==02zGjI@6>JJTm0|?-)
zvV{SH9gAcf3_p*Us)%7N78eOSO$am;1+<&X!xdz*ftaMRskhB}&5A@kkwvlKQ}`*x
z-je0zCiB@siwUCM*(T00EvShO#Z{L1Ji!c}uo=SuZ>{Lr;)xNzsZlZc@q7}QnF1N7
zV#II7S*bD=(YSAWiKheMPc;#eu^BYHE_g@B~8?LSVwt119{VmYTx8
z8dix50gbfSx`Rnr@rA{DWSp6FiP|wh`z}xEjZoPbOG9SC&P$UkNK;uXTp*|fsB)wW
z3Dc&6NL4P$cspQg4KE$)rV33Q5zbp0J&hQtq?pjso<&%ia+v6Gtm`q9S}enx^3Xbw
z99vkG+Gv$p7Q$KC(b{N`n0wM9P+@uW8`_kXy1UTYlFge37rj@MI?Th{w;b#G9XlMC
z>c*BjzTrBZ(YjbkIX=sh
zJS*su@Q&Z1VJCX8bpB~J0e0m}mzMq;3w<(tNiqvviVVGs3cV}OZ+`s>VKZB2B08b%GT8?trq#{5
zY!ar!NrgMObR|-WOPutx-1K!TuQ!0V%H&u=5ZEV|ZY@`;3pKyNBD;1gyQS2JrTE<31s|d=-WOowFq)JL`Qb
z!ZXvm`o1!>u%ajidkk!*6g#ql%IsWVYzJDfhMm0l6e3q{b(mf4;Uq8E4pMt|c3M$s
zDRM$aX8gPe7ZyWSGmo3qGX~3kzQb>Cu3t_`B!>_))w3)0$>`h^F;GfjyTy&M;Lh$R
z131>q+8^yuUJEJHPv;k@{li0?S5sA|K10_?)mcnAEj$yikG-i5{Qz0fz%tDs4-=cn
zg|1BX&@t7pM#->oHIo&Sx)alAZQwRaEG
zlwHvj7RfYE#q>5)xs5II)deu_LMFJvGpb_N%Hr2sb=jgVHnQn_*ij4zGx5al)*2fi
zB}1JIGaA;VxD^AQ6T`|=!O9t+Y62V>$4r#QEC@NPsH`DraO9JKFm6U&%xf^q>enEc
z)!=X0ZjD@S?K>)+)u7)wDy*LG)H?1WJE0h)3Q)aIP#=bABs>ODHI(UUtw5X
zaX7L3-p>Dx1vm-2LXLA{O{+Z(rZ`(KJgdEeYq?_VVYv{=zsRJzT)u+ZzM?y>y@HTm
z>rl-K$gD$HVBxQ+h?qZ9F^lPIgcJSjrDUZLaD@7EpaE-fAm$8VW;xI)Ij}OMg_fD$
zE0(l!R`*+$(uk6_yKa#GNg7;J$#(siWbu?sJqbJcr?ObXk@>xa^x2cO)SuPPQ>sc|
zM#XAcTlHUUuYM5q`En8sbC@(4WG|{m|WH&LM4yFb!F|>MDvdNPL|N$
zOEjbK5O*>Wf9&a_N?;Gwq4M@qP|tsBxR5afTBjg*-GtU`M;Zhe8`iR+$kxH0$LROn
zppLqH-dXtki>Z>*N%P`JKbKX>ap|#(8B;S8ll<1Q7KFuAkCia%w{5c=aDxXhK~beN
zAb`OhW5XtZF;E-CK6fBeWOnW=#ebJI0J48>9A>|eAQinLJ-Br`xg}%NH=q{BrWQB2
zfo4VJc){Z!uf4@w$7baUrbcI@>9oM7bE}TU;O2s6ttOx%Hla(tqzh?qj>VvlZ(uj9
zAuPKyspVjd9!4aT1gM1wo^XWZG{DR^(5YTB|3+oFppXENgb4P*@R7i9+z+tK-ck_N
zvVE^%#=rl9Gs-UJ2A~*V4}=kdh5b(rI26LCzn_>?VA7yaKYjjGhJ=KMf`WmHiiL)T
zgMopMiAji!O^ky>ii1Oji%X7&M}db&iH}e9UjX>{|DOm5s0j!F|7V1R)c+6>{Rc5I
zH3j#6Ob%lcc1gq?Dr6KhjFlGDX-#k4%zkmPk<>lq=?d{{^FMk18|WVx8XO!R
z8X6rM9vdDR9~u2;V)UP}$^V0~vB|OV|28!?{{J*SF*QChJux{wIXN>qH8VB+Yi4Hl
z*X;c4+`|0);=28p2q@}yN8$ppy5wH~y1mXRBp9c_~8Sl)!^IPxx{_e~=
z%Z1L&UH6aKpR>tLNjgNysfOk7SvQb9^eNm@o(Mpji;PEAf8
z0+GCerUEEM2t@GGR#4n4MMZ5zrQa_lC2b{TP&&$>RCH8SbyQV#Rn>IW)b-Rg^fWZ}
zwX_VhbqsZNkLl?f85kZvW@K{Q7$6M53n1(4e*>m+a&mHWa{;pQ^YaS|3IM)}ii(N>
z#!3LnN`V|uUJjrJuvS@BRR!U#wzj^$zM-M9v9YPCxw*NewWYPKwY9CSt-YX%4TG4I+k3X7!GnOAwdF&9a*H1khq0q~;k-fswTv$e
zLvW!ZkVPk<$9rI|%bR1j^(M#DL^*GP-NMJCgNr&I61!>h_8-%AlCT?Tvot=iD+a&A
zpo^9aw;oDF6REVAMibZbomz&|Q8|q_xLV}TPl&(oPRFJ_$Lqb8p%;sc42Lor)E?OYl*y2Y
zkuq>_NbvALR|G8)p!T2{{*2V$V)v&%`8AaH+a_qCP=`Edk_VV(XBXh+7UAO;7ZR2h
z69Z6Il$M5YEGM@QVhFz9vHR1{zku>S#B~6gAwWZDhM=sj4#%;!p^lEBzWy;dh>edM
zgFXqG&|3&_TLN{)s_L4$dH~Rt=9V_l4BMb)_%GVvA9YB0Km1jDL^RCK
zPN+%t_64=D;hROH5QHa?g&2BWEkN^criD1>tfaVmEj%&J7P
zooRw?^fLCjG2SIwSiGLDnv7aXYP*cj(Rf8il*wo`_k7qBg9{h^Upz7sL(1Ke!NfLX
z?(#jCSh*2tYpa-d>RkFa6BV*aW4m6>D@SH#i^+BiYP~Up-?ebQ*lBd$xbwJ-%py+!
zkCNbfA0|TaLS{sw`jOlIx(}0+|BB@P8oWRC;eBGuLPz&Aw`FDJ0`!)XlaHGlFkC?a
z0U=>w5iv0_adB}82?w%a(9+b@*3#0^*4EY5(bLh<(*=}PUmtK*sYHrk<
z?HvGs?du!t?;nKt?7+|<;Il)|hKE5{h8i-&XD5HB7b6-moY?NM+QYo|2WtCy70zk_
zr-fpaezzM#;O#&XfbI8TvKD^Jq$V!{OpA>X{uC8=Vh+igdjgMD18H%MQ85RZ8$)2k
zG18SEljWRP2*;GNKCozeaA7t*_90l*io@#vD17fTTbtLcX9c&_aFW`6HZS$#C&QL{
zJy4gACanc^aQm5HihdI_xLicJ+mswYVf^Me&c$7UWtJ~oEoHk`5^!etP5qt5tqOE9
z$r;0Jcdy{EN=KMgQdng2T#O54KUVI+^{O?F{Mv=Y`_z}qFsq6$K2gyE2WB@#E;UJYm4-wF4j!F7*n!-+LSua%XxRrb2E9z?9w_0=^DG&Bt~wG6ei47Ih7
z>F5~g>KWG1`ONS7!0ugEu9%Lxc(8ieTg*Z}1a#6b@SGc91)
z0OIWkh{H*C*8$1y1SGqw2jba1fM@r8=h<+gJv0OnZ9uaRlkABJfNa3Czk?evY(T5Q
zqzYzK1gi$qDS}w<&!v0Z`hZyfna&M?yXZT~79gSYE--I$!lu=PdApdk_~3G#wDcZK
zY70R7wi&xY2vZ1Qri~DmFih2Sf5()5Ym;EM(t~4naCIqoqBTr{LlehjVW!WC{+TIv
zQ%UAv9Mv;`X}!*zFbo5%@a&$}db_i?MTdP|Ue|Nh_npP1GPDdq!U-?kxck=QgqIqo
zapgK++hjHS=N;-1MQz~*-lOx+vW|az(Z(}6mll2EhFY5wA32UTKg0JPjfV0N85fBh
zDFY13czC2>L7z}k`pgBSP7a=(PQf>Mz&Hl3l`v(;YYTpPIYVaul
zI5bE@Q#3+?f?D3WD9yr*NjupX-m`*$Fsx{sQ^NoJHl8RTN1T5P^P!)(;PT;3?h40J+
zIARjhD#!45(<+=Wq-$iBa{08)hA;obN#~?_&%MITV)ETCg)^E>%W|B>d33G!P#Y94
z@$R^|6$-<&IcK(8`J=99NswEV74nQ1GWUeu)>6%({&=d
z&d$!s$;rjV#m&vl!^6YN%ge{d$Is6%ARr(pC@3TZD73JMh={1D=bN_8aX!k?w$4G(@ELMPi_7!S!I!Zh;=$3)h3;vKHvI5ELOS{?uzhmjzlD
zz~jOKkc5FA49USiX~FN`fBf*_6KJ@gK7Cq+*BVf@5Vg9x4&*HWQ!q*+kh-r9L%kS*
zT0pHKkai*MVv=Mkj5fGopxaPb@Fy$b?ovo0OO~Xy{EnR9U3bp&AN#3?yfk+OKC-N3
zcB0~jr)}KrJ=*S~o%b#F<8g)x5{uMucu;7$-F#R4>w(1jvODkdYA@f-Z>T%Bwu9nt
z@WHGZlaN?9j^d+yyZ!6uXSVNJEVu>Ib3NP^d%xK1D1?tjJ9cBC?vd1M6&@?g@pw|
zHXDR(4i1h#4R0_cgAo}F$g(mr^0KlDvT{mt^2+k^DhdiJ3W{oqpp?{=Kq;#$D{H8z
zXsD=as;X+LscEUJYiaCH%K+g2!29qH=ui(X0X-Pfq!B}LZ9VA3^1<>IU8Vt{1az>2J-`7CD?ZI>K9{j5v5Lf{Hq+J6{L$LmhTn52=
z2f&*~eP6GRN*)DsGP9BCwo}EV7@C7+W_kp
zW-+Uho3QQJBaVWzy77GWSngklGc}Tr43dg`CCqBLp%j&;%yDfo_=!Op9Vz=Yg(ps`
zbvE%|^DhgL?RF*8J`r>qb<(}kNZL)d5PXy@HhBZRPh~Pjw*fo>Fbe#^N1Ya@rs+Tr+TZ)-%mHVVbkl@
zz;l4P&h^#UTRQFNDg~XDlw4gok{^`5qvv4tZn9Ctf$aT*n#NCYtzIUH(cf-;MxV~m
z^QIHJyE63pT$|Gwr>(W;g(FiA-!Ll@?;JJ06z{rohU}2wriN0B1VcLWA3Y?{OF~LY
zMn*=y|Bz5oQc_by;^5!~>tb$hL0(>A
zK0XnC0Wm>A2|(aQM1W2%DFM})3?^HQN0ePZUu
z?H$$AB6pdifv&~k?K$j9w9aUXd7S*cK=F!#*=BEIu3tYSw=O#EU_9345f@o`e&ig=
z#cz6L=f+B}yFIgYC~ut7yZwsnYS@O&GFK!`8F`qPc$t~`U@(3b
z7El7Ltb%N8poBoNvx5@m-~c58ijxzRC>Ix^#JIUZiSzJ?^YTg@6d#`iyd?Sg_ewxO
zQczF|l#r0Lh=>f>z5!)GQc@8T2Y|pQ3%xB03hIiA8cNEVDk@rPYT6o_K$bu7m_Ta$
zKT-U9QgfoL2L9bbebb%c-;CMcU0z!V&~OsilRe2X2?sDq;u-eG3qtlXG)
z;x2{y7$hkO^kK_ip5yl3*;d&u7moIKn$45-=RD5nnZ28YfxTsvJe-LYjcON#(<*ma
zw2VmkGNEs&lfpvZTdYDFEP=k&ceuX6@6DQy;?k?;Y|xvu1QN@#PTae8!7q~bl4r~d
z!7~wO=$+DYDBmt6o$k-}lpbBZIBt{iUMG`_{|62jRzYPcW7T|4Rp{53S
zXQQPBkmsPMhfvSJ0D#ZU#KgnQ%nO47?DGNav$6v0Lj{LF^a!xCgMuCb4i2a|Ifc2n
zpaPq89v%^1UQs^CAR{g$Bq1ye6hA3(acN0O8EI)bFk67Vo3gTs8bTn@_(vl6Q$Di4
z8{h}6AL{-8695O20kDq&?-*$P2S7gT5&PZE+To^;_!$ED{2_pIp0*-z3vs~#-xArt
zZ?5+u5wd}SJI|H?2J$gKOeRvxW421QK9))-l?SXYbKIFSyE-}%^XDq^PCUN)tz8+kesgjvOe6t-{pWX5
zdplaj7BiNw#KF@KQ%C
zikEJUc*(_~n+9QI{wF`rbcGO?w^3Dpd{a_J>u^!$=nGWJFpB-Mq(F5EQ
zA@Ti^^23D#AR6G~;SmxL5Fb(pDS<#pN=i*e2C0LGq(KG>iUVnoftnf=kOmpyx*!uh
zJu_Svgaia2AN)n_;E#6fdrNjjMMWhgfOusU6%|#mVgCpB@xStq!p)<=If?*$eqLTd
zetuzoK~X_LG4PQV7L^ngl@^zjmy}kNl~n@YOhsiiSiu4J3^2I?2MsWl0zmiY)=2A(1$LNEXTwH_GW;0yLiIOPX6H?V?(+Bsaa
zhsgfQ${T=r_-g$gfV2aEGawD(lL%gI_g9IlVAU*zHTCh)}C
z(V4p2;1@Ya@xN2Jacg%}X2VupvGgM<9;Ng~e#1Sii{F@2Ud)=bbe-7VVjUG&aMHeS
zel^a{+x1D8{`Sx!69=*F?nM}>mm-dc*N@;X2R2rpAHWS{e@OF3N5{gzz{bG9!NkPH
z!UEQDe7Jj@5EqvSA0HUVNeKzbzz%?fgo2cml8lUsjEtI`oQ8se78E5V9VjX)dTMHV
z8X9_9S_V2gMtXWi_+bAlVGwBk{QN-e7Zw&46BU&Z6PJ>Zkdc&>lai8`hSuy#va&yK
z+7%#wIHEKa6*U!=KtcX+gfslW9KP=l*HKl|fv@FsH8l0Kpv|1Vj;?{8o}qz(5rVw~
zhd6Mr{#PyM{?d;959WEeofR7A!MYtXv+i;B|6ra!%-R882hawN8Q=pySg^yr-*6P~
z8Na_T*b&tHw;JG2um-=~-Q7jZ^WQcR1{$=Zc*-68vvMxD%)IUtgtJXvIU=8
zZnRt=-Y(Q!!-Go8!pJn3rOT6BK=X>mr?k!(!DD$e6hy3=-ZDIfs8mC*)PgW=nGQY>
z7OzU*D8CcDe?&*f5vD)j0r7YyO-
zV$ri^MsZlQd4|Y(*4z@j5EQ{@(zBg^X5Kq)H+rjwe^u^!Dt^okdLG7->oNs-^xLZ0
z`CB+v-;@NgKg&&Yo+u#86F~Xkbj+Rc{h2}xl;%$T?c(Q6%Osa~&BSrN6#a!<_nrh2
zXpm<|;Xx)q68Ygt0INW-2}DOj!-T&I2Tua@D&XJ{z}JF=`1qjrgIxhJF)=B8S3p5V
zMoCT%Eea?oXb$fRfXMfkb_HM!2zG!%LSXkN0jKVAQql_2GKiHu{7hue;r_Gd=Fq*!
z5BB!&&Kni&Jy$#YRnUNz^?KSm`adk|O-z8@=AS14;cW+oo3b)ssN46`0X=U|%=>Y5
zaH!dXwf=#j4y^AFR)GiRISr#sjRA{O*e&qp}i
zfxrDXPXf3I*)!aH`LgGi`}5Dh;fG=GNoYkvJP8VJN6_g`Z(K`~_e3X^bywFnSMtLV
z(CwihWNz}HmbVmLW%DEHug;KA`V!zn!s&y
z@Xf$f$_Ub4Gv$>5oZalRESaTj#(Bn!507eH=Qj1c*iWaurFX`}?aFSngBJfgx$C#y
z?x0*ky{d5QbO6S?Qy;h_(Ta9BG-?Q5&tBkOSG~HuG5zRF1SPd_Q^SfN$!=LCh2({C
zISQrbWP)P>W(bK6Zm8o%(L)wS;zi1UH+W3Y+Tnd2>ge#3Ffu|yav~yd6-EU=34|6Hy7&6i+*_XPhpNOT8o
zI>hzYzijr0HTyp~zV9J>c@Np}tCiFD^k?Kf!4?oEu0I2|fY`DnQH9JcUc2J=X+{T<
z)I(tkhDJU`%-z9!r*s{c_0zlEMQqRdV}@nuy36YAoW{8ESSe9SBrnHXIIA;3J6=;7
zt2o=pQ-TMp_G=;2NW4V-;bu?v($mrw_p102v3K>jyGvuOvE{s{>K=?A!K=B$KU?C7
zpQtmT%Qx1t+an>0y_s0iY00&Va@X>D<1N%6Z?dVt*CP#6nIhSDG|1kQEP;8JTktBZZ>w6ZTzvux#^!5Ky55VC$
z9ysOq{5^8=it-A|zy`2y@lk_YeAHD`)m7Cr)F8V&Wb*mP;*;{rJJ3Iae!%nLj(J3f
zKcM$unnxV0A-uGE2WxPP55g`F{5|`2TKL&oPjBBrJBJ^x0Y5Ed@_|qAdpB#prTPdX
zEjaW1X;F7DssBmD|4v^o`~m$P9}*h?)z^%(vP+Wpr4V9rzi04R&6j}Ib6eeT7Tl~I
zGnV!?ywDYbda7z0SMycqiLu{VnUlD`ruqk~JM#p}(8*qT-F
zN<290M*C|h1~wkx;vps?B7;xsdx9J}IV8wYP=JEGdX$v(R8+vI2dQy1Gz_$~(7+D7
zJpY-K=SLI+KaZ@OtegUb;@>gqsjI32qn-x*=;a?2|Lbe+KZD}Km#2sYJmUBizIunS
z{709k2owX0-rg3zAG$k5knx``PeI=Xy&4GX;D8js^Un<3hf(=gf8Oii)Nm9BCpEYn
zMaR;%B1o>s>Du9O6o;iWIK$V{6v$wj^+riXMnO9A*YNU_^9^BG*>kK=P*6}(Qc?lC
z3iW|u<*!Y%f6>^AxDfkCz5W~05B@#8{IOx>PjOyw3I;C0CMO}48VJ;gzJ|EDK5(BL
zTwDKDEc}^&eh)7g5MI~@&K(*E!%;#&Gzby=Gy?<}{9ioHpr>bN+CQ=aV-7&wo!e2!I8M
zEw?NJ8ePkwC+MI1hZU-$f>(8>n{g#4+~
z46x_{*H&;V_+B&!*zF#iW_(Wu0rweT$pe>%K`;p1>IGU9bV_+(-hk9!tG&|<1tRtR
zXb{-Hj0S1Ep$?)!yi+e~yRIUYe0^of*61w}U%O#)b*VpTH?v1`g%}gbqwn-K%B59C
zQoCIX0vwF*cTuB9G?6=yO#f&66bHtNgCF*lnV&*={^)j@o0F55n;RTpfa?pejDe0W
z{@`}`pfe%Xs(<5N6~ywGojYf4W@ce-e%`{u(&GGu^XD>3)UQHDT+8sXeTE+3V|n^LFw#vq(N$D82hnoM{xPr
z8P0#cD-N?TO)Eh7=E{Wq(?y*Gc{i+prO&Sh9;GCFL
zV!2lS4SHhpz;B!hj}AM=RDb!(El~9MBUn|
zwbw6-FHiT?R)2Xv)9mXg&F3ZG3(`-Cti1zR8Zp
zKI7cDIgjtcNqLXKm5tVl!Htz?gTbAFXQSVpsv0}st
zeQ1g@QxtjAH&T>%BgD@uk!fa{1&9%)K6aB{KS2i1(&fM^U9V;&w+etr;g
zBrPs34^-lPUhsp_`=>ONgWn!9fd8-v+RsD*e+aq44+sJXIRb~+2#Ys}H-gv!lx_51
z7>kk%m;tbPl$3yTk*b2CQG;|uEDA_CI;tVO
ze|#+oQ{Yc&aU1!STCiAa85A_77$IOGH>uR1vM
z0ykc&YFcXQ+Ugp*nsEDumbL-7tp)@hm^i@F7Wg>8k+p##uyR1LDA1wxe`(-fb{3TP
z2YAI_3nxQJME~K)`!9(FeA9zC)c77y23fZjp>VRFEFKWQKrr|p_&Y@4|H!Qc01ZKR
z`Y^FD@;2|t2H|9y+g`Kh0$qrOF6Jy8r#;+2u2-jxKNs@1C#
zgtt+?oR(zxK1@KE*F$3cYckh?EKEvFeBk4PteQX>M##cI6NbyehkaZO|4J4{oNxct
z`|W>ZuD>nh^AP5Ln@9LNfrN)K4`1^@9O!mJ>$t(k)Dgmd%mQ{#Fik6v%hbkE3J^aw+qTEYiutHq>E!@#)rAa
zlZ>Xj;xF^N2~?}2amS`ty~6)tF3<;4^5GSMBFpASY$tcb
zuHCrk6}wyedE4H6$!SGBQuW@~a}|tFC|Lv9?7eMY6p|7JmODR}V=BHOw%t8Wfj!dh
z5zD(1q*1Wg7|uph
zKtuhpj$)u4#Y8`ffe!upFAEC;4HPyeIyM#t4mKt(4mLh64go$M5g`EyF%cOl2?aSB
z6(t2oa-gH51rZKl<@;~NHvCJ8@SoF*e?PkWP*?v`F~f(uIy?*Qr)%p!wY>UsO#bJn
z;R7ZQPdMCH4G%{g{vgmFj_!tTv42OO-$A0q*k&7OtcPNT!L{{wiBQECjn4)l5z+~{
z(r6R`i4apI<#cCJnwC4~xvn^kA&Z_E@tZ3(S;ZN85z-J+}XkxhBEZc
zRpYyiIG#Nb&$XERYREN`&w@=vgYipu_JL*NPh4AxNg>K^;Ie=4}x`L)LyiP~csJin5>tE3D;1z2sxi>JQ7AU~Hc&lOv)|W`-&=)6eXxZU;_%O>D;0z0i
z;P1fMLHEbO!oIV2cvb^uc`=yy^c3iB13D?0*%`z)}#TodOyT)O7Hv
zfR)!^;|Hek)laMIt7~6Y*EiO_Z2nyZ2iaEy&ek`;58n&InH16*=B*F!6J^mcu&KDg
z@rA+z99mg_cEY)OPdpwAqfCRjCOi6gjxz=mHyfCDDz0s^j)L*K@cInkg+SOLknQ)O@5q1}61*pYw)ACl3+%EszHV)9
zZG-OwfZ-SD;_$^5wA(to-GcCxk2He0&1N@=pwiw03}D-iFX^u?Fx%ow%4gx9d40Y)
zkdEBdC<>XfEd*1DL_mX(r3q)pxGV=lh_yRN_}lU$pD>Hwcrnr{=?!A`=Hy*ps&MfF
z2IaJ!g^xIx&*;musGoeT_7utJ%RiSzn*3E{qL0a{{eBK*pEHk>mbQoEaz2kB=}u-=
zl-BS&InMTNgAl25Z{&y$!wt7G*Y}E?1KXu`Id&&~`MU7-xF`HF(fUXR_>L9$R0lRT
zF&-ZH*bV?H4KXnt2?+x!DU>8kM#lW-i<}&Gu$=zo5715;6yj4IAW4{xj-81KI%Hz!
z5CG{S{LqJYq(wymk`*MSz~z#vjI0`jVF|)qD>n}ezu*HqCB-FWAlDzrSe4baRWGU$
z?Z2+Z=Jvg6X>a^q9gQu&Q%$WMO|6~HZJjM`U9Ih1Z6Kf+gb4$?8VDu;d+4EOU)B8KS?Q4|dW=
z{0OAIgWW-rFfP{i7dysg9}>p1F!O@BHa9w!8>m?y>DvN72`9Y4z?Wd
zRgaxF%l~9uzG+jwc^O`|W$Sl}SKM=+`lr+e$K-_sJr47Z33Cb#xZ&(`>6Vwp6~9yG
z1C2~Vbv46uWFKh@g==wzYjK2Yu_G!%pFQ4`J=co6{2F(K9Y=*7JNUK!o^Y?1(ny&0
zXt>^Jxc*oKq726(PK-yLn~t-1n|o!o?8aKfp{lyIR(F4`*Kchka&0tbZ7lYO8joL_
zNm+YSu)1Eo_N8X+OD(9?FSYN#)Gn;m_rGngo_m@zJCiW^E@E^ed~`E>?1ze--b`EC
zEc~=tw*IyJ%O8;3
z*v8t}#>Uvj=J>|O?8c{$8}n-$(}-H%nEtWm);C^*{JeeYwl^ys`tA3Ah4{}Mh_ldt
z;$MINI~E83iU0Hi*zElDCkMa%#oq$|%rE}#FaFlA|HZ?97yOSvXxu^if-zAHq48&N
zs@0D|XiuDCQ1S)h6s*|^_}3tDsyh<$uW1yg_r?NoYNE3^qdyS^Glu4eJK+pUC(VQC
zfKn=w>_gE3xaHYGh)hwA6*}FTd*d@5VO-~~j#U8vnu8$Rzg9H}
z{A*L6sv!T`4*5&ny6u}EA^#fwV9nN-@=@Sl+m+hh+K?Fm{xzrf+rYmTsLoZlF)HCklRQEYw*0QBJKmIoM
zd4HocD`G$PTyLfT>Gh?@S4DT&7lMu7Mm-KxCCXX|)fQb|2y>gwvs^SKQA52yY=Q=r^Occ<({I2*Om9MUfUjD>_fd8Kl+sGMB&FGk!#xG
zo=@`Y-xQH$XYHm|KdnOU_DLb(S*Sq6x}f;6T@$|;CeX^RZQ4cPpDEl;!J}L)z|4_{
zAsEWchFR3k?BIB#vpDt2d^=-*+$T9M%{a?et~35ZzW6s^7dI2U_fF{(LYMi>txn97
z)6Y6`<$SkVUd~*vT>W-&kAzJC(}=hOtx&t_5X}O&=5Eg_z0{?N&n=uEbDj>ccg7P<
z?!E{h+L^k4EI#xZ$7TT03_Ioy{_HMAV8tBn6HD>wtNpllHSh1DRJMkV&~8pfzpCAw
zif85xdm@!&Q=o~#R`ZIA@Yb7960ut!(cjoRIHO}-zSqzxSJ18N@UHw-p9Y7@Hem~M
zE4^$J6|cX5;#@0zV$J6sDg4@x9eUaiKKBy`eOv9mnP{;(%60C+mj!Y;t@p*#`VJqe
zKGQjDS&aueY`@vPTK|E)7vJIAhw(Ez6X-Qt*DW6G+?-y|c_p)4XzQ}HMK{s(swOH;
z&w+%daRX*0`%$F8@%jAJ7LK?4G@+f-hSm(mrdR`M`hYtxNfH(|dkwzpd&iNRX6Tgn
z8fjJay>Xc47PgQ3Be3p~Wuf@h3FBRPCi>D-h%R5U+1TVcO!n#=4oOtE})
z`z9;ZGj$1T#hdWOrAEHXNa0_P}=9ytozF~y(Y)rxr>z8;z_Lc45q?!H!Z*(yDs%<=-$
zru5^pPeUbZ+4Y2~hOXg}W|Fd;KNb7+d3ZWWwrK4Wi3^i|{;rxv(OKX#3jriUk9
zzrd!7k8M(x{Vey!gDc0-Pl>ywqhjQTlIA=_LiMb&CNt&dAPu5u54XG*0h=`hYm20@gTPN2wBi(vDt~tEiI!l`^
z=98h5Z{OX0>f5?WCBJ3f1p~nX!+;f|gyY2Y?O75%<~@zqw`fKfINI_VR%&d)j5{rTu;SFM$D^9ts^+D)E3P;f
z^LLtwS}^Kaw|HQGoL0O8OIyyg#x=g~&ggH!sb+cu|4v*eI$IkoF{E2+>eFmhoVdWH
zjqdY!LOU^hY%e*>H@o7x1tT)H7lp@R$(RX4?W|Q1Hn~x!KCe8lUh&|w{@B^yzA`ep
z&BCIDT?K$NUfq@^dL4J{sc&CNJA3?+Ipx=W{@21uL60t#&qx@h?aY1cz)5rD>3EjK
zil0DE^;)11uUEI~mY3O?%Wut$i(}tj$?qo_Gv9I_X?v*ag6ltH>9w33f3vJ4L+7o{
zsjaaWeIVVu_w7}Ot??PW@``qycQ<0UCYE%|t41dCREoDIKNyoF-KKqie|%i`$(@+m
zcfIc)62E?~wOZbQ&dWL=s+*M!t7syB$l|3qT!<4?(GrPzauDzC97X><|CJ82e(UXd
z2C>0}9X_g0p|Nq=I8v2eCJ78BrGYQ`gEk#}c|OOC(?|}~RrcNO`<$?~{YoCcYQRf(
zHHG@ylDb~i)5yNnbg6I4`axdkn-2TR%QqI6-}ewaSa?>81YajMGyBoKI0pto_f^MoVuvtrow)!$smQCfJY{
zl>N}0>NcmJjz!l~5)xsoZ#(T-DB~XG%bOqev=k4x`h6Bv)V$xqD^I_Qh
z>Ql2jJDb|ZQcmi4K~|R6ls~IJf3r?)*F=Ap?`Rku=Em04gBPOCm@KREce|W~BY_|h
zF(8foGy|2E?LG|ME|A&Td{z71$b)a~uwoN2ayDXotA}M7s5}h!6_jqS9dY7oJN@uJ$N)EiHf0%9d(0U9X6zPX<_7^n7%{tEtgdj
zX;XPe4*P9yiwh^3>s-6_N@QSD)3j=mM%=dGOOl3m!5y~o=zgrbh(evrPGs$S$q)Ew#hp+)r_
zisR51eFk+unU7A$9lm@U7fd@Oqum^ch5Y(3m@AfuC&hJ6h-+LyH4GWnQx?}vFwsqY
zCF|K?GVV<*Y~q;oO84bG?bLP+uM=wg&g%9eIyqkgVK?lNB!W>*gVF4RF`|R9DuZ!G
zgYhP(xa&(f8d5pO`(P=AX_Eu{rk%A=DElV2V`L~dCBGSo
z{=~>ms9@#YBb&xT_F-|KoRPi4q^&uySue>@K6<3+sc8Br$}m(l`cb5XpXTVJ;7wVyW_hnA^DtVwo(PHJYm5pmbo7lTHpHL^
z`DIuhHYIo
zyn&iDMU5ZeLEcWwS2sOzaztp~4cPst6&s@huj=!ys{YHpL!w%yGEW@pOjQ
zu&FEYO42(~8@>CflvQbRLTT$7jy&n92@xL0sP0l@X0%$LVFBL
zwgGd;Z~zIH_^}XG*iU;<`tkY(?0koOIR7wo0dn
zZQ_hk$MT@U%CQ~R8e*cmsB*F}lkLirn7Crj
z$LtgZr>E;jr8C`6jp?|QB%=LwCGP==;M+)|h_7z1HUwx$^Lb{aP3=$=oV}u(^WB6D
zBHK$Q@0Prm6!+!K=VkP^yF(hV{!@Lpxcd#92|tQBlB}c6lt{`hL!8bdDKS$_t`o
z-s*~$PXOls{ein3OT
zF?Gz1F|t#B`7IPkep{+MUk%T56|gjyR*&f(S-bNMQ@CnKvw)(wa>LMdqpIwD)k9yN
zZ#$SEhwidSOVGED6cfobcZZ_(ti;;tWG7aaujL{2T`{k=D*8_G2}#vqI2g5v`#uqW
zApYs`n)-3ag@;c@_#>>m#!MW!1F15DmHeoP2D68Oe>@SdF<$)8uqBc>m(|Q9ZIuUxlJdwMHZ2C1GX4)
z_`{GV{=rB2vr&&%=lY==mbdjRTJ;P}@TZQT~Z2zt#!6Upi4;
znXn>R5a(JT-utpJKD)59-d!(hLG{GAecFgX4|lZ!%h9l&l&IK1AJqH4sp0aswM9Gb
zp|1J{(}dSFU>j}Xn~V;KDhx!=^(|bF9xd!_Q|KwJCc^zT$S^s`R10G`^E4?WclX7P
zOTgX!R^)+6>>#dhPnm7+u+TmgdN3qyI3yY{Bu&dK$ulTJJIwoOsEK=6RfkFW!LVj8
zqhv3!XBMfKgRjDUE2`WCeV$kf-1_%h6l9acXKY!|*$(UHlp3D7n=#sX!K-EN@-s4@
z=Yp4GY-&j&O0|7xP-W+Fosk5W7>~ElF2;}KcfJ@7
zeG$k-Y4mNxPa}aaGoCc2i1*F;6^+UepCWx}E5)1`y0P1F5lQ5}x6e}5Z(&v{W{+WX
zjR}t@sZ-^wnvNM}*C|q^Yi+j#NR9Dg6OU)BSKzkjTp2IY8O<+$TsZRh(^l+D#oM=b
zBI6^B?-<5CuL^k9L0g&G%k!dk5?0NZLpd3yHC|JjKB6<3RBN4Oo8Hh{ck)5HkxnJ<
zm}7ybf0G0Y^Qp-dp6TG+=vnmZWLeYqD_)$`ne_2%S$JE={k{U(#TTstgj
zn!m0&GnD(h?%Qy0%&2PDd|mwWqVggo-I=#C6dY>_9kG*aQKu`e?w!(I
zNmiK{U5lTwvPsLGB*I@q;XdQ5xP>kpvoJLGq*Zei{l)cgB{pTeN!zJO`G>QsZ)bOI
z_ss=PF0l7aYwb)DOwE~R&z^d_=vg=G@^FfxZf?_d!7ZV};KAhGz%gpaDU#-de#>G>
zqN;i2dB)50Fs|pe+k6kME)3>Q>-x{kG>w|+F0lkIYn?12%uBk&`I2#TE=6{{(KhF%
z%}WBhInJq(vpZ>L`ksG&FcbD}N!7wx+ea{ldO7IHl2hPNzy@FZVw2oXYW24<{;jdR
z-UYqDqKT_x_*H2wn!c(u^{oLp{NwNZu1+i@yt{IiZH_LQUiS5pY|^ubV^TNl8^>>-
z@%K!$eVF4wK|&*oHE(dh;b+nKkpFb;C5ctfshBA9Qwj
ziR#~z>`t@lv1I$kDUka25BKXn_@t;am?irDq08ro-}*T9m?ZIE$itY6ihUe!IvZl6Hkv3@&f@-qe<8)@PjO6X`8s1mt
z*PCJ0n;#OMr92-$7r6KtZz5Z6%XxaRJHQSm)H4bK^C!vz`du2t98qx|l)jtJ_%?BC
zr|Zl8bFaqVt@ZW2)Y5*x9`IE-|CPr5ca$IjrhA%r>g&7OYl?lZLeB1(Bu;wUzdFg=
zDtB!ax$lHXVYAo$4Y_;nK}P<&`tDTf&PX8_TI!ulMeUfP_-AuWQ7L7wYy>5@_~4VP
zmZ%e^wE2-UbD}QW0h2y~PJ}RrU}}>;k3ispddR#+2(MU|e`OJ?)+5me4~?Rav1vpp
zQyaTmA4_ZX=ZdXr869RHj8^ejm$tsmc07Z_UXzx}_|1u;3%v;{vBqytmf23$c~G0Y
zJ6&~~980^R4TX;6K4HumVwb@vx3otk3|19Kl_Zg`^54NR#IkU8*~N&va1T{KL8KUK
z=PgCp;!u#;?U=Thi8cl<`2c_rr3H5<#7eI;HAo^qV)U3~dPD-!rmX#C`{$Q?hHk=0i{6%zMq
z-r?w-P<~XTAbe)xtqSEU_k!m9sR{6J;j0K6sMy9`(5QG$;aqnV?}l*4294CGr_>*q
zI@Efo9C8#UJ6iP17m$<(disY^ZYz~xQH!YpH|L_D-@x6|FXg|OixwfLiOs<;C#txBz-u+wzQF^7iPLUyn_jyCs}5dN|D;UMlsr%RwJ~nziP`8_AZPnu_B9+Og2q!O1BziGT6K59bO$Q4F@d-SE7&E)gresXlJ^8q5Y_OZFb
zGM`2Vd`ZVfzx5<+&9&>rKYvFpra#IX`@Z&JX(_3H_3Qpr*)h@lpakDXmt>G5G@L&O
zJulcfQBF+!_L@_w@3Cbh6$ZtZ*qqO#h&xFZ>QMw<>*jD0Myx~-BZ(52(hrBPyeU`A
z6M$h;K0Z;26dA*5`oS50CHAfAg=BFJ7H!F#;J0?Sxfo=F9-z!kM`^-R#x;WVi06_{
zIv$T@o$B*sI!ze=FiKL^$KUU!poQ-Van<5hH5q%KM-?kaYPo0meX>7|&(yW6oE_}9
zzolrlwNlo+zH98LdnoX|ChWMR(umV)+r=sjg+
zU!KaH)x;A=4Ov5SX4y?fE2TdghV>7hy!cLu?(+#YUt1#>k8P(mMQ*5O;AvJm@@QF8
z)qzJj(uq0#5{g_BH(cr#7}1jF()c2-I_9{Y6<5lv(rhA*96()qc0X11n*h2Wlj8#H
zOl9r;${>fV7z-qm`PNmJwj^|wvtm9fH1{v!t2(>)(y~bES+a6PnNKWnt1V^wHxW6z
z`b{&UNFJ*Z;XHpdoP+Z62(7Q{rHs)rCLIq+qoONX*ClA@^~#5iC2$@$&}OkQN;^s5
z+IjV!WbH~o@Uqk$-Dgh*EJsaRC5?+Bp5k(~Gl`xT$tlGhn=eY1
z4rLGQlepAC;b&B)URHRO(pGm%Lo6tFy(s@^j1H|~!jPx7OPR|AGCoy*van~;BxQ3G
z)jCTr>pHig83kwQ`IApW^Gi!TY;Q?;%3Xa>#7DO=c$z_lz>_0QLiVfoJq!-Q9&Wp!
zqb=-iRL6O3aghWf!MNTn)_UH>1~y~6oJRHmzw7j>Hxq8+J#*Iy&qjd+k{&CvCrY{}
zA9&l-dSqE>SaV`(jWj)Rn7zW>I#rd#C7$k&d5@UstVNZb&_>Oyk>D0hJV`RL(~Kp`
z)Yjk*x@Mkk`KYnV2R{|Psz}B&OUcN!oeI{0UZD>qZv>l*q#v8>^sTlm{Os+hxa{(|
z$s|33(rbKP{6c=UR#B0ZqBhhQjm+7jD?
zBgIgbL*-Q1l_iVO(eAgYx0N&^+fb_*DT=)xP=^r^ma`dQF2EY;iqOa_3ivf=u05{1
zkmtT*hIM}841QJg(NI|j=Lr#xd|}FO)iO#xr{guR)=9B63-D_{l^(tB_2vnIEjp4w
zBTwXo>|TuZ1}^NEH&!iFb9u<6ml;&>d<>*$S6tg;&6QoP&~A2^`YjUpzF}qv2)BL1
zE;qjDi505YrIfGwEQ3+swV0~**;@&v(Uu1j5f>$I6WrlIJ&V%X@<4mLZ#xqmOM&8@
z(iG0cFm;8~F81yY?(R{3USFSLP)jLQ>;$_%v6`(m_72jNy%gcGWj;6PKPE>PLi6hM
zt4$$8B~RFz9r^XvUCRZl$;`qBWZ0uVuP@17ligIr9q#rj?rKwWrS!r1HqRV!UrpPU
z+|O)Ba_Hf!b;p)g`%JyCY$LhI`wMv?VkopshMAZ?#H!IE%x&+(3>=cA>hE&bOU{V^
z-InvU24%aNuuY_QAx>vzcJfS}J0(VQgE%P;CcAaj
z|KaPNpCganwNWRT7!%vJZQHiZiEZ1~#I`*_M;+V7#F^MVXTE#y7eAbHR^7Gg^AB`a
zt*Ym`A2fGRzmgh`5&|6LF&F1WnU{L>3q5RT8fk154;u$I%SSKcQq2Bv64PrKT|D9s
zmuz;sp0842rKSN@{%p2m@%xFNtjAa^Q{7Y!m@E*(5)|a(%ZYOOU^uZDY~rnXscmco
ztz2$=vbeAum*7K919J2uviaACz>|qjKLtiG+ePD1Rsxgp-zNy$OP*(pYlyaSjg;w6K$$ZM5a%~#8Z`~a$S{7#4k^<0a;?Ai&eHJ
zk})Q+O2)K$`%)w()7^82YvcR78qzc-v(qPwX~*nxC-VTZeZ?dB$CHHs2G+;PA`D>3zg->~DWM+~68bR;q0?7M(7Jx!!diq2kWPe3ZPYnTDN*oXjw?~1|
z0EMY`y}Wk$K23F^4#_M?udhPR_<2*Zz%t1#ti}JzCg65!F9?
z>yg6wuIm@$$9?H+;W$arGu?T!KX4ns
z>Xc%-g-CJ1HQ1AGK4-tmXp@(C^B87DmXegWdO7*UK6Pe<=@riu#O(9uqBdkhWJZOS
zltFFt)-3{EEXvNTbh&2=A3&}rZzX6$1x9}r3Piw8S}#`BJc7pp=H`?W?MMsya54^O
zx%qfxwbEw#EbZrLG+gbKK(wa)0yd}GZuP&|H?ZT$b`!mPV3q4PTbcU}`U0mJeXuxR*IVRZw`+
z=%53}g-v_h99pdC)YtyO(9~_$?5>&AU(xIW&Ko{yb}ud)
zW3G0vO`CFRwc{t}ZJk9X>F~ZC9dl#&NUu!g9Spf-xVF^kGknuc%=~kKu
z>56ewitEF?nn>mfst~H7B%G7YY{^XnBg^a6cj}pxO9eZq8IlOaf(SnyH#%H2nZD_L
zU%;rx2mf}`DP0$>IF3*p
zLy{JTev73f+mv1hVQb^V+WJEX$2%%%nKspDy|#U}j@uR&pw;N3m8MOkZ3)hwwaUZe9XS0+7}5`DLfpO6#%oEZ0>T>nl8p
zrKd-tyhSeL@*5blYAN|Q+q>HO)!QAB_tZl}V404fjFOAS;5BjH!j>XcN2mmL&*Hfc
zGlcgrv5S@sqE)xm35?$RbYzE&!fATr-G;~Nsl+rw)5LMSWrue|g`VdT?a~cS9HoWo
zcw82cr)LyP`&*;p#5PYx_D(We;`nhxv03X>-F-SwBa~MAGY#6QHY{b2`wZ<75o#lZ
z>L{}vaTm&a1*BC+Ql79f40n&)7aHwTM^9$ko-(fxN2$*DKZnFcII@}!Ro!y9_7Deq
zdyxt1_a+lMAvD_AFJ_zYOq(uS9q(qE4nf2GmblHB$`^HXe^1iC7Xj*OjzlD;CAYSD6ZVKR#l$L*pD7QU=_7>D5oAGe
zj&FxdgFT4i>`#cb4Kqf7*TatTBs!&qj4rcrk$#f?Bmp5DSyL&Q)zOt&I^u<0j@cHo
z)9xHbW`soZgu#Bqh9e}ZUa3GJ3DyA{WUDaN1|Nsc7RD|MgMPFRk4wk_hs2W9YB%^k
zN6Lt)p3+G9)50$jQG;Cz{Y+8@5Xi!qVs0#A02R8GAvlDTq*Ety@4!xNc<>u6jzm%W
zVVr7`0kqoq{8&Dx*d&+;b6L7G*J;w--er}VI}yKrq;+jVJWt-~CA#_R=c$)Dvg53Y
z2*{`aMf?RZCex^YCtxx5o9$)11>N
z7&u1JH_~9+kI`8MEhAW*Z@@oRx0Yg|8@~h%`meqizkNU6&R60kK(^RDlaSTwem(OT
zncj6A-Bq(U^xsU|-PO-iRH?OJ+-co+T$Quh)BTQ6Bry%vVWHb00Y!D(|6twTQQh8i-9BVuyGY(XJ!8vT-oEVSWryCrDgE%gmcMLTYnr$%UcdcQ
z?_f%x6N&`p9f{zth#-5k9yf!NEQtZ#iTdp?9c<-~)H9o&v)hdI+xLEFsH}J}YJ|%N
z#`ORMIO#YtP8^uM?~^mS7?r4K@%Qn~Xj%z|$OArSvSARR}=XTFEaicUS&zr;BXwE?eJ#F<<+bn3phv=9#y)fr;i
z)^)%Uf8H4jOdUb8G(Ng(W7_6YHgFTw_q?RY;_6?X-qK{B%AK$RU%2Uh5wsv1)gD;niDLL&3y<`tBtH%Ip;x2P
zg(41wviaX>1hDq|_>?OQq-Q}cNm30HoW0+d`p@N7+e1^oTjx(aq)qMTyq-{aS%sx+
zh4x@>v>CTeS3&jpme#p{N8Sj$)f6n|jeOMNU#Oo`$PCZ~9*^w*hIvApHnY%aI_dO*
z`Tlx1zy~v{Q2(8d`Rb;6R^{dGMLfzMnS}~{YxMQqc<($B`5>NE@Cnh!z~SNCel+!k
z%XE1lojb0C+poyuEjhu*@t0{Xv+iPeB1(31
z&9USMh(Ga#g79M(S+@$=s2L?%rN&qs@E*PDOYsZz5Zx6n9ON|n!Ea>A5$Qw;6CDHr
zgT`R02q_P+xZD$=)-q=m=KF%3Of@slgYJCv
zC=b8ne)w|VT6P*E^=R%cx9|OqSo>|z6y^~?Zqc0VwZv+sE%iiMiKhl!&@{AM6vQ#|
zI#eCs6o!i(FOvDj&;+gkzvz)1im)BErV>W^n@D>8OMO)Whw|m8I>v=WayW>BkYY3%
zMdaaJlPuh()^D<5j68sM)ts!8o=e_yR{90cu|E+2~LOH&d<*F#g9z_+Or
zS0$)7Z)6~cXI<_L?D$<~Wx7r)rkX)TQy_i{NB6JFtB0<(zUQ6p2c?l-WnG&KU-i!>
zD!E4^ZzTo4ui3KMr>xw-lwzUHHFb{!
z27#Vyo|E;PIfpN5bJT}
zME~-u-84h{p1+lMD#(43@zP7>X->ZUICY^%$ri#Wb2pcu-buYGUqX$Io1)+B&WTZk>K1pS_YOuZ
znU{LuayHpD4t&z+8HJRXB12s(#@C@csH{lQnZ8{>rJUpMr!>^!ba?~}-+ow>P#Sr?
zHw+!bv;sIgMWGQA3jzx)7}R#luSZ>J*-!A93k?m?F3A&(%#Wh+3(p)*Z!lyUl7lt8
zhqhlchi!mpm6*6;JNoQYtt_OTU*PiQ}e-SqNz=$y$cf7kA}X4rXBbY(>rc+v%7s(bM;sS&lURwR
z4Nr`1tL1o`p2C)3&qNVXCkORq$Q=w9QG_gknBJH3p;2*&$;;RHAA!Kr&6U+yhH0ZU>b+jmsCV
zp^2MnEkz8=!~=qUjCw+YYnmk;@V1bc^cNYhed-bFafU#zQK(5ix^1T@OOZDD=v?2=P%>wV@VitATcRsF(fb^qvUvy
z^h~C8y4v0W0#RoTm_Z$1cTAmfpVR276EnVoZfNB@0&7e$6!3Y-S5ANAb8D6C_ibSba&rQH{-)F7C+WDK%y{Ukk)IdA@88_9dep_P0{
z()7|d4t3>x<61I}*}3Xg9z#fOxY@47Q#*oOyE=SDY3!wVU_&0H_#ubl#$tugQw>i7
zzUJ-9QjDv77-5u@I+D|B6=;C7L3h+{>k6;5;RdU55x)ZKoO5kVh^r;7{>qZQcVjk?
ztF4sr+E%@Hb9I2LqqY9pkvPw78^qN$l5n9dq_BM|#NBi9EEbzQZJ}bHw!)@pC0a0}
z$8eKytH!w}KCaJU*ZtxgSYJtppVN6R)97
zBFJ!CBMeThOPJ=q`uFzg1h~r!6DDk#o;C;77`72!pCM={HY8(eZqf@BEx60USC4%e
ze&4Qj1*Ww0V%Ft^fE?4$TLyZqR$t?TXvd)O4kP%GOwKO$q$Iu4i|Jj(Ri)
z37*}OV=4Q_eG?X$!VNPFGCSPE8YtSHD5ts0b`CC^8Q!0@fCm@T%&LP^Y{U@?4
z9#jSM;JJF1!ur86A*h^gR1^hW%*9JnJ}pDdtY^WTip%GS-GV)$*vc>_tb#53z&;$L
z7T9z*pnwx2KAmpky%=YTO7WF!>Vqr`JLVxuj8`4;MX3fVP;DknC6?VY^i~N;-;)qs
z0rQLyq20R$Wso>lsYPQFM{=N>f9bnhBmpP^Vm@i7ENbP;kVsOih12T06IgS)IJHlN
zt`mR^1{}_M6YY9JBbG&ORvE1!$amCCyp5kawj}pH>mY}0{`M@40a#_sePtbW8I`Ol
z)Aa}+QgR+FoqTCbEO_u!ZKvW0c2RYUew=_9NzV*b3ETp>XVbygeE8TU=zY-uT4J72
zlYC9xMOJ`y*D~2nk+3DfQ;w0c<4Ojh#2#gMro|yDJQ;Pmq8ebd3JMddUNgNI8uJ1x
z%7siVJ#yW!@GM4p{q7)9Cj&xrQkrOs+h33n9k^D{Q=f2Sf*oM^#wdk;$Y-#*rS*RY^&UkxZW_lb{0LaZM>*4{*sK>7P?G
z9QWmiWj9cCFpG&lea6-VFa=wd7EMXXOCSelFci_s;{UA1+RDZ{jD0Qal>1ZQVWCk%
zQ)(fWTWqB15T@Ap@8#BIe)b(mW?D94{>*-o&J-nLW|}GXfss2!4V(CmYFBRf1{xQp
zgDITZN;}qdG$k98m6UZs&*&;k;;?{E8P@=dIdClWsj-2JUs
z7F&jGwR#-kvq3D7rjZM+PgLR_{avHa2s0B_?PMY{L&Nt#H8WjXk`>QU(@58-Y!FKN
zhvz0N7qCF**jb{u3GufR6?M-il`*SzfrVUrv1}O$g8Oj3s}XevkF}Job^bDN+?(1n
zveNrsDPU%$Pa(B$MWt^8wO>c2-vG7$Sf&3gb-?QHuIq%^jmp5A-_t4hQ=emqca_24
zZQLcz2h-#CAEgE;Y|Q=h*H%VhD~Qf4;{tW5oe@=P)(dR`xenO|KPU(zK@|ici8RU<
zWq)`Hf;&>Dy3od&)_Y^}H$}>96OGK`vlS?yT?X*7bgO=-Td!|~z4;uJ4@TBfoqkv-Ix_(rD~xgaT4
zln(xT&hY?-eK8Lbicp{EMG@;1oowYKU?4)Ip&_VHizg^tAOLt5$rk%lQnmgi`&n0U
zViw22>05yLy=tCu_&_OLfdj~MX%Nb&vJMmm-e1`%|
zTr>I_B%rJ0F&U-fxXcAO9aE)xGHbpA4xH}F#xsVwH|W7lX5i!_y{B_YrB2+3UoA4~
zhhK;7JF4~=o$RQ|zb)?#nD0PWguB3MC1N@;Ir-t)TbD~A(my=^Z%Ns6Z{
z&IKgVFTRtlEY=qo)Gwc6;O8`aq9Fa*6*(lMmmI{t4m@=3zPh$k53*2a^n6%t2~yYVVju0zMgb7#}{Pw28ps9^qD@{kw0fzOXbGAJi)_>MiLr^
z`%hdk^*~B1P^t8sc=$QMXXq?CL&;K4z=h|G|s-m_F7^l
zTD(8*!sbyD!bDv;1f!z>qmS>1)QP;CD3c;KPQmXxD=1&aNVC$31Z&Mc9kva$>|Ob^Y{Kju;yZ*t