UpBeat talk

pull/2/head
Oliver Kennedy 2022-10-07 01:12:17 -04:00
parent ba4fb8696c
commit 271bcac632
Signed by: okennedy
GPG Key ID: 3E5F9B3ABD3FDB60
5 changed files with 1194 additions and 0 deletions

View File

@ -0,0 +1,425 @@
---
template: templates/talk_slides_v1.erb
title: "Microkernel Notebooks"
---
<section>
<h2>μKernel Notebooks</h2>
<h4>Oliver Kennedy</h4>
<h5>University at Buffalo</h5>
</section>
<section>
<svg data-src="graphics/2022-06-20/NotebookOverview.svg" height="400px" style="margin-left: -100px"/>
</section>
<section>
<div style="display: inline-block; width: 45%;">
<img src="graphics/2022-06-20/Pimentel.png" height="400px">
<p style="font-size: 70%;"><a href="https://ieeexplore.ieee.org/document/8816763">Pimentel et al</a>: "4.03% of notebooks on github are reproducible"</p>
</div>
<div style="display: inline-block; width: 45%;" class="fragment">
<img src="graphics/2022-06-20/Grus.png">
<p style="font-size: 70%;"><a href="https://www.youtube.com/watch?v=7jiPeIFXb6U">Joel Grus</a>: "For beginners, with dozens of cells and more complex code [the ability to run code snippets out of order] is utterly confusing."</p>
</div>
</section>
<section>
<svg data-src="graphics/2022-06-20/Checkpointing.svg" width="800px"/>
</section>
<section>
<h3><a href="https://github.com/stitchfix/nodebook">Nodebook</a></h3>
<img src="graphics/2022-06-20/Nodebook.png" height="300px">
<attribution><a href="https://github.com/stitchfix/nodebook">https://github.com/stitchfix/nodebook</a></attribution>
</section>
<section>
<svg data-src="graphics/2022-06-20/MonokernelCheckpoints.svg" height="400px" />
<attribution><a href="https://openclipart.org">https://openclipart.org</a></attribution>
</section>
<section>
<img src="graphics/2022-06-20/NoCheckpointing.png" height="400px">
</section>
<section>
<p>A modest proposal...</p>
</section>
<section>
<img src="graphics/2022-06-20/MicrokernelCheckpoints.svg" height="400px">
<attribution>https://openclipart.com</attribution>
</section>
<section>
<p>So now...</p>
</section>
<section>
<img src="graphics/2022-06-20/MicrokernelPyV2Checkpoints.svg" height="400px">
</section>
<section>
<img src="graphics/2022-06-20/MicrokernelPyScalaCheckpoints.svg" height="400px">
</section>
<section>
<p>and...</p>
</section>
<section>
<svg data-src="graphics/2022-06-20/Parallelism.svg" width="800px"/>
</section>
<section>
<p>and...</p>
</section>
<section>
<img src="graphics/2022-10-07/kernel-restarting.png">
<p class="fragment">... or worse ...</p>
</section>
<section>
<img src="graphics/2022-10-07/kernel-failed.png">
</section>
<section>
<p>and...</p>
</section>
<section>
<img src="graphics/2022-10-07/inspector.png">
</section>
<section>
<p>and...</p>
</section>
<section>
<img src="graphics/2022-10-07/dep_graph.svg" height="400px">
</section>
<section>
<h3>Provenance</h3>
<ul>
<li>Automatically re-run dependent cells.</li>
<li>"Jump" to the cell that created an artifact.</li>
<li>Track problems.</li>
<li>... and more</li>
</ul>
</section>
<section>
<h3>... not all smiles and sunshine</h3>
<ul>
<li>Dependency Analysis</li>
<li class="fragment highlight-grey" data-fragment-index="1">Scheduling Cell Execution</li>
<li class="fragment highlight-grey" data-fragment-index="1">Python Startup Costs</li>
<li class="fragment highlight-grey" data-fragment-index="1">Migrating state between kernels</li>
</ul>
</section>
<section>
<pre><code class="python">
def social_link(base, provider = "facebook.com"):
if base is None:
return None
if base.startswith("http://"):
base = base.replace("http://", "https://")
if base.startswith("https://"):
return base
if base.startswith(provider) or base.startswith(f"www.{provider}"):
return "https://"+base
return f"https://{provider}/"+base
vizierdb.export_module(social_link)
</code></pre>
</section>
<section>
<pre><code class="python">
vizierdb.export_module(social_link)
</code></pre>
</section>
<section>
<h3>Explicit Exports</h3>
<ul>
<li class="fragment highlight-grey" data-fragment-index="2">Avoid serializing state unnecessarily</li>
<li>Mitigate explicit dependency analysis</li>
</ul>
<p class="fragment" data-fragment-index="1">... but they're annoying</p>
</section>
<section>
<pre><code class="python">
c = 19
</code></pre>
<pre><code class="python">
b = 23
</code></pre>
<pre><code class="python">
a = b + c
</code></pre>
</section>
<section>
<p><b>Writes: </b> c</p>
<hr>
<p><b>Writes: </b> b</p>
<hr>
<p><b>Reads: </b>b, c; <b>Writes: </b> c</p>
</section>
<section>
<p style="font-size: 200px;">🧹</p>
</section>
<section>
<p>Python's scoping rules are a mess.</p>
<p class="fragment">... fortunately we only care about cross-cell dependencies (for the most part).</p>
</section>
<section>
<pre><code class="python">
import urrlib.request as r
with r.urlopen("https://not.sus.com/code.py") as response:
eval( response.read() )
</code></pre>
</section>
<section>
<p>&nbsp;</p>
<p>???</p>
<p class="fragment">... fortunately eval isn't a major part of notebook use.</p>
</section>
<section>
<pre><code class="python">
import pandas as pd
pd.load_csv("myfile.csv")
</code></pre>
</section>
<section>
<p>&nbsp;</p>
<p>maybe safe???</p>
<p class="fragment">... fortunately libraries are usually good at abstracting.</p>
</section>
<section>
<p>... in short, we're still working on it.</p>
</section>
<section>
<h3>... not all smiles and sunshine</h3>
<ul>
<li class="fragment highlight-grey" data-fragment-index="1">Dependency Analysis</li>
<li>Scheduling Cell Execution</li>
<li class="fragment highlight-grey" data-fragment-index="1">Python Startup Costs</li>
<li class="fragment highlight-grey" data-fragment-index="1">Migrating state between kernels</li>
</ul>
</section>
<section>
<h3>State</h3>
$$\Sigma \rightarrow \mathbb N \cup \{ \emptyset \}$$
<p>(artifact → version)</p>
<p class="fragment">(e.g., $\{ retail \rightarrow 937, markets \rightarrow 252 \}$)</p>
</section>
<section>
<h3>Cell History</h3>
<dl>
<dt>Last Read</dt>
<dd>$2^{\Sigma \times \mathbb N}$ (e.g., $\{ retail \rightarrow 937 \}$)</dd>
<dt>Last Write</dt>
<dd>$2^{\Sigma \times (\mathbb N \cup \{\emptyset\})}$ (e.g., $\{ farmstands \rightarrow 939 \}$)</dd>
</dl>
</section>
<section>
<h3>Execution</h3>
<dl>
<dt>Current State</dt>
<dd>$\{ retail \rightarrow 946, markets \rightarrow 252 \}$</dd>
<div class="fragment">
<dt>Last Read</dt>
<dd class="fragment highlight-red">$\{ retail \rightarrow 937 \}$</dd>
</div>
</dl>
</section>
<section>
<h3>Execution</h3>
<dl>
<dt>Current State</dt>
<dd>$\{ retail \rightarrow 937, markets \rightarrow 252 \}$</dd>
<dt>Last Read</dt>
<dd>$\{ retail \rightarrow 937 \}$</dd>
<div class="fragment">
<dt>Last Write</dt>
<dd>$\{ farmstands \rightarrow 939 \}$</dd>
</div>
<div class="fragment">
<dt>Next State</dt>
<dd>$\{ retail \rightarrow 937, markets \rightarrow 252, farmstands \rightarrow 939 \}$</dd>
</div>
</dl>
</section>
<section>
<h3>Cell Dependencies</h3>
<dl>
<dt>Could Read</dt>
<dd>$2^{\Sigma}$ (e.g., $\{retail\}$ or $everything$)</dd>
<dt>Could Write</dt>
<dd>$2^{\Sigma}$</dd>
</dl>
</section>
<section>
<h3>Execution</h3>
<dl>
<dt>Current State</dt>
<dd>$\{ markets \rightarrow 252 \}$</dd>
<div class="fragment">
<dt>Could Write</dt>
<dd>$\{ retail \}$</dd>
</div>
<div class="fragment">
<dt>Next State</dt>
<dd>$\{ retail \rightarrow ?, markets \rightarrow 252 \}$</dd>
</div>
</dl>
</section>
<section>
<h3>Execution</h3>
<dl>
<dt>Current State</dt>
<dd>$\{ retail \rightarrow ?, markets \rightarrow 252 \}$</dd>
<div class="fragment">
<dt>Last Read</dt>
<dd class="fragment highlight-blue">$\{ retail \rightarrow 937 \}$</dd>
<dd class="fragment">(i.e., State Unknown)</dd>
</div>
</dl>
</section>
<section>
<h3>Scheduling</h3>
<p>is the cell...</p>
<ul>
<li>Guaranteed Reusable</li>
<li>Stale</li>
<li>Stale and Runnable</li>
<li>Unknown</li>
</ul>
</section>
<section>
<h3>Future/Work in progress...</h3>
<ul>
<li class="fragment">Re-using python kernels</li>
<li class="fragment">Migrating state efficiently</li>
<li class="fragment">Minimizing checkpointing</li>
<li class="fragment">Instrumenting python</li>
</ul>
</section>
<!--
<section>
<pre><code>
x = 3
</code></pre>
</section>
<section>
<pre><code>
from foo import x
</code></pre>
</section>
<section>
<pre><code>
x = pandas.read_csv("foo.csv")
</code></pre>
</section>
<section>
<img src="graphics/2022-06-20/arrow.png" height="300px">
</section>
<section>
<img src="graphics/2022-06-20/Vizier-System-Diag.svg" height="300px">
</section>
<section>
<img src="graphics/2022-06-20/Vizier-Polyglot.png" height="500px">
</section>
<section>
<img src="graphics/2022-06-20/Vizier-Load.png" height="500px">
</section>
<section>
<img src="graphics/2022-06-20/Vizier-Spreadsheet.png" height="500px">
</section>
<section>
<img src="graphics/2022-06-20/Vizier-New.png" height="400px">
</section>
-->
<section>
<a href="https://vizierdb.info">
<img src="graphics/2022-06-20/vizier.svg" height="200px">
<p style="margin-top: -20px;">https://vizierdb.info</p>
</a>
<p style="font-size: 65%"><b>Mike Brachmann, Boris Glavic, Nachiket Deo</b>, Juliana Freire, Heiko Mueller, Sonia Castello, Munaf Arshad Qazi, William Spoth, Poonam Kumari, Soham Patel, and more...</p>
</section>

View File

@ -0,0 +1,769 @@
<svg xmlns="http://www.w3.org/2000/svg" stroke="black" height="2580" fill="white" viewbox="0 0 3720 2580" width="3720" stroke-width="1">
<g transform="translate(0 10)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">0</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 395"/>
<rect x="320" y="20" width="180" height="30"/>
<text x="330" y="40">counties</text>
<path stroke="grey" stroke-width="3" d="M 395 5 l 15 15"/>
</g>
</g>
<g transform="translate(0 110)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">3</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 595"/>
<rect x="520" y="20" width="180" height="30"/>
<text x="530" y="40">farms</text>
<path stroke="grey" stroke-width="3" d="M 595 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 100 V 210"/>
<g transform="translate(0 210)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">4</text>
<text x="65" y="20">vizual script</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 600 l 10 10"/>
<rect x="600" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 610 200 V 230"/>
<path stroke="grey" stroke-width="3" d="M 410 100 V 250"/>
<path stroke="grey" stroke-width="3" d="M 610 250 V 250"/>
<g transform="translate(0 250)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 395"/>
<path stroke="grey" stroke-width="3" d="M 395 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">5</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 600 l 10 10"/>
<rect x="600" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 100 V 280"/>
<path stroke="grey" stroke-width="3" d="M 610 250 V 300"/>
<path stroke="grey" stroke-width="3" d="M 410 250 V 320"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 320"/>
<g transform="translate(0 320)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">6</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 795"/>
<rect x="720" y="20" width="180" height="30"/>
<text x="730" y="40">sanitize_website</text>
<path stroke="grey" stroke-width="3" d="M 795 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 420"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 420"/>
<g transform="translate(0 420)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">7</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 995"/>
<rect x="920" y="20" width="180" height="30"/>
<text x="930" y="40">social_link</text>
<path stroke="grey" stroke-width="3" d="M 995 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 520"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 520"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 520"/>
<g transform="translate(0 520)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">8</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 1195"/>
<rect x="1120" y="20" width="180" height="30"/>
<text x="1130" y="40">current_date</text>
<path stroke="grey" stroke-width="3" d="M 1195 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 620"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 620"/>
<path stroke="grey" stroke-width="3" d="M 1010 510 V 620"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 620"/>
<g transform="translate(0 620)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">9</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 1395"/>
<rect x="1320" y="20" width="180" height="30"/>
<text x="1330" y="40">extract_dates</text>
<path stroke="grey" stroke-width="3" d="M 1395 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 720"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 720"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 720"/>
<path stroke="grey" stroke-width="3" d="M 1010 510 V 720"/>
<path stroke="grey" stroke-width="3" d="M 1210 610 V 720"/>
<g transform="translate(0 720)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">10</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 1595"/>
<rect x="1520" y="20" width="180" height="30"/>
<text x="1530" y="40">seasonal_details</text>
<path stroke="grey" stroke-width="3" d="M 1595 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 820"/>
<path stroke="grey" stroke-width="3" d="M 1410 710 V 820"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 820"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 820"/>
<path stroke="grey" stroke-width="3" d="M 1010 510 V 820"/>
<path stroke="grey" stroke-width="3" d="M 1210 610 V 820"/>
<g transform="translate(0 820)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">11</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 1995"/>
<rect x="1720" y="20" width="180" height="30"/>
<text x="1730" y="40">export_point_layer</text>
<path stroke="grey" stroke-width="3" d="M 1795 5 l 15 15"/>
<rect x="1920" y="20" width="180" height="30"/>
<text x="1930" y="40">render_point_layer</text>
<path stroke="grey" stroke-width="3" d="M 1995 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 920"/>
<path stroke="grey" stroke-width="3" d="M 1410 710 V 920"/>
<path stroke="grey" stroke-width="3" d="M 610 320 V 920"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 920"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 920"/>
<path stroke="grey" stroke-width="3" d="M 1010 510 V 920"/>
<path stroke="grey" stroke-width="3" d="M 1210 610 V 920"/>
<g transform="translate(0 920)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">13</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 600 l 10 10"/>
<rect x="600" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 610 320 V 940"/>
<path stroke="grey" stroke-width="3" d="M 410 250 V 960"/>
<path stroke="grey" stroke-width="3" d="M 1410 710 V 960"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 960"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 960"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 960"/>
<path stroke="grey" stroke-width="3" d="M 1810 910 V 960"/>
<path stroke="grey" stroke-width="3" d="M 1010 510 V 960"/>
<path stroke="grey" stroke-width="3" d="M 2010 910 V 960"/>
<path stroke="grey" stroke-width="3" d="M 1210 610 V 960"/>
<g transform="translate(0 960)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 1995"/>
<path stroke="grey" stroke-width="3" d="M 595 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 795 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 995 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1195 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1395 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1795 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1995 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">14</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 70)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 2195"/>
<rect x="2120" y="20" width="180" height="30"/>
<text x="2130" y="40">farms.json</text>
<path stroke="grey" stroke-width="3" d="M 2195 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 610 960 V 990"/>
<path stroke="grey" stroke-width="3" d="M 810 410 V 990"/>
<path stroke="grey" stroke-width="3" d="M 1010 510 V 990"/>
<path stroke="grey" stroke-width="3" d="M 1210 610 V 990"/>
<path stroke="grey" stroke-width="3" d="M 1410 710 V 990"/>
<path stroke="grey" stroke-width="3" d="M 1810 910 V 990"/>
<path stroke="grey" stroke-width="3" d="M 2010 910 V 990"/>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1090"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1090"/>
<g transform="translate(0 1090)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">16</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 2395"/>
<rect x="2320" y="20" width="180" height="30"/>
<text x="2330" y="40">farmers_markets</text>
<path stroke="grey" stroke-width="3" d="M 2395 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1190"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1190"/>
<g transform="translate(0 1190)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">17</text>
<text x="65" y="20">vizual script</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 2400 l 10 10"/>
<rect x="2400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 2410 1180 V 1210"/>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 2410 1230 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1230"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1230"/>
<g transform="translate(0 1230)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">28</text>
<text x="65" y="20">script.python</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 2400 l 10 10"/>
<rect x="2400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 2410 1230 V 1250"/>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 2410 1270 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1270"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1270"/>
<g transform="translate(0 1270)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">30</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 2595"/>
<rect x="2520" y="20" width="180" height="30"/>
<text x="2530" y="40">farmers_markets_nys</text>
<path stroke="grey" stroke-width="3" d="M 2595 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 2410 1270 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1370"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1370"/>
<g transform="translate(0 1370)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">31</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 2795"/>
<rect x="2720" y="20" width="180" height="30"/>
<text x="2730" y="40">farmers_markets_contrib</text>
<path stroke="grey" stroke-width="3" d="M 2795 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 2410 1270 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 2610 1360 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1470"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1470"/>
<g transform="translate(0 1470)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 2795"/>
<path stroke="grey" stroke-width="3" d="M 2595 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 2795 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">32</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 2400 l 10 10"/>
<rect x="2400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 2610 1360 V 1500"/>
<path stroke="grey" stroke-width="3" d="M 2810 1460 V 1500"/>
<path stroke="grey" stroke-width="3" d="M 2410 1270 V 1520"/>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 2410 1540 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1540"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1540"/>
<g transform="translate(0 1540)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 395"/>
<path stroke="grey" stroke-width="3" d="M 395 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">33</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 2400 l 10 10"/>
<rect x="2400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 250 V 1570"/>
<path stroke="grey" stroke-width="3" d="M 2410 1540 V 1590"/>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 2410 1610 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1610"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1610"/>
<g transform="translate(0 1610)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">34</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 2400 l 10 10"/>
<rect x="2400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 2410 1610 V 1630"/>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1650"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1650"/>
<g transform="translate(0 1650)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 2395"/>
<path stroke="grey" stroke-width="3" d="M 795 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 995 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1195 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1395 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1795 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1995 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 2395 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">35</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 70)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 2995"/>
<rect x="2920" y="20" width="180" height="30"/>
<text x="2930" y="40">farmers_markets.json</text>
<path stroke="grey" stroke-width="3" d="M 2995 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 810 960 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 1010 960 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 1210 960 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 1410 960 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 1810 960 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 2010 960 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 1680"/>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 1780"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 1780"/>
<g transform="translate(0 1780)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">37</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 3195"/>
<rect x="3120" y="20" width="180" height="30"/>
<text x="3130" y="40">csas</text>
<path stroke="grey" stroke-width="3" d="M 3195 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 1880"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 1880"/>
<g transform="translate(0 1880)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">38</text>
<text x="65" y="20">data.load</text>
</g>
<g transform="translate(0 40)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 3395"/>
<rect x="3320" y="20" width="180" height="30"/>
<text x="3330" y="40">retail</text>
<path stroke="grey" stroke-width="3" d="M 3395 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 1980"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 1980"/>
<g transform="translate(0 1980)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">39</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 3400 l 10 10"/>
<rect x="3400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 3410 1970 V 2000"/>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2020"/>
<path stroke="grey" stroke-width="3" d="M 3410 2020 V 2020"/>
<g transform="translate(0 2020)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 395"/>
<path stroke="grey" stroke-width="3" d="M 395 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">40</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 3400 l 10 10"/>
<rect x="3400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 410 1540 V 2050"/>
<path stroke="grey" stroke-width="3" d="M 3410 2020 V 2070"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2090"/>
<path stroke="grey" stroke-width="3" d="M 3410 2090 V 2090"/>
<g transform="translate(0 2090)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">41</text>
<text x="65" y="20">sql.query</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 3400 l 10 10"/>
<rect x="3400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 3410 2090 V 2110"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2130"/>
<path stroke="grey" stroke-width="3" d="M 3410 2130 V 2130"/>
<g transform="translate(0 2130)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 3395"/>
<path stroke="grey" stroke-width="3" d="M 795 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 995 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1395 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1795 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 1995 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 3395 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">42</text>
<text x="65" y="20">script.python</text>
</g>
<g transform="translate(0 70)">
<path stroke="grey" stroke-width="3" d="M 150 -10 l 15 15 H 3595"/>
<rect x="3520" y="20" width="180" height="30"/>
<text x="3530" y="40">retail.json</text>
<path stroke="grey" stroke-width="3" d="M 3595 5 l 15 15"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 810 1650 V 2160"/>
<path stroke="grey" stroke-width="3" d="M 1010 1650 V 2160"/>
<path stroke="grey" stroke-width="3" d="M 1410 1650 V 2160"/>
<path stroke="grey" stroke-width="3" d="M 1810 1650 V 2160"/>
<path stroke="grey" stroke-width="3" d="M 2010 1650 V 2160"/>
<path stroke="grey" stroke-width="3" d="M 3410 2130 V 2160"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 1410 2130 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 810 2130 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 1810 2130 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 1010 2130 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 2010 2130 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2260"/>
<path stroke="grey" stroke-width="3" d="M 3410 2130 V 2260"/>
<g transform="translate(0 2260)">
<g transform="translate(0 0)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">43</text>
<text x="65" y="20">mimir.geotag</text>
<path stroke="grey" stroke-width="3" fill="none" d="M 310 15 H 3400 l 10 10"/>
<rect x="3400" y="20" width="20" height="20"/>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 3410 2130 V 2280"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 1410 2130 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 810 2130 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 1810 2130 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 1010 2130 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 3610 2250 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 2010 2130 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2300"/>
<path stroke="grey" stroke-width="3" d="M 3410 2300 V 2300"/>
<g transform="translate(0 2300)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 2195"/>
<path stroke="grey" stroke-width="3" d="M 2195 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">45</text>
<text x="65" y="20">data.unloadFile</text>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 2210 1080 V 2330"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 1410 2130 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 2210 2300 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 810 2130 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 1810 2130 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 1010 2130 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 3610 2250 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 2010 2130 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2370"/>
<path stroke="grey" stroke-width="3" d="M 3410 2300 V 2370"/>
<g transform="translate(0 2370)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 3595"/>
<path stroke="grey" stroke-width="3" d="M 3595 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">46</text>
<text x="65" y="20">data.unloadFile</text>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 3610 2250 V 2400"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 1410 2130 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 2210 2300 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 810 2130 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 1810 2130 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 1010 2130 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 3610 2370 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 2010 2130 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2440"/>
<path stroke="grey" stroke-width="3" d="M 3410 2300 V 2440"/>
<g transform="translate(0 2440)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 2995"/>
<path stroke="grey" stroke-width="3" d="M 2995 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">47</text>
<text x="65" y="20">data.unloadFile</text>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 3010 1770 V 2470"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 1410 2130 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 2210 2300 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 3010 2440 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 810 2130 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 1810 2130 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 1010 2130 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 3610 2370 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 2010 2130 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2510"/>
<path stroke="grey" stroke-width="3" d="M 3410 2300 V 2510"/>
<g transform="translate(0 2510)">
<path stroke="grey" stroke-width="3" d="M 150 30 l 15 -15 H 3595"/>
<path stroke="grey" stroke-width="3" d="M 2195 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 2995 15 l 15 -15"/>
<path stroke="grey" stroke-width="3" d="M 3595 15 l 15 -15"/>
<g transform="translate(0 30)">
<rect x="10" y="0" width="300" height="30"/>
<text x="15" y="20">48</text>
<text x="65" y="20">script.scala</text>
</g>
</g>
<path stroke="grey" stroke-width="3" d="M 2210 2300 V 2540"/>
<path stroke="grey" stroke-width="3" d="M 3010 2440 V 2540"/>
<path stroke="grey" stroke-width="3" d="M 3610 2370 V 2540"/>
<path stroke="grey" stroke-width="3" d="M 410 2020 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 1410 2130 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 2410 1650 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 3210 1870 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 610 960 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 1610 810 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 2210 2510 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 3010 2510 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 810 2130 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 2810 1470 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 1810 2130 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 1010 2130 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 3610 2510 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 2610 1470 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 2010 2130 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 1210 1650 V 2580"/>
<path stroke="grey" stroke-width="3" d="M 3410 2300 V 2580"/>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB