Files
2026-04-27 18:47:39 -04:00

1 line
44 KiB
XML

<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="ACTIVITY" height="2566px" preserveAspectRatio="none" style="width:3825px;height:2566px;background:#FAFCF9;" version="1.1" viewBox="0 0 3825 2566" width="3825px" zoomAndPan="magnify"><title>The Biergarten Data Pipeline (Streaming Architecture)</title><defs/><g><rect fill="#FAFCF9" height="2566" style="stroke:none;stroke-width:1;" width="3825" x="0" y="0"/><g class="title" data-source-line="20"><text fill="#28342A" font-family="'Volkhov'" font-size="20" font-weight="bold" lengthAdjust="spacing" textLength="536.54" x="1643.1503" y="39.42">The Biergarten Data Pipeline (Streaming Architecture)</text></g><rect fill="none" height="18.228" style="stroke:none;stroke-width:1;" width="3770.0163" x="15" y="59.64"/><rect fill="#F2F6F0" height="2494.414" style="stroke:#F2F6F0;stroke-width:1;" width="429.3647" x="15" y="59.64"/><ellipse cx="230.6823" cy="92.868" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="200.4815" x="130.4416" y="122.868"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="180.4815" x="140.4416" y="146.756">ParseArguments(argc, argv)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="171.5924" x="144.8862" y="232.21"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.5924" x="154.8862" y="256.098">spdlog::error usage info</text><ellipse cx="230.6823" cy="307.824" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="230.6823" cy="307.824" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><polygon fill="#FAFCF9" points="162.1522,181.096,299.2125,181.096,311.2125,193.096,299.2125,205.096,162.1522,205.096,150.1522,193.096,162.1522,181.096" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="234.6823" y="218.984">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="137.0603" x="162.1522" y="197.87">Are arguments valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="311.2125" y="188.756">yes</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="292.9199" x="84.2224" y="360.824"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="272.9199" x="94.2224" y="384.712">Init CurlGlobalState &amp; LlamaBackendState</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="150.5921" x="155.3863" y="419.052"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="130.5921" x="165.3863" y="442.94">di::make_injector(...)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="419.3647" x="21" y="477.28"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="399.3647" x="31" y="501.168">injector.create&lt;std::unique_ptr&lt;BiergartenDataGenerator&gt;&gt;()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="224.1274" x="118.6186" y="535.508"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.1274" x="128.6186" y="559.396">BiergartenDataGenerator::Run()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="76.287" x="192.5388" y="2473.826"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="56.287" x="202.5388" y="2497.714">Return 0</text><ellipse cx="230.6823" cy="2543.054" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="230.6823" cy="2543.054" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><line style="stroke:#547461;stroke-width:0.3;" x1="15" x2="15" y1="59.64" y2="2554.054"/><rect fill="#EAF0E8" height="2494.414" style="stroke:#EAF0E8;stroke-width:1;" width="986.6656" x="444.3647" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="165.1697" x="876.7478" y="593.736"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.1697" x="886.7478" y="617.624">Initialize SQLite export</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="201.2686" x="858.6983" y="821.332"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="181.2686" x="868.6983" y="845.22">QueryCitiesWithCountries()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="317.469" x="800.5981" y="1171.86"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="297.469" x="810.5981" y="1195.748">Store EnrichedCity{Location, region_context}</text><polygon fill="#FAFCF9" points="867.671,996.016,1050.9943,996.016,1062.9943,1008.016,1050.9943,1020.016,867.671,1020.016,855.671,1008.016,867.671,996.016" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="963.3326" y="1033.904">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.3233" x="867.671" y="1012.79">For each sampled Location?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="821.749" y="1003.676">Done</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="256.6633" x="831.001" y="1252.088"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.6633" x="841.001" y="1275.976">GenerateBreweries(enriched_cities)</text><polygon fill="#FAFCF9" points="883.0482,1911.23,1035.6171,1911.23,1047.6171,1923.23,1035.6171,1935.23,883.0482,1935.23,871.0482,1923.23,883.0482,1911.23" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.5688" x="883.0482" y="1928.004">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="848.2737" y="1918.89">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1047.6171" y="1918.89">no</text><path d="M846.3398,2245.028 L846.3398,2264.256 L826.3398,2268.256 L846.3398,2272.256 L846.3398,2291.484 A0,0 0 0 0 846.3398,2291.484 L1091.5957,2291.484 A0,0 0 0 0 1091.5957,2291.484 L1091.5957,2255.028 L1081.5957,2245.028 L846.3398,2245.028 A0,0 0 0 0 846.3398,2245.028" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1081.5957,2245.028 L1081.5957,2255.028 L1091.5957,2255.028 L1081.5957,2245.028" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="224.2558" x="852.3398" y="2263.916">Data loss is prevented per-record.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.7788" x="852.3398" y="2282.144">The pipeline continues running.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="375.9752" x="450.3647" y="2249.142"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="355.9752" x="460.3647" y="2273.03">spdlog::warn "Failed to stream record to SQLite export"</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="293.4347" x="1133.5957" y="1955.23"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="273.4347" x="1143.5957" y="1979.118">spdlog::warn "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="959.3326,2345.484,971.3326,2357.484,959.3326,2369.484,947.3326,2357.484,959.3326,2345.484" style="stroke:#628A5B;stroke-width:0.5;"/><line style="stroke:#547461;stroke-width:0.3;" x1="444.3647" x2="444.3647" y1="59.64" y2="2554.054"/><rect fill="#E0EAE0" height="2494.414" style="stroke:#E0EAE0;stroke-width:1;" width="985.7576" x="1431.0303" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="353.7568" x="1741.8766" y="651.964"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.7568" x="1751.8766" y="675.852">GetUtcTimestamp() from SystemDateTimeProvider</text><path d="M1979.9471,700.192 L1979.9471,746.762 L1959.9471,750.762 L1979.9471,754.762 L1979.9471,801.332 A0,0 0 0 0 1979.9471,801.332 L2411.788,801.332 A0,0 0 0 0 2411.788,801.332 L2411.788,710.192 L2401.788,700.192 L1979.9471,700.192 A0,0 0 0 0 1979.9471,700.192" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2401.788,700.192 L2401.788,710.192 L2411.788,710.192 L2401.788,700.192" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="410.8409" x="1985.9471" y="719.08">Builds a fresh biergarten_seed_&lt;UTC datetime&gt;.sqlite filename</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="370.0484" x="1985.9471" y="737.308">Appends a numeric suffix if the timestamp already exists</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.689" x="1985.9471" y="755.536">Opens DB Connection</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.6175" x="1985.9471" y="773.764">Executes Schema DDL</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.8503" x="1985.9471" y="791.992">Begins Transaction</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="82.3841" x="1877.563" y="731.648"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="62.3841" x="1887.563" y="755.536">Initialize()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="251.3364" x="1472.1065" y="1955.23"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="231.3364" x="1482.1065" y="1979.118">ProcessRecord(GeneratedBrewery)</text><polygon fill="#FAFCF9" points="1536.6453,2013.458,1658.904,2013.458,1670.904,2025.458,1658.904,2037.458,1536.6453,2037.458,1524.6453,2025.458,1536.6453,2013.458" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.2587" x="1536.6453" y="2030.232">Location in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1501.8708" y="2021.118">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1670.904" y="2021.118">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="136.6096" x="1437.0303" y="2047.458"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="116.6096" x="1447.0303" y="2071.346">Reuse location_id</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="193.1487" x="1593.6399" y="2047.458"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.1487" x="1603.6399" y="2071.346">Insert Location &amp; Cache ID</text><polygon fill="#FAFCF9" points="1597.7747,2091.686,1609.7747,2103.686,1597.7747,2115.686,1585.7747,2103.686,1597.7747,2091.686" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="223.8088" x="1485.8703" y="2135.686"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="203.8088" x="1495.8703" y="2159.574">Insert Brewery (FK: location_id)</text><polygon fill="#FAFCF9" points="1494.549,2193.914,1701.0004,2193.914,1713.0004,2205.914,1701.0004,2217.914,1494.549,2217.914,1482.549,2205.914,1494.549,2193.914" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1601.7747" y="2231.802">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="206.4514" x="1494.549" y="2210.688">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1713.0004" y="2201.574">no</text><polygon fill="#FAFCF9" points="1597.7747,2311.484,1609.7747,2323.484,1597.7747,2335.484,1585.7747,2323.484,1597.7747,2311.484" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M1977.6406,2407.37 L1977.6406,2426.598 L1957.6406,2430.598 L1977.6406,2434.598 L1977.6406,2453.826 A0,0 0 0 0 1977.6406,2453.826 L2186.8462,2453.826 A0,0 0 0 0 2186.8462,2453.826 L2186.8462,2417.37 L2176.8462,2407.37 L1977.6406,2407.37 A0,0 0 0 0 1977.6406,2407.37" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2176.8462,2407.37 L2176.8462,2417.37 L2186.8462,2417.37 L2176.8462,2407.37" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.3947" x="1983.6406" y="2426.258">Commits Transaction</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.2056" x="1983.6406" y="2444.486">Closes Database Connection</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="77.7711" x="1879.8695" y="2411.484"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="57.7711" x="1889.8695" y="2435.372">Finalize()</text><line style="stroke:#547461;stroke-width:0.3;" x1="1431.0303" x2="1431.0303" y1="59.64" y2="2554.054"/><rect fill="#E2EBDC" height="2494.414" style="stroke:#E2EBDC;stroke-width:1;" width="314.169" x="2416.788" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="304.169" x="2422.788" y="879.56"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.169" x="2432.788" y="903.448">JsonLoader::LoadLocations("locations.json")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="260.3698" x="2444.6876" y="937.788"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="240.3698" x="2454.6876" y="961.676">std::ranges::sample(all_locations, 50)</text><line style="stroke:#547461;stroke-width:0.3;" x1="2416.788" x2="2416.788" y1="59.64" y2="2554.054"/><rect fill="#DCE8D8" height="2494.414" style="stroke:#DCE8D8;stroke-width:1;" width="252.6634" x="2730.957" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="182.6382" x="2766.9696" y="1055.404"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="162.6382" x="2776.9696" y="1079.292">GetLocationContext(loc)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="242.6634" x="2736.957" y="1113.632"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="222.6634" x="2746.957" y="1137.52">FetchExtracts(City, Country, Beer)</text><line style="stroke:#547461;stroke-width:0.3;" x1="2730.957" x2="2730.957" y1="59.64" y2="2554.054"/><rect fill="#E5EDE1" height="2494.414" style="stroke:#E5EDE1;stroke-width:1;" width="800.5338" x="2983.6204" y="59.64"/><polygon fill="#FAFCF9" points="3256.712,1369.704,3363.5741,1369.704,3375.5741,1381.704,3363.5741,1393.704,3256.712,1393.704,3244.712,1381.704,3256.712,1369.704" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="106.8621" x="3256.712" y="1386.478">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="3143.2433" y="1377.364">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="3375.5741" y="1377.364">LlamaGenerator</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="203.7782" x="3016.6204" y="1403.704"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.7782" x="3026.6204" y="1427.592">DeterministicHash &amp; Format</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="166.7972" x="3418.3779" y="1403.704"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="146.7972" x="3428.3779" y="1427.592">PrepareRegionContext</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="354.2819" x="3324.6355" y="1461.932"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="334.2819" x="3334.6355" y="1485.82">LoadBrewerySystemPrompt("prompts/system.md")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="502.7556" x="3250.3987" y="1564.16"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="482.7556" x="3260.3987" y="1588.048">Infer(system_prompt, user_prompt, max_tokens, kBreweryJsonGrammar)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="250.5106" x="3376.5212" y="1622.388"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="230.5106" x="3386.5212" y="1646.276">ValidateBreweryJson(raw, brewery)</text><polygon fill="#FAFCF9" points="3455.2999,1691.502,3548.253,1691.502,3560.253,1703.502,3548.253,1715.502,3455.2999,1715.502,3443.2999,1703.502,3455.2999,1691.502" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.9531" x="3455.2999" y="1708.276">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="3420.5254" y="1699.162">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="3560.253" y="1699.162">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="90.3536" x="3525.0762" y="1725.502"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="3535.0762" y="1749.39">Attempt++</text><polygon fill="#FAFCF9" points="3501.7765,1520.16,3513.7765,1532.16,3501.7765,1544.16,3489.7765,1532.16,3501.7765,1520.16" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="3458.9277,1783.73,3544.6253,1783.73,3556.6253,1795.73,3544.6253,1807.73,3458.9277,1807.73,3446.9277,1795.73,3458.9277,1783.73" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="85.6976" x="3458.9277" y="1800.504">Attempt &lt; 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="3556.6253" y="1791.39">yes</text><polygon fill="#FAFCF9" points="3501.7765,1837.23,3513.7765,1849.23,3501.7765,1861.23,3489.7765,1849.23,3501.7765,1837.23" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="3310.143,1867.23,3322.143,1879.23,3310.143,1891.23,3298.143,1879.23,3310.143,1867.23" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="3234.4956,1310.316,3385.7904,1310.316,3397.7904,1322.316,3385.7904,1334.316,3234.4956,1334.316,3222.4956,1322.316,3234.4956,1310.316" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="3314.143" y="1348.204">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.2948" x="3234.4956" y="1327.09">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="3188.5737" y="1317.976">Done</text><line style="stroke:#547461;stroke-width:0.3;" x1="2983.6204" x2="2983.6204" y1="59.64" y2="2554.054"/><line style="stroke:#547461;stroke-width:0.3;" x1="3784.1543" x2="3784.1543" y1="59.64" y2="2554.054"/><polygon fill="#628A5B" points="3795.8407,1827.73,3799.8407,1817.73,3803.8407,1827.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="102.868" y2="122.868"/><polygon fill="#628A5B" points="226.6823,112.868,234.6823,112.868,230.6823,122.868" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="270.438" y2="296.824"/><polygon fill="#628A5B" points="226.6823,286.824,234.6823,286.824,230.6823,296.824" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="205.096" y2="232.21"/><polygon fill="#628A5B" points="226.6823,222.21,234.6823,222.21,230.6823,232.21" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="311.2125" x2="326.4785" y1="193.096" y2="193.096"/><polygon fill="#628A5B" points="322.4785,266.824,330.4785,266.824,326.4785,276.824" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="326.4785" x2="326.4785" y1="193.096" y2="340.824"/><line style="stroke:#628A5B;stroke-width:1;" x1="326.4785" x2="230.6823" y1="340.824" y2="340.824"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="340.824" y2="360.824"/><polygon fill="#628A5B" points="226.6823,350.824,234.6823,350.824,230.6823,360.824" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="161.096" y2="181.096"/><polygon fill="#628A5B" points="226.6823,171.096,234.6823,171.096,230.6823,181.096" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="399.052" y2="419.052"/><polygon fill="#628A5B" points="226.6823,409.052,234.6823,409.052,230.6823,419.052" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="457.28" y2="477.28"/><polygon fill="#628A5B" points="226.6823,467.28,234.6823,467.28,230.6823,477.28" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="515.508" y2="535.508"/><polygon fill="#628A5B" points="226.6823,525.508,234.6823,525.508,230.6823,535.508" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="2512.054" y2="2532.054"/><polygon fill="#628A5B" points="226.6823,2522.054,234.6823,2522.054,230.6823,2532.054" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="1210.088" y2="1220.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="1130.0671" y1="1220.088" y2="1220.088"/><polygon fill="#628A5B" points="1126.0671,1121.632,1130.0671,1111.632,1134.0671,1121.632" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1130.0671" x2="1130.0671" y1="1008.016" y2="1220.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="1130.0671" x2="1062.9943" y1="1008.016" y2="1008.016"/><polygon fill="#628A5B" points="1072.9943,1004.016,1062.9943,1008.016,1072.9943,1012.016" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="855.671" x2="788.5981" y1="1008.016" y2="1008.016"/><polygon fill="#628A5B" points="784.5981,1107.632,792.5981,1107.632,788.5981,1117.632" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="788.5981" x2="788.5981" y1="1008.016" y2="1232.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="788.5981" x2="959.3326" y1="1232.088" y2="1232.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="1232.088" y2="1252.088"/><polygon fill="#628A5B" points="955.3326,1242.088,963.3326,1242.088,959.3326,1252.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.6171" x2="1280.313" y1="1923.23" y2="1923.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="1280.313" x2="1280.313" y1="1923.23" y2="1955.23"/><polygon fill="#628A5B" points="1276.313,1945.23,1284.313,1945.23,1280.313,1955.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1280.313" x2="1280.313" y1="1993.458" y2="2357.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="1280.313" x2="971.3326" y1="2357.484" y2="2357.484"/><polygon fill="#628A5B" points="981.3326,2353.484,971.3326,2357.484,981.3326,2361.484" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="1918.755" y1="690.192" y2="731.648"/><polygon fill="#628A5B" points="1914.755,721.648,1922.755,721.648,1918.755,731.648" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1524.6453" x2="1505.3351" y1="2025.458" y2="2025.458"/><line style="stroke:#628A5B;stroke-width:1;" x1="1505.3351" x2="1505.3351" y1="2025.458" y2="2047.458"/><polygon fill="#628A5B" points="1501.3351,2037.458,1509.3351,2037.458,1505.3351,2047.458" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1670.904" x2="1690.2142" y1="2025.458" y2="2025.458"/><line style="stroke:#628A5B;stroke-width:1;" x1="1690.2142" x2="1690.2142" y1="2025.458" y2="2047.458"/><polygon fill="#628A5B" points="1686.2142,2037.458,1694.2142,2037.458,1690.2142,2047.458" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1505.3351" x2="1505.3351" y1="2085.686" y2="2103.686"/><line style="stroke:#628A5B;stroke-width:1;" x1="1505.3351" x2="1585.7747" y1="2103.686" y2="2103.686"/><polygon fill="#628A5B" points="1575.7747,2099.686,1585.7747,2103.686,1575.7747,2107.686" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1690.2142" x2="1690.2142" y1="2085.686" y2="2103.686"/><line style="stroke:#628A5B;stroke-width:1;" x1="1690.2142" x2="1609.7747" y1="2103.686" y2="2103.686"/><polygon fill="#628A5B" points="1619.7747,2099.686,1609.7747,2103.686,1619.7747,2107.686" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="1993.458" y2="2013.458"/><polygon fill="#628A5B" points="1593.7747,2003.458,1601.7747,2003.458,1597.7747,2013.458" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="2115.686" y2="2135.686"/><polygon fill="#628A5B" points="1593.7747,2125.686,1601.7747,2125.686,1597.7747,2135.686" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1713.0004" x2="2061.0181" y1="2205.914" y2="2205.914"/><polygon fill="#628A5B" points="2057.0181,2258.256,2065.0181,2258.256,2061.0181,2268.256" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2061.0181" x2="2061.0181" y1="2205.914" y2="2323.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="2061.0181" x2="1609.7747" y1="2323.484" y2="2323.484"/><polygon fill="#628A5B" points="1619.7747,2319.484,1609.7747,2323.484,1619.7747,2327.484" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="2173.914" y2="2193.914"/><polygon fill="#628A5B" points="1593.7747,2183.914,1601.7747,2183.914,1597.7747,2193.914" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2574.8725" x2="2574.8725" y1="917.788" y2="937.788"/><polygon fill="#628A5B" points="2570.8725,927.788,2578.8725,927.788,2574.8725,937.788" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2858.2887" x2="2858.2887" y1="1093.632" y2="1113.632"/><polygon fill="#628A5B" points="2854.2887,1103.632,2862.2887,1103.632,2858.2887,1113.632" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1441.932" y2="1461.932"/><polygon fill="#628A5B" points="3497.7765,1451.932,3505.7765,1451.932,3501.7765,1461.932" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1602.388" y2="1622.388"/><polygon fill="#628A5B" points="3497.7765,1612.388,3505.7765,1612.388,3501.7765,1622.388" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3443.2999" x2="3433.2999" y1="1703.502" y2="1703.502"/><line style="stroke:#628A5B;stroke-width:1;" x1="3433.2999" x2="3433.2999" y1="1703.502" y2="1849.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="3433.2999" x2="3489.7765" y1="1849.23" y2="1849.23"/><polygon fill="#628A5B" points="3479.7765,1845.23,3489.7765,1849.23,3479.7765,1853.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3560.253" x2="3570.253" y1="1703.502" y2="1703.502"/><line style="stroke:#628A5B;stroke-width:1;" x1="3570.253" x2="3570.253" y1="1703.502" y2="1725.502"/><polygon fill="#628A5B" points="3566.253,1715.502,3574.253,1715.502,3570.253,1725.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3570.253" x2="3570.253" y1="1763.73" y2="1768.73"/><line style="stroke:#628A5B;stroke-width:1;" x1="3570.253" x2="3501.7765" y1="1768.73" y2="1768.73"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1768.73" y2="1783.73"/><polygon fill="#628A5B" points="3497.7765,1773.73,3505.7765,1773.73,3501.7765,1783.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1660.616" y2="1691.502"/><polygon fill="#628A5B" points="3497.7765,1681.502,3505.7765,1681.502,3501.7765,1691.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1544.16" y2="1564.16"/><polygon fill="#628A5B" points="3497.7765,1554.16,3505.7765,1554.16,3501.7765,1564.16" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3556.6253" x2="3765.1543" y1="1795.73" y2="1795.73"/><polygon fill="#628A5B" points="3761.1543,1671.502,3765.1543,1661.502,3769.1543,1671.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3765.1543" x2="3765.1543" y1="1532.16" y2="1795.73"/><line style="stroke:#628A5B;stroke-width:1;" x1="3765.1543" x2="3513.7765" y1="1532.16" y2="1532.16"/><polygon fill="#628A5B" points="3523.7765,1528.16,3513.7765,1532.16,3523.7765,1536.16" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1807.73" y2="1837.23"/><polygon fill="#628A5B" points="3497.7765,1827.23,3505.7765,1827.23,3501.7765,1837.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1500.16" y2="1520.16"/><polygon fill="#628A5B" points="3497.7765,1510.16,3505.7765,1510.16,3501.7765,1520.16" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3244.712" x2="3118.5096" y1="1381.704" y2="1381.704"/><line style="stroke:#628A5B;stroke-width:1;" x1="3118.5096" x2="3118.5096" y1="1381.704" y2="1403.704"/><polygon fill="#628A5B" points="3114.5096,1393.704,3122.5096,1393.704,3118.5096,1403.704" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3375.5741" x2="3501.7765" y1="1381.704" y2="1381.704"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1381.704" y2="1403.704"/><polygon fill="#628A5B" points="3497.7765,1393.704,3505.7765,1393.704,3501.7765,1403.704" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3118.5096" x2="3118.5096" y1="1441.932" y2="1879.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="3118.5096" x2="3298.143" y1="1879.23" y2="1879.23"/><polygon fill="#628A5B" points="3288.143,1875.23,3298.143,1879.23,3288.143,1883.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3501.7765" y1="1861.23" y2="1879.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="3501.7765" x2="3322.143" y1="1879.23" y2="1879.23"/><polygon fill="#628A5B" points="3332.143,1875.23,3322.143,1879.23,3332.143,1883.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3310.143" x2="3310.143" y1="1334.316" y2="1369.704"/><polygon fill="#628A5B" points="3306.143,1359.704,3314.143,1359.704,3310.143,1369.704" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3222.4956" x2="3002.6204" y1="1322.316" y2="1322.316"/><polygon fill="#628A5B" points="2998.6204,1829.5085,3006.6204,1829.5085,3002.6204,1839.5085" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3002.6204" x2="3002.6204" y1="1322.316" y2="2396.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="3002.6204" x2="1918.755" y1="2396.484" y2="2396.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="1918.755" y1="2396.484" y2="2411.484"/><polygon fill="#628A5B" points="1914.755,2401.484,1922.755,2401.484,1918.755,2411.484" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="573.736" y2="578.736"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="959.3326" y1="578.736" y2="578.736"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="578.736" y2="593.736"/><polygon fill="#628A5B" points="955.3326,583.736,963.3326,583.736,959.3326,593.736" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="631.964" y2="636.964"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="1918.755" y1="636.964" y2="636.964"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="1918.755" y1="636.964" y2="651.964"/><polygon fill="#628A5B" points="1914.755,641.964,1922.755,641.964,1918.755,651.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="1918.755" y1="769.876" y2="803.104"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="959.3326" y1="803.104" y2="803.104"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="803.104" y2="821.332"/><polygon fill="#628A5B" points="955.3326,811.332,963.3326,811.332,959.3326,821.332" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="859.56" y2="864.56"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="2574.8725" y1="864.56" y2="864.56"/><line style="stroke:#628A5B;stroke-width:1;" x1="2574.8725" x2="2574.8725" y1="864.56" y2="879.56"/><polygon fill="#628A5B" points="2570.8725,869.56,2578.8725,869.56,2574.8725,879.56" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2858.2887" x2="2858.2887" y1="1151.86" y2="1156.86"/><line style="stroke:#628A5B;stroke-width:1;" x1="2858.2887" x2="959.3326" y1="1156.86" y2="1156.86"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="1156.86" y2="1171.86"/><polygon fill="#628A5B" points="955.3326,1161.86,963.3326,1161.86,959.3326,1171.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="1020.016" y2="1040.404"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="2858.2887" y1="1040.404" y2="1040.404"/><line style="stroke:#628A5B;stroke-width:1;" x1="2858.2887" x2="2858.2887" y1="1040.404" y2="1055.404"/><polygon fill="#628A5B" points="2854.2887,1045.404,2862.2887,1045.404,2858.2887,1055.404" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2574.8725" x2="2574.8725" y1="976.016" y2="981.016"/><line style="stroke:#628A5B;stroke-width:1;" x1="2574.8725" x2="959.3326" y1="981.016" y2="981.016"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="981.016" y2="996.016"/><polygon fill="#628A5B" points="955.3326,986.016,963.3326,986.016,959.3326,996.016" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="2217.914" y2="2233.528"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="638.3523" y1="2233.528" y2="2233.528"/><line style="stroke:#628A5B;stroke-width:1;" x1="638.3523" x2="638.3523" y1="2233.528" y2="2249.142"/><polygon fill="#628A5B" points="634.3523,2239.142,642.3523,2239.142,638.3523,2249.142" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="638.3523" x2="638.3523" y1="2287.37" y2="2296.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="638.3523" x2="1597.7747" y1="2296.484" y2="2296.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="2296.484" y2="2311.484"/><polygon fill="#628A5B" points="1593.7747,2301.484,1601.7747,2301.484,1597.7747,2311.484" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="871.0482" x2="859.0482" y1="1923.23" y2="1923.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="859.0482" x2="859.0482" y1="1923.23" y2="1941.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="859.0482" x2="1597.7747" y1="1941.23" y2="1941.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="1941.23" y2="1955.23"/><polygon fill="#628A5B" points="1593.7747,1945.23,1601.7747,1945.23,1597.7747,1955.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="1597.7747" y1="2335.484" y2="2339.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="1597.7747" x2="929.3326" y1="2339.484" y2="2339.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="929.3326" x2="929.3326" y1="2339.484" y2="2357.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="929.3326" x2="947.3326" y1="2357.484" y2="2357.484"/><polygon fill="#628A5B" points="937.3326,2353.484,947.3326,2357.484,937.3326,2361.484" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3310.143" x2="3310.143" y1="1891.23" y2="1896.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="3310.143" x2="959.3326" y1="1896.23" y2="1896.23"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="1896.23" y2="1911.23"/><polygon fill="#628A5B" points="955.3326,1901.23,963.3326,1901.23,959.3326,1911.23" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="2369.484" y2="2379.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="3799.8407" y1="2379.484" y2="2379.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="3799.8407" x2="3799.8407" y1="1322.316" y2="2379.484"/><line style="stroke:#628A5B;stroke-width:1;" x1="3799.8407" x2="3397.7904" y1="1322.316" y2="1322.316"/><polygon fill="#628A5B" points="3407.7904,1318.316,3397.7904,1322.316,3407.7904,1326.316" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="959.3326" y1="1290.316" y2="1295.316"/><line style="stroke:#628A5B;stroke-width:1;" x1="959.3326" x2="3310.143" y1="1295.316" y2="1295.316"/><line style="stroke:#628A5B;stroke-width:1;" x1="3310.143" x2="3310.143" y1="1295.316" y2="1310.316"/><polygon fill="#628A5B" points="3306.143,1300.316,3314.143,1300.316,3310.143,1310.316" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="1918.755" y1="2449.712" y2="2458.826"/><line style="stroke:#628A5B;stroke-width:1;" x1="1918.755" x2="230.6823" y1="2458.826" y2="2458.826"/><line style="stroke:#628A5B;stroke-width:1;" x1="230.6823" x2="230.6823" y1="2458.826" y2="2473.826"/><polygon fill="#628A5B" points="226.6823,2463.826,234.6823,2463.826,230.6823,2473.826" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="50.26" x="204.5523" y="73.528">main.cc</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.6743" x="855.8603" y="73.528">BiergartenDataGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3512" x="1860.2335" y="73.528">SqliteExportService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="2536.0794" y="73.528">JsonLoader</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.7306" x="2801.4234" y="73.528">WikipediaService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="96.6737" x="3335.5505" y="73.528">DataGenerator</text><?plantuml-src ZLPRKzj657xthpZZp6Ja2NKT0YaLJ3g-KbAI44oIHyyY7TjRIxlAxihWrltl_LONOuW9-46MTi_rErUxa2eJHgHatIfXF8sCN9uc3RkvYNagyiIDj78VHShK77oWiL2skPjcBFzXUdsmTUcaI_YE_QjE5dEzREwYA9ZtErjNro9Qp8pELTpNYJRqOjGTzKU_xzPTaUmVlJdOx-wI_nX1rnXzKrs-tJ_g7lQsBZzgnxs7PWoxeyxmw26LDZ6RYkBmuBU3jw-tbKHEBgLRzPvqQKFvB7a3ALAjukUBhHcsfV_WzPsrZvACRsIQ2FM4s_UfhkOoMYYsbZhjDur64HcwcZFr99kPC8uL3OGJT24pJgHY2iREi4YbcY5CqLmwHeOQRZKQwnUZ_T7RKMUT2gdQKRHkM0S9ZV126CjTCyjJLiu6mioYFS9psJfko2a5NSF-ixocfKXa_4UBt1ow0wLR3QBGPd6YPs78o0n3kHKp9gcc-XYNrkcimOc5RIkshGQhM4uRZV1CIKVzt2IdYRuMoTW9n_IIpXEH2XyTq1Ldnuqmbc6OYWLFfFeR_cWJjDjjM1VMt-q8JZi-iIuEmrp9xpbFCcTExc3oA9soOYD0_kvTuBaVkGt3ornv0a1M9kxw4SfrwOK49AZ4yUTpm4rycsdZIkxEi3lihCVV4rmCY_CncwMC69odxBwuw4gcZ3YaMT2YgT58W9Lrd48D-wiBevSIYN2yhSdRfb10PEHixW1nBvT9R4b00jivNM-idLZcU7BovQfFCIGwI7pNjeKvD9K9A_GOy7Up36Xx0GfHHbCZcq-dyfOGViIPN6qaYGH0noiuAQspOFq4Jak37lMrKeY5r0gdmrkESiUMnj6SKq63mRatasSIn5S6_L2Kf51BtfLdOVqvPxFg0mMstwIRzr6zwC1iwrZj3tk3_lgzrUfS2u06bhkFCFJ_vpeINh4DcadzsluRH4sV44NwmBePsp2qy3VXG2J9P4EwHuUTvoN6pHpmKZ12ER28vbHAYwas01KaBGMNxAlHLsjK-EMhQVrYq1yU3OxMt-G2PHrBiKaQb1hIffO1o1tVkW3cjNobXIDsqNnuwmpGjG6GMkrHYH9UUioc87lQU8WQuuLfg90CSuwzg7zhjNja44Yj9b6f_xzZ7yRAuO5MPRDvCfhLE_SCtt0HHgwqJIeiIg0FXuFXw_KJy6uR-XDeVJlRIA4FEkQwaNtGqM9puqc1mO0T6xHIfBgC_XIeh9S4ZQbm7iQofHNjwY7ZXM5qSxuiOAgYT5nU-IGiFLwLbOuAJpCNDBFYt_vgYzDs6ZTR9GjaeRSLh-0_KrCsGKaqANdsq73PR3vISJjn6kqJsRgeLFaoECLuIOMff4BKLz_9Dm4eQ08ZRlRekZpOK7hKpYoz7t_wI5_ljVzL2Mlv0vjOL5ybEELqgDHr7KpEtAjNjTXo4DovI5LGAq8weJTLA2irrUHuNWPlXHf1G4EB8ipHQPxyQFpF6tKLKUtPBpd2NAxbSXt92YcliYuIZ3-Aa9cy2wlmaX4ogjlAHCQbW8Ue8Tg8hDiq3UHVtykaiq75i86m9gqiGcdy5MuhyCLKspYyZJWhv4KYnmIXE3U-JcGXOfV1pm6yiA9U16w4KTGS2UbxdjD-LSPMWa1x_Fp1lM7Ph5FYtbGhVyLwasYiGCY4pF0IMmXaPcn-AQMrDwH-CShgHSWt9wbop22JAzy6sdTfLuwS7n6luRn_-i2fhQIQ5lxj4TQtBFCgskt2bLhEOzrhLxlysQemachtuE_hD9Nk_aZ5AU22trxfjO0dMwDvUzu-N0UHbLWL5NME6yNEzZy0?></g></svg>