<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Ulf Schneider – Maker and Agile Coach</title>
  <subtitle>Hi, I&#39;m Ulf Schneider, a software maker and agile coach living in Paderborn, Germany.</subtitle>
  <link href="https://ulfschneider.io/feed.xml" rel="self" />
  <link href="https://ulfschneider.io" />
  <updated>2026-08-12T17:35:46Z</updated>
  <id>https://ulfschneider.io</id>
  <author>
    <name>Ulf Schneider</name>
    <email>mail@ulfschneider.io</email>
  </author>
  <entry>
    <title>Libori</title>
    <link href="https://ulfschneider.io/2026-08-01-libori/" />
    <updated>2026-08-02T07:03:02Z</updated>
    <id>https://ulfschneider.io/2026-08-01-libori/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/Sj11lqanY5-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/Sj11lqanY5-200.webp 200w, https://ulfschneider.io/img/Sj11lqanY5-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Libori is Paderborn&#39;s fair, which is also a major religious celebration. For one week, Christians from around the world gather at Paderborn Cathedral for services and shared celebrations. Since Emil joined the cathedral choir, we feel more connected to this spiritual side of the festival. &lt;a href=&quot;https://www.youtube.com/watch?v=ltzSQYjw2Do&quot;&gt;Libori 2026&lt;/a&gt; shows the opening service at Paderborn Cathedral. Here is a jump right into the &lt;a href=&quot;https://www.youtube.com/live/ltzSQYjw2Do?t=4270&quot;&gt;singing of the psalms&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Libori</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-08-01-libori/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Libori RTF</title>
    <link href="https://ulfschneider.io/2026-08-01-libori–rtf/" />
    <updated>2026-08-02T07:09:25Z</updated>
    <id>https://ulfschneider.io/2026-08-01-libori–rtf/</id>
    <content type="html"> &lt;p&gt;This year&#39;s Libori RTF was a fantastic ride. Perfect weather, beautifully planned routes, excellent organization and catering, and so many friends to meet along the way! What a great day! Here is the &lt;a href=&quot;https://www.strava.com/activities/19553989565&quot;&gt;Strava Route&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/pq7_rxyoWv-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/pq7_rxyoWv-200.webp 200w, https://ulfschneider.io/img/pq7_rxyoWv-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/O86y4of_jb-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;676&quot; srcset=&quot;https://ulfschneider.io/img/O86y4of_jb-200.webp 200w, https://ulfschneider.io/img/O86y4of_jb-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/MWL1_CYvLm-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;900&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/MWL1_CYvLm-200.webp 200w, https://ulfschneider.io/img/MWL1_CYvLm-900.webp 900w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;

    <hr/><p><strong><a href="">Libori RTF</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-08-01-libori–rtf/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Cake and coffee</title>
    <link href="https://ulfschneider.io/2026-08-01-cake-and-coffee/" />
    <updated>2026-08-02T06:57:38Z</updated>
    <id>https://ulfschneider.io/2026-08-01-cake-and-coffee/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/0rNvPH81vk-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/0rNvPH81vk-200.webp 200w, https://ulfschneider.io/img/0rNvPH81vk-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Emil wanted to do something special for me and baked a cake and cooked coffee. What a lovely surprise.&lt;/figcaption&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Cake and coffee</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-08-01-cake-and-coffee/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Free time</title>
    <link href="https://ulfschneider.io/2026-07-05-free-time/" />
    <updated>2026-07-05T10:48:28Z</updated>
    <id>https://ulfschneider.io/2026-07-05-free-time/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/0J2SRFF4q0-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/0J2SRFF4q0-200.webp 200w, https://ulfschneider.io/img/0J2SRFF4q0-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Free time</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-07-05-free-time/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Why Agile Works</title>
    <link href="https://ulfschneider.io/2026-06-23-why-agile-works/" />
    <updated>2026-06-23T05:11:46Z</updated>
    <id>https://ulfschneider.io/2026-06-23-why-agile-works/</id>
    <content type="html"> &lt;p&gt;The &lt;a href=&quot;https://ulfschneider.io/assets/why-agile-works/&quot;&gt;&lt;cite&gt;Why Agile Works&lt;/cite&gt;&lt;/a&gt; slide deck can be used for a two-hour interactive session exploring the reasoning behind agile software development, without referring to any specific agile method.&lt;/p&gt;

    <hr/><p><strong><a href="">Why Agile Works</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-06-23-why-agile-works/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Joy</title>
    <link href="https://ulfschneider.io/2026-06-21-joy/" />
    <updated>2026-06-21T17:24:17Z</updated>
    <id>https://ulfschneider.io/2026-06-21-joy/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/7kTLmRiSs3-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/7kTLmRiSs3-200.webp 200w, https://ulfschneider.io/img/7kTLmRiSs3-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Joy</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-06-21-joy/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Mit dem Rad von Paderborn nach Dänemark</title>
    <link href="https://ulfschneider.io/2026-06-12-444/" />
    <updated>2026-06-12T08:56:53Z</updated>
    <id>https://ulfschneider.io/2026-06-12-444/</id>
    <content type="html">&lt;p&gt;20 Radfahrer, 660 Kilometer, ein Ziel – Radelnde Rotarier sammeln 75.000 Euro für Fahrräder, die Menschen in Sambia helfen sollen.&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://www1.wdr.de/nrw/ostwestfalen-lippe/kreis-paderborn/paderborn-aarhus-radtour-spenden-100.html&quot;&gt;&lt;cite&gt;Mit dem Rad von Paderborn nach Dänemark&lt;/cite&gt;&lt;/a&gt;&lt;/p&gt;

    <hr/><p><strong><a href="">Mit dem Rad von Paderborn nach Dänemark</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-06-12-444/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>RTF Durch das Hochstift &amp; Löckenhoff Bike-Day</title>
    <link href="https://ulfschneider.io/2026-06-05-RTF/" />
    <updated>2026-06-21T17:37:53Z</updated>
    <id>https://ulfschneider.io/2026-06-05-RTF/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/BA1hyk540y-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/BA1hyk540y-200.webp 200w, https://ulfschneider.io/img/BA1hyk540y-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;The ambitious gravel group on the Löckenhoff Bike-Day&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Save the date: As a result of the collaboration between my cycling club, the  &lt;em&gt;Rad-Treff Borchen&lt;/em&gt;, and the bicycle shop &lt;em&gt;Löckenhoff&lt;/em&gt;, as one of our sponsors, you have the chance to ride a variety of organized routes on Sunday, 14th June, 2026!&lt;/p&gt;
&lt;p&gt;Starting point is the Löckenhoff shop at Karl-Schurz-Str. 14, in Paderborn. You can do RTF road cycling from 58 km, over 97 km, 125 km, up to 177 km, including catering on the routes. Starting is 08:00 - 09:30. Get details and GPX tracks at &lt;a href=&quot;https://rad-treff-borchen.de/rtf_2026/&quot;&gt;RTF Durch das Hochstift&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And you can do Gravel on two routes, 25 km and 52 km, with catering on the 52 km route. Starting at 12:00, guided! Details and GPX tracks at &lt;a href=&quot;https://rad-treff-borchen.de/loeckenhoff-gravelrides/&quot;&gt;Löckenhoff Gravelrides&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/yN3ybl22H9-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2480&quot; height=&quot;3508&quot; srcset=&quot;https://ulfschneider.io/img/yN3ybl22H9-200.webp 200w, https://ulfschneider.io/img/yN3ybl22H9-2480.webp 2480w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">RTF Durch das Hochstift &amp; Löckenhoff Bike-Day</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-06-05-RTF/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Cuddle time</title>
    <link href="https://ulfschneider.io/2026-05-01-cuddle-time/" />
    <updated>2026-06-21T18:03:42Z</updated>
    <id>https://ulfschneider.io/2026-05-01-cuddle-time/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/oEcKJDvS_E-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/oEcKJDvS_E-200.webp 200w, https://ulfschneider.io/img/oEcKJDvS_E-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;

    <hr/><p><strong><a href="">Cuddle time</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-05-01-cuddle-time/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Robust enums in Go</title>
    <link href="https://ulfschneider.io/2026-04-26-go-enums/" />
    <updated>2026-04-27T05:25:14Z</updated>
    <id>https://ulfschneider.io/2026-04-26-go-enums/</id>
    <content type="html">&lt;p&gt;Yet another article on the topic&lt;/p&gt;
 &lt;p&gt;In a programming situation an enum should provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;self-documenting constant identifiers,&lt;/li&gt;
&lt;li&gt;easy logging, marshaling and unmarshaling,&lt;/li&gt;
&lt;li&gt;type safety,&lt;/li&gt;
&lt;li&gt;and being able to iterate over the enum values.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go does not support enums natively and some of the patterns developers use to handle enums in Go have drawbacks, as you can read in &lt;a href=&quot;https://threedots.tech/post/safer-enums-in-go/&quot;&gt;&lt;cite&gt;Safer Enums in Go&lt;/cite&gt;&lt;/a&gt;. I&#39;ve come to use a slug-based approach that is iterable and gets close enough to type-safety for practical purposes. In my view it gives a good balance of safety and implementation effort.&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-04-26-go-enums/#slug-based&quot;&gt;Slug-based&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-04-26-go-enums/#type-safe&quot;&gt;Type-safe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-04-26-go-enums/#iterable&quot;&gt;Iterable&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h2 id=&quot;slug-based&quot; tabindex=&quot;-1&quot;&gt;Slug-based&lt;/h2&gt;
&lt;p&gt;A slug refers to a string that is lowercase, contains no spaces (using - or _ instead), is human-readable, and safe to use in URLs, JSON, and databases. In Go it can be implemented like:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; job

&lt;span class=&quot;token comment&quot;&gt;// Status represents the lifecycle state of a job.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; Status &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Possible status values for a job.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	StatusPending    Status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pending&quot;&lt;/span&gt;
	StatusCancel     Status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cancel&quot;&lt;/span&gt;
	StatusProcessing Status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;processing&quot;&lt;/span&gt;
	StatusCompleted  Status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;completed&quot;&lt;/span&gt;
	StatusCanceled   Status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;canceled&quot;&lt;/span&gt;
	StatusFailed     Status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;failed&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Slugs are self-documenting and work equally well for logging and marshaling, something the Go &lt;code&gt;iota&lt;/code&gt; approach does not give you. The constant identifier &lt;code&gt;StatusPending&lt;/code&gt; is as readable as the slug &lt;code&gt;&amp;quot;pending&amp;quot;&lt;/code&gt;. However, the above code will not let you iterate over all constant values and it is not type-safe.&lt;/p&gt;
&lt;h2 id=&quot;type-safe&quot; tabindex=&quot;-1&quot;&gt;Type-safe&lt;/h2&gt;
&lt;p&gt;The slug-based approach cannot be made type-safe. The following is possible:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// s should hold only defined status values,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// but the following assignment of an arbitrary value &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// will not raise a compiler complaint&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;arbitrary value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To improve in this area, you can do:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// KnownStatuses is a slice with all possible status values&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; KnownStatuses &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;Status&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;StatusPending&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusCancel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusProcessing&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusCompleted&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusCanceled&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusFailed&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// knownStatusSes is a set with fast access to each status&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; knownStatusesSet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MakeSet&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Status&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;KnownStatuses&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ParseStatus will parse s into a job status&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ParseStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Status&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	status &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ok &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; knownStatusesSet&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;status&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; ok &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; status&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;unknown job status: %s&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ParseStatus&lt;/code&gt; will parse any &lt;code&gt;string&lt;/code&gt; and ensure it can be parsed into a valid &lt;code&gt;Status&lt;/code&gt;, or an &lt;code&gt;error&lt;/code&gt; is raised. It is still required by the programmer to call &lt;code&gt;ParseStatus&lt;/code&gt; when transforming a &lt;code&gt;string&lt;/code&gt; into a &lt;code&gt;Status&lt;/code&gt;, like when unmarshaling from a JSON value to a &lt;code&gt;Status&lt;/code&gt; value, but in this situation you have to do something like &lt;code&gt;s = Status(&amp;quot;processing&amp;quot;)&lt;/code&gt; regardless, so you may as well do &lt;code&gt;s = job.ParseStatus(&amp;quot;processing&amp;quot;)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A possible enhancement for a validation when you &lt;em&gt;do not control&lt;/em&gt; the parsing situation, because someone else is handing over a &lt;code&gt;Status&lt;/code&gt; to you, is:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// IsValidStatus will return true if s is a known job status&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;IsValidStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s Status&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ParseStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When using &lt;code&gt;ParseStatus&lt;/code&gt; and &lt;code&gt;IsValidStatus&lt;/code&gt; at key locations in the code, I think we get something that is close enough to type-safety, which allows to work in all other code locations with &lt;em&gt;unguarded&lt;/em&gt; access to &lt;code&gt;Status&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MakeSet&lt;/code&gt; is a helper function that will transform a &lt;code&gt;slice&lt;/code&gt; into a set , and as such, it can be useful as well in other situations. Note that Go does not have a native set type; they are typically implemented as maps with empty struct values since an empty struct consumes no memory.&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; MakeSet&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;T comparable&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;T&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;T&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	m &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;T&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; values &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		m&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; m
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;iterable&quot; tabindex=&quot;-1&quot;&gt;Iterable&lt;/h2&gt;
&lt;p&gt;It is most straightforward to iterate over &lt;code&gt;KnownStatuses&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; KnownStatuses &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// do something with s&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the &lt;code&gt;KnownStatuses&lt;/code&gt; should not be exposed outside of the job package, you can make a range-over-func (you need Go 1.23+ for this to work):&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// keep knownStatus inside of the job package&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; knownStatuses &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;Status&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;StatusPending&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusCancel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusProcessing&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusCompleted&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusCanceled&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; StatusFailed&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// AllStatuses is a range-over-func that &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// exposes an iterator over all job status values&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AllStatuses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;yield &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Status&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; knownStatuses &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;yield&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Outside of the &lt;code&gt;job&lt;/code&gt; package the range-over-func allows to iterate over all job status values without exposing the &lt;code&gt;knownStatuses&lt;/code&gt; slice.&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; data-language=&quot;go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; job&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AllStatuses &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

    <hr/><p><strong><a href="">Robust enums in Go</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-04-26-go-enums/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Springtime market</title>
    <link href="https://ulfschneider.io/2026-04-19-springtime-market/" />
    <updated>2026-04-19T07:05:28Z</updated>
    <id>https://ulfschneider.io/2026-04-19-springtime-market/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/na_RKI1Wsn-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/na_RKI1Wsn-200.webp 200w, https://ulfschneider.io/img/na_RKI1Wsn-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;This weekend the people of our local market asked the children to draw images of the springtime market. Emil joined happily because there was the change to get a prize for the drawings that received the most up-votes from visitors.&lt;/figcaption&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Springtime market</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-04-19-springtime-market/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Keep your email address away from spammers</title>
    <link href="https://ulfschneider.io/2026-04-10-obfuscate-email/" />
    <updated>2026-04-12T08:06:45Z</updated>
    <id>https://ulfschneider.io/2026-04-10-obfuscate-email/</id>
    <content type="html"> &lt;p&gt;Use &lt;a href=&quot;https://spencermortensen.com/articles/email-obfuscation/&quot;&gt;&lt;cite&gt;Email address obfuscation: What works in 2026?&lt;/cite&gt;&lt;/a&gt; by Spencer Mortensen to keep your email address away from spammers.&lt;/p&gt;
&lt;p&gt;This could be a case for a web component combining multiple of the presented techniques. Unfortunately, what really works requires JavaScript, which can be an issue. My favorite pattern so far is &lt;em&gt;2.10 User Interaction&lt;/em&gt;, because it provides decent protection against spammers without additional library dependencies. I am using it with the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API&quot;&gt;Intersection Observer API&lt;/a&gt; and CSS class name selectors &lt;code&gt;.oma&lt;/code&gt; for &lt;em&gt;obfuscated email address&lt;/em&gt; and &lt;code&gt;.oml&lt;/code&gt; for &lt;em&gt;obfuscated email link&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; data-language=&quot;JavaScript&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// email obfuscation&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; mObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IntersectionObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;decode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; parts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;o&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;l&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;u&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;c&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;k&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;c&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;o&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;m&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; entries&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isIntersecting &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;oml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mai&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lto&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; parts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      mObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unobserve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isIntersecting &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;oma&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      mObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unobserve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;o &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.oml,.oma&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    mObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;o&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;readyState &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;loading&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DOMContentLoaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To challenge the crawler a bit more, you could put that script into a dedicated file &lt;code&gt;mail.js&lt;/code&gt;, and load it from inside of your &lt;code&gt;head&lt;/code&gt;, like:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; data-language=&quot;JavaScript&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//challenge the crawler!&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;script&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/js/mail.js&quot;&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will require the crawler to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;execute JS,&lt;/li&gt;
&lt;li&gt;discover the dynamic script,&lt;/li&gt;
&lt;li&gt;load the script, and&lt;/li&gt;
&lt;li&gt;execute it,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to get your email address.&lt;/p&gt;

    <hr/><p><strong><a href="">Keep your email address away from spammers</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-04-10-obfuscate-email/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Have fun</title>
    <link href="https://ulfschneider.io/2026-04-03-have-fun/" />
    <updated>2026-04-03T08:14:10Z</updated>
    <id>https://ulfschneider.io/2026-04-03-have-fun/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/Xnm4fx19er-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/Xnm4fx19er-200.webp 200w, https://ulfschneider.io/img/Xnm4fx19er-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Have fun</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-04-03-have-fun/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>JSON Web Tokens</title>
    <link href="https://ulfschneider.io/2026-03-25-jwt/" />
    <updated>2026-03-25T09:34:52Z</updated>
    <id>https://ulfschneider.io/2026-03-25-jwt/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://www.jwt.io/introduction&quot;&gt;&lt;cite&gt;jwt.io/introduction&lt;/cite&gt;&lt;/a&gt; is a good introduction to JWTs.&lt;/p&gt;
&lt;p&gt;Tool-wise &lt;a href=&quot;https://www.authgear.com/tools/jwt-jwe-debugger&quot;&gt;&lt;cite&gt;authgear.com/tools/jwt-jwe-debugger&lt;/cite&gt;&lt;/a&gt; is probably a good choice, as it runs completely in the web browser. Authgear claims:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your data security is our top priority. All encoding, decoding, encryption and decryption happen in this browser. This tool does not store or send your JWT and JWE outside of the browser.&lt;/p&gt;
&lt;/blockquote&gt;

    <hr/><p><strong><a href="">JSON Web Tokens</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-03-25-jwt/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Come, join our cycling route from Paderborn to Aarhus</title>
    <link href="https://ulfschneider.io/2026-03-14-44444/" />
    <updated>2026-06-05T13:46:29Z</updated>
    <id>https://ulfschneider.io/2026-03-14-44444/</id>
    <content type="html">&lt;p&gt;From May 30 to June 3, we will ride from Paderborn in Germany to Aarhus in Denmark in four days. The route covers 625 kilometers of road cycling with 3,190 meters of elevation gain. The event is organized by the &lt;a href=&quot;https://www.cyclingtoserve.org&quot;&gt;Rotary Fellowship Cycling to Serve&lt;/a&gt; in collaboration with local cycling clubs and everyone is invited to join! The &lt;a href=&quot;https://rad-treff-borchen.de/projekt-4-444-4/&quot;&gt;Rad-Treff Borchen planned the day-to-day routes&lt;/a&gt;.&lt;/p&gt;
 &lt;figure&gt;
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874466421/embed?share_token=aKv38DM6wNpIarZA6ON4Lf3qN5XtZfuXgg2W02fvQO9dWvXS4i&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;
&lt;p&gt;This is not only an inspiring cycling event; it is a fantastic way to help! We&#39;re aiming to gather donations to buy &lt;a href=&quot;https://fund.worldbicyclerelief.org/de-DE/project/rotary-cycling-team?tab=ubersicht&amp;amp;yby6rfrrwwbr7xhah335hpglly=qLswiCWUFUZ1L3g2UXlSmGRfFxunUjgHxUAYBrnGf_VMOr4tOvUqUXbGdTD86ryAv54uklRx&quot;&gt;444 Buffalo Bikes&lt;/a&gt; for &lt;a href=&quot;https://worldbicyclerelief.org/&quot;&gt;World Bicycle Relief&lt;/a&gt;. 147 euros will fund a Buffalo Bike for someone in need.&lt;/p&gt;
&lt;p&gt;As we arrive in Aarhus, the &lt;a href=&quot;https://4days-favrskov.dk&quot;&gt;4Days of Favrskov&lt;/a&gt; will begin, and that&#39;s another cycling event aiming to contribute to the donation goal. So, the name &lt;span class=&quot;inline-block&quot;&gt;4 444 4&lt;/span&gt; might make more sense now – ride 4 days to help fund 444 bikes, and if you like, take part in the 4Days of Favrskov 😃!&lt;/p&gt;
&lt;p&gt;On our ride to Aarhus you’re welcome to join us 🚴 for a day or a part of a day! The route is divided into nine sections with clear meeting spots, so you can easily hop on. Riders with a German Cycling license can even earn official kilometers for their clubs during the event. Though, it&#39;s not required to have a license nor to be organized with Rotary. Your passion for road cycling will bring you in.&lt;/p&gt;
&lt;dl class=&quot;line-list marker&quot;&gt;
&lt;dt&gt;May 29, 19:00 Warm up and fundraising party&lt;/dt&gt;
&lt;dd&gt;
Meet us at&lt;br&gt;
Deelenhaus&lt;br&gt;
Krämerstraße 8&lt;br&gt;
Paderborn&lt;/dd&gt;
&lt;dt&gt;May 30, 09:30 Paderborn → Detmold
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Zahnmedizinisches Zentrum&lt;br&gt;
Mersinweg 26&lt;br&gt;
33100 Paderborn
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2843597669/embed?share_token=av4Et9Gvnn6crJsz5XEfCnMQ40MUh8PjB0JYOZgG2xVntVLH4S&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;May 30, 12:00 Detmold → Nienburg
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Arminstraße 65A&lt;br&gt;
Detmold
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2843606385/embed?profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;May 31, 09:30 Nienburg → Rothenburg (Wümme)
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Schlossplatz&lt;br&gt;
Nienburg
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874378512/embed?share_token=azYwp3gt3Mt7uTGsIuXONaWtiMGLYhyrO92fNLej6WZSenXjp5&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;May 31, 13:30 Rothenburg (Wümme) → Hamburg/Hagenbeck
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Große Str. 1&lt;br&gt;
Rothenburg (Wümme)
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874383615/embed?share_token=aGOT2T4MDlEi8is6ClUl3Z6v3KT8gWnX2MGhYORqeQsmqdQsH7&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;June 1, 09:30 Hamburg → Aukrug
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Tierpark Hagenbeck&lt;br&gt;
Lokstedter Grenzstraße 2&lt;br&gt;
Hamburg
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874384244/embed?share_token=aaRfo8uzsfbkycXx4gAsY46U2uwTHV62ajlZy45Zv0auv5rP5O&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;June 1, 13:30 Aukrug → Schleswig
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Fahrrad Raststation und Eisdiele&lt;br&gt;
Itzehoer Str. 2&lt;br&gt;
Aukrug
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874385215/embed?share_token=a894QQDW0C2bD19Iv80Tjg9Pv2IbBor62XUoWKo1sMa0UE0AHy&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;June 2, 09:30 Schleswig → Flensburg
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
F-Ritz Hotel Schleswig&lt;br&gt;
Friedrichstr. 100&lt;br&gt;
Schleswig
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874386024/embed?share_token=aSY9TP25GZnYk0qbdkq4mVsitO44twvyI5EBzH3fK23FJOrjZG&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;June 2, 12:00 Flensburg → Vejle
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Ben&#39;s Fischhütte&lt;br&gt;
Museumshafen&lt;br&gt;
Flensburg
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874387064/embed?share_token=a5jKvS14D4rDht39G5Ou3OtrymKBOyRwnsF4rNp8n304Ld2zVD&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;June 3, 10:00 Vejle → Aarhus
&lt;/dt&gt;
&lt;dd&gt;
Starting point is&lt;br&gt;
Willy Sørensens Plads 3&lt;br&gt;
7100 Vejle
&lt;iframe src=&quot;https://www.komoot.com/de-de/tour/2874389414/embed?share_token=aXaKnPFzRs3ZrRZOJBAmxhyoOQsjPN6pk1Nxi3jQGE2kbiCHI8&amp;amp;profile=1&quot; width=&quot;100%&quot; height=&quot;700&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/dd&gt;
&lt;dt&gt;June 4, 15:00 Our final destination and the beginning of the &lt;a href=&quot;https://4days-favrskov.dk&quot;&gt;4Days of Favrskov&lt;/a&gt; in Aarhus&lt;/dt&gt;
&lt;/dl&gt;
&lt;figure&gt;&lt;img src=&quot;https://ulfschneider.io/img/0P_1ylXRJW-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;726&quot; srcset=&quot;https://ulfschneider.io/img/0P_1ylXRJW-200.webp 200w, https://ulfschneider.io/img/0P_1ylXRJW-1600.webp 1600w&quot; sizes=&quot;100vw&quot;&gt;&lt;/figure&gt;

    <hr/><p><strong><a href="">Come, join our cycling route from Paderborn to Aarhus</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-03-14-44444/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Coziness</title>
    <link href="https://ulfschneider.io/2026-03-09-coziness/" />
    <updated>2026-04-03T08:14:01Z</updated>
    <id>https://ulfschneider.io/2026-03-09-coziness/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/bjhgYUKAxQ-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/bjhgYUKAxQ-200.webp 200w, https://ulfschneider.io/img/bjhgYUKAxQ-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Coziness</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-03-09-coziness/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Laughter</title>
    <link href="https://ulfschneider.io/2026-02-03-laughter/" />
    <updated>2026-02-03T18:46:40Z</updated>
    <id>https://ulfschneider.io/2026-02-03-laughter/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/9GWAE6IfH9-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/9GWAE6IfH9-200.webp 200w, https://ulfschneider.io/img/9GWAE6IfH9-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Laughter</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-02-03-laughter/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Accessibility for everyone</title>
    <link href="https://ulfschneider.io/2026-02-03-accessibility-for-everyone/" />
    <updated>2026-02-03T18:46:33Z</updated>
    <id>https://ulfschneider.io/2026-02-03-accessibility-for-everyone/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://accessibilityforeveryone.site&quot;&gt;&lt;cite&gt;Accessibility for everyone&lt;/cite&gt;&lt;/a&gt; by Laura Kalbag is now available online for free.&lt;/p&gt;

    <hr/><p><strong><a href="">Accessibility for everyone</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-02-03-accessibility-for-everyone/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>pure prompt</title>
    <link href="https://ulfschneider.io/2026-01-27-pure/" />
    <updated>2026-01-28T06:06:31Z</updated>
    <id>https://ulfschneider.io/2026-01-27-pure/</id>
    <content type="html">&lt;p&gt;Pretty, minimal and fast ZSH prompt&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://github.com/sindresorhus/pure&quot;&gt;&lt;cite&gt;pure&lt;/cite&gt;&lt;/a&gt; by Sindre Sorhus is a prompt enhancement for ZSH.&lt;/p&gt;
&lt;figure class=&quot;max-w-sm&quot;&gt;
&lt;img src=&quot;https://ulfschneider.io/img/cLqdfO9FTf-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;724&quot; height=&quot;138&quot; srcset=&quot;https://ulfschneider.io/img/cLqdfO9FTf-200.webp 200w, https://ulfschneider.io/img/cLqdfO9FTf-724.webp 724w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;My pure prompt. I like to see my current folder and the Git status in a dedicated line, followed by a new line for inputting my commands.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;My settings in the &lt;code&gt;.zshrc&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .zshrc &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Pure prompt&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;fpath&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;brew &lt;span class=&quot;token parameter variable&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;/share/zsh/site-functions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
autoload &lt;span class=&quot;token parameter variable&quot;&gt;-U&lt;/span&gt; promptinit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; promptinit
prompt pure
zstyle :prompt:pure:path color cyan
zstyle :prompt:pure:git:branch color yellow&lt;/code&gt;&lt;/pre&gt;

    <hr/><p><strong><a href="">pure prompt</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-01-27-pure/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Learning Go</title>
    <link href="https://ulfschneider.io/2026-01-24-golang-resources/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/2026-01-24-golang-resources/</id>
    <content type="html">&lt;p&gt;I find these resources useful for learning Go&lt;/p&gt;
 &lt;div class=&quot;table-of-contents&quot;&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#go&quot;&gt;Go&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#test&quot;&gt;Test&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#error-handling&quot;&gt;Error handling&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#vulnerability-management&quot;&gt;Vulnerability management&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#folder-structure&quot;&gt;Folder structure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#logging&quot;&gt;Logging&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2026-01-24-golang-resources/#json&quot;&gt;JSON&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h2 id=&quot;go&quot; tabindex=&quot;-1&quot;&gt;Go&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com&quot;&gt;&lt;cite&gt;gobyexample.com&lt;/cite&gt;&lt;/a&gt; excellent examples with short and clear explanations, by &lt;a href=&quot;https://markmcgranaghan.com&quot;&gt;Mark McGranaghan&lt;/a&gt; and &lt;a href=&quot;https://eli.thegreenplace.net&quot;&gt;Eli Bendersky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://threedots.tech/go-in-one-evening/&quot;&gt;&lt;cite&gt;Go in one evening&lt;/cite&gt;&lt;/a&gt; a practical course for experienced programmers. It&#39;s excellent, but it took me more than one evening.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@FloWoelki&quot;&gt;&lt;cite&gt;youtube.com/@FloWoelki&lt;/cite&gt;&lt;/a&gt; watch and listen while Florian is coding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://google.github.io/styleguide/go/index&quot;&gt;&lt;cite&gt;Google Go Styleguide&lt;/cite&gt;&lt;/a&gt; &lt;q&gt;The Go Style Guide and accompanying documents codify the current best approaches for writing readable and idiomatic Go&lt;/q&gt; at Google. It has three parts: the style guide, a more verbose style decisions, and best practices.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://100go.co&quot;&gt;&lt;cite&gt;100 Go mistakes and how to avoid them&lt;/cite&gt;&lt;/a&gt; a summary of the original book with the same title by Teiva Harsanyi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;test&quot; tabindex=&quot;-1&quot;&gt;Test&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TG5cRcBihCM&quot;&gt;&lt;cite&gt;Testen in Go (Golang) in 90 Minuten // deutsch&lt;/cite&gt;&lt;/a&gt;, Golo Roden, the native web GmbH&lt;/p&gt;
&lt;h2 id=&quot;error-handling&quot; tabindex=&quot;-1&quot;&gt;Error handling&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jetbrains.com/guide/go/tutorials/handle_errors_in_go/&quot;&gt;&lt;cite&gt;How to Handle Errors in Go&lt;/cite&gt;&lt;/a&gt;, JetBrains blog&lt;/p&gt;
&lt;h2 id=&quot;vulnerability-management&quot; tabindex=&quot;-1&quot;&gt;Vulnerability management&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck&quot;&gt;&lt;cite&gt;govulncheck&lt;/cite&gt;&lt;/a&gt; Go documentation&lt;/p&gt;
&lt;h2 id=&quot;folder-structure&quot; tabindex=&quot;-1&quot;&gt;Folder structure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/modules/layout&quot;&gt;&lt;cite&gt;Organizing a Go module&lt;/cite&gt;&lt;/a&gt; the official Go guide&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/golang-standards/project-layout&quot;&gt;&lt;cite&gt;Standard Go Project Layout&lt;/cite&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2k0GYWBGGFM&quot;&gt;&lt;cite&gt;Go (Golang): Endlich Struktur im Code // deutsch&lt;/cite&gt;&lt;/a&gt;, Golo Roden, the native Web GmbH, the recommendation is to not create a pkg folder&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/golang-learn/go-project-layout-e5213cdcfaa2&quot;&gt;&lt;cite&gt;Go Project Layout&lt;/cite&gt;&lt;/a&gt; article on Medium by Kyle C. Quest&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bontus.medium.com/embrace-the-internal-package-a-go-project-structure-for-clarity-2207bacb4bed&quot;&gt;&lt;cite&gt;Embrace the Internal Package: A Go-Project Structure for Clarity.&lt;/cite&gt;&lt;/a&gt; article on Medium by Ikwechegh Ukandu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;logging&quot; tabindex=&quot;-1&quot;&gt;Logging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/logging/logging-in-go/&quot;&gt;&lt;cite&gt;Logging in Go with Slog: The Ultimate Guide&lt;/cite&gt;&lt;/a&gt; a betterstack.com article by Ayooluwa Isaiah&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/logging/golang-contextual-logging/&quot;&gt;&lt;cite&gt;Contextual Logging in Go with Slog&lt;/cite&gt;&lt;/a&gt; a betterstack.com article by Percy Bolmér&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dusted.codes/creating-a-pretty-console-logger-using-gos-slog-package&quot;&gt;&lt;cite&gt;Creating a pretty console logger using Go&#39;s slog package&lt;/cite&gt;&lt;/a&gt;, a concrete explanation resulting in a pretty useful slog TextHandler with colored console output that does not add any dependency to your code, Dusted Codes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/golang/example/tree/master/slog-handler-guide&quot;&gt;&lt;cite&gt;A guide to writing slog handlers&lt;/cite&gt;&lt;/a&gt;, Jonathan Amsterdam, jba@google.com&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkuebler.de/posts/slog-glossy/&quot;&gt;&lt;cite&gt;Slog Handler für bessere Lesbarkeit in lokalen Logs&lt;/cite&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@thisara.weerakoon2001/implementing-a-dynamic-package-level-logger-in-go-949d573a2192&quot;&gt;&lt;cite&gt;Implementing a Dynamic Package-Level Logger in Go&lt;/cite&gt;&lt;/a&gt; a medium.com article by Thisara Weerakoon, this shows how to dynamically set log levels for certain packages and touches the &lt;a href=&quot;https://github.com/knadh/koanf&quot;&gt;&lt;cite&gt;koanf&lt;/cite&gt;&lt;/a&gt; package to manage the logging configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;json&quot; tabindex=&quot;-1&quot;&gt;JSON&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Convert JSON to Go structs with &lt;a href=&quot;https://mholt.github.io/json-to-go/&quot;&gt;&lt;cite&gt;JSON to Go&lt;/cite&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    <hr/><p><strong><a href="">Learning Go</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-01-24-golang-resources/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Creating a scroll-spy with two lines of CSS</title>
    <link href="https://ulfschneider.io/2026-01-20-scroll-spy/" />
    <updated>2026-01-20T07:35:35Z</updated>
    <id>https://ulfschneider.io/2026-01-20-scroll-spy/</id>
    <content type="html"> &lt;p&gt;Two incredible lines of CSS code to reflect the current scroll position in a table of contents, by Una Kravets: &lt;a href=&quot;https://una.im/scroll-target-group/&quot;&gt;&lt;cite&gt;Creating a scroll-spy with 2 lines of CSS&lt;/cite&gt;&lt;/a&gt;. This required JavaScript coding in the past.&lt;/p&gt;

    <hr/><p><strong><a href="">Creating a scroll-spy with two lines of CSS</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-01-20-scroll-spy/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Good Luck and Success</title>
    <link href="https://ulfschneider.io/2026-01-01-good-luck-and-success/" />
    <updated>2026-01-01T13:16:23Z</updated>
    <id>https://ulfschneider.io/2026-01-01-good-luck-and-success/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/oVszQFleUw-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/oVszQFleUw-200.webp 200w, https://ulfschneider.io/img/oVszQFleUw-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Good Luck and Success</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2026-01-01-good-luck-and-success/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>bikeinsights.com</title>
    <link href="https://ulfschneider.io/2025-12-27-bike-insights/" />
    <updated>2025-12-28T06:37:22Z</updated>
    <id>https://ulfschneider.io/2025-12-27-bike-insights/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://bikeinsights.com&quot;&gt;&lt;cite&gt;bikeinsights.com&lt;/cite&gt;&lt;/a&gt; offers a bike geometry database that allows to search and compare bike frames. Their blog article &lt;a href=&quot;https://blog.bikeinsights.com/how-bikes-are-measured/&quot;&gt;&lt;cite&gt;How Bikes are Measured&lt;/cite&gt;&lt;/a&gt; made me aware normalizing the different ways of measuring bikes is absolutely required to come to meaningful comparisons of bike frames.&lt;/p&gt;

    <hr/><p><strong><a href="">bikeinsights.com</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-12-27-bike-insights/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Sentimental Chaos</title>
    <link href="https://ulfschneider.io/2025-12-23-sentimental-chaos/" />
    <updated>2025-12-23T14:38:49Z</updated>
    <id>https://ulfschneider.io/2025-12-23-sentimental-chaos/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/_V0enbw67o-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;900&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/_V0enbw67o-200.webp 200w, https://ulfschneider.io/img/_V0enbw67o-900.webp 900w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Sentimental Chaos&lt;/figcaption&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Sentimental Chaos</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-12-23-sentimental-chaos/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>qrvc</title>
    <link href="https://ulfschneider.io/tools/qrvc/" />
    <updated>2026-01-07T13:43:04Z</updated>
    <id>https://ulfschneider.io/tools/qrvc/</id>
    <content type="html">&lt;p&gt;Use the command line to make a QR code from a vCard&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://pkg.go.dev/github.com/ulfschneider/qrvc&quot;&gt;&lt;cite&gt;qrvc&lt;/cite&gt;&lt;/a&gt; is a command line tool that allows to prepare a QR code from vCard data.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/LZAIatoE45-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;400&quot; height=&quot;400&quot; srcset=&quot;https://ulfschneider.io/img/LZAIatoE45-200.webp 200w, https://ulfschneider.io/img/LZAIatoE45-400.webp 400w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;A QR code for a fictional vCard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;One way to create the QR code is by providing a vCard file as input and process that. If you do not have a vCard file, &lt;strong&gt;qrvc&lt;/strong&gt; will ask you for data input and will then create a vCard file and a QR code for you.&lt;/p&gt;
&lt;p&gt;Your data remains on your computer and nowhere else.&lt;/p&gt;
&lt;figure class=&quot;max-w-prose&quot;&gt;
&lt;img src=&quot;https://ulfschneider.io/img/pceeBgJtmS-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1090&quot; height=&quot;1012&quot; srcset=&quot;https://ulfschneider.io/img/pceeBgJtmS-200.webp 200w, https://ulfschneider.io/img/pceeBgJtmS-1090.webp 1090w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;&lt;strong&gt;qrvc&lt;/strong&gt; in interactive mode&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;installation&quot; tabindex=&quot;-1&quot;&gt;Installation&lt;/h2&gt;
&lt;h3 id=&quot;install-with-homebrew-on-mac-and-linux&quot; tabindex=&quot;-1&quot;&gt;Install with Homebrew on Mac and Linux&lt;/h3&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;brew tap ulfschneider/tap
brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cask&lt;/span&gt; qrvc&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;install-with-go-on-any-machine-that-has-go-on-board&quot; tabindex=&quot;-1&quot;&gt;Install with Go on any machine that has Go on board&lt;/h3&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;go &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; github.com/ulfschneider/qrvc@latest&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;manual-install&quot; tabindex=&quot;-1&quot;&gt;Manual install&lt;/h3&gt;
&lt;p&gt;You can also download the appropriate binary directly from GitHub Releases:&lt;/p&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://github.com/ulfschneider/qrvc/releases&quot;&gt;github.com/ulfschneider/qrvc/releases&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the archive matching your OS and architecture&lt;/li&gt;
&lt;li&gt;Extract it&lt;/li&gt;
&lt;li&gt;Move the binary to a directory included in your PATH (for example /usr/local/bin)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;verify-the-installation&quot; tabindex=&quot;-1&quot;&gt;Verify the installation&lt;/h3&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;qrvc &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command should print out the qrvc version you are using.&lt;/p&gt;
&lt;h2 id=&quot;usage&quot; tabindex=&quot;-1&quot;&gt;Usage&lt;/h2&gt;
&lt;p&gt;After installation, start the tool by typing:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;qrvc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When using the &lt;code&gt;-h&lt;/code&gt; flag, you get information about how to use it:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;qrvc &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

    <hr/><p><strong><a href="">qrvc</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/tools/qrvc/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Freeze</title>
    <link href="https://ulfschneider.io/2025-11-23-freeze/" />
    <updated>2025-11-28T05:37:37Z</updated>
    <id>https://ulfschneider.io/2025-11-23-freeze/</id>
    <content type="html">&lt;p&gt;Make images from text&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://github.com/charmbracelet/freeze&quot;&gt;&lt;cite&gt;Freeze&lt;/cite&gt;&lt;/a&gt; can create images from text files and from shell command output. E.g.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;freeze &lt;span class=&quot;token parameter variable&quot;&gt;--execute&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ls -ls&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; freeze-ls-ls.png&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;will create a file &lt;code&gt;freeze-ls-ls.png&lt;/code&gt; that shows the result of the &lt;code&gt;ls -ls&lt;/code&gt; command, which looks like:&lt;/p&gt;
&lt;figure class=&quot;max-w-prose&quot;&gt;
&lt;img src=&quot;https://ulfschneider.io/img/3bLZaNAsQ9-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2207&quot; height=&quot;468&quot; srcset=&quot;https://ulfschneider.io/img/3bLZaNAsQ9-200.webp 200w, https://ulfschneider.io/img/3bLZaNAsQ9-2207.webp 2207w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Output of &lt;code&gt;freeze --execute &quot;ls -ls&quot; -o freeze-ls-ls.png&lt;/code&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You can get an image of a text file, like a &lt;code&gt;go.mod&lt;/code&gt; file, as well. Issue the command&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;freeze go.mod &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; freeze-go-mod.png&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and get the following image:&lt;/p&gt;
&lt;figure class=&quot;max-w-prose&quot;&gt;
&lt;img src=&quot;https://ulfschneider.io/img/lxLgYFILF1-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2840&quot; height=&quot;1744&quot; srcset=&quot;https://ulfschneider.io/img/lxLgYFILF1-200.webp 200w, https://ulfschneider.io/img/lxLgYFILF1-2840.webp 2840w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Output of &lt;code&gt;freeze go.mod -o freeze-go-mod.png&lt;/code&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Because Freeze is written in Go, you can use it on any operating system.&lt;/p&gt;

    <hr/><p><strong><a href="">Freeze</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-11-23-freeze/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Adjust pointer size and pointer color on a Mac</title>
    <link href="https://ulfschneider.io/2025-11-15-pointer-color/" />
    <updated>2025-11-15T06:31:34Z</updated>
    <id>https://ulfschneider.io/2025-11-15-pointer-color/</id>
    <content type="html"> &lt;p&gt;I often struggle to spot the current mouse pointer location. By default the pointer is small and the white color does not have enough contrast. To help with that I change those settings on MacOS in the menu:&lt;/p&gt;
&lt;p&gt;System settings → Accessibility → Display → Pointer&lt;/p&gt;
&lt;p&gt;There it is possible to set size, border color and fill color for the pointer.&lt;/p&gt;

    <hr/><p><strong><a href="">Adjust pointer size and pointer color on a Mac</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-11-15-pointer-color/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>One-time passcodes without JavaScript</title>
    <link href="https://ulfschneider.io/2025-11-12-simple-otps/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/2025-11-12-simple-otps/</id>
    <content type="html"> &lt;p&gt;Tyler Sticka shows how to do OTP&#39;s (one-time passcodes) in his article &lt;a href=&quot;https://cloudfour.com/thinks/simple-one-time-passcode-inputs/&quot;&gt;&lt;cite&gt;Simple One-Time Passcode Inputs&lt;/cite&gt;&lt;/a&gt;. The key element is the &lt;code&gt;autocomplete=&amp;quot;one-time-code&amp;quot;&lt;/code&gt; setting on the &lt;code&gt;input&lt;/code&gt; element, which adds support for autofill from password managers or via SMS. The other attributes make typing in the code more convenient and activate client-side input validation:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; data-language=&quot;HTML&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Verify Account&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;otp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    Enter the 6-digit numeric code sent to +1 (555) 555-5555
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;otp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;inputmode&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;numeric&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;autocomplete&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-time-code&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;maxlength&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&#92;d{6}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;required&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Continue&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; Try another way… &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One by one:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;type=&amp;quot;text&amp;quot;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;OTP&#39;s appear as a number, but a six digit &lt;code&gt;000004&lt;/code&gt; is not the a countable number, but a sequence of 6 digits, therefore the OTP is treated as text&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;inputmode=&amp;quot;numeric&amp;quot;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;enable the numeric virtual keyboard on touch devices&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;autocomplete=&amp;quot;one-time-code&amp;quot;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;this add&#39;s support for &lt;a href=&quot;https://cloudfour.com/thinks/autofill-what-web-devs-should-know-but-dont/&quot;&gt;autofill&lt;/a&gt; from password managers or via &lt;a href=&quot;https://web.dev/articles/sms-otp-form&quot;&gt;SMS&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;maxlength=&amp;quot;6&amp;quot;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;prevent users putting in more than 6 digits&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;pattern=&amp;quot;&#92;d{6}&amp;quot;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;we want 6 digits, and no other values&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;required&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;make the field mandatory&lt;/dd&gt;
&lt;/dl&gt;

    <hr/><p><strong><a href="">One-time passcodes without JavaScript</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-11-12-simple-otps/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>SmoothCSV</title>
    <link href="https://ulfschneider.io/2025-10-17-smoothcsv/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/2025-10-17-smoothcsv/</id>
    <content type="html">&lt;p&gt;A cross-platform editor for &lt;code&gt;.csv&lt;/code&gt; files&lt;/p&gt;
 &lt;p&gt;This feels like Markdown for spreadsheets: &lt;a href=&quot;https://smoothcsv.com&quot;&gt;&lt;cite&gt;SmoothCSV&lt;/cite&gt;&lt;/a&gt; is a cross-platform app made by &lt;a href=&quot;https://github.com/kohii&quot;&gt;kohii&lt;/a&gt;, which allows to comfortably edit &lt;code&gt;.csv&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.csv&lt;/code&gt; files are text files that can be created, read, and shared with any tool capable of handling text. SmoothCSV can pick up and create &lt;code&gt;.csv&lt;/code&gt; files with a comprehensive editing experience – on Mac and Windows. SmoothCSV is fast, probably because it&#39;s written in Rust. kohii explains how he created the tool in his dev.to article &lt;a href=&quot;https://dev.to/kohii/the-technology-behind-smoothcsv-the-ultimate-csv-editor-3lg0&quot;&gt;&lt;cite&gt;The Technology Behind SmoothCSV - The Ultimate CSV Editor&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;

    <hr/><p><strong><a href="">SmoothCSV</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-10-17-smoothcsv/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Build possibility</title>
    <link href="https://ulfschneider.io/2025-10-17-build-possibility/" />
    <updated>2026-01-07T09:27:10Z</updated>
    <id>https://ulfschneider.io/2025-10-17-build-possibility/</id>
    <content type="html"> &lt;blockquote&gt;
&lt;p&gt;Buy stability. Build possibility.&lt;/p&gt;
&lt;footer&gt;Ben Werdmüller, &lt;a href=&quot;https://werd.io/build-what-makes-you-special-buy-the-rest/&quot;&gt;&lt;cite&gt;Build what makes you special. Buy the rest.&lt;/cite&gt;&lt;/a&gt;&lt;/footer&gt;
&lt;/blockquote&gt;
&lt;p&gt;This sounds true! When deciding to buy or to build a software solution, build what makes you special, what differentiates you.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Getting your build vs buy balance right is how you achieve table stakes: stable infrastructure, reliable publishing, sustainable engineering. But that sets you up for &lt;em&gt;today&lt;/em&gt;. In order for any business to future-proof itself, it needs to make a bet on what the future will look like and build for &lt;em&gt;that&lt;/em&gt;.&lt;/p&gt;
&lt;footer&gt;Ben Werdmüller&lt;/footer&gt;
&lt;/blockquote&gt;

    <hr/><p><strong><a href="">Build possibility</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-10-17-build-possibility/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Plex</title>
    <link href="https://ulfschneider.io/tools/plex/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/tools/plex/</id>
    <content type="html">&lt;p&gt;The iA Presenter theme based on the IBM Plex® typeface&lt;/p&gt;
 &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/J-TDPU_FNh-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1452&quot; srcset=&quot;https://ulfschneider.io/img/J-TDPU_FNh-200.webp 200w, https://ulfschneider.io/img/J-TDPU_FNh-2400.webp 2400w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Plex is a custom theme for iA Presenter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://ia.net/presenter&quot;&gt;iA Presenter&lt;/a&gt; is my favorite software for writing and presenting a &lt;em&gt;story&lt;/em&gt;. Presenter comes with a set of themes to provide a suitable visual style for your message. You can add your own &lt;em&gt;custom themes&lt;/em&gt; to fit the tool even better to your needs. That&#39;s what I did with Plex: It is a custom iA Presenter theme based on the IBM Plex® typeface with vibrant dynamic background colors.&lt;/p&gt;
&lt;p&gt;See it here: &lt;a href=&quot;https://ulfschneider.io/assets/plex/&quot;&gt;&lt;strong&gt;Plex in action&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Download Plex at &lt;a href=&quot;https://github.com/ulfschneider/plex&quot;&gt;&lt;cite&gt;github.com/ulfschneider/plex&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tell your story.&lt;/p&gt;

    <hr/><p><strong><a href="">Plex</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/tools/plex/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>fork .</title>
    <link href="https://ulfschneider.io/2025-10-15-fork-from-the-terminal/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/2025-10-15-fork-from-the-terminal/</id>
    <content type="html"> &lt;p&gt;When you are in the Terminal on a Mac inside of a Git repository, and you use the &lt;a href=&quot;https://git-fork.com&quot;&gt;Fork Git client&lt;/a&gt;, it&#39;s perfectly doable to open the current repo in Fork by issuing the command:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;fork &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As a one-time prerequisite, install the Fork Command Line Tools from the Fork menu bar by navigating to Fork → Install Command Line Tools.&lt;/p&gt;
&lt;p&gt;From any folder within the terminal, to open the current folder in the Finder, issue the command:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

    <hr/><p><strong><a href="">fork .</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-10-15-fork-from-the-terminal/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Pure Paste</title>
    <link href="https://ulfschneider.io/2025-10-01-pure-paste/" />
    <updated>2025-10-01T05:46:15Z</updated>
    <id>https://ulfschneider.io/2025-10-01-pure-paste/</id>
    <content type="html"> &lt;p&gt;The tiny &lt;em&gt;Sindre Sorhus-style&lt;/em&gt; app &lt;a href=&quot;https://sindresorhus.com/pure-paste&quot;&gt;&lt;cite&gt;Pure Paste&lt;/cite&gt;&lt;/a&gt; sits in the menu bar and clears the formatting of text pasted from the clipboard.&lt;/p&gt;
&lt;p&gt;For example, you can paste text into an email and avoid polluting your message with the source formatting. That makes a lot of sense to me and is probably useful in any text-authoring situation.&lt;/p&gt;
&lt;p&gt;The app can do even more clever things when pasting. From the following list of options I have activated the ones marked with (on):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preserve links&lt;/li&gt;
&lt;li&gt;Remove tracking parameters from URLs (on)&lt;/li&gt;
&lt;li&gt;Trim leading and trailing whitespace&lt;/li&gt;
&lt;li&gt;Normalize quotes (on)&lt;/li&gt;
&lt;li&gt;Normalize newlines (on)&lt;/li&gt;
&lt;li&gt;Normalize unordered lists (on)&lt;/li&gt;
&lt;li&gt;Remove invisible characters (on)&lt;/li&gt;
&lt;li&gt;Remove footnote references (on)&lt;/li&gt;
&lt;li&gt;Remove mailto: prefix from email addresses (on)&lt;/li&gt;
&lt;/ul&gt;

    <hr/><p><strong><a href="">Pure Paste</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-10-01-pure-paste/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Unknown at rules with Tailwind CSS in Zed</title>
    <link href="https://ulfschneider.io/2025-09-25-unknown-at-rule/" />
    <updated>2025-09-27T16:29:36Z</updated>
    <id>https://ulfschneider.io/2025-09-25-unknown-at-rule/</id>
    <content type="html"> &lt;p&gt;My Zed editor was complaining about unknown at rules (like &lt;code&gt;@apply&lt;/code&gt;) when using Tailwind CSS.&lt;/p&gt;
&lt;figure class=&quot;max-w-prose&quot;&gt;
&lt;img src=&quot;https://ulfschneider.io/img/1UJeejr0hJ-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1516&quot; height=&quot;214&quot; srcset=&quot;https://ulfschneider.io/img/1UJeejr0hJ-200.webp 200w, https://ulfschneider.io/img/1UJeejr0hJ-1516.webp 1516w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;Unknown at rule @apply&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You can solve this issue by adding the following lines to your Zed &lt;code&gt;settings.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; data-language=&quot;JSON&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;languages&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;CSS&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;language_servers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tailwindcss-language-server&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

    <hr/><p><strong><a href="">Unknown at rules with Tailwind CSS in Zed</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-09-25-unknown-at-rule/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Riding with the RMC</title>
    <link href="https://ulfschneider.io/2025-09-18-riding-with-the-rmc/" />
    <updated>2025-09-24T15:54:54Z</updated>
    <id>https://ulfschneider.io/2025-09-18-riding-with-the-rmc/</id>
    <content type="html"> &lt;figure&gt;
&lt;video controls=&quot;&quot;&gt;
&lt;source src=&quot;https://ulfschneider.io/assets/2025-09-18-riding-with-the-rmc.mp4&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;figcaption&gt;The high season of bike riding is ending. Yesterday, the RMC Schloss Neuhaus held its regular training session. Though I ride at the RTB in Borchen, the RMC welcomes guest riders, and we know each other from biking events, therefore I took a chance for a pleasant ride in the beautiful landscape with great company.
&lt;/figcaption&gt;
&lt;/figure&gt;

    <hr/><p><strong><a href="">Riding with the RMC</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-09-18-riding-with-the-rmc/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Remove the pedals</title>
    <link href="https://ulfschneider.io/2025-09-06-remove-pedals/" />
    <updated>2025-09-06T07:03:31Z</updated>
    <id>https://ulfschneider.io/2025-09-06-remove-pedals/</id>
    <content type="html"> &lt;figure&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/t42lXHGtUp4?si=5NuRlWjjy-mEkghQ&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot; style=&quot;aspect-ratio:560/315; max-width:100%; height:auto; width:65ch;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt; If you’ve ever wondered what the correct thread direction is to remove a pedal from a crank arm, this video is for you! Excellent practical advice. &lt;a href=&quot;https://youtu.be/t42lXHGtUp4?si=ym0KYXjHmcLWloEb&quot;&gt;Get it right every time&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">Remove the pedals</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-09-06-remove-pedals/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Tuesday evening</title>
    <link href="https://ulfschneider.io/2025-09-05-tuesday-training-ride/" />
    <updated>2025-09-05T05:56:47Z</updated>
    <id>https://ulfschneider.io/2025-09-05-tuesday-training-ride/</id>
    <content type="html"> &lt;p&gt;My cycling club’s Tuesday training ride was exceptional this week. The beautiful light, mild temperature, and inspiring comrades made it unforgettable. We will meet again on Sunday, for the &lt;a href=&quot;https://www.komoot.com/de-de/collection/3731022/-herbst-rtf-die-maehdreschertour-2025&quot;&gt;Mähdrescher Tour&lt;/a&gt;, organized by the RSG Harsewinkel.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/sKVdPytZNf-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/sKVdPytZNf-200.webp 200w, https://ulfschneider.io/img/sKVdPytZNf-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/GWFUuuWgTL-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/GWFUuuWgTL-200.webp 200w, https://ulfschneider.io/img/GWFUuuWgTL-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/3DY144ABbE-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://ulfschneider.io/img/3DY144ABbE-200.webp 200w, https://ulfschneider.io/img/3DY144ABbE-1200.webp 1200w&quot; sizes=&quot;100vw&quot;&gt;
&lt;/figure&gt;

    <hr/><p><strong><a href="">Tuesday evening</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-09-05-tuesday-training-ride/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Tools for Designers</title>
    <link href="https://ulfschneider.io/2025-08-26-tools-for-designers/" />
    <updated>2025-08-26T06:06:03Z</updated>
    <id>https://ulfschneider.io/2025-08-26-tools-for-designers/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://www.learnui.design/tools/&quot;&gt;&lt;cite&gt;Tools for Designers&lt;/cite&gt;&lt;/a&gt; provides great (and free) tools to help with colors and web typography:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learnui.design/tools/gradient-generator.html&quot;&gt;Gradient Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learnui.design/tools/mesh-gradient-generator.html&quot;&gt;Mesh Gradient Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learnui.design/tools/data-color-picker.html&quot;&gt;Data Visualization Color Picker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learnui.design/tools/accessible-color-generator.html&quot;&gt;Accessible Color Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learnui.design/tools/typography-tutorial.html&quot;&gt;Interactive Typography Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

    <hr/><p><strong><a href="">Tools for Designers</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-26-tools-for-designers/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>An official logo for CSS</title>
    <link href="https://ulfschneider.io/2025-08-26-css-logo/" />
    <updated>2025-08-28T05:03:32Z</updated>
    <id>https://ulfschneider.io/2025-08-26-css-logo/</id>
    <content type="html"> &lt;p&gt;CSS, the &lt;em&gt;awesome&lt;/em&gt; language that controls how HTML looks in the browser, &lt;a href=&quot;https://github.com/CSS-Next/logo.css&quot;&gt;has a new logo&lt;/a&gt; . The background is &lt;code&gt;rebeccapurple&lt;/code&gt;, which I find a &lt;a href=&quot;https://meyerweb.com/eric/thoughts/2014/06/19/rebeccapurple/&quot;&gt;beautiful color choice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At some point there was the idea by Amit Sheen to spill the CSS text &lt;a href=&quot;https://www.ondrejkonecny.com/blog/kind-of-rebeccapurple/&quot;&gt;slightly out of the framing container&lt;/a&gt;, which, as a nod to &lt;a href=&quot;https://css-tricks.com/css-is-awesome/&quot;&gt;CSS is Awesome&lt;/a&gt;, I liked even more. It seems the participants of the discussion disliked the association of CSS with something unpredictable and chaotic, so they refrained from going into that direction. Unfortunately. Here is the &lt;a href=&quot;https://github.com/CSS-Next/css-next/issues/105&quot;&gt;discussion thread&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;max-w-sm&quot;&gt;
&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://ulfschneider.io/img/q5hl2Gyv4G-200.webp 200w, https://ulfschneider.io/img/q5hl2Gyv4G-1000.webp 1000w&quot; sizes=&quot;100vw&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://ulfschneider.io/img/q5hl2Gyv4G-1000.svg&quot; width=&quot;1000&quot; height=&quot;1000&quot;&gt;&lt;/picture&gt;
&lt;figcaption&gt;The official CSS logo&lt;/figcaption&gt;
&lt;/figure&gt;
    <hr/><p><strong><a href="">An official logo for CSS</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-26-css-logo/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Color Lisa</title>
    <link href="https://ulfschneider.io/2025-08-26-color-lisa/" />
    <updated>2025-08-26T06:11:27Z</updated>
    <id>https://ulfschneider.io/2025-08-26-color-lisa/</id>
    <content type="html"> &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://colorlisa.com&quot;&gt;&lt;cite&gt;colorlisa.com&lt;/cite&gt;&lt;/a&gt; is a curated list of color palettes based on masterpieces of the worlds greatest artists. Each palette was painstakingly created by color obsessed designers, artists, museum curators, and masters of color theory. Palettes are constantly being added to help keep your designs colorful and fresh.&lt;/p&gt;
&lt;footer&gt;&lt;a href=&quot;https://www.mcguiremade.com&quot;&gt;Ryan McGuire&lt;/a&gt;, community artist and creator of Color Lisa&lt;/footer&gt;&lt;/blockquote&gt;

    <hr/><p><strong><a href="">Color Lisa</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-26-color-lisa/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Lidl Deutschland Tour – Course Festival in Borchen</title>
    <link href="https://ulfschneider.io/2025-08-22-deutschland-tour-borchen/" />
    <updated>2025-08-22T05:11:35Z</updated>
    <id>https://ulfschneider.io/2025-08-22-deutschland-tour-borchen/</id>
    <content type="html"> &lt;figure&gt;
&lt;img src=&quot;https://ulfschneider.io/img/ZYxgkZCIg8-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1754&quot; height=&quot;2480&quot; srcset=&quot;https://ulfschneider.io/img/ZYxgkZCIg8-200.webp 200w, https://ulfschneider.io/img/ZYxgkZCIg8-1754.webp 1754w&quot; sizes=&quot;100vw&quot;&gt;
&lt;figcaption&gt;The Lidl Deutschland Tour passes through Borchen today. On this occasion, the Rad-Treff Borchen is hosting a course festival with delicious food and drinks at the parish hall in Borchen, right next to the route. Come, have a good time and see the racers passing by. More information on the  &lt;a href=&quot;https://rad-treff-borchen.de/deutschland-tour-streckenfest/&quot;&gt;Rad-Treff Borchen&lt;/a&gt; website and on &lt;a href=&quot;https://www.deutschland-tour.com/&quot;&gt;deutschland-tour.com&lt;/a&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;

    <hr/><p><strong><a href="">Lidl Deutschland Tour – Course Festival in Borchen</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-22-deutschland-tour-borchen/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Text-to-Chart</title>
    <link href="https://ulfschneider.io/2025-08-16-text-to-chart/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/2025-08-16-text-to-chart/</id>
    <content type="html">&lt;p&gt;&lt;em&gt;Text-to-chart&lt;/em&gt; is the process of describing a diagram in text form,  and letting software render the actual output. I&#39;ve been investigating the topic by examining &lt;a href=&quot;https://mermaid.js.org&quot;&gt;Mermaid&lt;/a&gt;, a free software library created in 2014 by Knut Sveidqvist with a focus on &lt;em&gt;development related charts&lt;/em&gt;, and &lt;a href=&quot;https://echarts.apache.org/&quot;&gt;ECharts&lt;/a&gt;, a flexible general-purpose diagramming solution that follows the &lt;em&gt;code-to-chart&lt;/em&gt; approach. Unlike Mermaid, which uses a domain-specific language, ECharts is relying on JavaScript to describe the diagrams it renders.&lt;/p&gt;
&lt;p&gt;Along the way I couldn&#39;t resist to write two markdown-it plugins, allowing to integrate the charting solutions into your &lt;a href=&quot;https://daringfireball.net/projects/markdown/syntax&quot;&gt;Markdown&lt;/a&gt; writing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/markdown-it-mermaid-server&quot;&gt;markdown-it-mermaid-server&lt;/a&gt;, and&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/markdown-it-responsive-echarts&quot;&gt;markdown-it-responsive-echarts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This document is my current state of learning the topic. All example charts are rendered by the mentioned plugins.&lt;/p&gt;
 &lt;div class=&quot;table-of-contents&quot;&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#text-to-chart%2C-what-is-it-good-for%3F&quot;&gt;Text-to-chart, what is it good for?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#could-there-be-problems%3F&quot;&gt;Could there be problems?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid&quot;&gt;Mermaid&lt;/a&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid-flowchart&quot;&gt;Mermaid Flowchart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid-radar-chart&quot;&gt;Mermaid Radar Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid-sankey-chart&quot;&gt;Mermaid Sankey Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid-pie-chart&quot;&gt;Mermaid Pie Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid-xy-chart&quot;&gt;Mermaid XY Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#mermaid-chart-appearance&quot;&gt;Mermaid Chart Appearance&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#echarts&quot;&gt;ECharts&lt;/a&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#echarts-pie-chart&quot;&gt;ECharts Pie Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#echarts-xy-chart&quot;&gt;ECharts XY Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#echarts-radar-chart&quot;&gt;ECharts Radar Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#echarts-sankey-chart&quot;&gt;ECharts Sankey Chart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#echarts-large-area-chart&quot;&gt;ECharts Large Area Chart&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ulfschneider.io/2025-08-16-text-to-chart/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h2 id=&quot;text-to-chart%2C-what-is-it-good-for%3F&quot; tabindex=&quot;-1&quot;&gt;Text-to-chart, what is it good for?&lt;/h2&gt;
&lt;p&gt;The idea of creating charts from text is appealing to me since I got aware of Mermaid several years ago. When creating output for the web by writing Markdown, text-to-chart has similar advantages as &lt;a href=&quot;https://daringfireball.net/projects/markdown/syntax&quot;&gt;Markdown&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use your environment&lt;/strong&gt;: Write chart definitions with any text editor, which means, you can stay in your familiar writing environment without installing additional software to create the charts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick&lt;/strong&gt;: Save time because your focus is on data, content and writing, and not on formatting. It&#39;s important to mention, the time-saving aspect is only achieved if the text-to-chart software suits your context in terms of syntax and available diagram types!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ideal web output&lt;/strong&gt;: The charts can be created in a web-friendly output format – in the case of Mermaid it can be SVG, PNG or PDF. SVG, I believe, is a good starting point for charts on the web, because it is lightweight and scales well up and down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standardized output&lt;/strong&gt;: The resulting charts have a standardized appearance and can be themed to a certain look, which means you can fit the charts into your design language. This again might help to improve shared understanding in collaborative contexts, because even with multiple people creating charts, the charts are rendered by the same rules and thus create a kind of a shared language.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Up-to-date charts&lt;/strong&gt;: The possibility of quick text-based changes leading to optimal output rendering helps to avoid what the Mermaid creator Knut Sveidqvist calls &lt;em&gt;doc-rot,&lt;/em&gt; the gap between a current development state and the outdated diagram documentation aiming to describe that state. This gives a hint that Mermaid has a tendency to provide diagrams that fit well into the software development domain, like flowcharts or sequence diagrams. Other text-to-chart software can have a different focus and produce different diagram types with the same general advantages for your workflow. The benefit of always having up-to-date charts published in the correct standardized look on even a large website is huge, in my view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version control&lt;/strong&gt;: The chart definitions are made of text and as such can be versioned in an excellent way by Git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast and lightweight delivery&lt;/strong&gt;: Sometimes the charts can be rendered as part of the build process of a static website on the server, which means users get the charts as quick and as lean as possible delivered to their web browsers, without the need to run JavaScript on the browser. This can be done with Mermaid and it makes sense in that case, because Mermaid charts do not offer options for interactive changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interaction&lt;/strong&gt;: When the charts are rendered by JavaScript on the browser client, as opposed to the server, you can have other advantages, like interactive charts, allowing to filter out certain visualization aspects to analyze the data. ECharts delivers charts this way.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;could-there-be-problems%3F&quot; tabindex=&quot;-1&quot;&gt;Could there be problems?&lt;/h2&gt;
&lt;p&gt;There can be downsides.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Syntax&lt;/strong&gt;: The syntax of text-to-chart, in this case the Mermaid-syntax, as simple as the maintainers are aiming to keep it, takes time to learn. I sometimes have to visit the Mermaid website to understand how to achieve certain results. Same comes true with code-to-chart in ECharts. There are certain building blocks which appear repeatedly, which helps a lot getting into the concepts, but the resulting charts can cover such a wide range of visualization variants that it&#39;s natural the code handling requires learning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback loop&lt;/strong&gt;: When rendering the charts within the build process of a static website, the feedback cycle to see what chart is getting produced by processing your textual definition is slowed down, because every change of the chart definition requires a build step to get the chart results. To overcome this problem, Mermaid has a free online editor &lt;a href=&quot;https://mermaid.live/&quot;&gt;mermaid.live&lt;/a&gt; which you can use to set up diagrams and see immediately how your chart does look like. Once you have your desired result, you can copy your chart definition and paste it into the final location. ECharts is the same. Their online editor is &lt;a href=&quot;https://echarts.apache.org/examples/editor.html&quot;&gt;echarts.apache.org/examples/editor.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Software complexity&lt;/strong&gt;: Generating charts at build time or at run time is more complex than creating an image once and referencing that image in your website. You can be sure a web browser is able to visualize a .png image or a .jpg image 20 years into the future without the need for you to ever touch it. Generating charts on the other hand will touch your chart definition with every build or with every page view and will carry out computational tasks to translate your text into a graphic. Sure there are chances something might break and your users will end up seeing no chart at all. You have to have your software stack under control to keep this in a working state.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mermaid&quot; tabindex=&quot;-1&quot;&gt;Mermaid&lt;/h2&gt;
&lt;p&gt;Mermaid has its roots in creating &lt;em&gt;development charts&lt;/em&gt; from text, like flowcharts, sequence diagrams, and state diagrams. The mind map chart can as well be seen to be in this domain. A strength of Mermaid is the lean syntax for describing the charts, and Sveidqvist&#39;s intent to fight doc-rot is well addressed in my view. There are good ideas in Mermaid, but the actual execution could be more standardized. The different chart types sometimes appear to me as not generated by the same software but by different software stacks.&lt;/p&gt;
&lt;p&gt;Mermaid supports class diagrams, but generating them directly from your code base with a different software might be more effective.&lt;/p&gt;
&lt;h3 id=&quot;mermaid-flowchart&quot; tabindex=&quot;-1&quot;&gt;Mermaid Flowchart&lt;/h3&gt;
&lt;p&gt;You can create a flowchart by adding a few lines of text to your Markdown document, like below:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;mermaid&lt;/span&gt;
&lt;span class=&quot;token code-block language-mermaid language-mermaid language-mermaid&quot;&gt;flowchart LR

start --&gt; decision
decision --&gt; optionA &amp;amp; optionB

start([&quot;Start&quot;])
decision{&quot;Decision&quot;}
optionA[&quot;Option A&quot;]
optionB[&quot;Option B&quot;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above chart definition will produce the following diagram, and the simplicity of the creation is a source of joy to me.&lt;/p&gt;
&lt;figure class=&quot;mermaid&quot;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;svg id=&quot;mermaid-uhqdhxrvcugw&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; class=&quot;flowchart&quot; style=&quot;max-width: 431.4174499511719px;&quot; viewBox=&quot;0.0000019073486328125 0 431.4174499511719 174&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;flowchart-v2&quot; aria-label=&quot;A flowchart starting at a node &amp;amp;quot;Start&amp;amp;quot;, flowing to a decision point &amp;amp;quot;Decision&amp;amp;quot;, from where the flow can go further to either node &amp;amp;quot;Option A&amp;amp;quot; or &amp;amp;quot;Option B&amp;amp;quot;&quot;&gt;&lt;style&gt;#mermaid-uhqdhxrvcugw{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-uhqdhxrvcugw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-uhqdhxrvcugw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-uhqdhxrvcugw .error-icon{fill:#552222;}#mermaid-uhqdhxrvcugw .error-text{fill:#552222;stroke:#552222;}#mermaid-uhqdhxrvcugw .edge-thickness-normal{stroke-width:1px;}#mermaid-uhqdhxrvcugw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-uhqdhxrvcugw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-uhqdhxrvcugw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-uhqdhxrvcugw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-uhqdhxrvcugw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-uhqdhxrvcugw .marker{fill:#333333;stroke:#333333;}#mermaid-uhqdhxrvcugw .marker.cross{stroke:#333333;}#mermaid-uhqdhxrvcugw svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-uhqdhxrvcugw p{margin:0;}#mermaid-uhqdhxrvcugw .label{font-family:arial,sans-serif;color:#333;}#mermaid-uhqdhxrvcugw .cluster-label text{fill:#333;}#mermaid-uhqdhxrvcugw .cluster-label span{color:#333;}#mermaid-uhqdhxrvcugw .cluster-label span p{background-color:transparent;}#mermaid-uhqdhxrvcugw .label text,#mermaid-uhqdhxrvcugw span{fill:#333;color:#333;}#mermaid-uhqdhxrvcugw .node rect,#mermaid-uhqdhxrvcugw .node circle,#mermaid-uhqdhxrvcugw .node ellipse,#mermaid-uhqdhxrvcugw .node polygon,#mermaid-uhqdhxrvcugw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-uhqdhxrvcugw .rough-node .label text,#mermaid-uhqdhxrvcugw .node .label text,#mermaid-uhqdhxrvcugw .image-shape .label,#mermaid-uhqdhxrvcugw .icon-shape .label{text-anchor:middle;}#mermaid-uhqdhxrvcugw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-uhqdhxrvcugw .rough-node .label,#mermaid-uhqdhxrvcugw .node .label,#mermaid-uhqdhxrvcugw .image-shape .label,#mermaid-uhqdhxrvcugw .icon-shape .label{text-align:center;}#mermaid-uhqdhxrvcugw .node.clickable{cursor:pointer;}#mermaid-uhqdhxrvcugw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-uhqdhxrvcugw .arrowheadPath{fill:#333333;}#mermaid-uhqdhxrvcugw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-uhqdhxrvcugw .flowchart-link{stroke:#333333;fill:none;}#mermaid-uhqdhxrvcugw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-uhqdhxrvcugw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-uhqdhxrvcugw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-uhqdhxrvcugw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-uhqdhxrvcugw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-uhqdhxrvcugw .cluster text{fill:#333;}#mermaid-uhqdhxrvcugw .cluster span{color:#333;}#mermaid-uhqdhxrvcugw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-uhqdhxrvcugw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-uhqdhxrvcugw rect.text{fill:none;stroke-width:0;}#mermaid-uhqdhxrvcugw .icon-shape,#mermaid-uhqdhxrvcugw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-uhqdhxrvcugw .icon-shape p,#mermaid-uhqdhxrvcugw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-uhqdhxrvcugw .icon-shape .label rect,#mermaid-uhqdhxrvcugw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-uhqdhxrvcugw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-uhqdhxrvcugw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-uhqdhxrvcugw :root{--mermaid-font-family:arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id=&quot;mermaid-uhqdhxrvcugw_flowchart-v2-pointEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1, 0;&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id=&quot;mermaid-uhqdhxrvcugw_flowchart-v2-pointStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;4.5&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 0 5 L 10 10 L 10 0 z&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1, 0;&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id=&quot;mermaid-uhqdhxrvcugw_flowchart-v2-circleEnd&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;11&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1, 0;&quot;&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id=&quot;mermaid-uhqdhxrvcugw_flowchart-v2-circleStart&quot; class=&quot;marker flowchart-v2&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;-1&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 1; stroke-dasharray: 1, 0;&quot;&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id=&quot;mermaid-uhqdhxrvcugw_flowchart-v2-crossEnd&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;12&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1, 0;&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id=&quot;mermaid-uhqdhxrvcugw_flowchart-v2-crossStart&quot; class=&quot;marker cross flowchart-v2&quot; viewBox=&quot;0 0 11 11&quot; refX=&quot;-1&quot; refY=&quot;5.2&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;11&quot; markerHeight=&quot;11&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 1,1 l 9,9 M 10,1 l -9,9&quot; class=&quot;arrowMarkerPath&quot; style=&quot;stroke-width: 2; stroke-dasharray: 1, 0;&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;g class=&quot;root&quot;&gt;&lt;g class=&quot;clusters&quot;&gt;&lt;/g&gt;&lt;g class=&quot;edgePaths&quot;&gt;&lt;path d=&quot;M72.324,87.5L76.407,87.417C80.49,87.333,88.657,87.167,96.24,87.083C103.824,87,110.824,87,114.324,87L117.824,87&quot; id=&quot;L_start_decision_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_start_decision_0&quot; data-points=&quot;W3sieCI6NzIuMzIzNzEyNDMxODI2NzksInkiOjg3LjV9LHsieCI6OTYuODIzNzExMzk1MjYzNjcsInkiOjg3fSx7IngiOjEyMS44MjM3MTEzOTUyNjM2NywieSI6ODd9XQ==&quot; marker-end=&quot;url(#mermaid-uhqdhxrvcugw_flowchart-v2-pointEnd)&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M220.95,64.001L228.95,59.168C236.95,54.334,252.949,44.667,264.452,39.834C275.954,35,282.959,35,286.462,35L289.964,35&quot; id=&quot;L_decision_optionA_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_decision_optionA_0&quot; data-points=&quot;W3sieCI6MjIwLjk1MDA2OTQ3NTg0MzEyLCJ5Ijo2NC4wMDEzNTgwODA1Nzk0NX0seyJ4IjoyNjguOTQ4NzExMzk1MjYzNywieSI6MzV9LHsieCI6MjkzLjk2NDMzNjM5NTI2MzcsInkiOjM1fV0=&quot; marker-end=&quot;url(#mermaid-uhqdhxrvcugw_flowchart-v2-pointEnd)&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M220.95,109.999L228.95,114.832C236.95,119.666,252.949,129.333,264.449,134.166C275.949,139,282.949,139,286.449,139L289.949,139&quot; id=&quot;L_decision_optionB_0&quot; class=&quot;edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link&quot; style=&quot;;&quot; data-edge=&quot;true&quot; data-et=&quot;edge&quot; data-id=&quot;L_decision_optionB_0&quot; data-points=&quot;W3sieCI6MjIwLjk1MDA2OTQ3NTg0MzEyLCJ5IjoxMDkuOTk4NjQxOTE5NDIwNTV9LHsieCI6MjY4Ljk0ODcxMTM5NTI2MzcsInkiOjEzOX0seyJ4IjoyOTMuOTQ4NzExMzk1MjYzNywieSI6MTM5fV0=&quot; marker-end=&quot;url(#mermaid-uhqdhxrvcugw_flowchart-v2-pointEnd)&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabels&quot;&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_start_decision_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;foreignObject width=&quot;0&quot; height=&quot;0&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; class=&quot;labelBkg&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;edgeLabel&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_decision_optionA_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;foreignObject width=&quot;0&quot; height=&quot;0&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; class=&quot;labelBkg&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;edgeLabel&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;edgeLabel&quot;&gt;&lt;g class=&quot;label&quot; data-id=&quot;L_decision_optionB_0&quot; transform=&quot;translate(0, 0)&quot;&gt;&lt;foreignObject width=&quot;0&quot; height=&quot;0&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; class=&quot;labelBkg&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;edgeLabel&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node default&quot; id=&quot;flowchart-start-0&quot; transform=&quot;translate(39.911855697631836, 87)&quot;&gt;&lt;g class=&quot;basic label-container outer-path&quot;&gt;&lt;path d=&quot;M-12.421875 -19.5 C-5.763310271054353 -19.5, 0.8952544578912942 -19.5, 12.421875 -19.5 C12.421875 -19.5, 12.421874999999998 -19.5, 12.421874999999998 -19.5 C12.871533909002489 -19.485580313996262, 13.32119281800498 -19.47116062799252, 13.6712442896239 -19.45993515863156 C13.93414271353613 -19.43457366385836, 14.197041137448357 -19.409212169085162, 14.915479652847864 -19.3399052695533 C15.238944566544879 -19.287609970814636, 15.562409480241893 -19.235314672075976, 16.14946825967676 -19.140403561325776 C16.435924849974512 -19.07502171389426, 16.72238144027227 -19.009639866462745, 17.36813938623539 -18.862249829261074 C17.619068640158428 -18.787775343851248, 17.869997894081465 -18.713300858441425, 18.566485251460602 -18.50658706670804 C18.880736488033662 -18.390939706742564, 19.194987724606722 -18.275292346777093, 19.739581595147794 -18.074876768247425 C19.991791838232952 -17.963230775184666, 20.244002081318108 -17.851584782121908, 20.88260791279238 -17.568892924097174 C21.189503904557068 -17.4087854817698, 21.49639989632176 -17.248678039442428, 21.990867264076783 -16.990714730406097 C22.40189687652586 -16.741546163861347, 22.812926488974938 -16.4923775973166, 23.059805573605697 -16.342718045390892 C23.379928688771077 -16.11941401815783, 23.700051803936457 -15.896109990924765, 24.085030344578712 -15.627565626425154 C24.356953091325884 -15.410714472062475, 24.628875838073057 -15.193863317699796, 25.06232870850187 -14.848196188198123 C25.374844875520058 -14.564377274036872, 25.687361042538246 -14.28055835987562, 25.987684736767985 -14.007812326905688 C26.23448625603866 -13.752969495477146, 26.481287775309337 -13.498126664048602, 26.857295942968648 -13.10986736009568 C27.169667175904898 -12.742938335462082, 27.48203840884115 -12.376009310828481, 27.667588908126582 -12.158051136245305 C27.87230294503615 -11.883752976618911, 28.077016981945714 -11.609454816992516, 28.415233964640635 -11.156274872382312 C28.588386939121087 -10.890265405496347, 28.761539913601535 -10.624255938610382, 29.097158878604247 -10.108655082055241 C29.252659992512143 -9.832547108116533, 29.40816110642004 -9.556439134177822, 29.7105614742735 -9.019496659696287 C29.88164146915487 -8.664245389799632, 30.052721464036246 -8.308994119902977, 30.25292114880834 -7.893275190886684 C30.42379406496446 -7.471215784377977, 30.594666981120582 -7.04915637786927, 30.722009229970325 -6.734618561215508 C30.83678190701692 -6.388941544493889, 30.951554584063516 -6.043264527772271, 31.11589813421488 -5.548287939305138 C31.231840356772235 -5.106149995016832, 31.347782579329586 -4.664012050728525, 31.43296928754556 -4.339158212148133 C31.527052732395003 -3.85605960738936, 31.621136177244445 -3.3729610026305865, 31.671919776581777 -3.1121979531509023 C31.71495367800316 -2.7784355117316935, 31.75798757942454 -2.4446730703124846, 31.831767702509367 -1.872449005199798 C31.863399434459165 -1.3797592474072173, 31.895031166408963 -0.8870694896146368, 31.911856215913414 -0.6250057626472757 C31.911856215913414 -0.21875959307038795, 31.911856215913414 0.1874865765064998, 31.911856215913414 0.625005762647271 C31.893249999381148 0.9148126038049691, 31.874643782848885 1.2046194449626673, 31.831767702509367 1.8724490051997846 C31.76979672307642 2.3530836841276694, 31.707825743643472 2.833718363055554, 31.671919776581777 3.1121979531508885 C31.594870843952673 3.5078279379036625, 31.51782191132357 3.9034579226564365, 31.43296928754556 4.339158212148129 C31.331227702111264 4.727142972491161, 31.229486116676966 5.115127732834193, 31.115898134214884 5.548287939305125 C30.965944325881747 5.999924918109765, 30.815990517548606 6.451561896914404, 30.72200922997033 6.734618561215495 C30.596531066176635 7.044552051741183, 30.47105290238294 7.354485542266873, 30.252921148808344 7.893275190886679 C30.14259716706905 8.122365299523386, 30.03227318532975 8.351455408160092, 29.710561474273504 9.019496659696284 C29.536734485322608 9.328144080469915, 29.36290749637171 9.636791501243547, 29.09715887860425 10.108655082055236 C28.881994409878896 10.439205485767161, 28.66682994115354 10.769755889479086, 28.41523396464064 11.156274872382301 C28.223809561198102 11.412766133873392, 28.032385157755566 11.669257395364482, 27.667588908126582 12.158051136245302 C27.481498810096948 12.376643154217458, 27.29540871206731 12.595235172189614, 26.85729594296866 13.10986736009567 C26.672843749322578 13.300329393841984, 26.488391555676493 13.490791427588299, 25.98768473676799 14.007812326905684 C25.76418755407176 14.210786554818991, 25.54069037137553 14.413760782732298, 25.062328708501887 14.848196188198111 C24.795184634783922 15.06123647798583, 24.528040561065954 15.274276767773546, 24.085030344578715 15.627565626425152 C23.81566105024223 15.815465985345472, 23.54629175590574 16.003366344265793, 23.059805573605708 16.34271804539089 C22.741412630387856 16.53572971865417, 22.423019687170004 16.728741391917456, 21.990867264076787 16.990714730406093 C21.60235704207342 17.193400264372574, 21.213846820070053 17.396085798339058, 20.882607912792388 17.56889292409717 C20.448511567803653 17.76105449901313, 20.01441522281492 17.953216073929088, 19.739581595147804 18.07487676824742 C19.270429596166444 18.247529040666098, 18.801277597185084 18.42018131308478, 18.566485251460616 18.506587066708033 C18.180251039706512 18.621219353371902, 17.794016827952404 18.735851640035776, 17.368139386235413 18.86224982926107 C16.894317852798917 18.970396502293486, 16.42049631936242 19.078543175325898, 16.149468259676766 19.140403561325773 C15.838857476007444 19.190620704006825, 15.528246692338124 19.240837846687878, 14.915479652847878 19.3399052695533 C14.453492090459395 19.38447265407558, 13.991504528070912 19.429040038597865, 13.6712442896239 19.45993515863156 C13.366295132900609 19.46971428454015, 13.061345976177318 19.47949341044874, 12.421875000000004 19.5 C12.421875000000002 19.5, 12.421875000000002 19.5, 12.421875 19.5 C6.541491582385115 19.5, 0.6611081647702299 19.5, -12.421874999999996 19.5 C-12.702400282274022 19.49100410020681, -12.982925564548047 19.48200820041362, -13.671244289623893 19.45993515863156 C-13.998460322649402 19.428369021460444, -14.32567635567491 19.39680288428933, -14.915479652847871 19.3399052695533 C-15.204432904629952 19.293189548671105, -15.493386156412033 19.246473827788915, -16.14946825967676 19.140403561325773 C-16.467251430362648 19.067871626345706, -16.785034601048537 18.995339691365643, -17.368139386235388 18.862249829261074 C-17.76280532397698 18.745115050583152, -18.157471261718573 18.62798027190523, -18.56648525146059 18.506587066708043 C-18.88851919602268 18.38807559826004, -19.210553140584775 18.269564129812043, -19.739581595147797 18.074876768247425 C-20.039344922672118 17.942180435315578, -20.33910825019644 17.809484102383735, -20.88260791279238 17.568892924097174 C-21.248679508233174 17.377913607235758, -21.614751103673967 17.186934290374346, -21.99086726407678 16.990714730406097 C-22.296997594972833 16.805136724795396, -22.603127925868886 16.619558719184695, -23.059805573605686 16.3427180453909 C-23.335913909999988 16.150116822459477, -23.61202224639429 15.957515599528056, -24.085030344578712 15.627565626425156 C-24.353743570287673 15.413273979681508, -24.622456795996634 15.19898233293786, -25.06232870850187 14.848196188198125 C-25.42588604825955 14.518023031430292, -25.789443388017233 14.18784987466246, -25.987684736767974 14.007812326905697 C-26.2926355460532 13.692925579391634, -26.597586355338432 13.378038831877571, -26.857295942968655 13.109867360095677 C-27.0744060385801 12.854837487876063, -27.291516134191543 12.599807615656449, -27.66758890812658 12.158051136245307 C-27.933920486042446 11.80119108514394, -28.20025206395831 11.444331034042571, -28.415233964640635 11.156274872382316 C-28.668900229556197 10.766575370542336, -28.922566494471756 10.376875868702355, -29.097158878604244 10.108655082055249 C-29.241708674591813 9.85199228202527, -29.386258470579378 9.595329481995291, -29.7105614742735 9.019496659696289 C-29.856071446620845 8.717342088702377, -30.00158141896819 8.415187517708466, -30.25292114880834 7.893275190886686 C-30.4060819959936 7.514964937175564, -30.559242843178858 7.1366546834644415, -30.722009229970325 6.73461856121551 C-30.825543416765854 6.422790086519852, -30.92907760356138 6.110961611824194, -31.11589813421488 5.5482879393051325 C-31.23807995485971 5.082355703250362, -31.36026177550454 4.616423467195591, -31.432969287545557 4.339158212148136 C-31.510528463423352 3.9409082361532923, -31.588087639301147 3.542658260158449, -31.671919776581777 3.112197953150904 C-31.712838134687694 2.79484324792516, -31.75375649279361 2.477488542699416, -31.831767702509364 1.872449005199809 C-31.856442648228253 1.4881168083704153, -31.881117593947142 1.1037846115410215, -31.911856215913414 0.6250057626472781 C-31.911856215913414 0.2821758808400364, -31.911856215913414 -0.0606540009672053, -31.911856215913414 -0.6250057626472687 C-31.88056250692076 -1.1124305400350991, -31.849268797928108 -1.5998553174229297, -31.831767702509367 -1.8724490051997822 C-31.78506712484903 -2.234649463461227, -31.73836654718869 -2.5968499217226717, -31.671919776581777 -3.112197953150895 C-31.606401512031 -3.448620394329022, -31.540883247480224 -3.7850428355071486, -31.43296928754556 -4.339158212148126 C-31.331653020036622 -4.725521050907818, -31.23033675252768 -5.111883889667511, -31.115898134214884 -5.548287939305123 C-31.016049008774942 -5.849017596332551, -30.916199883334997 -6.14974725335998, -30.722009229970332 -6.734618561215485 C-30.60508911045449 -7.023413516916349, -30.488168990938647 -7.312208472617215, -30.252921148808344 -7.893275190886676 C-30.077701462264613 -8.257122619095433, -29.90248177572088 -8.62097004730419, -29.710561474273504 -9.019496659696282 C-29.48363541704572 -9.422426853059243, -29.256709359817933 -9.825357046422202, -29.097158878604247 -10.108655082055243 C-28.827647809029727 -10.522696458777183, -28.558136739455207 -10.936737835499125, -28.41523396464064 -11.156274872382308 C-28.211107572027508 -11.429785642186976, -28.006981179414378 -11.703296411991644, -27.667588908126586 -12.158051136245302 C-27.413470983928377 -12.456552509728029, -27.159353059730172 -12.755053883210756, -26.857295942968662 -13.10986736009567 C-26.616475663116194 -13.358534070756024, -26.375655383263723 -13.607200781416378, -25.987684736767996 -14.007812326905677 C-25.767246901656623 -14.208008136288317, -25.54680906654525 -14.408203945670959, -25.062328708501887 -14.848196188198107 C-24.68841152956317 -15.146385188047718, -24.314494350624447 -15.444574187897329, -24.08503034457872 -15.627565626425149 C-23.82567348017177 -15.80848174765773, -23.56631661576482 -15.989397868890313, -23.05980557360571 -16.342718045390885 C-22.74425967636102 -16.53400382265414, -22.42871377911633 -16.725289599917392, -21.99086726407679 -16.99071473040609 C-21.58163336350982 -17.204211794205055, -21.172399462942845 -17.417708858004023, -20.882607912792388 -17.56889292409717 C-20.600499330750917 -17.693774024913175, -20.318390748709447 -17.81865512572918, -19.739581595147804 -18.07487676824742 C-19.39586574471399 -18.201367378481557, -19.052149894280173 -18.327857988715692, -18.56648525146062 -18.506587066708033 C-18.2798081276674 -18.59167133225093, -17.993131003874183 -18.676755597793825, -17.368139386235413 -18.862249829261067 C-17.00500305112221 -18.94513332806461, -16.641866716009 -19.028016826868157, -16.149468259676766 -19.140403561325773 C-15.883158389278902 -19.18345847590781, -15.616848518881039 -19.226513390489846, -14.91547965284788 -19.3399052695533 C-14.514213854895804 -19.37861489848901, -14.11294805694373 -19.417324527424718, -13.671244289623903 -19.45993515863156 C-13.19774547686627 -19.475119343947167, -12.72424666410864 -19.490303529262775, -12.421875000000005 -19.5 C-12.421875000000004 -19.5, -12.421875000000004 -19.5, -12.421875 -19.5&quot; stroke=&quot;none&quot; stroke-width=&quot;0&quot; fill=&quot;#ECECFF&quot; style=&quot;&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M-12.421875 -19.5 C-4.499331780648734 -19.5, 3.4232114387025323 -19.5, 12.421875 -19.5 M-12.421875 -19.5 C-6.586162650190524 -19.5, -0.7504503003810488 -19.5, 12.421875 -19.5 M12.421875 -19.5 C12.421875 -19.5, 12.421874999999998 -19.5, 12.421874999999998 -19.5 M12.421875 -19.5 C12.421875 -19.5, 12.421874999999998 -19.5, 12.421874999999998 -19.5 M12.421874999999998 -19.5 C12.824441746470937 -19.487090467989315, 13.227008492941875 -19.47418093597863, 13.6712442896239 -19.45993515863156 M12.421874999999998 -19.5 C12.80595316211838 -19.487683360903656, 13.190031324236761 -19.47536672180731, 13.6712442896239 -19.45993515863156 M13.6712442896239 -19.45993515863156 C14.027328659212193 -19.425584127751485, 14.383413028800486 -19.391233096871414, 14.915479652847864 -19.3399052695533 M13.6712442896239 -19.45993515863156 C13.941003819741828 -19.433911781194382, 14.210763349859757 -19.40788840375721, 14.915479652847864 -19.3399052695533 M14.915479652847864 -19.3399052695533 C15.405392793500317 -19.26069991230576, 15.895305934152768 -19.181494555058222, 16.14946825967676 -19.140403561325776 M14.915479652847864 -19.3399052695533 C15.295184404914462 -19.278517549893504, 15.67488915698106 -19.217129830233706, 16.14946825967676 -19.140403561325776 M16.14946825967676 -19.140403561325776 C16.421275567169328 -19.07836531709904, 16.6930828746619 -19.016327072872304, 17.36813938623539 -18.862249829261074 M16.14946825967676 -19.140403561325776 C16.513530643712006 -19.05730869789881, 16.877593027747253 -18.974213834471843, 17.36813938623539 -18.862249829261074 M17.36813938623539 -18.862249829261074 C17.679912691841455 -18.76971714868867, 17.991685997447522 -18.677184468116266, 18.566485251460602 -18.50658706670804 M17.36813938623539 -18.862249829261074 C17.7378066713124 -18.752534519473397, 18.107473956389402 -18.642819209685715, 18.566485251460602 -18.50658706670804 M18.566485251460602 -18.50658706670804 C18.889463867287542 -18.38772795050213, 19.212442483114483 -18.268868834296217, 19.739581595147794 -18.074876768247425 M18.566485251460602 -18.50658706670804 C18.954957582326305 -18.3636256579506, 19.343429913192008 -18.22066424919316, 19.739581595147794 -18.074876768247425 M19.739581595147794 -18.074876768247425 C20.071087927485824 -17.928128748707334, 20.402594259823857 -17.78138072916724, 20.88260791279238 -17.568892924097174 M19.739581595147794 -18.074876768247425 C20.02739474007747 -17.947470426660658, 20.315207885007144 -17.82006408507389, 20.88260791279238 -17.568892924097174 M20.88260791279238 -17.568892924097174 C21.21639791987304 -17.3947548912059, 21.550187926953697 -17.220616858314624, 21.990867264076783 -16.990714730406097 M20.88260791279238 -17.568892924097174 C21.262037000795647 -17.3709450119218, 21.64146608879891 -17.17299709974643, 21.990867264076783 -16.990714730406097 M21.990867264076783 -16.990714730406097 C22.225026464627145 -16.848766046960264, 22.459185665177504 -16.706817363514432, 23.059805573605697 -16.342718045390892 M21.990867264076783 -16.990714730406097 C22.227243288614666 -16.847422195231523, 22.463619313152552 -16.70412966005695, 23.059805573605697 -16.342718045390892 M23.059805573605697 -16.342718045390892 C23.438585159795693 -16.078497803168766, 23.817364745985685 -15.814277560946636, 24.085030344578712 -15.627565626425154 M23.059805573605697 -16.342718045390892 C23.44345599948526 -16.075100116256575, 23.82710642536482 -15.807482187122256, 24.085030344578712 -15.627565626425154 M24.085030344578712 -15.627565626425154 C24.313497568563236 -15.445369095065661, 24.541964792547756 -15.263172563706169, 25.06232870850187 -14.848196188198123 M24.085030344578712 -15.627565626425154 C24.41515580534072 -15.364299356474909, 24.74528126610273 -15.101033086524664, 25.06232870850187 -14.848196188198123 M25.06232870850187 -14.848196188198123 C25.351221325819623 -14.585831556829934, 25.640113943137376 -14.323466925461746, 25.987684736767985 -14.007812326905688 M25.06232870850187 -14.848196188198123 C25.33779673757196 -14.598023412681322, 25.61326476664205 -14.347850637164518, 25.987684736767985 -14.007812326905688 M25.987684736767985 -14.007812326905688 C26.2940724756998 -13.691441831557407, 26.60046021463161 -13.375071336209126, 26.857295942968648 -13.10986736009568 M25.987684736767985 -14.007812326905688 C26.207285657833708 -13.781056346334402, 26.426886578899435 -13.554300365763117, 26.857295942968648 -13.10986736009568 M26.857295942968648 -13.10986736009568 C27.02013719910859 -12.91858475470374, 27.182978455248527 -12.727302149311802, 27.667588908126582 -12.158051136245305 M26.857295942968648 -13.10986736009568 C27.17678954295278 -12.734571997853473, 27.496283142936914 -12.359276635611266, 27.667588908126582 -12.158051136245305 M27.667588908126582 -12.158051136245305 C27.872328721401214 -11.883718438637999, 28.077068534675846 -11.60938574103069, 28.415233964640635 -11.156274872382312 M27.667588908126582 -12.158051136245305 C27.865934652153097 -11.892285908918785, 28.06428039617961 -11.626520681592265, 28.415233964640635 -11.156274872382312 M28.415233964640635 -11.156274872382312 C28.596762430984896 -10.877398400859061, 28.778290897329157 -10.59852192933581, 29.097158878604247 -10.108655082055241 M28.415233964640635 -11.156274872382312 C28.564273568569067 -10.927310018010871, 28.713313172497504 -10.69834516363943, 29.097158878604247 -10.108655082055241 M29.097158878604247 -10.108655082055241 C29.317665561546985 -9.71712313776752, 29.538172244489722 -9.325591193479797, 29.7105614742735 -9.019496659696287 M29.097158878604247 -10.108655082055241 C29.250739663102763 -9.835956847437323, 29.40432044760128 -9.563258612819405, 29.7105614742735 -9.019496659696287 M29.7105614742735 -9.019496659696287 C29.88112879145182 -8.66530997601956, 30.051696108630146 -8.311123292342833, 30.25292114880834 -7.893275190886684 M29.7105614742735 -9.019496659696287 C29.905203034543295 -8.615319295133837, 30.09984459481309 -8.211141930571387, 30.25292114880834 -7.893275190886684 M30.25292114880834 -7.893275190886684 C30.39290363732264 -7.547515737879061, 30.532886125836942 -7.201756284871437, 30.722009229970325 -6.734618561215508 M30.25292114880834 -7.893275190886684 C30.43291469967155 -7.4486876403159945, 30.612908250534755 -7.004100089745304, 30.722009229970325 -6.734618561215508 M30.722009229970325 -6.734618561215508 C30.80328494605856 -6.489829053884525, 30.884560662146793 -6.245039546553541, 31.11589813421488 -5.548287939305138 M30.722009229970325 -6.734618561215508 C30.86609260187958 -6.300662401592582, 31.010175973788837 -5.8667062419696565, 31.11589813421488 -5.548287939305138 M31.11589813421488 -5.548287939305138 C31.222686209189046 -5.141058727184185, 31.32947428416321 -4.733829515063233, 31.43296928754556 -4.339158212148133 M31.11589813421488 -5.548287939305138 C31.182813603553797 -5.293110253367986, 31.249729072892713 -5.0379325674308335, 31.43296928754556 -4.339158212148133 M31.43296928754556 -4.339158212148133 C31.490518978873613 -4.043652710310145, 31.54806867020167 -3.748147208472156, 31.671919776581777 -3.1121979531509023 M31.43296928754556 -4.339158212148133 C31.4941298798831 -4.025111496790633, 31.55529047222064 -3.7110647814331346, 31.671919776581777 -3.1121979531509023 M31.671919776581777 -3.1121979531509023 C31.723742773341318 -2.710269023892112, 31.775565770100858 -2.308340094633322, 31.831767702509367 -1.872449005199798 M31.671919776581777 -3.1121979531509023 C31.731557856098398 -2.64965678529084, 31.791195935615022 -2.187115617430778, 31.831767702509367 -1.872449005199798 M31.831767702509367 -1.872449005199798 C31.852374059050394 -1.551488368921673, 31.87298041559142 -1.230527732643548, 31.911856215913414 -0.6250057626472757 M31.831767702509367 -1.872449005199798 C31.84830033616906 -1.61493989104837, 31.864832969828754 -1.3574307768969422, 31.911856215913414 -0.6250057626472757 M31.911856215913414 -0.6250057626472757 C31.911856215913414 -0.15687761538427203, 31.911856215913414 0.31125053187873164, 31.911856215913414 0.625005762647271 M31.911856215913414 -0.6250057626472757 C31.911856215913414 -0.25753810561891716, 31.911856215913414 0.10992955140944138, 31.911856215913414 0.625005762647271 M31.911856215913414 0.625005762647271 C31.882626109419608 1.0802882654055972, 31.853396002925802 1.5355707681639235, 31.831767702509367 1.8724490051997846 M31.911856215913414 0.625005762647271 C31.891239626723138 0.9461257806971015, 31.870623037532862 1.267245798746932, 31.831767702509367 1.8724490051997846 M31.831767702509367 1.8724490051997846 C31.784172034251835 2.241591609377437, 31.7365763659943 2.610734213555089, 31.671919776581777 3.1121979531508885 M31.831767702509367 1.8724490051997846 C31.798370130329747 2.1314739799283227, 31.76497255815013 2.3904989546568607, 31.671919776581777 3.1121979531508885 M31.671919776581777 3.1121979531508885 C31.597731177108002 3.493140731682683, 31.523542577634224 3.874083510214477, 31.43296928754556 4.339158212148129 M31.671919776581777 3.1121979531508885 C31.577712512163423 3.5959323452267595, 31.483505247745068 4.07966673730263, 31.43296928754556 4.339158212148129 M31.43296928754556 4.339158212148129 C31.334634298359454 4.714152144568659, 31.236299309173347 5.08914607698919, 31.115898134214884 5.548287939305125 M31.43296928754556 4.339158212148129 C31.306405825677892 4.821799545200903, 31.179842363810224 5.3044408782536765, 31.115898134214884 5.548287939305125 M31.115898134214884 5.548287939305125 C30.991573508156755 5.922733904553091, 30.86724888209862 6.297179869801058, 30.72200922997033 6.734618561215495 M31.115898134214884 5.548287939305125 C31.031693280156706 5.801899543506819, 30.94748842609853 6.055511147708513, 30.72200922997033 6.734618561215495 M30.72200922997033 6.734618561215495 C30.58343061342135 7.07691042332676, 30.44485199687237 7.4192022854380255, 30.252921148808344 7.893275190886679 M30.72200922997033 6.734618561215495 C30.569934177907797 7.110246879981062, 30.417859125845265 7.48587519874663, 30.252921148808344 7.893275190886679 M30.252921148808344 7.893275190886679 C30.093334167179968 8.224660972852398, 29.933747185551592 8.556046754818116, 29.710561474273504 9.019496659696284 M30.252921148808344 7.893275190886679 C30.116625130810945 8.176296788525883, 29.98032911281355 8.459318386165087, 29.710561474273504 9.019496659696284 M29.710561474273504 9.019496659696284 C29.486769993657777 9.416861094874228, 29.262978513042054 9.814225530052171, 29.09715887860425 10.108655082055236 M29.710561474273504 9.019496659696284 C29.54497449310464 9.313513112261647, 29.37938751193578 9.607529564827013, 29.09715887860425 10.108655082055236 M29.09715887860425 10.108655082055236 C28.874675308186518 10.450449591420647, 28.652191737768785 10.792244100786057, 28.41523396464064 11.156274872382301 M29.09715887860425 10.108655082055236 C28.867145654742444 10.462017161105802, 28.637132430880637 10.815379240156368, 28.41523396464064 11.156274872382301 M28.41523396464064 11.156274872382301 C28.16681034044649 11.489139896944721, 27.91838671625234 11.822004921507139, 27.667588908126582 12.158051136245302 M28.41523396464064 11.156274872382301 C28.11999538611408 11.55186767082007, 27.824756807587523 11.947460469257837, 27.667588908126582 12.158051136245302 M27.667588908126582 12.158051136245302 C27.43984415924058 12.425573077330126, 27.212099410354575 12.693095018414951, 26.85729594296866 13.10986736009567 M27.667588908126582 12.158051136245302 C27.504667123335192 12.349428335173448, 27.3417453385438 12.540805534101592, 26.85729594296866 13.10986736009567 M26.85729594296866 13.10986736009567 C26.544334282434267 13.433025969227614, 26.231372621899876 13.756184578359559, 25.98768473676799 14.007812326905684 M26.85729594296866 13.10986736009567 C26.612556110084153 13.36258133106289, 26.36781627719965 13.615295302030109, 25.98768473676799 14.007812326905684 M25.98768473676799 14.007812326905684 C25.790552654101944 14.186842468553898, 25.5934205714359 14.365872610202112, 25.062328708501887 14.848196188198111 M25.98768473676799 14.007812326905684 C25.682684406248146 14.284805557217275, 25.377684075728304 14.561798787528868, 25.062328708501887 14.848196188198111 M25.062328708501887 14.848196188198111 C24.78126876446864 15.072334014245405, 24.50020882043539 15.2964718402927, 24.085030344578715 15.627565626425152 M25.062328708501887 14.848196188198111 C24.72415837089761 15.117878033346901, 24.385988033293334 15.38755987849569, 24.085030344578715 15.627565626425152 M24.085030344578715 15.627565626425152 C23.69787828807769 15.89762614149786, 23.310726231576663 16.167686656570567, 23.059805573605708 16.34271804539089 M24.085030344578715 15.627565626425152 C23.73634333296647 15.870794591308403, 23.38765632135422 16.114023556191654, 23.059805573605708 16.34271804539089 M23.059805573605708 16.34271804539089 C22.68381278973175 16.57064708055414, 22.307820005857792 16.79857611571739, 21.990867264076787 16.990714730406093 M23.059805573605708 16.34271804539089 C22.63543310916321 16.59997512722535, 22.21106064472071 16.85723220905981, 21.990867264076787 16.990714730406093 M21.990867264076787 16.990714730406093 C21.573413969932318 17.208499846569666, 21.15596067578785 17.426284962733238, 20.882607912792388 17.56889292409717 M21.990867264076787 16.990714730406093 C21.76820661598773 17.106876647893202, 21.545545967898676 17.22303856538031, 20.882607912792388 17.56889292409717 M20.882607912792388 17.56889292409717 C20.65035070834225 17.671706298842068, 20.41809350389211 17.774519673586965, 19.739581595147804 18.07487676824742 M20.882607912792388 17.56889292409717 C20.44252574091446 17.76370424701373, 20.002443569036526 17.95851556993029, 19.739581595147804 18.07487676824742 M19.739581595147804 18.07487676824742 C19.420180507801753 18.192419320902054, 19.100779420455698 18.309961873556688, 18.566485251460616 18.506587066708033 M19.739581595147804 18.07487676824742 C19.407337303744896 18.19714573871625, 19.07509301234199 18.319414709185086, 18.566485251460616 18.506587066708033 M18.566485251460616 18.506587066708033 C18.10876323293089 18.642436559175753, 17.651041214401165 18.778286051643473, 17.368139386235413 18.86224982926107 M18.566485251460616 18.506587066708033 C18.140109300544896 18.633133210846783, 17.713733349629173 18.759679354985533, 17.368139386235413 18.86224982926107 M17.368139386235413 18.86224982926107 C16.941612875448996 18.95960172200247, 16.51508636466258 19.05695361474387, 16.149468259676766 19.140403561325773 M17.368139386235413 18.86224982926107 C16.990599566368587 18.948420829468105, 16.613059746501758 19.03459182967514, 16.149468259676766 19.140403561325773 M16.149468259676766 19.140403561325773 C15.721728077445041 19.209557276814344, 15.293987895213316 19.278710992302912, 14.915479652847878 19.3399052695533 M16.149468259676766 19.140403561325773 C15.689935573188553 19.21469724234798, 15.230402886700338 19.288990923370186, 14.915479652847878 19.3399052695533 M14.915479652847878 19.3399052695533 C14.485098123059972 19.38142365812242, 14.054716593272063 19.422942046691542, 13.6712442896239 19.45993515863156 M14.915479652847878 19.3399052695533 C14.44101977197073 19.385675843640026, 13.966559891093581 19.431446417726754, 13.6712442896239 19.45993515863156 M13.6712442896239 19.45993515863156 C13.32131200079371 19.471156806032464, 12.971379711963522 19.482378453433366, 12.421875000000004 19.5 M13.6712442896239 19.45993515863156 C13.195377435524335 19.47519528242389, 12.719510581424773 19.49045540621622, 12.421875000000004 19.5 M12.421875000000004 19.5 C12.421875000000004 19.5, 12.421875000000002 19.5, 12.421875 19.5 M12.421875000000004 19.5 C12.421875000000004 19.5, 12.421875000000002 19.5, 12.421875 19.5 M12.421875 19.5 C4.330857494113191 19.5, -3.7601600117736176 19.5, -12.421874999999996 19.5 M12.421875 19.5 C6.647976825351332 19.5, 0.8740786507026641 19.5, -12.421874999999996 19.5 M-12.421874999999996 19.5 C-12.786805909667656 19.488297376021883, -13.151736819335314 19.476594752043766, -13.671244289623893 19.45993515863156 M-12.421874999999996 19.5 C-12.86776608436187 19.48570114079886, -13.313657168723743 19.47140228159772, -13.671244289623893 19.45993515863156 M-13.671244289623893 19.45993515863156 C-13.993698865144285 19.428828353539473, -14.31615344066468 19.397721548447386, -14.915479652847871 19.3399052695533 M-13.671244289623893 19.45993515863156 C-14.079678673873902 19.420533984797174, -14.48811305812391 19.38113281096279, -14.915479652847871 19.3399052695533 M-14.915479652847871 19.3399052695533 C-15.29325017931443 19.278830260488373, -15.671020705780988 19.217755251423444, -16.14946825967676 19.140403561325773 M-14.915479652847871 19.3399052695533 C-15.360385044494373 19.267976416124736, -15.805290436140874 19.19604756269617, -16.14946825967676 19.140403561325773 M-16.14946825967676 19.140403561325773 C-16.632614924613538 19.03012848788059, -17.115761589550317 18.919853414435405, -17.368139386235388 18.862249829261074 M-16.14946825967676 19.140403561325773 C-16.60358710238816 19.03675389887929, -17.057705945099567 18.933104236432804, -17.368139386235388 18.862249829261074 M-17.368139386235388 18.862249829261074 C-17.845655143938743 18.72052565890608, -18.3231709016421 18.578801488551086, -18.56648525146059 18.506587066708043 M-17.368139386235388 18.862249829261074 C-17.71387371901617 18.759637694088283, -18.059608051796953 18.657025558915496, -18.56648525146059 18.506587066708043 M-18.56648525146059 18.506587066708043 C-19.022256008337376 18.338859215078696, -19.478026765214157 18.171131363449348, -19.739581595147797 18.074876768247425 M-18.56648525146059 18.506587066708043 C-18.932655118812857 18.37183317068526, -19.298824986165126 18.237079274662477, -19.739581595147797 18.074876768247425 M-19.739581595147797 18.074876768247425 C-20.03897795183034 17.942342882421432, -20.338374308512883 17.80980899659544, -20.88260791279238 17.568892924097174 M-19.739581595147797 18.074876768247425 C-20.132059467922264 17.901138456412607, -20.52453734069673 17.72740014457779, -20.88260791279238 17.568892924097174 M-20.88260791279238 17.568892924097174 C-21.23830172162414 17.383327691862405, -21.5939955304559 17.197762459627633, -21.99086726407678 16.990714730406097 M-20.88260791279238 17.568892924097174 C-21.130964165798567 17.43932562598362, -21.37932041880475 17.309758327870064, -21.99086726407678 16.990714730406097 M-21.99086726407678 16.990714730406097 C-22.413316120479223 16.734623751069893, -22.835764976881663 16.47853277173369, -23.059805573605686 16.3427180453909 M-21.99086726407678 16.990714730406097 C-22.250983521452177 16.83303072657233, -22.51109977882757 16.675346722738563, -23.059805573605686 16.3427180453909 M-23.059805573605686 16.3427180453909 C-23.38639123729486 16.114906024066855, -23.71297690098403 15.887094002742812, -24.085030344578712 15.627565626425156 M-23.059805573605686 16.3427180453909 C-23.430178424439877 16.08436197783127, -23.80055127527407 15.826005910271643, -24.085030344578712 15.627565626425156 M-24.085030344578712 15.627565626425156 C-24.378487390507146 15.393541441517188, -24.67194443643558 15.15951725660922, -25.06232870850187 14.848196188198125 M-24.085030344578712 15.627565626425156 C-24.424059532142 15.357198871289013, -24.763088719705287 15.086832116152868, -25.06232870850187 14.848196188198125 M-25.06232870850187 14.848196188198125 C-25.28461962970064 14.646317455060883, -25.506910550899406 14.44443872192364, -25.987684736767974 14.007812326905697 M-25.06232870850187 14.848196188198125 C-25.317182607227288 14.616744620440354, -25.572036505952703 14.38529305268258, -25.987684736767974 14.007812326905697 M-25.987684736767974 14.007812326905697 C-26.18697211562867 13.802031746433938, -26.386259494489362 13.59625116596218, -26.857295942968655 13.109867360095677 M-25.987684736767974 14.007812326905697 C-26.256555340911856 13.730181353440008, -26.525425945055737 13.45255037997432, -26.857295942968655 13.109867360095677 M-26.857295942968655 13.109867360095677 C-27.02451402884088 12.913443481451528, -27.1917321147131 12.717019602807381, -27.66758890812658 12.158051136245307 M-26.857295942968655 13.109867360095677 C-27.15774993969667 12.756936999222216, -27.458203936424688 12.404006638348754, -27.66758890812658 12.158051136245307 M-27.66758890812658 12.158051136245307 C-27.962701513252405 11.76262713068811, -28.25781411837823 11.367203125130914, -28.415233964640635 11.156274872382316 M-27.66758890812658 12.158051136245307 C-27.89585607324578 11.852193930552126, -28.12412323836498 11.546336724858943, -28.415233964640635 11.156274872382316 M-28.415233964640635 11.156274872382316 C-28.65272855118246 10.791419411228073, -28.890223137724284 10.426563950073831, -29.097158878604244 10.108655082055249 M-28.415233964640635 11.156274872382316 C-28.64333737582436 10.805846778461795, -28.871440787008083 10.455418684541277, -29.097158878604244 10.108655082055249 M-29.097158878604244 10.108655082055249 C-29.288594552177983 9.768741658661092, -29.480030225751722 9.428828235266936, -29.7105614742735 9.019496659696289 M-29.097158878604244 10.108655082055249 C-29.302711953677033 9.743674782757614, -29.508265028749822 9.378694483459979, -29.7105614742735 9.019496659696289 M-29.7105614742735 9.019496659696289 C-29.868675604726793 8.691169284709595, -30.02678973518009 8.362841909722901, -30.25292114880834 7.893275190886686 M-29.7105614742735 9.019496659696289 C-29.92473447251278 8.574761846284375, -30.13890747075206 8.13002703287246, -30.25292114880834 7.893275190886686 M-30.25292114880834 7.893275190886686 C-30.43392138944303 7.446201097117418, -30.614921630077717 6.99912700334815, -30.722009229970325 6.73461856121551 M-30.25292114880834 7.893275190886686 C-30.35561983327993 7.639607454697869, -30.458318517751522 7.385939718509052, -30.722009229970325 6.73461856121551 M-30.722009229970325 6.73461856121551 C-30.867190580091755 6.297355466156586, -31.01237193021318 5.860092371097661, -31.11589813421488 5.5482879393051325 M-30.722009229970325 6.73461856121551 C-30.82764589311282 6.4164577627469, -30.933282556255318 6.09829696427829, -31.11589813421488 5.5482879393051325 M-31.11589813421488 5.5482879393051325 C-31.1855578359613 5.282645305840315, -31.255217537707722 5.017002672375499, -31.432969287545557 4.339158212148136 M-31.11589813421488 5.5482879393051325 C-31.20131157968896 5.222569453291035, -31.286725025163037 4.8968509672769365, -31.432969287545557 4.339158212148136 M-31.432969287545557 4.339158212148136 C-31.49584747662348 4.016292000542973, -31.558725665701402 3.6934257889378106, -31.671919776581777 3.112197953150904 M-31.432969287545557 4.339158212148136 C-31.493796266135682 4.026824532874334, -31.554623244725803 3.7144908536005325, -31.671919776581777 3.112197953150904 M-31.671919776581777 3.112197953150904 C-31.725457600371875 2.696969164074018, -31.77899542416197 2.281740374997132, -31.831767702509364 1.872449005199809 M-31.671919776581777 3.112197953150904 C-31.717816678818807 2.756230642768982, -31.763713581055836 2.40026333238706, -31.831767702509364 1.872449005199809 M-31.831767702509364 1.872449005199809 C-31.85026514747064 1.5843363690590735, -31.86876259243192 1.296223732918338, -31.911856215913414 0.6250057626472781 M-31.831767702509364 1.872449005199809 C-31.852577724690672 1.54831611217837, -31.87338774687198 1.2241832191569308, -31.911856215913414 0.6250057626472781 M-31.911856215913414 0.6250057626472781 C-31.911856215913414 0.3444094729848822, -31.911856215913414 0.06381318332248631, -31.911856215913414 -0.6250057626472687 M-31.911856215913414 0.6250057626472781 C-31.911856215913414 0.13794563858912284, -31.911856215913414 -0.34911448546903245, -31.911856215913414 -0.6250057626472687 M-31.911856215913414 -0.6250057626472687 C-31.88434167641363 -1.0535669246929322, -31.85682713691385 -1.4821280867385958, -31.831767702509367 -1.8724490051997822 M-31.911856215913414 -0.6250057626472687 C-31.882219283168507 -1.086624912650728, -31.852582350423603 -1.5482440626541871, -31.831767702509367 -1.8724490051997822 M-31.831767702509367 -1.8724490051997822 C-31.781652249311676 -2.261134563785493, -31.731536796113982 -2.6498201223712043, -31.671919776581777 -3.112197953150895 M-31.831767702509367 -1.8724490051997822 C-31.78207105504668 -2.257886389207364, -31.732374407583986 -2.643323773214946, -31.671919776581777 -3.112197953150895 M-31.671919776581777 -3.112197953150895 C-31.603877632285553 -3.4615799833997185, -31.535835487989328 -3.810962013648542, -31.43296928754556 -4.339158212148126 M-31.671919776581777 -3.112197953150895 C-31.604879651832555 -3.456434824802767, -31.53783952708333 -3.800671696454639, -31.43296928754556 -4.339158212148126 M-31.43296928754556 -4.339158212148126 C-31.310615018342613 -4.805748069294684, -31.188260749139666 -5.272337926441242, -31.115898134214884 -5.548287939305123 M-31.43296928754556 -4.339158212148126 C-31.33475388380129 -4.71369611345028, -31.236538480057018 -5.088234014752434, -31.115898134214884 -5.548287939305123 M-31.115898134214884 -5.548287939305123 C-30.959024015996395 -6.02076778888279, -30.80214989777791 -6.493247638460458, -30.722009229970332 -6.734618561215485 M-31.115898134214884 -5.548287939305123 C-31.021962791500606 -5.831206224996174, -30.928027448786324 -6.114124510687224, -30.722009229970332 -6.734618561215485 M-30.722009229970332 -6.734618561215485 C-30.60544695169974 -7.022529642122188, -30.488884673429148 -7.310440723028891, -30.252921148808344 -7.893275190886676 M-30.722009229970332 -6.734618561215485 C-30.62189063108827 -6.981913436115604, -30.52177203220621 -7.229208311015722, -30.252921148808344 -7.893275190886676 M-30.252921148808344 -7.893275190886676 C-30.107075489605446 -8.19612682281869, -29.96122983040255 -8.498978454750704, -29.710561474273504 -9.019496659696282 M-30.252921148808344 -7.893275190886676 C-30.05214060035416 -8.310200295767315, -29.85136005189998 -8.727125400647953, -29.710561474273504 -9.019496659696282 M-29.710561474273504 -9.019496659696282 C-29.5510363640517 -9.30274964656415, -29.391511253829893 -9.586002633432019, -29.097158878604247 -10.108655082055243 M-29.710561474273504 -9.019496659696282 C-29.55021159058286 -9.30421411537544, -29.38986170689222 -9.588931571054601, -29.097158878604247 -10.108655082055243 M-29.097158878604247 -10.108655082055243 C-28.922879300282137 -10.37639531497749, -28.748599721960026 -10.644135547899737, -28.41523396464064 -11.156274872382308 M-29.097158878604247 -10.108655082055243 C-28.957068248285488 -10.323871909826337, -28.81697761796673 -10.539088737597432, -28.41523396464064 -11.156274872382308 M-28.41523396464064 -11.156274872382308 C-28.255947065935135 -11.369704805312688, -28.09666016722963 -11.583134738243068, -27.667588908126586 -12.158051136245302 M-28.41523396464064 -11.156274872382308 C-28.182470645546616 -11.468156514793701, -27.949707326452593 -11.780038157205093, -27.667588908126586 -12.158051136245302 M-27.667588908126586 -12.158051136245302 C-27.366263426844583 -12.512005192464752, -27.064937945562576 -12.865959248684202, -26.857295942968662 -13.10986736009567 M-27.667588908126586 -12.158051136245302 C-27.421220423589407 -12.447449576946578, -27.174851939052225 -12.736848017647855, -26.857295942968662 -13.10986736009567 M-26.857295942968662 -13.10986736009567 C-26.649173110855617 -13.324771271454685, -26.441050278742573 -13.539675182813697, -25.987684736767996 -14.007812326905677 M-26.857295942968662 -13.10986736009567 C-26.597759828758488 -13.377859706328932, -26.338223714548313 -13.645852052562194, -25.987684736767996 -14.007812326905677 M-25.987684736767996 -14.007812326905677 C-25.717802665210826 -14.252912083605585, -25.447920593653652 -14.498011840305491, -25.062328708501887 -14.848196188198107 M-25.987684736767996 -14.007812326905677 C-25.618369333755417 -14.3432148043716, -25.249053930742843 -14.678617281837523, -25.062328708501887 -14.848196188198107 M-25.062328708501887 -14.848196188198107 C-24.692604580778408 -15.143041341285343, -24.32288045305493 -15.437886494372579, -24.08503034457872 -15.627565626425149 M-25.062328708501887 -14.848196188198107 C-24.812658805244535 -15.04730129205069, -24.562988901987186 -15.246406395903271, -24.08503034457872 -15.627565626425149 M-24.08503034457872 -15.627565626425149 C-23.846186701997357 -15.794172612115261, -23.607343059415992 -15.960779597805375, -23.05980557360571 -16.342718045390885 M-24.08503034457872 -15.627565626425149 C-23.811322609868714 -15.818492293541977, -23.537614875158713 -16.009418960658806, -23.05980557360571 -16.342718045390885 M-23.05980557360571 -16.342718045390885 C-22.818342653042677 -16.489094286829825, -22.57687973247964 -16.635470528268762, -21.99086726407679 -16.99071473040609 M-23.05980557360571 -16.342718045390885 C-22.6389566089259 -16.597839160962824, -22.218107644246086 -16.85296027653476, -21.99086726407679 -16.99071473040609 M-21.99086726407679 -16.99071473040609 C-21.558165776927066 -17.21645481909357, -21.12546428977734 -17.442194907781055, -20.882607912792388 -17.56889292409717 M-21.99086726407679 -16.99071473040609 C-21.612438431854248 -17.188140809781356, -21.2340095996317 -17.38556688915662, -20.882607912792388 -17.56889292409717 M-20.882607912792388 -17.56889292409717 C-20.44119510220533 -17.764293281298265, -19.999782291618278 -17.95969363849936, -19.739581595147804 -18.07487676824742 M-20.882607912792388 -17.56889292409717 C-20.591500737103132 -17.697757435387253, -20.300393561413873 -17.826621946677335, -19.739581595147804 -18.07487676824742 M-19.739581595147804 -18.07487676824742 C-19.422099841869535 -18.19171298822298, -19.104618088591263 -18.30854920819854, -18.56648525146062 -18.506587066708033 M-19.739581595147804 -18.07487676824742 C-19.35034363112179 -18.21811993708529, -18.961105667095776 -18.36136310592316, -18.56648525146062 -18.506587066708033 M-18.56648525146062 -18.506587066708033 C-18.239708640446583 -18.603572649571564, -17.912932029432543 -18.7005582324351, -17.368139386235413 -18.862249829261067 M-18.56648525146062 -18.506587066708033 C-18.18981354071804 -18.618381253266275, -17.813141829975457 -18.730175439824517, -17.368139386235413 -18.862249829261067 M-17.368139386235413 -18.862249829261067 C-16.911454640268094 -18.966485142381632, -16.454769894300775 -19.070720455502197, -16.149468259676766 -19.140403561325773 M-17.368139386235413 -18.862249829261067 C-16.902899035758644 -18.96843790328038, -16.437658685281875 -19.074625977299686, -16.149468259676766 -19.140403561325773 M-16.149468259676766 -19.140403561325773 C-15.695146350682784 -19.213854804252897, -15.2408244416888 -19.287306047180017, -14.91547965284788 -19.3399052695533 M-16.149468259676766 -19.140403561325773 C-15.832515101448044 -19.19164608993974, -15.515561943219321 -19.242888618553707, -14.91547965284788 -19.3399052695533 M-14.91547965284788 -19.3399052695533 C-14.647869688719695 -19.365721280944676, -14.380259724591507 -19.39153729233605, -13.671244289623903 -19.45993515863156 M-14.91547965284788 -19.3399052695533 C-14.462850236737388 -19.383569884958963, -14.010220820626897 -19.427234500364623, -13.671244289623903 -19.45993515863156 M-13.671244289623903 -19.45993515863156 C-13.340519376129679 -19.470540862890328, -13.009794462635455 -19.481146567149093, -12.421875000000005 -19.5 M-13.671244289623903 -19.45993515863156 C-13.377205973650495 -19.469364395113963, -13.083167657677087 -19.478793631596368, -12.421875000000005 -19.5 M-12.421875000000005 -19.5 C-12.421875000000004 -19.5, -12.421875000000004 -19.5, -12.421875 -19.5 M-12.421875000000005 -19.5 C-12.421875000000004 -19.5, -12.421875000000002 -19.5, -12.421875 -19.5&quot; stroke=&quot;#9370DB&quot; stroke-width=&quot;1.3&quot; fill=&quot;none&quot; stroke-dasharray=&quot;0 0&quot; style=&quot;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(-19.546875, -12)&quot;&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width=&quot;39.09375&quot; height=&quot;24&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;nodeLabel&quot;&gt;&lt;p&gt;Start&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;flowchart-decision-1&quot; transform=&quot;translate(182.88621139526367, 87)&quot;&gt;&lt;polygon points=&quot;61.0625,0 122.125,-61.0625 61.0625,-122.125 0,-61.0625&quot; class=&quot;label-container&quot; transform=&quot;translate(-60.5625, 61.0625)&quot;&gt;&lt;/polygon&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(-34.0625, -12)&quot;&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width=&quot;68.125&quot; height=&quot;24&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;nodeLabel&quot;&gt;&lt;p&gt;Decision&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;flowchart-optionA-3&quot; transform=&quot;translate(358.6830863952637, 35)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-64.71875&quot; y=&quot;-27&quot; width=&quot;129.4375&quot; height=&quot;54&quot;&gt;&lt;/rect&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(-34.71875, -12)&quot;&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width=&quot;69.4375&quot; height=&quot;24&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;nodeLabel&quot;&gt;&lt;p&gt;Option A&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node default&quot; id=&quot;flowchart-optionB-4&quot; transform=&quot;translate(358.6830863952637, 139)&quot;&gt;&lt;rect class=&quot;basic label-container&quot; style=&quot;&quot; x=&quot;-64.734375&quot; y=&quot;-27&quot; width=&quot;129.46875&quot; height=&quot;54&quot;&gt;&lt;/rect&gt;&lt;g class=&quot;label&quot; style=&quot;&quot; transform=&quot;translate(-34.734375, -12)&quot;&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width=&quot;69.46875&quot; height=&quot;24&quot;&gt;&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;&quot;&gt;&lt;span class=&quot;nodeLabel&quot;&gt;&lt;p&gt;Option B&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/body&gt;&lt;/html&gt;&lt;figcaption&gt;A basic Mermaid-generated flowchart. I usually start with describing the flows between the nodes and then add a second block to describe how the nodes should be shaped.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The flowchart syntax is powerful and simple. It&#39;s basically nodes and edges to connect nodes, which, as a general concept, can be applied in many communication situations. You get the complete syntax on the Mermaid site at &lt;a href=&quot;https://mermaid.js.org/syntax/flowchart.html&quot;&gt;Flowcharts – basic syntax&lt;/a&gt;. Visit the &lt;a href=&quot;https://mermaid.js.org/intro/&quot;&gt;Mermaid docs&lt;/a&gt; to get an overview of all available diagram types.&lt;/p&gt;
&lt;h3 id=&quot;mermaid-radar-chart&quot; tabindex=&quot;-1&quot;&gt;Mermaid Radar Chart&lt;/h3&gt;
&lt;p&gt;Mermaid does also have more &lt;em&gt;exotic&lt;/em&gt; chart types, like the radar or the Sankey.&lt;/p&gt;
&lt;figure class=&quot;mermaid&quot;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;svg id=&quot;mermaid-qnvnymitxpok&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; style=&quot;max-width: 700px;&quot; viewBox=&quot;0 0 700 700&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;radar&quot;&gt;&lt;style&gt;#mermaid-qnvnymitxpok{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-qnvnymitxpok .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-qnvnymitxpok .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-qnvnymitxpok .error-icon{fill:#552222;}#mermaid-qnvnymitxpok .error-text{fill:#552222;stroke:#552222;}#mermaid-qnvnymitxpok .edge-thickness-normal{stroke-width:1px;}#mermaid-qnvnymitxpok .edge-thickness-thick{stroke-width:3.5px;}#mermaid-qnvnymitxpok .edge-pattern-solid{stroke-dasharray:0;}#mermaid-qnvnymitxpok .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-qnvnymitxpok .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-qnvnymitxpok .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-qnvnymitxpok .marker{fill:#333333;stroke:#333333;}#mermaid-qnvnymitxpok .marker.cross{stroke:#333333;}#mermaid-qnvnymitxpok svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-qnvnymitxpok p{margin:0;}#mermaid-qnvnymitxpok .radarTitle{font-size:16px;color:#333;dominant-baseline:hanging;text-anchor:middle;}#mermaid-qnvnymitxpok .radarAxisLine{stroke:#333333;stroke-width:2;}#mermaid-qnvnymitxpok .radarAxisLabel{dominant-baseline:middle;text-anchor:middle;font-size:12px;color:#333333;}#mermaid-qnvnymitxpok .radarGraticule{fill:#DEDEDE;fill-opacity:0.3;stroke:#DEDEDE;stroke-width:1;}#mermaid-qnvnymitxpok .radarLegendText{text-anchor:start;font-size:12px;dominant-baseline:hanging;}#mermaid-qnvnymitxpok .radarCurve-0{color:hsl(240, 100%, 76.2745098039%);fill:hsl(240, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(240, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-0{fill:hsl(240, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-1{color:hsl(60, 100%, 73.5294117647%);fill:hsl(60, 100%, 73.5294117647%);fill-opacity:0.5;stroke:hsl(60, 100%, 73.5294117647%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-1{fill:hsl(60, 100%, 73.5294117647%);fill-opacity:0.5;stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-qnvnymitxpok .radarCurve-2{color:hsl(80, 100%, 76.2745098039%);fill:hsl(80, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(80, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-2{fill:hsl(80, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-3{color:hsl(270, 100%, 76.2745098039%);fill:hsl(270, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(270, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-3{fill:hsl(270, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-4{color:hsl(300, 100%, 76.2745098039%);fill:hsl(300, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(300, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-4{fill:hsl(300, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-5{color:hsl(330, 100%, 76.2745098039%);fill:hsl(330, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(330, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-5{fill:hsl(330, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-6{color:hsl(0, 100%, 76.2745098039%);fill:hsl(0, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(0, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-6{fill:hsl(0, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-7{color:hsl(30, 100%, 76.2745098039%);fill:hsl(30, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(30, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-7{fill:hsl(30, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-8{color:hsl(90, 100%, 76.2745098039%);fill:hsl(90, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(90, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-8{fill:hsl(90, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-9{color:hsl(150, 100%, 76.2745098039%);fill:hsl(150, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(150, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-9{fill:hsl(150, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-10{color:hsl(180, 100%, 76.2745098039%);fill:hsl(180, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(180, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-10{fill:hsl(180, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok .radarCurve-11{color:hsl(210, 100%, 76.2745098039%);fill:hsl(210, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(210, 100%, 76.2745098039%);stroke-width:2;}#mermaid-qnvnymitxpok .radarLegendBox-11{fill:hsl(210, 100%, 76.2745098039%);fill-opacity:0.5;stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-qnvnymitxpok :root{--mermaid-font-family:arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(350, 350)&quot;&gt;&lt;circle r=&quot;60&quot; class=&quot;radarGraticule&quot;&gt;&lt;/circle&gt;&lt;circle r=&quot;120&quot; class=&quot;radarGraticule&quot;&gt;&lt;/circle&gt;&lt;circle r=&quot;180&quot; class=&quot;radarGraticule&quot;&gt;&lt;/circle&gt;&lt;circle r=&quot;240&quot; class=&quot;radarGraticule&quot;&gt;&lt;/circle&gt;&lt;circle r=&quot;300&quot; class=&quot;radarGraticule&quot;&gt;&lt;/circle&gt;&lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1.8369701987210297e-14&quot; y2=&quot;-300&quot; class=&quot;radarAxisLine&quot;&gt;&lt;/line&gt;&lt;text x=&quot;1.9288187086570814e-14&quot; y=&quot;-315&quot; class=&quot;radarAxisLabel&quot;&gt;Math&lt;/text&gt;&lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;259.8076211353316&quot; y2=&quot;-150&quot; class=&quot;radarAxisLine&quot;&gt;&lt;/line&gt;&lt;text x=&quot;272.7980021920982&quot; y=&quot;-157.5&quot; class=&quot;radarAxisLabel&quot;&gt;Science&lt;/text&gt;&lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;259.8076211353316&quot; y2=&quot;149.99999999999994&quot; class=&quot;radarAxisLine&quot;&gt;&lt;/line&gt;&lt;text x=&quot;272.7980021920982&quot; y=&quot;157.49999999999994&quot; class=&quot;radarAxisLabel&quot;&gt;English&lt;/text&gt;&lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1.8369701987210297e-14&quot; y2=&quot;300&quot; class=&quot;radarAxisLine&quot;&gt;&lt;/line&gt;&lt;text x=&quot;1.9288187086570814e-14&quot; y=&quot;315&quot; class=&quot;radarAxisLabel&quot;&gt;History&lt;/text&gt;&lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;-259.80762113533154&quot; y2=&quot;150.0000000000001&quot; class=&quot;radarAxisLine&quot;&gt;&lt;/line&gt;&lt;text x=&quot;-272.7980021920981&quot; y=&quot;157.5000000000001&quot; class=&quot;radarAxisLabel&quot;&gt;Geography&lt;/text&gt;&lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;-259.8076211353316&quot; y2=&quot;-150.00000000000003&quot; class=&quot;radarAxisLine&quot;&gt;&lt;/line&gt;&lt;text x=&quot;-272.7980021920982&quot; y=&quot;-157.50000000000003&quot; class=&quot;radarAxisLabel&quot;&gt;Art&lt;/text&gt;&lt;path d=&quot;M1.5614246689128753e-14,-255 C79.50113206741148,-255 198.4930225473933,-198.75 233.8268590217984,-135 C269.1606954962035,-71.25 247.596662941971,61.34999999999995 207.84609690826528,119.99999999999996 C168.09553087455956,178.64999999999998 68.45930816915988,211.27499999999998 1.2858791391047208e-14,210 C-68.45930816915985,208.72500000000002 -155.10514981779295,171.1500000000001 -194.85571585149867,112.50000000000007 C-234.6062818852044,53.850000000000065 -266.9523307165532,-72.525 -233.8268590217984,-135.00000000000003 C-200.70138732704362,-197.47500000000005 -79.50113206741145,-255 1.5614246689128753e-14,-255 Z&quot; class=&quot;radarCurve-0&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M1.2858791391047208e-14,-210 C70.6676729488102,-207.45 157.31351459744326,-169.875 194.85571585149867,-112.5 C232.3979171055541,-55.12500000000001 253.96194965978663,67.57499999999996 220.83647796503186,127.49999999999996 C187.7110062702771,187.42499999999995 77.29276728776117,238.72499999999997 1.469576158976824e-14,240 C-77.29276728776114,241.27500000000003 -196.28465776774297,197.47500000000008 -233.82685902179838,135.00000000000009 C-271.3690602758538,72.52500000000009 -260.58704399873756,-68.85 -220.83647796503183,-127.50000000000003 C-181.0859119313261,-186.15000000000006 -70.66767294881018,-212.55 1.2858791391047208e-14,-210 Z&quot; class=&quot;radarCurve-1&quot;&gt;&lt;/path&gt;&lt;g transform=&quot;translate(262.5, -262.5)&quot;&gt;&lt;rect width=&quot;12&quot; height=&quot;12&quot; class=&quot;radarLegendBox-0&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;16&quot; y=&quot;0&quot; class=&quot;radarLegendText&quot;&gt;Alice&lt;/text&gt;&lt;/g&gt;&lt;g transform=&quot;translate(262.5, -242.5)&quot;&gt;&lt;rect width=&quot;12&quot; height=&quot;12&quot; class=&quot;radarLegendBox-1&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;16&quot; y=&quot;0&quot; class=&quot;radarLegendText&quot;&gt;Bob&lt;/text&gt;&lt;/g&gt;&lt;text class=&quot;radarTitle&quot; x=&quot;0&quot; y=&quot;-350&quot;&gt;&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/body&gt;&lt;/html&gt;&lt;figcaption&gt;A Mermaid-generated radar chart, made with a few lines of text&lt;/figcaption&gt;&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;mermaid&lt;/span&gt;
&lt;span class=&quot;token code-block language-mermaid language-mermaid language-mermaid&quot;&gt;radar-beta

axis m[&quot;Math&quot;], s[&quot;Science&quot;], e[&quot;English&quot;], h[&quot;History&quot;], g[&quot;Geography&quot;], a[&quot;Art&quot;]
curve a[&quot;Alice&quot;]{85, 90, 80, 70, 75, 90}
curve b[&quot;Bob&quot;]{70, 75, 85, 80, 90, 85}

max 100
min 0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;mermaid-sankey-chart&quot; tabindex=&quot;-1&quot;&gt;Mermaid Sankey Chart&lt;/h3&gt;
&lt;figure class=&quot;mermaid&quot;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;svg id=&quot;mermaid-azvfqwotwszy&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; style=&quot;max-width: 600px;&quot; viewBox=&quot;0 0 600 403.91900634765625&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;sankey&quot;&gt;&lt;style&gt;#mermaid-azvfqwotwszy{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-azvfqwotwszy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-azvfqwotwszy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-azvfqwotwszy .error-icon{fill:#552222;}#mermaid-azvfqwotwszy .error-text{fill:#552222;stroke:#552222;}#mermaid-azvfqwotwszy .edge-thickness-normal{stroke-width:1px;}#mermaid-azvfqwotwszy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-azvfqwotwszy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-azvfqwotwszy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-azvfqwotwszy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-azvfqwotwszy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-azvfqwotwszy .marker{fill:#333333;stroke:#333333;}#mermaid-azvfqwotwszy .marker.cross{stroke:#333333;}#mermaid-azvfqwotwszy svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-azvfqwotwszy p{margin:0;}#mermaid-azvfqwotwszy .label{font-family:arial,sans-serif;}#mermaid-azvfqwotwszy :root{--mermaid-font-family:arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;/g&gt;&lt;g class=&quot;nodes&quot;&gt;&lt;g class=&quot;node&quot; id=&quot;node-1&quot; transform=&quot;translate(0,72.09567842889594)&quot; x=&quot;0&quot; y=&quot;72.09567842889594&quot;&gt;&lt;rect height=&quot;9.220636581860191&quot; width=&quot;10&quot; fill=&quot;#4e79a7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-2&quot; transform=&quot;translate(84.28571428571429,88.20528658319179)&quot; x=&quot;84.28571428571429&quot; y=&quot;88.20528658319179&quot;&gt;&lt;rect height=&quot;28.751421743138962&quot; width=&quot;10&quot; fill=&quot;#f28e2c&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-3&quot; transform=&quot;translate(168.57142857142858,332.97985250039255)&quot; x=&quot;168.57142857142858&quot; y=&quot;332.97985250039255&quot;&gt;&lt;rect height=&quot;47.8731039464526&quot; width=&quot;10&quot; fill=&quot;#e15759&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-4&quot; transform=&quot;translate(590,0.18272916807304762)&quot; x=&quot;590&quot; y=&quot;0.18272916807304762&quot;&gt;&lt;rect height=&quot;64.93049431777976&quot; width=&quot;10&quot; fill=&quot;#76b7b2&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-5&quot; transform=&quot;translate(168.57142857142858,95.13615275845761)&quot; x=&quot;168.57142857142858&quot; y=&quot;95.13615275845761&quot;&gt;&lt;rect height=&quot;33.08012136432423&quot; width=&quot;10&quot; fill=&quot;#59a14f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-6&quot; transform=&quot;translate(168.57142857142858,138.21627412278184)&quot; x=&quot;168.57142857142858&quot; y=&quot;138.21627412278184&quot;&gt;&lt;rect height=&quot;15.08794477986612&quot; width=&quot;10&quot; fill=&quot;#edc949&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-7&quot; transform=&quot;translate(0,332.17102949516357)&quot; x=&quot;0&quot; y=&quot;332.17102949516357&quot;&gt;&lt;rect height=&quot;2.587387699453302&quot; width=&quot;10&quot; fill=&quot;#af7aa1&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-8&quot; transform=&quot;translate(0,125.0948937639732)&quot; x=&quot;0&quot; y=&quot;125.0948937639732&quot;&gt;&lt;rect height=&quot;2.5873876994532594&quot; width=&quot;10&quot; fill=&quot;#ff9da7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-9&quot; transform=&quot;translate(0,137.68228146342648)&quot; x=&quot;0&quot; y=&quot;137.68228146342648&quot;&gt;&lt;rect height=&quot;0.8579777611386987&quot; width=&quot;10&quot; fill=&quot;#9c755f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-10&quot; transform=&quot;translate(84.28571428571429,158.44588836836448)&quot; x=&quot;84.28571428571429&quot; y=&quot;158.44588836836448&quot;&gt;&lt;rect height=&quot;5.586613595296626&quot; width=&quot;10&quot; fill=&quot;#bab0ab&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-11&quot; transform=&quot;translate(0,168.47560621437722)&quot; x=&quot;0&quot; y=&quot;168.47560621437722&quot;&gt;&lt;rect height=&quot;4.728635834157956&quot; width=&quot;10&quot; fill=&quot;#4e79a7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-12&quot; transform=&quot;translate(337.14285714285717,63.864261550154154)&quot; x=&quot;337.14285714285717&quot; y=&quot;63.864261550154154&quot;&gt;&lt;rect height=&quot;5.86442510885513&quot; width=&quot;10&quot; fill=&quot;#f28e2c&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-13&quot; transform=&quot;translate(590,96.60216340475654)&quot; x=&quot;590&quot; y=&quot;96.60216340475654&quot;&gt;&lt;rect height=&quot;42.05813490533856&quot; width=&quot;10&quot; fill=&quot;#e15759&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-14&quot; transform=&quot;translate(590,186.1752444343467)&quot; x=&quot;590&quot; y=&quot;186.1752444343467&quot;&gt;&lt;rect height=&quot;9.91812238026995&quot; width=&quot;10&quot; fill=&quot;#76b7b2&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-15&quot; transform=&quot;translate(590,148.6602983100951)&quot; x=&quot;590&quot; y=&quot;148.6602983100951&quot;&gt;&lt;rect height=&quot;27.514946124251594&quot; width=&quot;10&quot; fill=&quot;#59a14f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-16&quot; transform=&quot;translate(337.14285714285717,197.4656550581489)&quot; x=&quot;337.14285714285717&quot; y=&quot;197.4656550581489&quot;&gt;&lt;rect height=&quot;67.90835578376198&quot; width=&quot;10&quot; fill=&quot;#edc949&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-17&quot; transform=&quot;translate(590,78.88043747987103)&quot; x=&quot;590&quot; y=&quot;78.88043747987103&quot;&gt;&lt;rect height=&quot;7.721725924885504&quot; width=&quot;10&quot; fill=&quot;#af7aa1&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-18&quot; transform=&quot;translate(421.42857142857144,242.73268021576226)&quot; x=&quot;421.42857142857144&quot; y=&quot;242.73268021576226&quot;&gt;&lt;rect height=&quot;2.006334347518873&quot; width=&quot;10&quot; fill=&quot;#ff9da7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-19&quot; transform=&quot;translate(590,298.3074464040654)&quot; x=&quot;590&quot; y=&quot;298.3074464040654&quot;&gt;&lt;rect height=&quot;14.380626908198394&quot; width=&quot;10&quot; fill=&quot;#9c755f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-20&quot; transform=&quot;translate(590,233.9039735188384)&quot; x=&quot;590&quot; y=&quot;233.9039735188384&quot;&gt;&lt;rect height=&quot;0.8153967521419645&quot; width=&quot;10&quot; fill=&quot;#bab0ab&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-21&quot; transform=&quot;translate(590,322.6880733122638)&quot; x=&quot;590&quot; y=&quot;322.6880733122638&quot;&gt;&lt;rect height=&quot;0.9075077542424879&quot; width=&quot;10&quot; fill=&quot;#4e79a7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-22&quot; transform=&quot;translate(590,217.2500994601987)&quot; x=&quot;590&quot; y=&quot;217.2500994601987&quot;&gt;&lt;rect height=&quot;6.653874058639701&quot; width=&quot;10&quot; fill=&quot;#f28e2c&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-23&quot; transform=&quot;translate(590,244.71937027098036)&quot; x=&quot;590&quot; y=&quot;244.71937027098036&quot;&gt;&lt;rect height=&quot;6.911577873505337&quot; width=&quot;10&quot; fill=&quot;#e15759&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-24&quot; transform=&quot;translate(0,183.20424204853518)&quot; x=&quot;0&quot; y=&quot;183.20424204853518&quot;&gt;&lt;rect height=&quot;3.010166849543907&quot; width=&quot;10&quot; fill=&quot;#76b7b2&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-25&quot; transform=&quot;translate(84.28571428571429,184.7650080756903)&quot; x=&quot;84.28571428571429&quot; y=&quot;184.7650080756903&quot;&gt;&lt;rect height=&quot;9.089271212090779&quot; width=&quot;10&quot; fill=&quot;#59a14f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-26&quot; transform=&quot;translate(0,196.21440889807909)&quot; x=&quot;0&quot; y=&quot;196.21440889807909&quot;&gt;&lt;rect height=&quot;6.079104362546872&quot; width=&quot;10&quot; fill=&quot;#edc949&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-27&quot; transform=&quot;translate(252.8571428571429,4.1019553082988605)&quot; x=&quot;252.8571428571429&quot; y=&quot;4.1019553082988605&quot;&gt;&lt;rect height=&quot;102.9032918964073&quot; width=&quot;10&quot; fill=&quot;#af7aa1&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-28&quot; transform=&quot;translate(0,212.29351326062596)&quot; x=&quot;0&quot; y=&quot;212.29351326062596&quot;&gt;&lt;rect height=&quot;0.5184385696075822&quot; width=&quot;10&quot; fill=&quot;#ff9da7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-29&quot; transform=&quot;translate(505.7142857142858,247.55307040930583)&quot; x=&quot;505.7142857142858&quot; y=&quot;247.55307040930583&quot;&gt;&lt;rect height=&quot;1.5448183072992947&quot; width=&quot;10&quot; fill=&quot;#9c755f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-30&quot; transform=&quot;translate(0,268.15814958480337)&quot; x=&quot;0&quot; y=&quot;268.15814958480337&quot;&gt;&lt;rect height=&quot;0.5171079130764156&quot; width=&quot;10&quot; fill=&quot;#bab0ab&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-31&quot; transform=&quot;translate(590,333.59558106650627)&quot; x=&quot;590&quot; y=&quot;333.59558106650627&quot;&gt;&lt;rect height=&quot;9.513454944075534&quot; width=&quot;10&quot; fill=&quot;#4e79a7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-32&quot; transform=&quot;translate(590,353.1090360105818)&quot; x=&quot;590&quot; y=&quot;353.1090360105818&quot;&gt;&lt;rect height=&quot;1.0688128959627647&quot; width=&quot;10&quot; fill=&quot;#f28e2c&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-33&quot; transform=&quot;translate(590,364.17784890654457)&quot; x=&quot;590&quot; y=&quot;364.17784890654457&quot;&gt;&lt;rect height=&quot;15.248362817232191&quot; width=&quot;10&quot; fill=&quot;#e15759&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-34&quot; transform=&quot;translate(590,389.42621172377676)&quot; x=&quot;590&quot; y=&quot;389.42621172377676&quot;&gt;&lt;rect height=&quot;2.4556527028696564&quot; width=&quot;10&quot; fill=&quot;#76b7b2&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-35&quot; transform=&quot;translate(0,91.31631501075613)&quot; x=&quot;0&quot; y=&quot;91.31631501075613&quot;&gt;&lt;rect height=&quot;0.32342346243166276&quot; width=&quot;10&quot; fill=&quot;#59a14f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-36&quot; transform=&quot;translate(0,0)&quot; x=&quot;0&quot; y=&quot;0&quot;&gt;&lt;rect height=&quot;62.09567842889594&quot; width=&quot;10&quot; fill=&quot;#edc949&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-37&quot; transform=&quot;translate(0,344.75841719461687)&quot; x=&quot;0&quot; y=&quot;344.75841719461687&quot;&gt;&lt;rect height=&quot;37.279599451262754&quot; width=&quot;10&quot; fill=&quot;#af7aa1&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-38&quot; transform=&quot;translate(84.28571428571429,341.6162789921701)&quot; x=&quot;84.28571428571429&quot; y=&quot;341.6162789921701&quot;&gt;&lt;rect height=&quot;45.241582805382905&quot; width=&quot;10&quot; fill=&quot;#ff9da7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-39&quot; transform=&quot;translate(0,392.0380166458796)&quot; x=&quot;0&quot; y=&quot;392.0380166458796&quot;&gt;&lt;rect height=&quot;7.961983354120434&quot; width=&quot;10&quot; fill=&quot;#9c755f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-40&quot; transform=&quot;translate(0,148.54025922456518)&quot; x=&quot;0&quot; y=&quot;148.54025922456518&quot;&gt;&lt;rect height=&quot;9.935346989812047&quot; width=&quot;10&quot; fill=&quot;#bab0ab&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-41&quot; transform=&quot;translate(0,222.81195183023354)&quot; x=&quot;0&quot; y=&quot;222.81195183023354&quot;&gt;&lt;rect height=&quot;19.493970330583636&quot; width=&quot;10&quot; fill=&quot;#4e79a7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-42&quot; transform=&quot;translate(84.28571428571429,242.0714175626971)&quot; x=&quot;84.28571428571429&quot; y=&quot;242.0714175626971&quot;&gt;&lt;rect height=&quot;4.428203159569989&quot; width=&quot;10&quot; fill=&quot;#f28e2c&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-43&quot; transform=&quot;translate(84.28571428571429,256.4996207222671)&quot; x=&quot;84.28571428571429&quot; y=&quot;256.4996207222671&quot;&gt;&lt;rect height=&quot;1.424024264416289&quot; width=&quot;10&quot; fill=&quot;#e15759&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-44&quot; transform=&quot;translate(0,252.30592216081718)&quot; x=&quot;0&quot; y=&quot;252.30592216081718&quot;&gt;&lt;rect height=&quot;5.852227423986193&quot; width=&quot;10&quot; fill=&quot;#76b7b2&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-45&quot; transform=&quot;translate(0,278.6752574978798)&quot; x=&quot;0&quot; y=&quot;278.6752574978798&quot;&gt;&lt;rect height=&quot;0.6987425295780554&quot; width=&quot;10&quot; fill=&quot;#59a14f&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-46&quot; transform=&quot;translate(0,101.63973847318779)&quot; x=&quot;0&quot; y=&quot;101.63973847318779&quot;&gt;&lt;rect height=&quot;13.455155290785413&quot; width=&quot;10&quot; fill=&quot;#edc949&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-47&quot; transform=&quot;translate(0,289.37400002745784)&quot; x=&quot;0&quot; y=&quot;289.37400002745784&quot;&gt;&lt;rect height=&quot;1.405542923705866&quot; width=&quot;10&quot; fill=&quot;#af7aa1&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;node&quot; id=&quot;node-48&quot; transform=&quot;translate(0,300.7795429511637)&quot; x=&quot;0&quot; y=&quot;300.7795429511637&quot;&gt;&lt;rect height=&quot;21.39148654399986&quot; width=&quot;10&quot; fill=&quot;#ff9da7&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;node-labels&quot; font-size=&quot;14&quot;&gt;&lt;text x=&quot;16&quot; y=&quot;76.70599671982603&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Agricultural waste&lt;/text&gt;&lt;text x=&quot;100.28571428571429&quot; y=&quot;102.58099745476127&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Bio-conversion&lt;/text&gt;&lt;text x=&quot;184.57142857142858&quot; y=&quot;356.91640447361885&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Liquid&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;32.64797632696293&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Losses&lt;/text&gt;&lt;text x=&quot;184.57142857142858&quot; y=&quot;111.67621344061973&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Solid&lt;/text&gt;&lt;text x=&quot;184.57142857142858&quot; y=&quot;145.7602465127149&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Gas&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;333.4647233448902&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Biofuel imports&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;126.38858761369983&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Biomass imports&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;138.11127034399584&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Coal imports&lt;/text&gt;&lt;text x=&quot;100.28571428571429&quot; y=&quot;161.2391951660128&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Coal&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;170.8399241314562&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Coal reserves&lt;/text&gt;&lt;text x=&quot;331.14285714285717&quot; y=&quot;66.79647410458172&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;District heating&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;117.63123085742582&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Industry&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;191.13430562448167&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Heating and cooling - commercial&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;162.4177713722209&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Heating and cooling - homes&lt;/text&gt;&lt;text x=&quot;331.14285714285717&quot; y=&quot;231.4198329500299&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Electricity grid&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;82.74130044231379&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Over generation / exports&lt;/text&gt;&lt;text x=&quot;415.42857142857144&quot; y=&quot;243.7358473895217&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;H2 conversion&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;305.4977598581646&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Road transport&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;234.31167189490938&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Agriculture&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;323.141827189385&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Rail transport&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;220.57703648951855&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Lighting &amp;amp; appliances - commercial&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;248.17515920773303&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Lighting &amp;amp; appliances - homes&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;184.70932547330713&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Gas imports&lt;/text&gt;&lt;text x=&quot;100.28571428571429&quot; y=&quot;189.30964368173568&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;NGas&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;199.2539610793525&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Gas reserves&lt;/text&gt;&lt;text x=&quot;268.8571428571429&quot; y=&quot;55.5536012565025&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Thermal generation&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;212.55273254542976&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Geothermal&lt;/text&gt;&lt;text x=&quot;499.7142857142858&quot; y=&quot;248.32547956295548&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;H2&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;268.4167035413416&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Hydro&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;338.35230853854404&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;International shipping&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;353.6434424585632&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;Domestic aviation&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;371.80203031516066&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;International aviation&lt;/text&gt;&lt;text x=&quot;584&quot; y=&quot;390.6540380752116&quot; dy=&quot;0.35em&quot; text-anchor=&quot;end&quot;&gt;National navigation&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;91.47802674197196&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Marine algae&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;31.04783921444797&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Nuclear&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;363.3982169202483&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Oil imports&lt;/text&gt;&lt;text x=&quot;100.28571428571429&quot; y=&quot;364.2370703948616&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Oil&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;396.01900832293984&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Oil reserves&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;153.5079327194712&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Other waste&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;232.55893699552536&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Pumped heat&lt;/text&gt;&lt;text x=&quot;100.28571428571429&quot; y=&quot;244.2855191424821&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Solar PV&lt;/text&gt;&lt;text x=&quot;100.28571428571429&quot; y=&quot;257.2116328544752&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Solar Thermal&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;255.2320358728103&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Solar&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;279.02462876266884&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Tidal&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;108.3673161185805&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;UK land based bioenergy&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;290.0767714893108&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Wave&lt;/text&gt;&lt;text x=&quot;16&quot; y=&quot;311.4752862231636&quot; dy=&quot;0.35em&quot; text-anchor=&quot;start&quot;&gt;Wind&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;links&quot; fill=&quot;none&quot; stroke-opacity=&quot;0.5&quot;&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-49&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,76.70599671982603C47.142857142857146,76.70599671982603,47.142857142857146,92.81560487412189,84.28571428571429,92.81560487412189&quot; stroke=&quot;url(#linearGradient-49)&quot; stroke-width=&quot;9.220636581860193&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-50&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,116.93464160552253C131.42857142857144,116.93464160552253,131.42857142857144,333.00191922120075,168.57142857142858,333.00191922120075&quot; stroke=&quot;url(#linearGradient-50)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-51&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,89.19817813151627C342.14285714285717,89.19817813151627,342.14285714285717,59.36441764448186,590,59.36441764448186&quot; stroke=&quot;url(#linearGradient-51)&quot; stroke-width=&quot;1.9857830966489627&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-52&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,100.5525224610713C131.42857142857144,100.5525224610713,131.42857142857144,105.49760553968817,168.57142857142858,105.49760553968817&quot; stroke=&quot;url(#linearGradient-52)&quot; stroke-width=&quot;20.72290556246112&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-53&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,113.91327506350811C131.42857142857144,113.91327506350811,131.42857142857144,141.21557394398806,168.57142857142858,141.21557394398806&quot; stroke=&quot;url(#linearGradient-53)&quot; stroke-width=&quot;5.998599642412458&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-54&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,333.4647233448902C89.28571428571429,333.4647233448902,89.28571428571429,334.3176797917356,168.57142857142858,334.3176797917356&quot; stroke=&quot;url(#linearGradient-54)&quot; stroke-width=&quot;2.5873876994532683&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-55&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,126.38858761369984C89.28571428571429,126.38858761369984,89.28571428571429,117.15275217064537,168.57142857142858,117.15275217064537&quot; stroke=&quot;url(#linearGradient-55)&quot; stroke-width=&quot;2.5873876994532683&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-56&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,138.11127034399584C47.142857142857146,138.11127034399584,47.142857142857146,158.87487724893384,84.28571428571429,158.87487724893384&quot; stroke=&quot;url(#linearGradient-56)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-57&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,170.8399241314562C47.142857142857146,170.8399241314562,47.142857142857146,161.66818404658216,84.28571428571429,161.66818404658216&quot; stroke=&quot;url(#linearGradient-57)&quot; stroke-width=&quot;4.728635834157952&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-58&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,161.23919516601282C131.42857142857144,161.23919516601282,131.42857142857144,125.42296732513354,168.57142857142858,125.42296732513354&quot; stroke=&quot;url(#linearGradient-58)&quot; stroke-width=&quot;5.586613595296655&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-59&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,64.25750751778963C468.57142857142856,64.25750751778963,468.57142857142856,96.99540937239202,590,96.99540937239202&quot; stroke=&quot;url(#linearGradient-59)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-60&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,68.89676758827218C468.57142857142856,68.89676758827218,468.57142857142856,187.0070895797209,590,187.0070895797209&quot; stroke=&quot;url(#linearGradient-60)&quot; stroke-width=&quot;1.6636902907484517&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-61&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,66.35783796416152C468.57142857142856,66.35783796416152,468.57142857142856,150.36738278883152,590,150.36738278883152&quot; stroke=&quot;url(#linearGradient-61)&quot; stroke-width=&quot;3.41416895747285&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-62&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,205.5174207654404C468.57142857142856,205.5174207654404,468.57142857142856,82.74130044231379,590,82.74130044231379&quot; stroke=&quot;url(#linearGradient-62)&quot; stroke-width=&quot;7.721725924885494&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-63&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,238.87657341180997C468.57142857142856,238.87657341180997,468.57142857142856,156.2780851748254,590,156.2780851748254&quot; stroke=&quot;url(#linearGradient-63)&quot; stroke-width=&quot;8.407235814514927&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-64&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;421.42857142857144&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,247.1038009678058C384.28571428571433,247.1038009678058,384.28571428571433,243.73584738952172,421.42857142857144,243.73584738952172&quot; stroke=&quot;url(#linearGradient-64)&quot; stroke-width=&quot;2.006334347518906&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-65&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,222.02561961621782C468.57142857142856,222.02561961621782,468.57142857142856,117.06311444398872,590,117.06311444398872&quot; stroke=&quot;url(#linearGradient-65)&quot; stroke-width=&quot;25.29467177666936&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-66&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,263.39565724422755C468.57142857142856,263.39565724422755,468.57142857142856,299.7045248737259,590,299.7045248737259&quot; stroke=&quot;url(#linearGradient-66)&quot; stroke-width=&quot;2.794156939321005&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-67&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,254.92392155063334C468.57142857142856,254.92392155063334,468.57142857142856,234.28720259980886,590,234.28720259980886&quot; stroke=&quot;url(#linearGradient-67)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-68&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,244.59041255655688C468.57142857142856,244.59041255655688,468.57142857142856,189.35869233439115,590,189.35869233439115&quot; stroke=&quot;url(#linearGradient-68)&quot; stroke-width=&quot;3.020442474978904&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-69&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,199.56110643057326C468.57142857142856,199.56110643057326,468.57142857142856,62.556329998571684,590,62.556329998571684&quot; stroke=&quot;url(#linearGradient-69)&quot; stroke-width=&quot;4.190902744848722&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-70&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,265.08337327789945C468.57142857142856,265.08337327789945,468.57142857142856,322.9787108762752,590,322.9787108762752&quot; stroke=&quot;url(#linearGradient-70)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-71&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,251.43390517088508C468.57142857142856,251.43390517088508,468.57142857142856,220.57703648951855,590,220.57703648951855&quot; stroke=&quot;url(#linearGradient-71)&quot; stroke-width=&quot;6.653874058639708&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-72&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;347.14285714285717&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M347.14285714285717,258.5427898378144C468.57142857142856,258.5427898378144,468.57142857142856,248.175159207733,590,248.175159207733&quot; stroke=&quot;url(#linearGradient-72)&quot; stroke-width=&quot;6.911577873505254&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-73&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,184.70932547330713C47.142857142857146,184.70932547330713,47.142857142857146,186.27009150046226,84.28571428571429,186.27009150046226&quot; stroke=&quot;url(#linearGradient-73)&quot; stroke-width=&quot;3.010166849543933&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-74&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,199.25396107935254C47.142857142857146,199.25396107935254,47.142857142857146,190.8147271065077,84.28571428571429,190.8147271065077&quot; stroke=&quot;url(#linearGradient-74)&quot; stroke-width=&quot;6.079104362546875&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-75&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,153.14450315622886C384.2857142857143,153.14450315622886,384.2857142857143,187.84370291099845,590,187.84370291099845&quot; stroke=&quot;url(#linearGradient-75)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-76&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,138.26805883945232C384.2857142857143,138.26805883945232,384.2857142857143,60.40909390947684,590,60.40909390947684&quot; stroke=&quot;url(#linearGradient-76)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-77&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;252.8571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,143.9341421998036C215.71428571428572,143.9341421998036,215.71428571428572,101.39094856102537,252.8571428571429,101.39094856102537&quot; stroke=&quot;url(#linearGradient-77)&quot; stroke-width=&quot;11.22859728736161&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-78&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,153.22674512239004C384.2857142857143,153.22674512239004,384.2857142857143,234.04664946912254,590,234.04664946912254&quot; stroke=&quot;url(#linearGradient-78)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-79&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,151.344087906905C384.2857142857143,151.344087906905,384.2857142857143,102.62013149223348,590,102.62013149223348&quot; stroke=&quot;url(#linearGradient-79)&quot; stroke-width=&quot;3.5912941268411367&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-80&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,212.55273254542976C173.57142857142858,212.55273254542976,173.57142857142858,236.5749442024206,337.14285714285717,236.5749442024206&quot; stroke=&quot;url(#linearGradient-80)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-81&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;431.42857142857144&quot; x2=&quot;505.7142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M431.42857142857144,243.9665314842687C468.5714285714286,243.9665314842687,468.5714285714286,248.32547956295548,505.7142857142858,248.32547956295548&quot; stroke=&quot;url(#linearGradient-81)&quot; stroke-width=&quot;1.5448183072992843&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-82&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;431.42857142857144&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M431.42857142857144,242.96340127319064C510.7142857142857,242.96340127319064,510.7142857142857,64.88250242842444,590,64.88250242842444&quot; stroke=&quot;url(#linearGradient-82)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-83&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;515.7142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M515.7142857142858,248.32547956295548C552.8571428571429,248.32547956295548,552.8571428571429,301.874012497036,590,301.874012497036&quot; stroke=&quot;url(#linearGradient-83)&quot; stroke-width=&quot;1.5448183072992843&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-84&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,268.4167035413416C173.57142857142858,268.4167035413416,173.57142857142858,241.52092060333263,337.14285714285717,241.52092060333263&quot; stroke=&quot;url(#linearGradient-84)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-85&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,337.4547764892784C384.2857142857143,337.4547764892784,384.2857142857143,134.18537432120925,590,134.18537432120925&quot; stroke=&quot;url(#linearGradient-85)&quot; stroke-width=&quot;8.949847977771698&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-86&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,357.3234005587429C384.2857142857143,357.3234005587429,384.2857142857143,338.352308538544,590,338.352308538544&quot; stroke=&quot;url(#linearGradient-86)&quot; stroke-width=&quot;9.51345494407546&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-87&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,347.2196146296965C384.2857142857143,347.2196146296965,384.2857142857143,307.66724748147476,590,307.66724748147476&quot; stroke=&quot;url(#linearGradient-87)&quot; stroke-width=&quot;10.041651661578136&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-88&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,362.61453447876204C384.2857142857143,362.61453447876204,384.2857142857143,353.6434424585632,590,353.6434424585632&quot; stroke=&quot;url(#linearGradient-88)&quot; stroke-width=&quot;1.0688128959627246&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-89&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,370.77312233535946C384.2857142857143,370.77312233535946,384.2857142857143,371.80203031516066,590,371.80203031516066&quot; stroke=&quot;url(#linearGradient-89)&quot; stroke-width=&quot;15.24836281723221&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-90&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,342.0642446385358C384.2857142857143,342.0642446385358,384.2857142857143,234.58482611060884,590,234.58482611060884&quot; stroke=&quot;url(#linearGradient-90)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-91&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,379.6251300954104C384.2857142857143,379.6251300954104,384.2857142857143,390.6540380752116,590,390.6540380752116&quot; stroke=&quot;url(#linearGradient-91)&quot; stroke-width=&quot;2.455652702869677&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-92&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,352.40355677359537C384.2857142857143,352.40355677359537,384.2857142857143,323.43246475339646,590,323.43246475339646&quot; stroke=&quot;url(#linearGradient-92)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-93&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,91.47802674197196C47.142857142857146,91.47802674197196,47.142857142857146,97.58763489626782,84.28571428571429,97.58763489626782&quot; stroke=&quot;url(#linearGradient-93)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-94&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,189.3096436817357C131.42857142857144,189.3096436817357,131.42857142857144,148.7595093712397,168.57142857142858,148.7595093712397&quot; stroke=&quot;url(#linearGradient-94)&quot; stroke-width=&quot;9.089271212090807&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-95&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;252.8571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,31.047839214447965C131.42857142857144,31.047839214447965,131.42857142857144,35.149794522746824,252.8571428571429,35.149794522746824&quot; stroke=&quot;url(#linearGradient-95)&quot; stroke-width=&quot;62.09567842889593&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-96&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,363.39821692024816C47.142857142857146,363.39821692024816,47.142857142857146,360.2560787178014,84.28571428571429,360.2560787178014&quot; stroke=&quot;url(#linearGradient-96)&quot; stroke-width=&quot;37.279599451262584&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-97&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#9c755f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,396.01900832293984C47.142857142857146,396.01900832293984,47.142857142857146,382.8768701204929,84.28571428571429,382.8768701204929&quot; stroke=&quot;url(#linearGradient-97)&quot; stroke-width=&quot;7.96198335412044&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-98&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,364.23707039486163C131.42857142857144,364.23707039486163,131.42857142857144,358.2321650441537,168.57142857142858,358.2321650441537&quot; stroke=&quot;url(#linearGradient-98)&quot; stroke-width=&quot;45.241582805383025&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-99&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;168.57142857142858&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,156.38399896082058C89.28571428571429,156.38399896082058,89.28571428571429,120.53805327392861,168.57142857142858,120.53805327392861&quot; stroke=&quot;url(#linearGradient-99)&quot; stroke-width=&quot;4.183214507113203&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-100&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,151.41632546591458C47.142857142857146,151.41632546591458,47.142857142857146,114.08056815961847,84.28571428571429,114.08056815961847&quot; stroke=&quot;url(#linearGradient-100)&quot; stroke-width=&quot;5.752132482698824&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-101&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,229.94671037415736C300,229.94671037415736,300,167.6164616260067,590,167.6164616260067&quot; stroke=&quot;url(#linearGradient-101)&quot; stroke-width=&quot;14.269517087847618&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-102&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#4e79a7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,239.69369553944918C300,239.69369553944918,300,193.48114019324862,590,193.48114019324862&quot; stroke=&quot;url(#linearGradient-102)&quot; stroke-width=&quot;5.22445324273604&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-103&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,244.2855191424821C215.71428571428572,244.2855191424821,215.71428571428572,239.04826506700937,337.14285714285717,239.04826506700937&quot; stroke=&quot;url(#linearGradient-103)&quot; stroke-width=&quot;4.428203159570007&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-104&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;94.28571428571429&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M94.28571428571429,257.2116328544752C342.14285714285717,257.2116328544752,342.14285714285717,175.4632323021386,590,175.4632323021386&quot; stroke=&quot;url(#linearGradient-104)&quot; stroke-width=&quot;1.4240242644162375&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-105&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,257.44613745259534C47.142857142857146,257.44613745259534,47.142857142857146,257.2116328544752,84.28571428571429,257.2116328544752&quot; stroke=&quot;url(#linearGradient-105)&quot; stroke-width=&quot;1.4240242644162375&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-106&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,254.52002374060217C47.142857142857146,254.52002374060217,47.142857142857146,244.2855191424821,84.28571428571429,244.2855191424821&quot; stroke=&quot;url(#linearGradient-106)&quot; stroke-width=&quot;4.428203159570007&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-107&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#bab0ab&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,128.18359911240591C384.2857142857143,128.18359911240591,384.2857142857143,233.9365746038515,590,233.9365746038515&quot; stroke=&quot;url(#linearGradient-107)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-108&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;252.8571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,109.92566084853249C215.71428571428572,109.92566084853249,215.71428571428572,80.98714182726968,252.8571428571429,80.98714182726968&quot; stroke=&quot;url(#linearGradient-108)&quot; stroke-width=&quot;29.579016180149765&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-109&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;178.57142857142858&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#e15759&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M178.57142857142858,126.43308348300009C384.2857142857143,126.43308348300009,384.2857142857143,99.10656988442021,590,99.10656988442021&quot; stroke=&quot;url(#linearGradient-109)&quot; stroke-width=&quot;3.435829088785416&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-110&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;262.8571428571429&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M262.8571428571429,87.58021227497223C300,87.58021227497223,300,216.89068998788284,337.14285714285717,216.89068998788284&quot; stroke=&quot;url(#linearGradient-110)&quot; stroke-width=&quot;38.85006985946787&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-111&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;262.8571428571429&quot; x2=&quot;590&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#76b7b2&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M262.8571428571429,33.19635377234103C426.42857142857144,33.19635377234103,426.42857142857144,29.277127632115217,590,29.277127632115217&quot; stroke=&quot;url(#linearGradient-111)&quot; stroke-width=&quot;58.18879692808434&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-112&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;262.8571428571429&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M262.8571428571429,65.22296479081075C300,65.22296479081075,300,66.7964741045817,337.14285714285717,66.7964741045817&quot; stroke=&quot;url(#linearGradient-112)&quot; stroke-width=&quot;5.8644251088550945&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-113&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#59a14f&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,279.02462876266884C173.57142857142858,279.02462876266884,173.57142857142858,242.12884582465986,337.14285714285717,242.12884582465986&quot; stroke=&quot;url(#linearGradient-113)&quot; stroke-width=&quot;1&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-114&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;84.28571428571429&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#f28e2c&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,108.36731611858049C47.142857142857146,108.36731611858049,47.142857142857146,104.47692427287635,84.28571428571429,104.47692427287635&quot; stroke=&quot;url(#linearGradient-114)&quot; stroke-width=&quot;13.455155290785411&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-115&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#af7aa1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,290.0767714893108C173.57142857142858,290.0767714893108,173.57142857142858,243.18098855130182,337.14285714285717,243.18098855130182&quot; stroke=&quot;url(#linearGradient-115)&quot; stroke-width=&quot;1.4055429237058572&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;link&quot; style=&quot;mix-blend-mode: multiply;&quot;&gt;&lt;linearGradient id=&quot;linearGradient-116&quot; gradientUnits=&quot;userSpaceOnUse&quot; x1=&quot;10&quot; x2=&quot;337.14285714285717&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#ff9da7&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#edc949&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;path d=&quot;M10,311.4752862231636C173.57142857142858,311.4752862231636,173.57142857142858,254.5795032851547,337.14285714285717,254.5795032851547&quot; stroke=&quot;url(#linearGradient-116)&quot; stroke-width=&quot;21.391486543999843&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/body&gt;&lt;/html&gt;&lt;figcaption&gt;A Sankey chart generated by Mermaid&lt;/figcaption&gt;&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;mermaid&lt;/span&gt;
&lt;span class=&quot;token code-block language-mermaid language-mermaid language-mermaid&quot;&gt;---
config:
  sankey:
    showValues: false
---
sankey-beta

Agricultural &#39;waste&#39;,Bio-conversion,124.729
Bio-conversion,Liquid,0.597
Bio-conversion,Losses,26.862
Bio-conversion,Solid,280.322
Bio-conversion,Gas,81.144
Biofuel imports,Liquid,35
Biomass imports,Solid,35
Coal imports,Coal,11.606
Coal reserves,Coal,63.965
Coal,Solid,75.571
District heating,Industry,10.639
District heating,Heating and cooling - commercial,22.505
District heating,Heating and cooling - homes,46.184
Electricity grid,Over generation / exports,104.453
Electricity grid,Heating and cooling - homes,113.726
Electricity grid,H2 conversion,27.14
Electricity grid,Industry,342.165
Electricity grid,Road transport,37.797
Electricity grid,Agriculture,4.412
Electricity grid,Heating and cooling - commercial,40.858
Electricity grid,Losses,56.691
Electricity grid,Rail transport,7.863
Electricity grid,Lighting &amp;amp; appliances - commercial,90.008
Electricity grid,Lighting &amp;amp; appliances - homes,93.494
Gas imports,NGas,40.719
Gas reserves,NGas,82.233
Gas,Heating and cooling - commercial,0.129
Gas,Losses,1.401
Gas,Thermal generation,151.891
Gas,Agriculture,2.096
Gas,Industry,48.58
Geothermal,Electricity grid,7.013
H2 conversion,H2,20.897
H2 conversion,Losses,6.242
H2,Road transport,20.897
Hydro,Electricity grid,6.995
Liquid,Industry,121.066
Liquid,International shipping,128.69
Liquid,Road transport,135.835
Liquid,Domestic aviation,14.458
Liquid,International aviation,206.267
Liquid,Agriculture,3.64
Liquid,National navigation,33.218
Liquid,Rail transport,4.413
Marine algae,Bio-conversion,4.375
NGas,Gas,122.952
Nuclear,Thermal generation,839.978
Oil imports,Oil,504.287
Oil reserves,Oil,107.703
Oil,Liquid,611.99
Other waste,Solid,56.587
Other waste,Bio-conversion,77.81
Pumped heat,Heating and cooling - homes,193.026
Pumped heat,Heating and cooling - commercial,70.672
Solar PV,Electricity grid,59.901
Solar Thermal,Heating and cooling - homes,19.263
Solar,Solar Thermal,19.263
Solar,Solar PV,59.901
Solid,Agriculture,0.882
Solid,Thermal generation,400.12
Solid,Industry,46.477
Thermal generation,Electricity grid,525.531
Thermal generation,Losses,787.129
Thermal generation,District heating,79.329
Tidal,Electricity grid,9.452
UK land based bioenergy,Bio-conversion,182.01
Wave,Electricity grid,19.013
Wind,Electricity grid,289.366&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;mermaid-pie-chart&quot; tabindex=&quot;-1&quot;&gt;Mermaid Pie Chart&lt;/h3&gt;
&lt;p&gt;Other examples are the xy chart or the pie chart. Those charts can be useful, but they are fairly simple and some might find they are not polished enough. The syntax isn&#39;t consistent either. The xy chart requires a title to be in double quotes to avoid having all spaces removed from the title text, while for the pie chart double quotes are supported, but the title would be better without quotes because the quotes are rendered into the diagram. Also, the titles of the two diagram types are rendered in different font sizes. Generally, font sizes vary across the different Mermaid chart types. At the beginning of this document I mentioned standardized output creation from text definitions is a benefit of text-to-chart, but it is not to 100% achieved in this case. It is a probably a minor complaint, depending on your context, but I expect these things to be aligned when using a charting software.&lt;/p&gt;
&lt;figure class=&quot;mermaid&quot;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;svg id=&quot;mermaid-gijykswpynhl&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 573.2783203125 450&quot; style=&quot;max-width: 573.2783203125px;&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;pie&quot;&gt;&lt;style&gt;#mermaid-gijykswpynhl{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-gijykswpynhl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-gijykswpynhl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-gijykswpynhl .error-icon{fill:#552222;}#mermaid-gijykswpynhl .error-text{fill:#552222;stroke:#552222;}#mermaid-gijykswpynhl .edge-thickness-normal{stroke-width:1px;}#mermaid-gijykswpynhl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-gijykswpynhl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-gijykswpynhl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-gijykswpynhl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-gijykswpynhl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-gijykswpynhl .marker{fill:#333333;stroke:#333333;}#mermaid-gijykswpynhl .marker.cross{stroke:#333333;}#mermaid-gijykswpynhl svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-gijykswpynhl p{margin:0;}#mermaid-gijykswpynhl .pieCircle{stroke:black;stroke-width:2px;opacity:0.7;}#mermaid-gijykswpynhl .pieOuterCircle{stroke:black;stroke-width:2px;fill:none;}#mermaid-gijykswpynhl .pieTitleText{text-anchor:middle;font-size:25px;fill:black;font-family:arial,sans-serif;}#mermaid-gijykswpynhl .slice{font-family:arial,sans-serif;fill:#333;font-size:17px;}#mermaid-gijykswpynhl .legend text{fill:black;font-family:arial,sans-serif;font-size:17px;}#mermaid-gijykswpynhl :root{--mermaid-font-family:arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(225,225)&quot;&gt;&lt;circle cx=&quot;0&quot; cy=&quot;0&quot; r=&quot;186&quot; class=&quot;pieOuterCircle&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M0,-185A185,185,0,1,1,-108.74,-149.668L0,0Z&quot; fill=&quot;#ECECFF&quot; class=&quot;pieCircle&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M-108.74,-149.668A185,185,0,0,1,-46.008,-179.188L0,0Z&quot; fill=&quot;#ffffde&quot; class=&quot;pieCircle&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M-46.008,-179.188A185,185,0,0,1,0,-185L0,0Z&quot; fill=&quot;hsl(80, 100%, 56.2745098039%)&quot; class=&quot;pieCircle&quot;&gt;&lt;/path&gt;&lt;text transform=&quot;translate(42.87610796952391,131.95909163595257)&quot; class=&quot;slice&quot; style=&quot;text-anchor: middle;&quot;&gt;90%&lt;/text&gt;&lt;text transform=&quot;translate(-59.07687670465376,-125.54475352966024)&quot; class=&quot;slice&quot; style=&quot;text-anchor: middle;&quot;&gt;6%&lt;/text&gt;&lt;text transform=&quot;translate(-17.389986157047144,-137.6559148073838)&quot; class=&quot;slice&quot; style=&quot;text-anchor: middle;&quot;&gt;4%&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;-200&quot; class=&quot;pieTitleText&quot;&gt;What Voldemort doesn&#39;t have?&lt;/text&gt;&lt;g class=&quot;legend&quot; transform=&quot;translate(216,-33)&quot;&gt;&lt;rect width=&quot;18&quot; height=&quot;18&quot; style=&quot;fill: rgb(181, 255, 32); stroke: rgb(181, 255, 32);&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;22&quot; y=&quot;14&quot;&gt;Friends&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;legend&quot; transform=&quot;translate(216,-11)&quot;&gt;&lt;rect width=&quot;18&quot; height=&quot;18&quot; style=&quot;fill: rgb(255, 255, 222); stroke: rgb(255, 255, 222);&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;22&quot; y=&quot;14&quot;&gt;Family&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;legend&quot; transform=&quot;translate(216,11)&quot;&gt;&lt;rect width=&quot;18&quot; height=&quot;18&quot; style=&quot;fill: rgb(236, 236, 255); stroke: rgb(236, 236, 255);&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;22&quot; y=&quot;14&quot;&gt;Nose&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/body&gt;&lt;/html&gt;&lt;figcaption&gt;A simple pie chart generated by Mermaid&lt;/figcaption&gt;&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;mermaid&lt;/span&gt;
&lt;span class=&quot;token code-block language-mermaid language-mermaid language-mermaid&quot;&gt;pie

title What Voldemort doesn&#39;t have?
&quot;Friends&quot; : 2
&quot;Family&quot; : 3
&quot;Nose&quot; : 45&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;mermaid-xy-chart&quot; tabindex=&quot;-1&quot;&gt;Mermaid XY Chart&lt;/h3&gt;
&lt;figure class=&quot;mermaid&quot;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;svg id=&quot;mermaid-wyvqrztiinhl&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; style=&quot;max-width: 700px;&quot; viewBox=&quot;0 0 700 500&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;xychart&quot;&gt;&lt;style&gt;#mermaid-wyvqrztiinhl{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-wyvqrztiinhl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-wyvqrztiinhl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-wyvqrztiinhl .error-icon{fill:#552222;}#mermaid-wyvqrztiinhl .error-text{fill:#552222;stroke:#552222;}#mermaid-wyvqrztiinhl .edge-thickness-normal{stroke-width:1px;}#mermaid-wyvqrztiinhl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-wyvqrztiinhl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-wyvqrztiinhl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-wyvqrztiinhl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-wyvqrztiinhl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-wyvqrztiinhl .marker{fill:#333333;stroke:#333333;}#mermaid-wyvqrztiinhl .marker.cross{stroke:#333333;}#mermaid-wyvqrztiinhl svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-wyvqrztiinhl p{margin:0;}#mermaid-wyvqrztiinhl :root{--mermaid-font-family:arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;/g&gt;&lt;g class=&quot;main&quot;&gt;&lt;rect width=&quot;700&quot; height=&quot;500&quot; class=&quot;background&quot; fill=&quot;white&quot;&gt;&lt;/rect&gt;&lt;g class=&quot;chart-title&quot;&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;20&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(350, 22) rotate(0)&quot;&gt;The week in data&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;plot&quot;&gt;&lt;g class=&quot;bar-plot-0&quot;&gt;&lt;rect x=&quot;74.18437690734864&quot; y=&quot;396.12263977302695&quot; width=&quot;55.099999999999994&quot; height=&quot;41.87735831962442&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;169.06198075612383&quot; y=&quot;413.95282836230297&quot; width=&quot;55.099999999999994&quot; height=&quot;24.0471697303484&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;263.93958460489904&quot; y=&quot;429.99999809265137&quot; width=&quot;55.099999999999994&quot; height=&quot;8&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;358.8171884536743&quot; y=&quot;413.95282836230297&quot; width=&quot;55.099999999999994&quot; height=&quot;24.0471697303484&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;453.6947923024495&quot; y=&quot;406.82075292659255&quot; width=&quot;55.099999999999994&quot; height=&quot;31.17924516605882&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;548.5723961512248&quot; y=&quot;396.12263977302695&quot; width=&quot;55.099999999999994&quot; height=&quot;41.87735831962442&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;643.45&quot; y=&quot;399.6886774908821&quot; width=&quot;55.099999999999994&quot; height=&quot;38.31132060176924&quot; fill=&quot;#ECECFF&quot; stroke=&quot;#ECECFF&quot; stroke-width=&quot;0&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;g class=&quot;line-plot-1&quot;&gt;&lt;path d=&quot;M101.734,396.123L196.612,342.632L291.49,305.189L386.367,251.698L481.245,191.075L576.122,119.755L671,52&quot; fill=&quot;none&quot; stroke=&quot;#8493A6&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;bottom-axis&quot;&gt;&lt;g class=&quot;axis-line&quot;&gt;&lt;path d=&quot;M 72.73437690734863,438.99999809265137 L 700,438.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;label&quot;&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(101.73437690734863, 449.99999809265137) rotate(0)&quot;&gt;Mon&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(196.61198075612384, 449.99999809265137) rotate(0)&quot;&gt;Tue&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(291.48958460489905, 449.99999809265137) rotate(0)&quot;&gt;Wed&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(386.3671884536743, 449.99999809265137) rotate(0)&quot;&gt;Thu&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(481.2447923024495, 449.99999809265137) rotate(0)&quot;&gt;Fri&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(576.1223961512247, 449.99999809265137) rotate(0)&quot;&gt;Sat&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(671, 449.99999809265137) rotate(0)&quot;&gt;Sun&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;ticks&quot;&gt;&lt;path d=&quot;M 101.73437690734863,439.99999809265137 L 101.73437690734863,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 196.61198075612384,439.99999809265137 L 196.61198075612384,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 291.48958460489905,439.99999809265137 L 291.48958460489905,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 386.3671884536743,439.99999809265137 L 386.3671884536743,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 481.2447923024495,439.99999809265137 L 481.2447923024495,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 576.1223961512247,439.99999809265137 L 576.1223961512247,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 671,439.99999809265137 L 671,444.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;title&quot;&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;16&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(386.3671884536743, 475.99999809265137) rotate(0)&quot;&gt;Days of the week&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;left-axis&quot;&gt;&lt;g class=&quot;axisl-line&quot;&gt;&lt;path d=&quot;M 71.73437690734863,44 L 71.73437690734863,437.99999809265137&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;label&quot;&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 75.17924516605882) rotate(0)&quot;&gt;220&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 110.83962234461083) rotate(0)&quot;&gt;200&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 146.49999952316284) rotate(0)&quot;&gt;180&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 182.16037670171485) rotate(0)&quot;&gt;160&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 217.82075388026686) rotate(0)&quot;&gt;140&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 253.48113105881887) rotate(0)&quot;&gt;120&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 289.14150823737094) rotate(0)&quot;&gt;100&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 324.8018854159229) rotate(0)&quot;&gt;80&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 360.46226259447496) rotate(0)&quot;&gt;60&lt;/text&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;14&quot; dominant-baseline=&quot;middle&quot; text-anchor=&quot;end&quot; transform=&quot;translate(60.73437690734863, 396.12263977302695) rotate(0)&quot;&gt;40&lt;/text&gt;&lt;/g&gt;&lt;g class=&quot;ticks&quot;&gt;&lt;path d=&quot;M 70.73437690734863,75.17924516605882 L 65.73437690734863,75.17924516605882&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,110.83962234461083 L 65.73437690734863,110.83962234461083&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,146.49999952316284 L 65.73437690734863,146.49999952316284&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,182.16037670171485 L 65.73437690734863,182.16037670171485&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,217.82075388026686 L 65.73437690734863,217.82075388026686&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,253.48113105881887 L 65.73437690734863,253.48113105881887&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,289.14150823737094 L 65.73437690734863,289.14150823737094&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,324.8018854159229 L 65.73437690734863,324.8018854159229&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,360.46226259447496 L 65.73437690734863,360.46226259447496&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M 70.73437690734863,396.12263977302695 L 65.73437690734863,396.12263977302695&quot; fill=&quot;none&quot; stroke=&quot;#131300&quot; stroke-width=&quot;2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class=&quot;title&quot;&gt;&lt;text x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#131300&quot; font-size=&quot;16&quot; dominant-baseline=&quot;text-before-edge&quot; text-anchor=&quot;middle&quot; transform=&quot;translate(5, 240.99999904632568) rotate(270)&quot;&gt;Data&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class=&quot;mermaid-tmp-group&quot;&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/body&gt;&lt;/html&gt;&lt;figcaption&gt;A simple xy chart generated by Mermaid. The bars represent data points for each day of the week. The line represents the cumulated data points from day to day. This visualization is clear as long as you have a single data series to visualize (like only bars, or only the line). When having more than one data series, I&#39;m missing an automatically generated legend to explain the data within the chart. The explanation can only be given in addition to what Mermaid does, for example by putting your own description as some sort of legend into a &lt;code&gt;figcaption&lt;/code&gt;, which is not ideal in my view. A legend should really be part of any information graphic.&lt;/figcaption&gt;&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;mermaid&lt;/span&gt;
&lt;span class=&quot;token code-block language-mermaid language-mermaid language-mermaid&quot;&gt;xychart-beta

title &quot;The week in data&quot;
x-axis &quot;Days of the week&quot; [Mon, Tue, Wed, Thu, Fri, Sat, Sun]
y-axis &quot;Data&quot;
bar &quot;Per day&quot; [40, 30, 21, 30, 34, 40, 38]
line &quot;Cumulated over days&quot; [40, 70, 91, 121, 155, 195, 233]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;mermaid-chart-appearance&quot; tabindex=&quot;-1&quot;&gt;Mermaid Chart Appearance&lt;/h3&gt;
&lt;p&gt;The appearance of each Mermaid chart can be configured through a frontmatter configuration within the chart definition, see &lt;a href=&quot;https://mermaid.js.org/config/configuration.html#frontmatter-config&quot;&gt;&lt;cite&gt;Frontmatter config&lt;/cite&gt;&lt;/a&gt; in the Mermaid documentation. In addition, a software developer can apply a custom styling to all diagrams by using a Mermaid config object and a theme CSS.&lt;/p&gt;
&lt;p&gt;The application of styles to the diagrams is inconsistent, not well documented, and I didn&#39;t find it straight forward. For example, you can set the colors of the bars and lines for the xy chart in the Mermaid config object (which is JSON), but the background of the xy chart needs to be set via the theme CSS. At some point I refrained from doing my own styling and now I just use the default. Unfortunately that means I do not have a dark mode switch, because Mermaid is not supporting an automatic switch by reacting to system settings out of the box, and the font size of the data series legends is too tiny, but I have to accept that.&lt;/p&gt;
&lt;p&gt;In the end, the limitations of Mermaid&#39;s general purpose charts made me watch out for other solutions and I came to ECharts.&lt;/p&gt;
&lt;h2 id=&quot;echarts&quot; tabindex=&quot;-1&quot;&gt;ECharts&lt;/h2&gt;
&lt;p&gt;ECharts is a free and capable charting software under the Apache License 2.0. It covers general purpose charts in various flavours and can be used for specific charts that go well beyond of what I would expect to get from a charting software. The charts are rendered on the client and can be interactive in the sense that users are able to filter out certain data series to shift focus on other data series to better analyze the data.&lt;/p&gt;
&lt;p&gt;I&#39;m impressed by the &lt;a href=&quot;https://echarts.apache.org/examples/index.html&quot;&gt;ECharts demo page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Other than Mermaid, ECharts does not rely on text to describe a chart. Instead the chart has to be defined with JavaScript. It&#39;s a steeper learning curve, but the concepts are well thought through, pretty flexible, and the resulting charts can be tailored to certain needs much better than with Mermaid. To directly jump in, let&#39;s pick up some chart types we rendered previously with Mermaid and do the same with ECharts.&lt;/p&gt;
&lt;h3 id=&quot;echarts-pie-chart&quot; tabindex=&quot;-1&quot;&gt;ECharts Pie Chart&lt;/h3&gt;
&lt;figure id=&quot;echarts-rwhaxyckuemz&quot; class=&quot;echarts&quot;&gt;
  &lt;div id=&quot;echarts-ufixvxkdlizv&quot; class=&quot;echarts-container&quot;&gt;
  &lt;/div&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;module&quot;&gt;
  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      const context = this;
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() =&gt; func.apply(context, args), delay);
    }
  }
  function deepMerge(target, ...sources) {
    for (const source of sources) {
      for (const k in source) {
        let vs = source[k], vt = target[k]
        if (Object(vs) == vs &amp;&amp; Object(vt) === vt) {
          target[k] = deepMerge(vt, vs)
          continue
        }
        target[k] = source[k]
      }
    }
    return target
  }
  function applyDefaults(defaults, config) {
     const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;
     let adjustedConfig;
     if (isDarkMode &amp;&amp; defaults.darkModeConfig) {
       defaults = deepMerge({}, defaults, defaults.darkModeConfig);
       adjustedConfig = deepMerge({}, config, config.darkModeConfig);
     } else {
       defaults = deepMerge({}, defaults);
       adjustedConfig = deepMerge({}, config);
     }
     delete defaults.darkModeConfig;
     delete adjustedConfig.darkModeConfig;
     if (defaults.series &amp;&amp; adjustedConfig.series) {
       for (const def in defaults.series) {
         for (const conf of adjustedConfig.series) {
           conf[def] = deepMerge({}, defaults.series[def], conf[def]);
         }
       }
     }
     delete defaults.series;
     adjustedConfig = deepMerge(defaults, adjustedConfig);
     return adjustedConfig;
  }
  function getDefaults() {
    return {&quot;color&quot;:[&quot;#007affa0&quot;,&quot;#ffa500a0&quot;,&quot;#008000a0&quot;,&quot;#9370DBa0&quot;,&quot;#FFD700a0&quot;,&quot;#ff0000a0&quot;],&quot;renderOptions&quot;:{&quot;renderer&quot;:&quot;svg&quot;},&quot;aria&quot;:{&quot;show&quot;:true},&quot;toolbox&quot;:{&quot;feature&quot;:{&quot;restore&quot;:{},&quot;saveAsImage&quot;:{},&quot;dataView&quot;:{}}},&quot;title&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;}},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;},&quot;grid&quot;:{&quot;left&quot;:0,&quot;containLabel&quot;:true},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#262626&quot;}},&quot;splitLine&quot;:{&quot;show&quot;:false},&quot;splitArea&quot;:{&quot;show&quot;:false}},&quot;series&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}}}},&quot;darkModeConfig&quot;:{&quot;title&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}},&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;series&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;markLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;splitLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}}}}};
  }
  function adjustConfig() {
    const defaults = getDefaults();
    const container = document.querySelector(&quot;#echarts-ufixvxkdlizv&quot;); //might be used by chart config
    const containerWidth = ctx.clientWidth; //might be used by chart config
    const containerHeight = ctx.clientHeight; //might be used by chart config
    const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;  //might be used by chart config
    const config = {
  title: {
    text: &#39;What Voldemort doesn&#39;t have&#39;,
  },
  figcaption: `A simple pie chart rendered by ECharts.
  You will probably notice it&#39;s more interactive,
  more polished, and much closer to the styling of the hosting website than the corresponding Mermaid chart.`,
  tooltip: {
    trigger: &#39;item&#39;
  },
  series: [
    {
      type: &#39;pie&#39;,
      radius: containerWidth &gt; 600 ? &#39;70%&#39; : &#39;50%&#39;,
      data: [
        { value: 2, name: &#39;Friends&#39; },
        { value: 3, name: &#39;Family&#39; },
        { value: 45, name: &#39;Nose&#39; }
      ],
      label: {
        show: true,
        formatter: containerWidth &gt; 600 ? &#39;{b}: {c} ≈ {d}%&#39; : &#39;{b} {c}&#39;
        // {b} = data name
        // {c} = raw value
        // {d} = percentage
      }
  }
  ]
};
    return applyDefaults(defaults, config);
  }
  //create chart instance
  const ctx = document.querySelector(&quot;#echarts-ufixvxkdlizv&quot;);
  let config = adjustConfig()
  let chart;
  if (config.renderOptions?.renderer) {
    chart = echarts.init(ctx, null, { renderer: config.renderOptions.renderer });
  } else {
    chart = echarts.init(ctx);
  }
  function renderChart() {
    try {
      const config = adjustConfig();
      ctx.setAttribute(&#39;class&#39;,&#39;echarts-container&#39;);
      for(const data of config.series) {
        ctx.classList.add(data.type);
      }
      if (config.figcaption) {
        const figure = document.querySelector(&quot;#echarts-rwhaxyckuemz&quot;);
        let figcaption = figure.querySelector(&#39;figcaption&#39;);
        if (!figcaption) {
          figcaption = document.createElement(&#39;figcaption&#39;);
          figure.appendChild(figcaption);
        }
        figcaption.innerHTML = config.figcaption;
      }
      const renderOptions = config?.renderOptions
      delete config?.figcaption;
      delete config?.renderOptions;
      chart.setOption(config, renderOptions);
    } catch (err) {
      console.error(err);
    }
  }
  renderChart();
  const debouncedRender = debounce(() =&gt; {
      chart.resize();
      renderChart();
    }, config.renderOptions?.debounceMillis || 16);
  const resizeObserver = new ResizeObserver(() =&gt; {
    requestAnimationFrame(() =&gt; {
      debouncedRender();
    });
  });
  resizeObserver.observe(ctx);
  const darkModeQuery = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;);
  darkModeQuery.addEventListener(&#39;change&#39;, debouncedRender);
  &lt;/script&gt;
&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;echarts&lt;/span&gt;
&lt;span class=&quot;token code-block language-echarts language-echarts language-echarts&quot;&gt;const config = {
  title: {
    text: &#39;What Voldemort doesn&#39;t have&#39;,
  },
  tooltip: {
    trigger: &#39;item&#39;
  },
  series: [
    {
      type: &#39;pie&#39;,
      radius: containerWidth &gt; 600 ? &#39;70%&#39; : &#39;50%&#39;,
      data: [
        { value: 2, name: &#39;Friends&#39; },
        { value: 3, name: &#39;Family&#39; },
        { value: 45, name: &#39;Nose&#39; }
      ],
      label: {
        show: true,
        formatter: containerWidth &gt; 600 ? &#39;{b}: {c} ≈ {d}%&#39; : &#39;{b} {c}&#39;
        // {b} = data name
        // {c} = raw value
        // {d} = percentage
      }
  }
  ]
};&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;echarts-xy-chart&quot; tabindex=&quot;-1&quot;&gt;ECharts XY Chart&lt;/h3&gt;
&lt;figure id=&quot;echarts-ydcjztaxkvhq&quot; class=&quot;echarts&quot;&gt;
  &lt;div id=&quot;echarts-isshxxhxfies&quot; class=&quot;echarts-container&quot;&gt;
  &lt;/div&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;module&quot;&gt;
  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      const context = this;
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() =&gt; func.apply(context, args), delay);
    }
  }
  function deepMerge(target, ...sources) {
    for (const source of sources) {
      for (const k in source) {
        let vs = source[k], vt = target[k]
        if (Object(vs) == vs &amp;&amp; Object(vt) === vt) {
          target[k] = deepMerge(vt, vs)
          continue
        }
        target[k] = source[k]
      }
    }
    return target
  }
  function applyDefaults(defaults, config) {
     const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;
     let adjustedConfig;
     if (isDarkMode &amp;&amp; defaults.darkModeConfig) {
       defaults = deepMerge({}, defaults, defaults.darkModeConfig);
       adjustedConfig = deepMerge({}, config, config.darkModeConfig);
     } else {
       defaults = deepMerge({}, defaults);
       adjustedConfig = deepMerge({}, config);
     }
     delete defaults.darkModeConfig;
     delete adjustedConfig.darkModeConfig;
     if (defaults.series &amp;&amp; adjustedConfig.series) {
       for (const def in defaults.series) {
         for (const conf of adjustedConfig.series) {
           conf[def] = deepMerge({}, defaults.series[def], conf[def]);
         }
       }
     }
     delete defaults.series;
     adjustedConfig = deepMerge(defaults, adjustedConfig);
     return adjustedConfig;
  }
  function getDefaults() {
    return {&quot;color&quot;:[&quot;#007affa0&quot;,&quot;#ffa500a0&quot;,&quot;#008000a0&quot;,&quot;#9370DBa0&quot;,&quot;#FFD700a0&quot;,&quot;#ff0000a0&quot;],&quot;renderOptions&quot;:{&quot;renderer&quot;:&quot;svg&quot;},&quot;aria&quot;:{&quot;show&quot;:true},&quot;toolbox&quot;:{&quot;feature&quot;:{&quot;restore&quot;:{},&quot;saveAsImage&quot;:{},&quot;dataView&quot;:{}}},&quot;title&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;}},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;},&quot;grid&quot;:{&quot;left&quot;:0,&quot;containLabel&quot;:true},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#262626&quot;}},&quot;splitLine&quot;:{&quot;show&quot;:false},&quot;splitArea&quot;:{&quot;show&quot;:false}},&quot;series&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}}}},&quot;darkModeConfig&quot;:{&quot;title&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}},&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;series&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;markLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;splitLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}}}}};
  }
  function adjustConfig() {
    const defaults = getDefaults();
    const container = document.querySelector(&quot;#echarts-isshxxhxfies&quot;); //might be used by chart config
    const containerWidth = ctx.clientWidth; //might be used by chart config
    const containerHeight = ctx.clientHeight; //might be used by chart config
    const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;  //might be used by chart config
    const config = {
  title: {
    text: &#39;The week in data&#39;,
  },
  figcaption: `The ECharts version of the xy chart, which is named a combined line/bar chart in ECharts. It&#39;s easy to have a proper legend for the visualized data, and again, the chart is interactive.`,
  xAxis: {
    type: &#39;category&#39;,
    data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;],
    name: containerWidth &gt; 600 ? &#39;Days of the week&#39;: &#39;&#39;
  },
  yAxis: {
    type: &#39;value&#39;,
    name: containerWidth &gt; 600 ? &#39;Data&#39; : &#39;&#39;
  },
  legend: {
    data: [&#39;Per day&#39;, &#39;Cumulated over days&#39;]
  },
  series: [
      {
      name: &#39;Per day&#39;,
      data: [40, 30, 21, 30, 34, 40, 38],
      type: &#39;bar&#39;
    },
    {
      name: &#39;Cumulated over days&#39;,
      data: [40, 70, 91, 121, 155, 195, 233],
      type: &#39;line&#39;
    }
  ]
};
    return applyDefaults(defaults, config);
  }
  //create chart instance
  const ctx = document.querySelector(&quot;#echarts-isshxxhxfies&quot;);
  let config = adjustConfig()
  let chart;
  if (config.renderOptions?.renderer) {
    chart = echarts.init(ctx, null, { renderer: config.renderOptions.renderer });
  } else {
    chart = echarts.init(ctx);
  }
  function renderChart() {
    try {
      const config = adjustConfig();
      ctx.setAttribute(&#39;class&#39;,&#39;echarts-container&#39;);
      for(const data of config.series) {
        ctx.classList.add(data.type);
      }
      if (config.figcaption) {
        const figure = document.querySelector(&quot;#echarts-ydcjztaxkvhq&quot;);
        let figcaption = figure.querySelector(&#39;figcaption&#39;);
        if (!figcaption) {
          figcaption = document.createElement(&#39;figcaption&#39;);
          figure.appendChild(figcaption);
        }
        figcaption.innerHTML = config.figcaption;
      }
      const renderOptions = config?.renderOptions
      delete config?.figcaption;
      delete config?.renderOptions;
      chart.setOption(config, renderOptions);
    } catch (err) {
      console.error(err);
    }
  }
  renderChart();
  const debouncedRender = debounce(() =&gt; {
      chart.resize();
      renderChart();
    }, config.renderOptions?.debounceMillis || 16);
  const resizeObserver = new ResizeObserver(() =&gt; {
    requestAnimationFrame(() =&gt; {
      debouncedRender();
    });
  });
  resizeObserver.observe(ctx);
  const darkModeQuery = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;);
  darkModeQuery.addEventListener(&#39;change&#39;, debouncedRender);
  &lt;/script&gt;
&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;echarts&lt;/span&gt;
&lt;span class=&quot;token code-block language-echarts language-echarts language-echarts&quot;&gt;const config = {
  title: {
    text: &#39;The week in data&#39;,
  },
  xAxis: {
    type: &#39;category&#39;,
    data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;],
    name: containerWidth &gt; 600 ? &#39;Days of the week&#39; : &#39;&#39;
  },
  yAxis: {
    type: &#39;value&#39;,
    name: containerWidth &gt; 600 ? &#39;Data&#39; : &#39;&#39;
  },
  legend: {
    data: [&#39;Per day&#39;, &#39;Cumulated over days&#39;]
  },
  series: [
      {
      name: &#39;Per day&#39;,
      data: [40, 30, 21, 30, 34, 40, 38],
      type: &#39;bar&#39;
    },
    {
      name: &#39;Cumulated over days&#39;,
      data: [40, 70, 91, 121, 155, 195, 233],
      type: &#39;line&#39;
    }
  ]
};&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;echarts-radar-chart&quot; tabindex=&quot;-1&quot;&gt;ECharts Radar Chart&lt;/h3&gt;
&lt;figure id=&quot;echarts-qeuxwzhzemcp&quot; class=&quot;echarts&quot;&gt;
  &lt;div id=&quot;echarts-iqgcnuugemtd&quot; class=&quot;echarts-container&quot;&gt;
  &lt;/div&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;module&quot;&gt;
  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      const context = this;
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() =&gt; func.apply(context, args), delay);
    }
  }
  function deepMerge(target, ...sources) {
    for (const source of sources) {
      for (const k in source) {
        let vs = source[k], vt = target[k]
        if (Object(vs) == vs &amp;&amp; Object(vt) === vt) {
          target[k] = deepMerge(vt, vs)
          continue
        }
        target[k] = source[k]
      }
    }
    return target
  }
  function applyDefaults(defaults, config) {
     const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;
     let adjustedConfig;
     if (isDarkMode &amp;&amp; defaults.darkModeConfig) {
       defaults = deepMerge({}, defaults, defaults.darkModeConfig);
       adjustedConfig = deepMerge({}, config, config.darkModeConfig);
     } else {
       defaults = deepMerge({}, defaults);
       adjustedConfig = deepMerge({}, config);
     }
     delete defaults.darkModeConfig;
     delete adjustedConfig.darkModeConfig;
     if (defaults.series &amp;&amp; adjustedConfig.series) {
       for (const def in defaults.series) {
         for (const conf of adjustedConfig.series) {
           conf[def] = deepMerge({}, defaults.series[def], conf[def]);
         }
       }
     }
     delete defaults.series;
     adjustedConfig = deepMerge(defaults, adjustedConfig);
     return adjustedConfig;
  }
  function getDefaults() {
    return {&quot;color&quot;:[&quot;#007affa0&quot;,&quot;#ffa500a0&quot;,&quot;#008000a0&quot;,&quot;#9370DBa0&quot;,&quot;#FFD700a0&quot;,&quot;#ff0000a0&quot;],&quot;renderOptions&quot;:{&quot;renderer&quot;:&quot;svg&quot;},&quot;aria&quot;:{&quot;show&quot;:true},&quot;toolbox&quot;:{&quot;feature&quot;:{&quot;restore&quot;:{},&quot;saveAsImage&quot;:{},&quot;dataView&quot;:{}}},&quot;title&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;}},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;},&quot;grid&quot;:{&quot;left&quot;:0,&quot;containLabel&quot;:true},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#262626&quot;}},&quot;splitLine&quot;:{&quot;show&quot;:false},&quot;splitArea&quot;:{&quot;show&quot;:false}},&quot;series&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}}}},&quot;darkModeConfig&quot;:{&quot;title&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}},&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;series&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;markLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;splitLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}}}}};
  }
  function adjustConfig() {
    const defaults = getDefaults();
    const container = document.querySelector(&quot;#echarts-iqgcnuugemtd&quot;); //might be used by chart config
    const containerWidth = ctx.clientWidth; //might be used by chart config
    const containerHeight = ctx.clientHeight; //might be used by chart config
    const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;  //might be used by chart config
    const config = {
  figcaption: &#39;The radar chart, generated by ECharts&#39;,
  legend: {
    data: [&#39;Alice&#39;, &#39;Bob&#39;]
  },
  radar: {
    splitLine: {
      show: false
    },
    splitArea: {
      show: false
    },
    indicator: [
      { name: &#39;Math&#39;, max: 100 },
      { name: &#39;Science&#39;, max: 100 },
      { name: &#39;English&#39;, max: 100 },
      { name: &#39;History&#39;, max: 100 },
      { name: &#39;Geography&#39;, max: 100 },
      { name: &#39;Art&#39;, max: 100 }
    ]
  },
  series: [
    {
      type: &#39;radar&#39;,
      data: [
        {
          value: [85, 90, 80, 70, 75, 90],
          name: &#39;Alice&#39;
        },
        {
          value: [70, 75, 85, 80, 90, 85],
          name: &#39;Bob&#39;
        }
      ]
    }
  ]
};
    return applyDefaults(defaults, config);
  }
  //create chart instance
  const ctx = document.querySelector(&quot;#echarts-iqgcnuugemtd&quot;);
  let config = adjustConfig()
  let chart;
  if (config.renderOptions?.renderer) {
    chart = echarts.init(ctx, null, { renderer: config.renderOptions.renderer });
  } else {
    chart = echarts.init(ctx);
  }
  function renderChart() {
    try {
      const config = adjustConfig();
      ctx.setAttribute(&#39;class&#39;,&#39;echarts-container&#39;);
      for(const data of config.series) {
        ctx.classList.add(data.type);
      }
      if (config.figcaption) {
        const figure = document.querySelector(&quot;#echarts-qeuxwzhzemcp&quot;);
        let figcaption = figure.querySelector(&#39;figcaption&#39;);
        if (!figcaption) {
          figcaption = document.createElement(&#39;figcaption&#39;);
          figure.appendChild(figcaption);
        }
        figcaption.innerHTML = config.figcaption;
      }
      const renderOptions = config?.renderOptions
      delete config?.figcaption;
      delete config?.renderOptions;
      chart.setOption(config, renderOptions);
    } catch (err) {
      console.error(err);
    }
  }
  renderChart();
  const debouncedRender = debounce(() =&gt; {
      chart.resize();
      renderChart();
    }, config.renderOptions?.debounceMillis || 16);
  const resizeObserver = new ResizeObserver(() =&gt; {
    requestAnimationFrame(() =&gt; {
      debouncedRender();
    });
  });
  resizeObserver.observe(ctx);
  const darkModeQuery = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;);
  darkModeQuery.addEventListener(&#39;change&#39;, debouncedRender);
  &lt;/script&gt;
&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;echarts&lt;/span&gt;
&lt;span class=&quot;token code-block language-echarts language-echarts language-echarts&quot;&gt;const config = {
  legend: {
    data: [&#39;Alice&#39;, &#39;Bob&#39;]
  },
  radar: {
     splitLine: {
      show: false
    },
    splitArea: {
      show: false
    },
    indicator: [
      { name: &#39;Math&#39;, max: 100 },
      { name: &#39;Science&#39;, max: 100 },
      { name: &#39;English&#39;, max: 100 },
      { name: &#39;History&#39;, max: 100 },
      { name: &#39;Geography&#39;, max: 100 },
      { name: &#39;Art&#39;, max: 100 }
    ]
  },
  series: [
    {
      type: &#39;radar&#39;,
      data: [
        {
          value: [85, 90, 80, 70, 75, 90],
          name: &#39;Alice&#39;
        },
        {
          value: [70, 75, 85, 80, 90, 85],
          name: &#39;Bob&#39;
        }
      ]
    }
  ]
};&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;echarts-sankey-chart&quot; tabindex=&quot;-1&quot;&gt;ECharts Sankey Chart&lt;/h3&gt;
&lt;figure id=&quot;echarts-bjkwyfmtsvfx&quot; class=&quot;echarts&quot;&gt;
  &lt;div id=&quot;echarts-lpvrfsogsiwn&quot; class=&quot;echarts-container&quot;&gt;
  &lt;/div&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;module&quot;&gt;
  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      const context = this;
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() =&gt; func.apply(context, args), delay);
    }
  }
  function deepMerge(target, ...sources) {
    for (const source of sources) {
      for (const k in source) {
        let vs = source[k], vt = target[k]
        if (Object(vs) == vs &amp;&amp; Object(vt) === vt) {
          target[k] = deepMerge(vt, vs)
          continue
        }
        target[k] = source[k]
      }
    }
    return target
  }
  function applyDefaults(defaults, config) {
     const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;
     let adjustedConfig;
     if (isDarkMode &amp;&amp; defaults.darkModeConfig) {
       defaults = deepMerge({}, defaults, defaults.darkModeConfig);
       adjustedConfig = deepMerge({}, config, config.darkModeConfig);
     } else {
       defaults = deepMerge({}, defaults);
       adjustedConfig = deepMerge({}, config);
     }
     delete defaults.darkModeConfig;
     delete adjustedConfig.darkModeConfig;
     if (defaults.series &amp;&amp; adjustedConfig.series) {
       for (const def in defaults.series) {
         for (const conf of adjustedConfig.series) {
           conf[def] = deepMerge({}, defaults.series[def], conf[def]);
         }
       }
     }
     delete defaults.series;
     adjustedConfig = deepMerge(defaults, adjustedConfig);
     return adjustedConfig;
  }
  function getDefaults() {
    return {&quot;color&quot;:[&quot;#007affa0&quot;,&quot;#ffa500a0&quot;,&quot;#008000a0&quot;,&quot;#9370DBa0&quot;,&quot;#FFD700a0&quot;,&quot;#ff0000a0&quot;],&quot;renderOptions&quot;:{&quot;renderer&quot;:&quot;svg&quot;},&quot;aria&quot;:{&quot;show&quot;:true},&quot;toolbox&quot;:{&quot;feature&quot;:{&quot;restore&quot;:{},&quot;saveAsImage&quot;:{},&quot;dataView&quot;:{}}},&quot;title&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;}},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;},&quot;grid&quot;:{&quot;left&quot;:0,&quot;containLabel&quot;:true},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#262626&quot;}},&quot;splitLine&quot;:{&quot;show&quot;:false},&quot;splitArea&quot;:{&quot;show&quot;:false}},&quot;series&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}}}},&quot;darkModeConfig&quot;:{&quot;title&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}},&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;series&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;markLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;splitLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}}}}};
  }
  function adjustConfig() {
    const defaults = getDefaults();
    const container = document.querySelector(&quot;#echarts-lpvrfsogsiwn&quot;); //might be used by chart config
    const containerWidth = ctx.clientWidth; //might be used by chart config
    const containerHeight = ctx.clientHeight; //might be used by chart config
    const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;  //might be used by chart config
    const config = {
  figcaption: &#39;The Sankey chart, generated by ECharts&#39;,
  tooltip: {
    trigger: &quot;item&quot;,
    triggerOn: &quot;mousemove&quot;,
  },
  animation: true,
  series: [
    {
      type: &quot;sankey&quot;,
      bottom: &quot;10%&quot;,
      emphasis: {
        focus: &quot;adjacency&quot;,
      },
      data: [
        {
          name: &quot;Agricultural &#39;waste&#39;&quot;,
        },
        { name: &quot;Bio-conversion&quot; },
        { name: &quot;Biofuel imports&quot; },
        { name: &quot;Biomass imports&quot; },
        { name: &quot;Coal imports&quot; },
        { name: &quot;Coal reserves&quot; },
        { name: &quot;Coal&quot; },
        {
          name: &quot;District heating&quot;,
        },
        {
          name: &quot;Electricity grid&quot;,
        },
        { name: &quot;Gas imports&quot; },
        { name: &quot;Gas reserves&quot; },
        {
          name: &quot;Gas&quot;,
        },
        { name: &quot;Geothermal&quot; },
        { name: &quot;H2 conversion&quot; },
        { name: &quot;H2&quot; },
        { name: &quot;Hydro&quot; },
        { name: &quot;Liquid&quot; },
        { name: &quot;Marine algae&quot; },
        { name: &quot;NGas&quot; },
        { name: &quot;Nuclear&quot; },
        { name: &quot;Oil imports&quot; },
        { name: &quot;Oil reserves&quot; },
        { name: &quot;Oil&quot; },
        { name: &quot;Other waste&quot; },
        {
          name: &quot;Pumped heat&quot;,
        },
        { name: &quot;Solar PV&quot; },
        {
          name: &quot;Solar Thermal&quot;,
        },
        { name: &quot;Solar&quot; },
        {
          name: &quot;Thermal generation&quot;,
        },
        { name: &quot;Tidal&quot; },
        {
          name: &quot;UK land based bioenergy&quot;,
        },
        { name: &quot;Wave&quot; },
        { name: &quot;Wind&quot; },
      ],
      links: [
        {
          source: &quot;Agricultural &#39;waste&#39;&quot;,
          target: &quot;Bio-conversion&quot;,
          value: 124.729,
        },
        { source: &quot;Bio-conversion&quot;, target: &quot;Liquid&quot;, value: 0.597 },
        { source: &quot;Bio-conversion&quot;, target: &quot;Losses&quot;, value: 26.862 },
        { source: &quot;Bio-conversion&quot;, target: &quot;Solid&quot;, value: 280.322 },
        { source: &quot;Bio-conversion&quot;, target: &quot;Gas&quot;, value: 81.144 },
        { source: &quot;Biofuel imports&quot;, target: &quot;Liquid&quot;, value: 35 },
        { source: &quot;Biomass imports&quot;, target: &quot;Solid&quot;, value: 35 },
        { source: &quot;Coal imports&quot;, target: &quot;Coal&quot;, value: 11.606 },
        { source: &quot;Coal reserves&quot;, target: &quot;Coal&quot;, value: 63.965 },
        { source: &quot;Coal&quot;, target: &quot;Solid&quot;, value: 75.571 },
        { source: &quot;District heating&quot;, target: &quot;Industry&quot;, value: 10.639 },
        {
          source: &quot;District heating&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 22.505,
        },
        {
          source: &quot;District heating&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 46.184,
        },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Over generation / exports&quot;,
          value: 104.453,
        },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 113.726,
        },
        { source: &quot;Electricity grid&quot;, target: &quot;H2 conversion&quot;, value: 27.14 },
        { source: &quot;Electricity grid&quot;, target: &quot;Industry&quot;, value: 342.165 },
        { source: &quot;Electricity grid&quot;, target: &quot;Road transport&quot;, value: 37.797 },
        { source: &quot;Electricity grid&quot;, target: &quot;Agriculture&quot;, value: 4.412 },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 40.858,
        },
        { source: &quot;Electricity grid&quot;, target: &quot;Losses&quot;, value: 56.691 },
        { source: &quot;Electricity grid&quot;, target: &quot;Rail transport&quot;, value: 7.863 },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Lighting &amp; appliances - commercial&quot;,
          value: 90.008,
        },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Lighting &amp; appliances - homes&quot;,
          value: 93.494,
        },
        { source: &quot;Gas imports&quot;, target: &quot;NGas&quot;, value: 40.719 },
        { source: &quot;Gas reserves&quot;, target: &quot;NGas&quot;, value: 82.233 },
        {
          source: &quot;Gas&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 0.129,
        },
        { source: &quot;Gas&quot;, target: &quot;Losses&quot;, value: 1.401 },
        { source: &quot;Gas&quot;, target: &quot;Thermal generation&quot;, value: 151.891 },
        { source: &quot;Gas&quot;, target: &quot;Agriculture&quot;, value: 2.096 },
        { source: &quot;Gas&quot;, target: &quot;Industry&quot;, value: 48.58 },
        { source: &quot;Geothermal&quot;, target: &quot;Electricity grid&quot;, value: 7.013 },
        { source: &quot;H2 conversion&quot;, target: &quot;H2&quot;, value: 20.897 },
        { source: &quot;H2 conversion&quot;, target: &quot;Losses&quot;, value: 6.242 },
        { source: &quot;H2&quot;, target: &quot;Road transport&quot;, value: 20.897 },
        { source: &quot;Hydro&quot;, target: &quot;Electricity grid&quot;, value: 6.995 },
        { source: &quot;Liquid&quot;, target: &quot;Industry&quot;, value: 121.066 },
        { source: &quot;Liquid&quot;, target: &quot;International shipping&quot;, value: 128.69 },
        { source: &quot;Liquid&quot;, target: &quot;Road transport&quot;, value: 135.835 },
        { source: &quot;Liquid&quot;, target: &quot;Domestic aviation&quot;, value: 14.458 },
        { source: &quot;Liquid&quot;, target: &quot;International aviation&quot;, value: 206.267 },
        { source: &quot;Liquid&quot;, target: &quot;Agriculture&quot;, value: 3.64 },
        { source: &quot;Liquid&quot;, target: &quot;National navigation&quot;, value: 33.218 },
        { source: &quot;Liquid&quot;, target: &quot;Rail transport&quot;, value: 4.413 },
        { source: &quot;Marine algae&quot;, target: &quot;Bio-conversion&quot;, value: 4.375 },
        { source: &quot;NGas&quot;, target: &quot;Gas&quot;, value: 122.952 },
        { source: &quot;Nuclear&quot;, target: &quot;Thermal generation&quot;, value: 839.978 },
        { source: &quot;Oil imports&quot;, target: &quot;Oil&quot;, value: 504.287 },
        { source: &quot;Oil reserves&quot;, target: &quot;Oil&quot;, value: 107.703 },
        { source: &quot;Oil&quot;, target: &quot;Liquid&quot;, value: 611.99 },
        { source: &quot;Other waste&quot;, target: &quot;Solid&quot;, value: 56.587 },
        { source: &quot;Other waste&quot;, target: &quot;Bio-conversion&quot;, value: 77.81 },
        {
          source: &quot;Pumped heat&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 193.026,
        },
        {
          source: &quot;Pumped heat&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 70.672,
        },
        { source: &quot;Solar PV&quot;, target: &quot;Electricity grid&quot;, value: 59.901 },
        {
          source: &quot;Solar Thermal&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 19.263,
        },
        { source: &quot;Solar&quot;, target: &quot;Solar Thermal&quot;, value: 19.263 },
        { source: &quot;Solar&quot;, target: &quot;Solar PV&quot;, value: 59.901 },
        { source: &quot;Solid&quot;, target: &quot;Agriculture&quot;, value: 0.882 },
        { source: &quot;Solid&quot;, target: &quot;Thermal generation&quot;, value: 400.12 },
        { source: &quot;Solid&quot;, target: &quot;Industry&quot;, value: 46.477 },
        {
          source: &quot;Thermal generation&quot;,
          target: &quot;Electricity grid&quot;,
          value: 525.531,
        },
        { source: &quot;Thermal generation&quot;, target: &quot;Losses&quot;, value: 787.129 },
        {
          source: &quot;Thermal generation&quot;,
          target: &quot;District heating&quot;,
          value: 79.329,
        },
        { source: &quot;Tidal&quot;, target: &quot;Electricity grid&quot;, value: 9.452 },
        {
          source: &quot;UK land based bioenergy&quot;,
          target: &quot;Bio-conversion&quot;,
          value: 182.01,
        },
        { source: &quot;Wave&quot;, target: &quot;Electricity grid&quot;, value: 19.013 },
        { source: &quot;Wind&quot;, target: &quot;Electricity grid&quot;, value: 289.366 },
      ],
      label: {
        position: &quot;top&quot;,
        fontSize: 10,
        lineHeight: 12,
        align: &#39;left&#39;
      },
      nodeGap: 20,
      lineStyle: {
        color: &quot;source&quot;,
        curveness: 0.5,
      },
    },
  ],
};
    return applyDefaults(defaults, config);
  }
  //create chart instance
  const ctx = document.querySelector(&quot;#echarts-lpvrfsogsiwn&quot;);
  let config = adjustConfig()
  let chart;
  if (config.renderOptions?.renderer) {
    chart = echarts.init(ctx, null, { renderer: config.renderOptions.renderer });
  } else {
    chart = echarts.init(ctx);
  }
  function renderChart() {
    try {
      const config = adjustConfig();
      ctx.setAttribute(&#39;class&#39;,&#39;echarts-container&#39;);
      for(const data of config.series) {
        ctx.classList.add(data.type);
      }
      if (config.figcaption) {
        const figure = document.querySelector(&quot;#echarts-bjkwyfmtsvfx&quot;);
        let figcaption = figure.querySelector(&#39;figcaption&#39;);
        if (!figcaption) {
          figcaption = document.createElement(&#39;figcaption&#39;);
          figure.appendChild(figcaption);
        }
        figcaption.innerHTML = config.figcaption;
      }
      const renderOptions = config?.renderOptions
      delete config?.figcaption;
      delete config?.renderOptions;
      chart.setOption(config, renderOptions);
    } catch (err) {
      console.error(err);
    }
  }
  renderChart();
  const debouncedRender = debounce(() =&gt; {
      chart.resize();
      renderChart();
    }, config.renderOptions?.debounceMillis || 16);
  const resizeObserver = new ResizeObserver(() =&gt; {
    requestAnimationFrame(() =&gt; {
      debouncedRender();
    });
  });
  resizeObserver.observe(ctx);
  const darkModeQuery = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;);
  darkModeQuery.addEventListener(&#39;change&#39;, debouncedRender);
  &lt;/script&gt;
&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;charts&lt;/span&gt;
&lt;span class=&quot;token code-block language-charts language-charts language-charts&quot;&gt;const config = {
  tooltip: {
    trigger: &quot;item&quot;,
    triggerOn: &quot;mousemove&quot;,
  },
  animation: true,
  series: [
    {
      type: &quot;sankey&quot;,
      bottom: &quot;10%&quot;,
      emphasis: {
        focus: &quot;adjacency&quot;,
      },
      data: [
        {
          name: &quot;Agricultural &#39;waste&#39;&quot;,
        },
        { name: &quot;Bio-conversion&quot; },
        { name: &quot;Biofuel imports&quot; },
        { name: &quot;Biomass imports&quot; },
        { name: &quot;Coal imports&quot; },
        { name: &quot;Coal reserves&quot; },
        { name: &quot;Coal&quot; },
        {
          name: &quot;District heating&quot;,
        },
        {
          name: &quot;Electricity grid&quot;,
        },
        { name: &quot;Gas imports&quot; },
        { name: &quot;Gas reserves&quot; },
        {
          name: &quot;Gas&quot;,
        },
        { name: &quot;Geothermal&quot; },
        { name: &quot;H2 conversion&quot; },
        { name: &quot;H2&quot; },
        { name: &quot;Hydro&quot; },
        { name: &quot;Liquid&quot; },
        { name: &quot;Marine algae&quot; },
        { name: &quot;NGas&quot; },
        { name: &quot;Nuclear&quot; },
        { name: &quot;Oil imports&quot; },
        { name: &quot;Oil reserves&quot; },
        { name: &quot;Oil&quot; },
        { name: &quot;Other waste&quot; },
        {
          name: &quot;Pumped heat&quot;,
        },
        { name: &quot;Solar PV&quot; },
        {
          name: &quot;Solar Thermal&quot;,
        },
        { name: &quot;Solar&quot; },
        {
          name: &quot;Thermal generation&quot;,
        },
        { name: &quot;Tidal&quot; },
        {
          name: &quot;UK land based bioenergy&quot;,
        },
        { name: &quot;Wave&quot; },
        { name: &quot;Wind&quot; },
      ],
      links: [
        {
          source: &quot;Agricultural &#39;waste&#39;&quot;,
          target: &quot;Bio-conversion&quot;,
          value: 124.729,
        },
        { source: &quot;Bio-conversion&quot;, target: &quot;Liquid&quot;, value: 0.597 },
        { source: &quot;Bio-conversion&quot;, target: &quot;Losses&quot;, value: 26.862 },
        { source: &quot;Bio-conversion&quot;, target: &quot;Solid&quot;, value: 280.322 },
        { source: &quot;Bio-conversion&quot;, target: &quot;Gas&quot;, value: 81.144 },
        { source: &quot;Biofuel imports&quot;, target: &quot;Liquid&quot;, value: 35 },
        { source: &quot;Biomass imports&quot;, target: &quot;Solid&quot;, value: 35 },
        { source: &quot;Coal imports&quot;, target: &quot;Coal&quot;, value: 11.606 },
        { source: &quot;Coal reserves&quot;, target: &quot;Coal&quot;, value: 63.965 },
        { source: &quot;Coal&quot;, target: &quot;Solid&quot;, value: 75.571 },
        { source: &quot;District heating&quot;, target: &quot;Industry&quot;, value: 10.639 },
        {
          source: &quot;District heating&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 22.505,
        },
        {
          source: &quot;District heating&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 46.184,
        },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Over generation / exports&quot;,
          value: 104.453,
        },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 113.726,
        },
        { source: &quot;Electricity grid&quot;, target: &quot;H2 conversion&quot;, value: 27.14 },
        { source: &quot;Electricity grid&quot;, target: &quot;Industry&quot;, value: 342.165 },
        { source: &quot;Electricity grid&quot;, target: &quot;Road transport&quot;, value: 37.797 },
        { source: &quot;Electricity grid&quot;, target: &quot;Agriculture&quot;, value: 4.412 },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 40.858,
        },
        { source: &quot;Electricity grid&quot;, target: &quot;Losses&quot;, value: 56.691 },
        { source: &quot;Electricity grid&quot;, target: &quot;Rail transport&quot;, value: 7.863 },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Lighting &amp;amp; appliances - commercial&quot;,
          value: 90.008,
        },
        {
          source: &quot;Electricity grid&quot;,
          target: &quot;Lighting &amp;amp; appliances - homes&quot;,
          value: 93.494,
        },
        { source: &quot;Gas imports&quot;, target: &quot;NGas&quot;, value: 40.719 },
        { source: &quot;Gas reserves&quot;, target: &quot;NGas&quot;, value: 82.233 },
        {
          source: &quot;Gas&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 0.129,
        },
        { source: &quot;Gas&quot;, target: &quot;Losses&quot;, value: 1.401 },
        { source: &quot;Gas&quot;, target: &quot;Thermal generation&quot;, value: 151.891 },
        { source: &quot;Gas&quot;, target: &quot;Agriculture&quot;, value: 2.096 },
        { source: &quot;Gas&quot;, target: &quot;Industry&quot;, value: 48.58 },
        { source: &quot;Geothermal&quot;, target: &quot;Electricity grid&quot;, value: 7.013 },
        { source: &quot;H2 conversion&quot;, target: &quot;H2&quot;, value: 20.897 },
        { source: &quot;H2 conversion&quot;, target: &quot;Losses&quot;, value: 6.242 },
        { source: &quot;H2&quot;, target: &quot;Road transport&quot;, value: 20.897 },
        { source: &quot;Hydro&quot;, target: &quot;Electricity grid&quot;, value: 6.995 },
        { source: &quot;Liquid&quot;, target: &quot;Industry&quot;, value: 121.066 },
        { source: &quot;Liquid&quot;, target: &quot;International shipping&quot;, value: 128.69 },
        { source: &quot;Liquid&quot;, target: &quot;Road transport&quot;, value: 135.835 },
        { source: &quot;Liquid&quot;, target: &quot;Domestic aviation&quot;, value: 14.458 },
        { source: &quot;Liquid&quot;, target: &quot;International aviation&quot;, value: 206.267 },
        { source: &quot;Liquid&quot;, target: &quot;Agriculture&quot;, value: 3.64 },
        { source: &quot;Liquid&quot;, target: &quot;National navigation&quot;, value: 33.218 },
        { source: &quot;Liquid&quot;, target: &quot;Rail transport&quot;, value: 4.413 },
        { source: &quot;Marine algae&quot;, target: &quot;Bio-conversion&quot;, value: 4.375 },
        { source: &quot;NGas&quot;, target: &quot;Gas&quot;, value: 122.952 },
        { source: &quot;Nuclear&quot;, target: &quot;Thermal generation&quot;, value: 839.978 },
        { source: &quot;Oil imports&quot;, target: &quot;Oil&quot;, value: 504.287 },
        { source: &quot;Oil reserves&quot;, target: &quot;Oil&quot;, value: 107.703 },
        { source: &quot;Oil&quot;, target: &quot;Liquid&quot;, value: 611.99 },
        { source: &quot;Other waste&quot;, target: &quot;Solid&quot;, value: 56.587 },
        { source: &quot;Other waste&quot;, target: &quot;Bio-conversion&quot;, value: 77.81 },
        {
          source: &quot;Pumped heat&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 193.026,
        },
        {
          source: &quot;Pumped heat&quot;,
          target: &quot;Heating and cooling - commercial&quot;,
          value: 70.672,
        },
        { source: &quot;Solar PV&quot;, target: &quot;Electricity grid&quot;, value: 59.901 },
        {
          source: &quot;Solar Thermal&quot;,
          target: &quot;Heating and cooling - homes&quot;,
          value: 19.263,
        },
        { source: &quot;Solar&quot;, target: &quot;Solar Thermal&quot;, value: 19.263 },
        { source: &quot;Solar&quot;, target: &quot;Solar PV&quot;, value: 59.901 },
        { source: &quot;Solid&quot;, target: &quot;Agriculture&quot;, value: 0.882 },
        { source: &quot;Solid&quot;, target: &quot;Thermal generation&quot;, value: 400.12 },
        { source: &quot;Solid&quot;, target: &quot;Industry&quot;, value: 46.477 },
        {
          source: &quot;Thermal generation&quot;,
          target: &quot;Electricity grid&quot;,
          value: 525.531,
        },
        { source: &quot;Thermal generation&quot;, target: &quot;Losses&quot;, value: 787.129 },
        {
          source: &quot;Thermal generation&quot;,
          target: &quot;District heating&quot;,
          value: 79.329,
        },
        { source: &quot;Tidal&quot;, target: &quot;Electricity grid&quot;, value: 9.452 },
        {
          source: &quot;UK land based bioenergy&quot;,
          target: &quot;Bio-conversion&quot;,
          value: 182.01,
        },
        { source: &quot;Wave&quot;, target: &quot;Electricity grid&quot;, value: 19.013 },
        { source: &quot;Wind&quot;, target: &quot;Electricity grid&quot;, value: 289.366 },
      ],
      label: {
        position: &quot;top&quot;,
        fontSize: 10,
        lineHeight: 12,
        align: &#39;left&#39;
      },
      nodeGap: 20,
      lineStyle: {
        color: &quot;source&quot;,
        curveness: 0.5,
      },
    },
  ],
};&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;echarts-large-area-chart&quot; tabindex=&quot;-1&quot;&gt;ECharts Large Area Chart&lt;/h3&gt;
&lt;p&gt;The large area chart, with its level of interaction, is a case where ECharts shines. I add it here to highlight what ECharts can do.&lt;/p&gt;
&lt;figure id=&quot;echarts-ydqfixyqxplh&quot; class=&quot;echarts&quot;&gt;
  &lt;div id=&quot;echarts-zfrastpaceej&quot; class=&quot;echarts-container&quot;&gt;
  &lt;/div&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;module&quot;&gt;
  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      const context = this;
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() =&gt; func.apply(context, args), delay);
    }
  }
  function deepMerge(target, ...sources) {
    for (const source of sources) {
      for (const k in source) {
        let vs = source[k], vt = target[k]
        if (Object(vs) == vs &amp;&amp; Object(vt) === vt) {
          target[k] = deepMerge(vt, vs)
          continue
        }
        target[k] = source[k]
      }
    }
    return target
  }
  function applyDefaults(defaults, config) {
     const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;
     let adjustedConfig;
     if (isDarkMode &amp;&amp; defaults.darkModeConfig) {
       defaults = deepMerge({}, defaults, defaults.darkModeConfig);
       adjustedConfig = deepMerge({}, config, config.darkModeConfig);
     } else {
       defaults = deepMerge({}, defaults);
       adjustedConfig = deepMerge({}, config);
     }
     delete defaults.darkModeConfig;
     delete adjustedConfig.darkModeConfig;
     if (defaults.series &amp;&amp; adjustedConfig.series) {
       for (const def in defaults.series) {
         for (const conf of adjustedConfig.series) {
           conf[def] = deepMerge({}, defaults.series[def], conf[def]);
         }
       }
     }
     delete defaults.series;
     adjustedConfig = deepMerge(defaults, adjustedConfig);
     return adjustedConfig;
  }
  function getDefaults() {
    return {&quot;color&quot;:[&quot;#007affa0&quot;,&quot;#ffa500a0&quot;,&quot;#008000a0&quot;,&quot;#9370DBa0&quot;,&quot;#FFD700a0&quot;,&quot;#ff0000a0&quot;],&quot;renderOptions&quot;:{&quot;renderer&quot;:&quot;svg&quot;},&quot;aria&quot;:{&quot;show&quot;:true},&quot;toolbox&quot;:{&quot;feature&quot;:{&quot;restore&quot;:{},&quot;saveAsImage&quot;:{},&quot;dataView&quot;:{}}},&quot;title&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;}},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;},&quot;grid&quot;:{&quot;left&quot;:0,&quot;containLabel&quot;:true},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#262626&quot;}},&quot;splitLine&quot;:{&quot;show&quot;:false},&quot;splitArea&quot;:{&quot;show&quot;:false}},&quot;series&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}}}},&quot;darkModeConfig&quot;:{&quot;title&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}},&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;series&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;markLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;splitLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}}}}};
  }
  function adjustConfig() {
    const defaults = getDefaults();
    const container = document.querySelector(&quot;#echarts-zfrastpaceej&quot;); //might be used by chart config
    const containerWidth = ctx.clientWidth; //might be used by chart config
    const containerHeight = ctx.clientHeight; //might be used by chart config
    const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;  //might be used by chart config
    let base = +new Date(1968, 9, 3);
let oneDay = 24 * 3600 * 1000;
let date = [];
let data = [Math.random() * 300];
for (let i = 1; i &lt; 20000; i++) {
  var now = new Date((base += oneDay));
  date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join(&#39;/&#39;));
  data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
}
const config = {
  figcaption: &#39;A large area chart, generated by ECharts&#39;,
  tooltip: {
    trigger: &#39;axis&#39;,
    position: function (pt) {
      return [pt[0], &#39;10%&#39;];
    }
  },
  title: {
    left: &#39;center&#39;,
    text: &#39;Large Area Chart&#39;
  },
  toolbox: {
    feature: {
      dataZoom: {
        yAxisIndex: &#39;none&#39;
      },
      restore: {},
      saveAsImage: {}
    }
  },
  xAxis: {
    type: &#39;category&#39;,
    boundaryGap: false,
    data: date
  },
  yAxis: {
    type: &#39;value&#39;,
    boundaryGap: [0, &#39;100%&#39;]
  },
  dataZoom: [
    {
      type: &#39;inside&#39;,
      start: 0,
      end: 10
    },
    {
      start: 0,
      end: 10
    }
  ],
  series: [
    {
      name: &#39;Fake Data&#39;,
      type: &#39;line&#39;,
      symbol: &#39;none&#39;,
      sampling: &#39;lttb&#39;,
      itemStyle: {
        color: &#39;rgb(255, 70, 131)&#39;
      },
      areaStyle: {
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          {
            offset: 0,
            color: &#39;rgb(255, 158, 68)&#39;
          },
          {
            offset: 1,
            color: &#39;rgb(255, 70, 131)&#39;
          }
        ])
      },
      data: data
    }
  ]
};
    return applyDefaults(defaults, config);
  }
  //create chart instance
  const ctx = document.querySelector(&quot;#echarts-zfrastpaceej&quot;);
  let config = adjustConfig()
  let chart;
  if (config.renderOptions?.renderer) {
    chart = echarts.init(ctx, null, { renderer: config.renderOptions.renderer });
  } else {
    chart = echarts.init(ctx);
  }
  function renderChart() {
    try {
      const config = adjustConfig();
      ctx.setAttribute(&#39;class&#39;,&#39;echarts-container&#39;);
      for(const data of config.series) {
        ctx.classList.add(data.type);
      }
      if (config.figcaption) {
        const figure = document.querySelector(&quot;#echarts-ydqfixyqxplh&quot;);
        let figcaption = figure.querySelector(&#39;figcaption&#39;);
        if (!figcaption) {
          figcaption = document.createElement(&#39;figcaption&#39;);
          figure.appendChild(figcaption);
        }
        figcaption.innerHTML = config.figcaption;
      }
      const renderOptions = config?.renderOptions
      delete config?.figcaption;
      delete config?.renderOptions;
      chart.setOption(config, renderOptions);
    } catch (err) {
      console.error(err);
    }
  }
  renderChart();
  const debouncedRender = debounce(() =&gt; {
      chart.resize();
      renderChart();
    }, config.renderOptions?.debounceMillis || 16);
  const resizeObserver = new ResizeObserver(() =&gt; {
    requestAnimationFrame(() =&gt; {
      debouncedRender();
    });
  });
  resizeObserver.observe(ctx);
  const darkModeQuery = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;);
  darkModeQuery.addEventListener(&#39;change&#39;, debouncedRender);
  &lt;/script&gt;
&lt;/figure&gt;&lt;details&gt;
&lt;summary&gt;&lt;span class=&quot;details-marker&quot;&gt;&lt;/span&gt;How to embed into Markdown&lt;/summary&gt;&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;echarts&lt;/span&gt;
&lt;span class=&quot;token code-block language-echarts language-echarts language-echarts&quot;&gt;let base = +new Date(1968, 9, 3);
let oneDay = 24 * 3600 * 1000;
let date = [];
let data = [Math.random() * 300];
for (let i = 1; i &amp;lt; 20000; i++) {
  var now = new Date((base += oneDay));
  date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join(&#39;/&#39;));
  data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
}
const config = {
  tooltip: {
    trigger: &#39;axis&#39;,
    position: function (pt) {
      return [pt[0], &#39;10%&#39;];
    }
  },
  title: {
    left: &#39;center&#39;,
    text: &#39;Large Area Chart&#39;
  },
  toolbox: {
    feature: {
      dataZoom: {
        yAxisIndex: &#39;none&#39;
      },
      restore: {},
      saveAsImage: {}
    }
  },
  xAxis: {
    type: &#39;category&#39;,
    boundaryGap: false,
    data: date
  },
  yAxis: {
    type: &#39;value&#39;,
    boundaryGap: [0, &#39;100%&#39;]
  },
  dataZoom: [
    {
      type: &#39;inside&#39;,
      start: 0,
      end: 10
    },
    {
      start: 0,
      end: 10
    }
  ],
  series: [
    {
      name: &#39;Fake Data&#39;,
      type: &#39;line&#39;,
      symbol: &#39;none&#39;,
      sampling: &#39;lttb&#39;,
      itemStyle: {
        color: &#39;rgb(255, 70, 131)&#39;
      },
      areaStyle: {
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          {
            offset: 0,
            color: &#39;rgb(255, 158, 68)&#39;
          },
          {
            offset: 1,
            color: &#39;rgb(255, 70, 131)&#39;
          }
        ])
      },
      data: data
    }
  ]
};&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Mermaid works well and allows to be quick with charts that fit into the software development domain. Though it is possible to influence the styling of the diagrams, it&#39;s not straight-forward enough in my view so that I refrain from doing any custom styling and instead use the default Mermaid styles. I enjoy getting a proper flowchart from a few lines of text and being able to change the chart with ease. This is a good example for the power of text-to-chart when the chart syntax fits its context.&lt;/p&gt;
&lt;p&gt;ECharts is my go-to choice for general purpose charts. The concepts are powerful yet simple enough, the results are beautiful, interactive, and can be styled to a certain look, including a dark-mode switch. The ECharts approach of enhancing accessibility by the automatic generation of aria-labels from the data shown is a smart move and a big plus on the feature list. I&#39;m impressed of what is doable with this charting library.&lt;/p&gt;

    <hr/><p><strong><a href="">Text-to-Chart</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-16-text-to-chart/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Mermaid online editor</title>
    <link href="https://ulfschneider.io/2025-08-16-mermaid-online-editor/" />
    <updated>2025-08-16T07:49:45Z</updated>
    <id>https://ulfschneider.io/2025-08-16-mermaid-online-editor/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://mermaid.live&quot;&gt;&lt;cite&gt;mermaid.live&lt;/cite&gt;&lt;/a&gt; is the online editor for Mermaid charts.&lt;/p&gt;

    <hr/><p><strong><a href="">Mermaid online editor</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-16-mermaid-online-editor/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>ECharts online editor</title>
    <link href="https://ulfschneider.io/2025-08-16-echarts-online-editor/" />
    <updated>2025-08-16T07:49:45Z</updated>
    <id>https://ulfschneider.io/2025-08-16-echarts-online-editor/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://echarts.apache.org/examples/editor.html&quot;&gt;&lt;cite&gt;echarts.apache.org/examples/editor.html&lt;/cite&gt;&lt;/a&gt; is the online editor for ECharts.&lt;/p&gt;

    <hr/><p><strong><a href="">ECharts online editor</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-08-16-echarts-online-editor/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>mermaid-cli-batch</title>
    <link href="https://ulfschneider.io/tools/mermaid-cli-batch/" />
    <updated>2025-08-10T15:11:38Z</updated>
    <id>https://ulfschneider.io/tools/mermaid-cli-batch/</id>
    <content type="html">&lt;p&gt;A command line tool to process multiple diagrams in one pass into SVG  images.&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/mermaid-cli-batch&quot;&gt;&lt;cite&gt;mermaid-cli-batch&lt;/cite&gt;&lt;/a&gt; is a npm/node based command-line tool to process &lt;a href=&quot;https://mermaid.js.org&quot;&gt;Mermaid&lt;/a&gt; diagram definition files in batches. For instance, to convert all &lt;code&gt;.mmd&lt;/code&gt; files to SVG images, run the command:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;npx mermaid-cli-batch &lt;span class=&quot;token parameter variable&quot;&gt;--input&lt;/span&gt; *.mmd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;List possible tool settings by issuing the command:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;npx mermaid-cli-batch &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mermaid-cli-batch has a peer dependency to Playwright that you have to install by yourself prior of using the package:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i playwright
npx playwright &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; chromium&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allows you to update playwright independently of mermaid-cli-batch!&lt;/p&gt;

    <hr/><p><strong><a href="">mermaid-cli-batch</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/tools/mermaid-cli-batch/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>markdown-it-responsive-echarts</title>
    <link href="https://ulfschneider.io/tools/markdown-it-responsive-echarts/" />
    <updated>2025-08-10T12:45:00Z</updated>
    <id>https://ulfschneider.io/tools/markdown-it-responsive-echarts/</id>
    <content type="html">&lt;p&gt;A plugin to render &lt;a href=&quot;https://echarts.apache.org/&quot;&gt;ECharts&lt;/a&gt; with markdown-it.&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/markdown-it-responsive-echarts&quot;&gt;&lt;cite&gt;markdown-it-responsive-echarts&lt;/cite&gt;&lt;/a&gt; enhances your Markdown capabilities by instantiating interactive and responsive &lt;a href=&quot;https://echarts.apache.org/&quot;&gt;ECharts&lt;/a&gt; that can react to light mode and dark mode.&lt;/p&gt;
&lt;p&gt;Install the plugin with&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; data-language=&quot;Shell&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; markdown-it-responsive-echarts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and add it to your markdown-it setup&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; data-language=&quot;JavaScript&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; markdownItECharts &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;markdown-it-responsive-echarts&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; markdownIt &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;markdown-it&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; md &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;markdownIt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
md&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;markdownItECharts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to render charts like the one below.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://www.npmjs.com/package/markdown-it-responsive-echarts&quot;&gt;plugin page&lt;/a&gt; to learn about the configuration options.&lt;/p&gt;
&lt;figure id=&quot;echarts-yyadzlxcyxtb&quot; class=&quot;echarts&quot;&gt;
  &lt;div id=&quot;echarts-mnunbgcatqdy&quot; class=&quot;echarts-container&quot;&gt;
  &lt;/div&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;module&quot;&gt;
  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      const context = this;
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() =&gt; func.apply(context, args), delay);
    }
  }
  function deepMerge(target, ...sources) {
    for (const source of sources) {
      for (const k in source) {
        let vs = source[k], vt = target[k]
        if (Object(vs) == vs &amp;&amp; Object(vt) === vt) {
          target[k] = deepMerge(vt, vs)
          continue
        }
        target[k] = source[k]
      }
    }
    return target
  }
  function applyDefaults(defaults, config) {
     const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;
     let adjustedConfig;
     if (isDarkMode &amp;&amp; defaults.darkModeConfig) {
       defaults = deepMerge({}, defaults, defaults.darkModeConfig);
       adjustedConfig = deepMerge({}, config, config.darkModeConfig);
     } else {
       defaults = deepMerge({}, defaults);
       adjustedConfig = deepMerge({}, config);
     }
     delete defaults.darkModeConfig;
     delete adjustedConfig.darkModeConfig;
     if (defaults.series &amp;&amp; adjustedConfig.series) {
       for (const def in defaults.series) {
         for (const conf of adjustedConfig.series) {
           conf[def] = deepMerge({}, defaults.series[def], conf[def]);
         }
       }
     }
     delete defaults.series;
     adjustedConfig = deepMerge(defaults, adjustedConfig);
     return adjustedConfig;
  }
  function getDefaults() {
    return {&quot;color&quot;:[&quot;#007affa0&quot;,&quot;#ffa500a0&quot;,&quot;#008000a0&quot;,&quot;#9370DBa0&quot;,&quot;#FFD700a0&quot;,&quot;#ff0000a0&quot;],&quot;renderOptions&quot;:{&quot;renderer&quot;:&quot;svg&quot;},&quot;aria&quot;:{&quot;show&quot;:true},&quot;toolbox&quot;:{&quot;feature&quot;:{&quot;restore&quot;:{},&quot;saveAsImage&quot;:{},&quot;dataView&quot;:{}}},&quot;title&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;}},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:18,&quot;color&quot;:&quot;#262626&quot;},&quot;grid&quot;:{&quot;left&quot;:0,&quot;containLabel&quot;:true},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#262626&quot;}},&quot;splitLine&quot;:{&quot;show&quot;:false},&quot;splitArea&quot;:{&quot;show&quot;:false}},&quot;series&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;fontFamily&quot;:&quot;&#39;iA Writer Quattro&#39;, system-ui, sans-serif&quot;,&quot;fontSize&quot;:16,&quot;color&quot;:&quot;#262626&quot;}}}},&quot;darkModeConfig&quot;:{&quot;title&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;radar&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}},&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;},&quot;legend&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;series&quot;:{&quot;name&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}},&quot;markLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;splitLine&quot;:{&quot;lineStyle&quot;:{&quot;color&quot;:&quot;#888&quot;}},&quot;markPoint&quot;:{&quot;label&quot;:{&quot;textStyle&quot;:{&quot;color&quot;:&quot;#c3c3c3&quot;}}}}}};
  }
  function adjustConfig() {
    const defaults = getDefaults();
    const container = document.querySelector(&quot;#echarts-mnunbgcatqdy&quot;); //might be used by chart config
    const containerWidth = ctx.clientWidth; //might be used by chart config
    const containerHeight = ctx.clientHeight; //might be used by chart config
    const isDarkMode = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;).matches;  //might be used by chart config
    var xAxisData = [];
var data1 = [];
var data2 = [];
for (var i = 0; i &lt; 100; i++) {
  xAxisData.push(&#39;A&#39; + i);
  data1.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5);
  data2.push((Math.cos(i / 5) * (i / 5 - 10) + i / 6) * 5);
}
const config = {
  figcaption: &quot;An EChart rendered with markdown-it-interactive-echarts. The chart definition is taken from the ECharts example titled &lt;a href=&#39;https://echarts.apache.org/examples/en/editor.html?c=bar-animation-delay&#39;&gt;&lt;cite&gt;Bar Animation Delay&lt;/cite&gt;&lt;/a&gt;.&quot;,
  title: {
    text: &#39;Bar Animation Delay&#39;
  },
  legend: {
    data: [&#39;bar&#39;, &#39;bar2&#39;]
  },
  toolbox: {
    // y: &#39;bottom&#39;,
    feature: {
      magicType: {
        type: [&#39;stack&#39;]
      },
      dataView: {},
      saveAsImage: {
        pixelRatio: 2
      }
    }
  },
  tooltip: {},
  xAxis: {
    data: xAxisData,
    splitLine: {
      show: false
    }
  },
  yAxis: {},
  series: [
    {
      name: &#39;bar&#39;,
      type: &#39;bar&#39;,
      data: data1,
      emphasis: {
        focus: &#39;series&#39;
      },
      animationDelay: function (idx) {
        return idx * 10;
      }
    },
    {
      name: &#39;bar2&#39;,
      type: &#39;bar&#39;,
      data: data2,
      emphasis: {
        focus: &#39;series&#39;
      },
      animationDelay: function (idx) {
        return idx * 10 + 100;
      }
    }
  ],
  animationEasing: &#39;elasticOut&#39;,
  animationDelayUpdate: function (idx) {
    return idx * 5;
  }
};
    return applyDefaults(defaults, config);
  }
  //create chart instance
  const ctx = document.querySelector(&quot;#echarts-mnunbgcatqdy&quot;);
  let config = adjustConfig()
  let chart;
  if (config.renderOptions?.renderer) {
    chart = echarts.init(ctx, null, { renderer: config.renderOptions.renderer });
  } else {
    chart = echarts.init(ctx);
  }
  function renderChart() {
    try {
      const config = adjustConfig();
      ctx.setAttribute(&#39;class&#39;,&#39;echarts-container&#39;);
      for(const data of config.series) {
        ctx.classList.add(data.type);
      }
      if (config.figcaption) {
        const figure = document.querySelector(&quot;#echarts-yyadzlxcyxtb&quot;);
        let figcaption = figure.querySelector(&#39;figcaption&#39;);
        if (!figcaption) {
          figcaption = document.createElement(&#39;figcaption&#39;);
          figure.appendChild(figcaption);
        }
        figcaption.innerHTML = config.figcaption;
      }
      const renderOptions = config?.renderOptions
      delete config?.figcaption;
      delete config?.renderOptions;
      chart.setOption(config, renderOptions);
    } catch (err) {
      console.error(err);
    }
  }
  renderChart();
  const debouncedRender = debounce(() =&gt; {
      chart.resize();
      renderChart();
    }, config.renderOptions?.debounceMillis || 16);
  const resizeObserver = new ResizeObserver(() =&gt; {
    requestAnimationFrame(() =&gt; {
      debouncedRender();
    });
  });
  resizeObserver.observe(ctx);
  const darkModeQuery = window.matchMedia(&#39;(prefers-color-scheme: dark)&#39;);
  darkModeQuery.addEventListener(&#39;change&#39;, debouncedRender);
  &lt;/script&gt;
&lt;/figure&gt;&lt;p&gt;The above chart is generated by putting the below chart definition into a fenced code block inside of your Markdown text. The fenced code block must be introduced by the identifier &lt;code&gt;echarts&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; style=&quot;display: flex; align-items: center;&quot;&gt;&lt;svg class=&quot;octicon octicon-info&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&amp;nbsp;Note&lt;/p&gt;&lt;p&gt;It is mandatory to create an object named &lt;code&gt;config&lt;/code&gt; that holds your chart definition. You cannot choose a different name!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-markdown&quot; data-language=&quot;Markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token code&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;token code-language&quot;&gt;echarts&lt;/span&gt;
&lt;span class=&quot;token code-block language-echarts language-echarts language-echarts&quot;&gt;var xAxisData = [];
var data1 = [];
var data2 = [];
for (var i = 0; i &amp;lt; 100; i++) {
  xAxisData.push(&#39;A&#39; + i);
  data1.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5);
  data2.push((Math.cos(i / 5) * (i / 5 - 10) + i / 6) * 5);
}
//your chart definition must be stored in an object named config
//you cannot choose a different name
const config = {
  figcaption: &quot;An EChart rendered with markdown-it-interactive-echarts. The chart definition is taken from the ECharts example titled &amp;lt;a href=&#39;https://echarts.apache.org/examples/en/editor.html?c=bar-animation-delay&#39;&gt;&amp;lt;cite&gt;Bar Animation Delay&amp;lt;/cite&gt;&amp;lt;/a&gt;.&quot;,
  title: {
    text: &#39;Bar Animation Delay&#39;
  },
  legend: {
    data: [&#39;bar&#39;, &#39;bar2&#39;]
  },
  toolbox: {
    // y: &#39;bottom&#39;,
    feature: {
      magicType: {
        type: [&#39;stack&#39;]
      },
      dataView: {},
      saveAsImage: {
        pixelRatio: 2
      }
    }
  },
  tooltip: {},
  xAxis: {
    data: xAxisData,
    splitLine: {
      show: false
    }
  },
  yAxis: {},
  series: [
    {
      name: &#39;bar&#39;,
      type: &#39;bar&#39;,
      data: data1,
      emphasis: {
        focus: &#39;series&#39;
      },
      animationDelay: function (idx) {
        return idx * 10;
      }
    },
    {
      name: &#39;bar2&#39;,
      type: &#39;bar&#39;,
      data: data2,
      emphasis: {
        focus: &#39;series&#39;
      },
      animationDelay: function (idx) {
        return idx * 10 + 100;
      }
    }
  ],
  animationEasing: &#39;elasticOut&#39;,
  animationDelayUpdate: function (idx) {
    return idx * 5;
  }
};&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

    <hr/><p><strong><a href="">markdown-it-responsive-echarts</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/tools/markdown-it-responsive-echarts/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Tosbot</title>
    <link href="https://ulfschneider.io/2025-07-28-tosbot/" />
    <updated>2026-04-26T18:30:13Z</updated>
    <id>https://ulfschneider.io/2025-07-28-tosbot/</id>
    <content type="html">&lt;p&gt;Wie Emil Deutsch lernte.&lt;/p&gt;
 &lt;blockquote class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; style=&quot;display: flex; align-items: center;&quot;&gt;&lt;svg class=&quot;octicon octicon-info&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&amp;nbsp;Note&lt;/p&gt;&lt;p&gt;The following text is in German language, because it relies heavily on the sound and the understanding of the German language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Während Emil, als er noch ganz jung war, die Deutsche Sprache erlernte, hat er die Worte zunächst auf seine eigene Art benutzt. Diese wunderbaren Wortschöpfungen habe ich damals notiert, und heute, Jahre später, sind sie mir wieder in die Hände gefallen.&lt;/p&gt;
&lt;p&gt;Ein Tosbot war ein Toastbrot, ein Sinebot ein Rosinenbrötchen, ein Meeresriegel ein Fischstäbchen, und Pustewaff war Hustensaft. Viele dieser ersten Worte hatten verständlicherweise mit Essen zu tun.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Abtöpfen = Abschöpfen&lt;/li&gt;
&lt;li&gt;Aschemädchen = Aschenputtel&lt;/li&gt;
&lt;li&gt;Aussaedata = Ausserirdischer&lt;/li&gt;
&lt;li&gt;Bate = Banane&lt;/li&gt;
&lt;li&gt;Beihuckter Hitter = Verrückter Ritter&lt;/li&gt;
&lt;li&gt;Beta = Tablette&lt;/li&gt;
&lt;li&gt;Bissen = Bisschen&lt;/li&gt;
&lt;li&gt;Bock = Bockwurst&lt;/li&gt;
&lt;li&gt;Botsen = Brötchen&lt;/li&gt;
&lt;li&gt;Bruder Japuk = Bruder Jakob&lt;/li&gt;
&lt;li&gt;Butuliert = Tätowiert&lt;/li&gt;
&lt;li&gt;Das butzelt = Das brutzelt&lt;/li&gt;
&lt;li&gt;Dinsaur = Dinosaurier&lt;/li&gt;
&lt;li&gt;Duß = Tschüss&lt;/li&gt;
&lt;li&gt;Emiauch = Emil auch&lt;/li&gt;
&lt;li&gt;Erbsefrau = Prinzessin auf der Erbse&lt;/li&gt;
&lt;li&gt;Fak = Quark&lt;/li&gt;
&lt;li&gt;Fanz = Schwanz&lt;/li&gt;
&lt;li&gt;Fetzelat = Fenchelsalat&lt;/li&gt;
&lt;li&gt;Fodo Oma = Frodo Oma&lt;/li&gt;
&lt;li&gt;Fuchelich = Fürchterlich&lt;/li&gt;
&lt;li&gt;Gepi = Spaghetti&lt;/li&gt;
&lt;li&gt;Habedi = Habe ich dich&lt;/li&gt;
&lt;li&gt;Handluh = Handschuh&lt;/li&gt;
&lt;li&gt;Haussas = Hausschuhe&lt;/li&gt;
&lt;li&gt;Hefe = Helfen&lt;/li&gt;
&lt;li&gt;Hersieren = Rasieren&lt;/li&gt;
&lt;li&gt;Hobbelbot = Roggenbrot&lt;/li&gt;
&lt;li&gt;Hubkesine = Hubschrauber&lt;/li&gt;
&lt;li&gt;Kaba Kaus = Cowboy Klaus&lt;/li&gt;
&lt;li&gt;Kabakau = Kakao&lt;/li&gt;
&lt;li&gt;Kabbel Kabbe = Krabbel Krabbe&lt;/li&gt;
&lt;li&gt;Käfersoff = Hefezopf&lt;/li&gt;
&lt;li&gt;Kafta = Kaspar&lt;/li&gt;
&lt;li&gt;Kak = Kalt&lt;/li&gt;
&lt;li&gt;Kanastik = Gymnastik&lt;/li&gt;
&lt;li&gt;Kappekau = Kakao&lt;/li&gt;
&lt;li&gt;Kavenzlender = Adventskalender&lt;/li&gt;
&lt;li&gt;Kefezopf = Hefezopf&lt;/li&gt;
&lt;li&gt;Keinbem = Kein Problem&lt;/li&gt;
&lt;li&gt;Kenne = Körner&lt;/li&gt;
&lt;li&gt;Konnfexe = Cornflakes&lt;/li&gt;
&lt;li&gt;Kotlik = Kotelett&lt;/li&gt;
&lt;li&gt;Kummel = Krümmel&lt;/li&gt;
&lt;li&gt;Lake = Schokolade&lt;/li&gt;
&lt;li&gt;Lamsas = Langsam&lt;/li&gt;
&lt;li&gt;Lat = Salat&lt;/li&gt;
&lt;li&gt;Lätta = Latz&lt;/li&gt;
&lt;li&gt;Lol = Schnuller&lt;/li&gt;
&lt;li&gt;Ludel = Nudeln&lt;/li&gt;
&lt;li&gt;Lufbon = Luftballon&lt;/li&gt;
&lt;li&gt;Luh = Schuh&lt;/li&gt;
&lt;li&gt;Lukelaus = Nikolaus&lt;/li&gt;
&lt;li&gt;Mani, Lami = Salami&lt;/li&gt;
&lt;li&gt;Marinekäfer = Marienkäfer&lt;/li&gt;
&lt;li&gt;Mate = Tomate&lt;/li&gt;
&lt;li&gt;Maukenbad = Mountainbike&lt;/li&gt;
&lt;li&gt;Meeresriegel = Fischstäbchen&lt;/li&gt;
&lt;li&gt;Meni Oma = Pelmeni Oma&lt;/li&gt;
&lt;li&gt;Morgig = Guten Morgen&lt;/li&gt;
&lt;li&gt;Muksen = Muskeln&lt;/li&gt;
&lt;li&gt;Muna = Müde&lt;/li&gt;
&lt;li&gt;Muze = Mütze&lt;/li&gt;
&lt;li&gt;Nasetupfer = Nasenstupser&lt;/li&gt;
&lt;li&gt;Nogges = Neues&lt;/li&gt;
&lt;li&gt;Nusskaka = Nussknacker&lt;/li&gt;
&lt;li&gt;Oga = Olga (Emil&#39;s Tagesmutter)&lt;/li&gt;
&lt;li&gt;Opposon = Operation&lt;/li&gt;
&lt;li&gt;Pakaka = Paprika&lt;/li&gt;
&lt;li&gt;Patz = Spatz&lt;/li&gt;
&lt;li&gt;Pielen = Spielen&lt;/li&gt;
&lt;li&gt;Pietzlat = Spielplatz&lt;/li&gt;
&lt;li&gt;Pipi Strumpfhose = Pipi Langstrumpf&lt;/li&gt;
&lt;li&gt;Pohelli mit Sene und Fanz = Forelle mit Zähnen und Schwanz&lt;/li&gt;
&lt;li&gt;Pott = Sport&lt;/li&gt;
&lt;li&gt;Pustewaff = Hustensaft&lt;/li&gt;
&lt;li&gt;Putz = Pups&lt;/li&gt;
&lt;li&gt;Sabatee = Salbeitee&lt;/li&gt;
&lt;li&gt;Sapp un mude = Schlapp und müde&lt;/li&gt;
&lt;li&gt;Sappefilik = Zappelfillip&lt;/li&gt;
&lt;li&gt;Sassa = Wasser&lt;/li&gt;
&lt;li&gt;Sinebots = Rosinenbrötchen&lt;/li&gt;
&lt;li&gt;Tam = Tannenzapfen&lt;/li&gt;
&lt;li&gt;Tampfer = Stampfer&lt;/li&gt;
&lt;li&gt;Tassekesine = Straßenkehrmaschine&lt;/li&gt;
&lt;li&gt;Tosbot = Toastbrot&lt;/li&gt;
&lt;li&gt;Waff = Saft&lt;/li&gt;
&lt;li&gt;Wickemode = Wickelkommode&lt;/li&gt;
&lt;li&gt;Woff = Wurst&lt;/li&gt;
&lt;/ul&gt;

    <hr/><p><strong><a href="">Tosbot</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-07-28-tosbot/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>The four-legged octopus</title>
    <link href="https://ulfschneider.io/2025-07-22-four-legged-octopus/" />
    <updated>2025-07-22T08:58:33Z</updated>
    <id>https://ulfschneider.io/2025-07-22-four-legged-octopus/</id>
    <content type="html"> &lt;figure&gt;&lt;img src=&quot;https://ulfschneider.io/img/ux8O6G0K9l-200.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;900&quot; height=&quot;1200&quot; srcset=&quot;https://ulfschneider.io/img/ux8O6G0K9l-200.webp 200w, https://ulfschneider.io/img/ux8O6G0K9l-900.webp 900w&quot; sizes=&quot;100vw&quot;&gt;&lt;/figure&gt;
    <hr/><p><strong><a href="">The four-legged octopus</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-07-22-four-legged-octopus/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>A friendly introduction to SVG</title>
    <link href="https://ulfschneider.io/2025-07-22-friendly-instruction-to-svg/" />
    <updated>2025-08-15T05:38:40Z</updated>
    <id>https://ulfschneider.io/2025-07-22-friendly-instruction-to-svg/</id>
    <content type="html"> &lt;p&gt;&lt;a href=&quot;https://www.joshwcomeau.com/svg/friendly-introduction-to-svg/?from=newsletter&quot;&gt;&lt;cite&gt;A friendly introduction to SVG&lt;/cite&gt;&lt;/a&gt; by Josh Comeau.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This post is intended to be completely beginner-friendly, no previous SVG experience required (though it does assume that you’re familiar with the basics of HTML/CSS/JS).&lt;/p&gt;
&lt;footer&gt;Josh Comeau&lt;/footer&gt;
&lt;/blockquote&gt;

    <hr/><p><strong><a href="">A friendly introduction to SVG</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-07-22-friendly-instruction-to-svg/">Reply via email</a></p></content>
  </entry>
  <entry>
    <title>Safety Notice – Fairlight carbon forks with Ortlieb QLS Fork Pack Mounting System</title>
    <link href="https://ulfschneider.io/2025-07-19-fairlight-ortlieb-safety-notice/" />
    <updated>2025-07-19T19:42:20Z</updated>
    <id>https://ulfschneider.io/2025-07-19-fairlight-ortlieb-safety-notice/</id>
    <content type="html">&lt;p&gt;Fit parts G and H!&lt;/p&gt;
 &lt;p&gt;Fairlight recently issued a &lt;a href=&quot;https://fairlightcycles.com/product-safety-notices/?v=5f02f0889301&quot;&gt;safety notice&lt;/a&gt; regarding the Ortlieb QLS Fork Pack Mounting System attached to Fairlight Secan carbon forks. The Ortlieb system can damage your Fairlight carbon fork if you do not mount it by following  the &lt;a href=&quot;https://downloads.ortlieb.com/instructions/fork_pack.pdf&quot;&gt;Ortlieb installation instruction&lt;/a&gt;. Specifically, &lt;strong&gt;&lt;mark&gt;you have to fit the parts G and H!&lt;/mark&gt;&lt;/strong&gt; If parts G and H are not fitted, the fork rack system will sit against the body of the fork (rather than against the attachment bosses) and &lt;mark&gt;potentially affect the fork’s integrity, which can lead to compromised rider safety&lt;/mark&gt;. If you have ever fitted the QLS Fork Pack Mounting System without parts G and H, &lt;mark&gt;stop riding the affected fork and contact Fairlight immediately&lt;/mark&gt;.&lt;/p&gt;

    <hr/><p><strong><a href="">Safety Notice – Fairlight carbon forks with Ortlieb QLS Fork Pack Mounting System</a></strong> appeared on <a href="https://ulfschneider.io">ulfschneider.io</a>.</p><p><a href="mailto:mail@ulfschneider.io?body=https://ulfschneider.io/2025-07-19-fairlight-ortlieb-safety-notice/">Reply via email</a></p></content>
  </entry>
</feed>
