mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-14 17:54:42 +00:00
* Remove restating comments in backend * Remove restating comments in frontend stories * Remove restating comments in pipeline * Remove restating comments in pipeline scripts * Restore location-clear comment in BreweryRepository * Remove stale/restating comments found in second pass * Restore mock curated-data branch comment in main.cc * Remove more restating/filler comments in backend * Document account-management endpoints, compose files, and env generator * Squashed commit of the following: commit a8a5b8abd9969859c695092fae6990d03b2135ed Author: Aaron Po <aaron.po97@gmail.com> Date: Sun Aug 23 23:53:56 2026 -0400 Add reverse geocoding for brewery street addresses (#245) * Add geocoding to seed application, remove postal codes from generator Update comments * Update pipeline class diagram for OpenAI generator * Update pipeline activity diagram for brewery coordinates and OpenAI backend * Add mailpit, production, db-only, and minimal environments to deployment diagram * Fix authentication flow diagram for Identity migration * Add account-management flows to authentication diagram * Fix database schema diagram note referencing removed AuthRepository
1 line
110 KiB
XML
1 line
110 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="5316px" preserveAspectRatio="none" style="width:7072px;height:5316px;background:#FAFCF9;" version="1.1" viewBox="0 0 7072 5316" width="7072px" zoomAndPan="magnify"><title>The Biergarten Data Pipeline (Current — Synchronous Data Path)</title><defs/><g><rect fill="#FAFCF9" height="5316" style="stroke:none;stroke-width:1;" width="7072" 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="643.3092" x="3213.1128" y="41.38">The Biergarten Data Pipeline (Current — Synchronous Data Path)</text></g><rect fill="none" height="19.0679" style="stroke:none;stroke-width:1;" width="7039.5348" x="15" y="60.842"/><rect fill="#F2F6F0" height="5243.2679" style="stroke:#F2F6F0;stroke-width:1;" width="758.7604" x="15" y="60.842"/><ellipse cx="252.0382" cy="94.9099" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="338.5547" x="82.7608" y="124.9099"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="318.5547" x="92.7608" y="149.8758">Create BoundedChannel<LogEntry> log_channel</text><path d="M376.4188,173.9778 L376.4188,213.1136 L356.4188,217.1136 L376.4188,221.1136 L376.4188,260.2495 A0,0 0 0 0 376.4188,260.2495 L720.6075,260.2495 A0,0 0 0 0 720.6075,260.2495 L720.6075,183.9778 L710.6075,173.9778 L376.4188,173.9778 A0,0 0 0 0 376.4188,173.9778" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M710.6075,173.9778 L710.6075,183.9778 L720.6075,183.9778 L710.6075,173.9778" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="293.8868" x="382.4188" y="193.9437">The only concurrency in the current pipeline:</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="280.041" x="382.4188" y="213.0116">a dedicated thread drains log_channel and</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="294.6429" x="382.4188" y="232.0796">forwards entries to spdlog for the entire run.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="323.1887" x="382.4188" y="251.1475">Joined during shutdown after log_channel closes.</text><rect fill="#FAFCF9" height="58.1358" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="208.7613" x="147.6575" y="188.0457"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.7613" x="157.6575" y="213.0116">Spawn log dispatcher thread</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.8374" x="157.6575" y="232.0796">(LogDispatcher::Run())</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="204.2113" x="149.9325" y="280.2495"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="184.2113" x="159.9325" y="305.2154">ParseArguments(argc, argv)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="163.1635" x="170.4564" y="390.8513"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.1635" x="180.4564" y="415.8173">Log error / usage info</text><ellipse cx="252.0382" cy="466.8853" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="252.0382" cy="466.8853" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><polygon fill="#FAFCF9" points="182.5004,339.3174,321.5759,339.3174,333.5759,351.3174,321.5759,363.3174,182.5004,363.3174,170.5004,351.3174,182.5004,339.3174" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="256.0382" y="378.2833">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.0755" x="182.5004" y="356.7494">Are arguments valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="333.5759" y="347.2154">yes</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="332.2408" x="85.9177" y="519.8853"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="312.2408" x="95.9177" y="544.8512">Init OpenSSL global state & LlamaBackendState</text><path d="M347.8939,568.9532 L347.8939,598.5551 L327.8939,602.5551 L347.8939,606.5551 L347.8939,636.157 A0,0 0 0 0 347.8939,636.157 L709.2186,636.157 A0,0 0 0 0 709.2186,636.157 L709.2186,578.9532 L699.2186,568.9532 L347.8939,568.9532 A0,0 0 0 0 347.8939,568.9532" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M699.2186,568.9532 L699.2186,578.9532 L709.2186,578.9532 L699.2186,568.9532" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="336.2087" x="353.8939" y="588.9191">Binds ILogger, IEnrichmentService, DataGenerator,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="340.3247" x="353.8939" y="607.9871">IExportService, IPromptFormatter, WebClient based</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="245.699" x="353.8939" y="627.055">on --mocked vs. model-backed mode.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="151.7115" x="176.1824" y="583.0211"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="131.7115" x="186.1824" y="607.9871">di::make_injector(...)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="462.0763" x="21" y="656.157"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="442.0763" x="31" y="681.1229">injector.create<std::unique_ptr<BiergartenPipelineOrchestrator>>()</text><path d="M406.6377,710.6909 L406.6377,730.7588 L386.6377,734.7588 L406.6377,738.7588 L406.6377,758.8268 A0,0 0 0 0 406.6377,758.8268 L768.7604,758.8268 A0,0 0 0 0 768.7604,758.8268 L768.7604,720.6909 L758.7604,710.6909 L406.6377,710.6909 A0,0 0 0 0 406.6377,710.6909" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M758.7604,710.6909 L758.7604,720.6909 L768.7604,720.6909 L758.7604,710.6909" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="341.1227" x="412.6377" y="730.6569">Run() itself is synchronous — sampling, enrichment,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="324.1408" x="412.6377" y="749.7248">generation, and export all happen on this thread.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="269.199" x="117.4386" y="715.2249"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.199" x="127.4386" y="740.1908">BiergartenPipelineOrchestrator::Run()</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="138.1175" x="182.9794" y="5104.9061"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="118.1175" x="192.9794" y="5129.8721">Close log_channel</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="189.5114" x="157.2825" y="5163.974"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="169.5114" x="167.2825" y="5188.94">Join log dispatcher thread</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="76.3918" x="213.8423" y="5223.042"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="56.3918" x="223.8423" y="5248.0079">Return 0</text><ellipse cx="252.0382" cy="5293.1099" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="252.0382" cy="5293.1099" 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="60.842" y2="5304.1099"/><rect fill="#EAF0E8" height="5243.2679" style="stroke:#EAF0E8;stroke-width:1;" width="1593.5394" x="773.7604" y="60.842"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="168.2454" x="1299.481" y="778.8268"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="148.2454" x="1309.481" y="803.7927">Initialize SQLite export</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="131.6776" x="1317.7649" y="1012.3022"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.6776" x="1327.7649" y="1037.2681">QueryLocations()</text><polygon fill="#FAFCF9" points="1336.0389,1360.6077,1431.1685,1360.6077,1443.1685,1372.6077,1431.1685,1384.6077,1336.0389,1384.6077,1324.0389,1372.6077,1336.0389,1360.6077" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="95.1296" x="1336.0389" y="1378.0397">Lookup failed?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="1302.297" y="1368.5057">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="1443.1685" y="1368.5057">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="162.1834" x="1173.5714" y="1394.6077"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="142.1834" x="1183.5714" y="1419.5736">Log warning, skip city</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="313.5789" x="1355.7549" y="1394.6077"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="293.5789" x="1365.7549" y="1419.5736">Store EnrichedCity{Location, region_context}</text><polygon fill="#FAFCF9" points="1383.6037,1439.6756,1395.6037,1451.6756,1383.6037,1463.6756,1371.6037,1451.6756,1383.6037,1439.6756" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1292.5131,1189.5059,1474.6944,1189.5059,1486.6944,1201.5059,1474.6944,1213.5059,1292.5131,1213.5059,1280.5131,1201.5059,1292.5131,1189.5059" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="107.9256" x="1387.6037" y="1228.4719">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="182.1813" x="1292.5131" y="1206.9379">For each sampled Location?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="35.2379" x="1245.2752" y="1197.4039">Done</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="224.5812" x="1271.3131" y="1505.6756"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.5812" x="1281.3131" y="1530.6415">GenerateUsers(enriched_cities)</text><rect fill="#FAFCF9" height="58.1358" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="304.1009" x="1231.5533" y="1839.617"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="245.993" x="1241.5533" y="1864.5829">SampleName(forenames_by_country,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="276.8209" x="1248.8332" y="1883.6508">surnames_by_country, location.iso3166_1)</text><polygon fill="#FAFCF9" points="1288.2361,1917.7528,1478.9714,1917.7528,1490.9714,1929.7528,1478.9714,1941.7528,1288.2361,1941.7528,1276.2361,1929.7528,1288.2361,1917.7528" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="190.7353" x="1288.2361" y="1935.1848">Names available for country?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="1259.1142" y="1925.6508">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="1490.9714" y="1925.6508">yes</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="162.1834" x="806.7604" y="1961.7528"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="142.1834" x="816.7604" y="1986.7187">Log warning, skip city</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="278.047" x="1740.3319" y="1961.7528"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="258.047" x="1750.3319" y="1986.7187">Sample UserPersona (uniform random)</text><polygon fill="#FAFCF9" points="1803.8747,2763.6943,1954.8361,2763.6943,1966.8361,2775.6943,1954.8361,2787.6943,1803.8747,2787.6943,1791.8747,2775.6943,1803.8747,2763.6943" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="150.9614" x="1803.8747" y="2781.1262">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="1770.1328" y="2771.5923">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="1966.8361" y="2771.5923">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="375.2766" x="1386.9366" y="2807.6943"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="355.2766" x="1396.9366" y="2832.6602">GetRandomCoordsWithinRange(city_centre, 5km, rng)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="293.6709" x="1427.7394" y="2866.7622"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="273.6709" x="1437.7394" y="2891.7281">BuildEmail(name, used_email_local_parts)</text><path d="M1690.3945,2915.8301 L1690.3945,2964.4999 L1670.3945,2968.4999 L1690.3945,2972.4999 L1690.3945,3021.1697 A0,0 0 0 0 1690.3945,3021.1697 L2011.1754,3021.1697 A0,0 0 0 0 2011.1754,3021.1697 L2011.1754,2925.8301 L2001.1754,2915.8301 L1690.3945,2915.8301 A0,0 0 0 0 1690.3945,2915.8301" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2001.1754,2915.8301 L2001.1754,2925.8301 L2011.1754,2925.8301 L2001.1754,2915.8301" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="252.363" x="1696.3945" y="2935.796">email and date_of_birth are generated</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="261.715" x="1696.3945" y="2954.8639">programmatically, never LLM-authored.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="264.571" x="1696.3945" y="2973.9319">Generation + coordinate jitter run inside</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="299.7809" x="1696.3945" y="2992.9998">one try/catch per record. UserRecord.address</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="244.971" x="1696.3945" y="3012.0677">now carries {city, longitude, latitude}.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="191.6393" x="1478.7552" y="2948.9659"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="171.6393" x="1488.7552" y="2973.9319">GenerateDateOfBirth(rng)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="246.7011" x="1451.2243" y="3333.9074"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="226.7011" x="1461.2243" y="3358.8733">Log warning "SQLite export failed"</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="305.9209" x="2028.3789" y="2807.6943"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="285.9209" x="2038.3789" y="2832.6602">Log warning "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="1879.3554,3426.9753,1891.3554,3438.9753,1879.3554,3450.9753,1867.3554,3438.9753,1879.3554,3426.9753" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1383.6037,3460.9753,1395.6037,3472.9753,1383.6037,3484.9753,1371.6037,3472.9753,1383.6037,3460.9753" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1309.425,1779.151,1457.7824,1779.151,1469.7824,1791.151,1457.7824,1803.151,1309.425,1803.151,1297.425,1791.151,1309.425,1779.151" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="107.9256" x="1387.6037" y="1818.117">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="148.3574" x="1309.425" y="1796.583">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="35.2379" x="1262.1872" y="1787.049">Done</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="252.9311" x="1257.1382" y="3526.9753"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="232.9311" x="1267.1382" y="3551.9412">GenerateBreweries(enriched_cities)</text><polygon fill="#FAFCF9" points="1308.123,4449.227,1459.0844,4449.227,1471.0844,4461.227,1459.0844,4473.227,1308.123,4473.227,1296.123,4461.227,1308.123,4449.227" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="150.9614" x="1308.123" y="4466.6589">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="1274.3811" y="4457.125">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="1471.0844" y="4457.125">no</text><path d="M1242.8902,4493.227 L1242.8902,4522.8288 L1222.8902,4526.8288 L1242.8902,4530.8288 L1242.8902,4560.4307 A0,0 0 0 0 1242.8902,4560.4307 L1558.9951,4560.4307 A0,0 0 0 0 1558.9951,4560.4307 L1558.9951,4503.227 L1548.9951,4493.227 L1242.8902,4493.227 A0,0 0 0 0 1242.8902,4493.227" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1548.9951,4493.227 L1548.9951,4503.227 L1558.9951,4503.227 L1548.9951,4493.227" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="293.2289" x="1248.8902" y="4513.1929">Generation + coordinate jitter run inside one</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="295.1049" x="1248.8902" y="4532.2608">try/catch per record. BreweryRecord.address</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="244.971" x="1248.8902" y="4551.3287">now carries {city, longitude, latitude}.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="375.2766" x="847.6136" y="4507.2949"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="355.2766" x="857.6136" y="4532.2608">GetRandomCoordsWithinRange(city_centre, 5km, rng)</text><path d="M1178.6025,4873.1684 L1178.6025,4893.2363 L1158.6025,4897.2363 L1178.6025,4901.2363 L1178.6025,4921.3043 A0,0 0 0 0 1178.6025,4921.3043 L1422.2716,4921.3043 A0,0 0 0 0 1422.2716,4921.3043 L1422.2716,4883.1684 L1412.2716,4873.1684 L1178.6025,4873.1684 A0,0 0 0 0 1178.6025,4873.1684" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1412.2716,4873.1684 L1412.2716,4883.1684 L1422.2716,4883.1684 L1412.2716,4873.1684" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="222.6692" x="1184.6025" y="4893.1344">Data loss is prevented per-record.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="208.5291" x="1184.6025" y="4912.2023">The pipeline continues running.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="246.7011" x="911.9014" y="4877.7024"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="226.7011" x="921.9014" y="4902.6683">Log warning "SQLite export failed"</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="305.9209" x="1578.9951" y="4493.227"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="285.9209" x="1588.9951" y="4518.1929">Log warning "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="1383.6037,4975.3043,1395.6037,4987.3043,1383.6037,4999.3043,1371.6037,4987.3043,1383.6037,4975.3043" style="stroke:#628A5B;stroke-width:0.5;"/><line style="stroke:#547461;stroke-width:0.3;" x1="773.7604" x2="773.7604" y1="60.842" y2="5304.1099"/><rect fill="#E0EAE0" height="5243.2679" style="stroke:#E0EAE0;stroke-width:1;" width="1013.7406" x="2367.2998" y="60.842"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="353.3947" x="2704.4257" y="837.8947"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.3947" x="2714.4257" y="862.8606">GetUtcTimestamp() from SystemDateTimeProvider</text><path d="M2942.9379,886.9626 L2942.9379,935.6324 L2922.9379,939.6324 L2942.9379,943.6324 L2942.9379,992.3022 A0,0 0 0 0 2942.9379,992.3022 L3376.0403,992.3022 A0,0 0 0 0 3376.0403,992.3022 L3376.0403,896.9626 L3366.0403,886.9626 L2942.9379,886.9626 A0,0 0 0 0 2942.9379,886.9626" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3366.0403,886.9626 L3366.0403,896.9626 L3376.0403,896.9626 L3366.0403,886.9626" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="412.1024" x="2948.9379" y="906.9285">Builds a fresh biergarten_seed_<UTC datetime>.sqlite filename</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="372.5386" x="2948.9379" y="925.9964">Appends a numeric suffix if the timestamp already exists</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="144.4234" x="2948.9379" y="945.0644">Opens DB Connection</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.0674" x="2948.9379" y="964.1323">Executes Schema DDL</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="125.3555" x="2948.9379" y="983.2002">Begins Transaction</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="83.6297" x="2839.3082" y="920.0984"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="63.6297" x="2849.3082" y="945.0644">Initialize()</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="202.1393" x="2971.0245" y="3041.1697"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="182.1393" x="2981.0245" y="3066.1356">ProcessRecord(UserRecord)</text><polygon fill="#FAFCF9" points="3012.2794,3100.2376,3131.909,3100.2376,3143.909,3112.2376,3131.909,3124.2376,3012.2794,3124.2376,3000.2794,3112.2376,3012.2794,3100.2376" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="119.6295" x="3012.2794" y="3117.6696">Location in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="2978.5375" y="3108.1356">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="3143.909" y="3108.1356">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="134.3795" x="2912.6227" y="3134.2376"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="114.3795" x="2922.6227" y="3159.2035">Reuse location_id</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="194.7473" x="3067.0023" y="3134.2376"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="174.7473" x="3077.0023" y="3159.2035">Insert Location & Cache ID</text><polygon fill="#FAFCF9" points="3072.0942,3179.3055,3084.0942,3191.3055,3072.0942,3203.3055,3060.0942,3191.3055,3072.0942,3179.3055" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="199.3393" x="2972.4245" y="3223.3055"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="179.3393" x="2982.4245" y="3248.2714">Insert User (FK: location_id)</text><polygon fill="#FAFCF9" points="2967.9136,3282.3734,3176.2748,3282.3734,3188.2748,3294.3734,3176.2748,3306.3734,2967.9136,3306.3734,2955.9136,3294.3734,2967.9136,3282.3734" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="3076.0942" y="3321.3394">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="208.3612" x="2967.9136" y="3299.8054">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="3188.2748" y="3290.2714">no</text><polygon fill="#FAFCF9" points="3072.0942,3392.9753,3084.0942,3404.9753,3072.0942,3416.9753,3060.0942,3404.9753,3072.0942,3392.9753" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="249.7671" x="2407.8877" y="4580.4307"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="229.7671" x="2417.8877" y="4605.3966">ProcessRecord(GeneratedBrewery)</text><polygon fill="#FAFCF9" points="2472.9565,4639.4986,2592.586,4639.4986,2604.586,4651.4986,2592.586,4663.4986,2472.9565,4663.4986,2460.9565,4651.4986,2472.9565,4639.4986" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="119.6295" x="2472.9565" y="4656.9306">Location in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="2439.2146" y="4647.3966">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="2604.586" y="4647.3966">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="134.3795" x="2373.2998" y="4673.4986"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="114.3795" x="2383.2998" y="4698.4646">Reuse location_id</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="194.7473" x="2527.6793" y="4673.4986"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="174.7473" x="2537.6793" y="4698.4646">Insert Location & Cache ID</text><polygon fill="#FAFCF9" points="2532.7712,4718.5665,2544.7712,4730.5665,2532.7712,4742.5665,2520.7712,4730.5665,2532.7712,4718.5665" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="223.3212" x="2421.1106" y="4762.5665"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="203.3212" x="2431.1106" y="4787.5325">Insert Brewery (FK: location_id)</text><polygon fill="#FAFCF9" points="2428.5906,4821.6345,2636.9518,4821.6345,2648.9518,4833.6345,2636.9518,4845.6345,2428.5906,4845.6345,2416.5906,4833.6345,2428.5906,4821.6345" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="2536.7712" y="4860.6004">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="208.3612" x="2428.5906" y="4839.0664">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="2648.9518" y="4829.5325">no</text><polygon fill="#FAFCF9" points="2532.7712,4941.3043,2544.7712,4953.3043,2532.7712,4965.3043,2520.7712,4953.3043,2532.7712,4941.3043" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M2939.8649,5036.7703 L2939.8649,5056.8382 L2919.8649,5060.8382 L2939.8649,5064.8382 L2939.8649,5084.9061 A0,0 0 0 0 2939.8649,5084.9061 L3147.4562,5084.9061 A0,0 0 0 0 3147.4562,5084.9061 L3147.4562,5046.7703 L3137.4562,5036.7703 L2939.8649,5036.7703 A0,0 0 0 0 2939.8649,5036.7703" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3137.4562,5036.7703 L3137.4562,5046.7703 L3147.4562,5046.7703 L3137.4562,5036.7703" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.6495" x="2945.8649" y="5056.7362">Commits Transaction</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.5913" x="2945.8649" y="5075.8041">Closes Database Connection</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="77.4838" x="2842.3812" y="5041.3043"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="57.4838" x="2852.3812" y="5066.2702">Finalize()</text><line style="stroke:#547461;stroke-width:0.3;" x1="2367.2998" x2="2367.2998" y1="60.842" y2="5304.1099"/><rect fill="#E2EBDC" height="5243.2679" style="stroke:#E2EBDC;stroke-width:1;" width="740.2945" x="3381.0403" y="60.842"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="306.4109" x="3429.9011" y="1071.3701"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="286.4109" x="3439.9011" y="1096.336">JsonLoader::LoadLocations("locations.json")</text><path d="M3777.305,1135.438 L3777.305,1145.972 L3757.305,1149.972 L3777.305,1153.972 L3777.305,1164.5059 A0,0 0 0 0 3777.305,1164.5059 L3999.2322,1164.5059 A0,0 0 0 0 3999.2322,1164.5059 L3999.2322,1145.438 L3989.2322,1135.438 L3777.305,1135.438 A0,0 0 0 0 3777.305,1135.438" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3989.2322,1135.438 L3989.2322,1145.438 L3999.2322,1145.438 L3989.2322,1135.438" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="200.9272" x="3783.305" y="1155.4039">--location-count defaults to 10.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="348.3968" x="3408.9082" y="1130.438"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="328.3968" x="3418.9082" y="1155.4039">std::ranges::sample(all_locations, --location-count)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="224.4972" x="3470.858" y="1564.7435"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.4972" x="3480.858" y="1589.7095">LoadPersonas("personas.json")</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="392.1326" x="3387.0403" y="1623.8114"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="372.1326" x="3397.0403" y="1648.7774">LoadForenamesByCountry("forenames-by-country.json")</text><path d="M3792.6139,1672.8794 L3792.6139,1712.0152 L3772.6139,1716.0152 L3792.6139,1720.0152 L3792.6139,1759.151 A0,0 0 0 0 3792.6139,1759.151 L4116.3348,1759.151 A0,0 0 0 0 4116.3348,1759.151 L4116.3348,1682.8794 L4106.3348,1672.8794 L3792.6139,1672.8794 A0,0 0 0 0 3792.6139,1672.8794" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4106.3348,1672.8794 L4106.3348,1682.8794 L4116.3348,1682.8794 L4106.3348,1672.8794" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="248.401" x="3798.6139" y="1692.8453">Each call is cached after its first parse.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="302.7208" x="3798.6139" y="1711.9132">MockCuratedDataService (--mocked) returns a</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="278.417" x="3798.6139" y="1730.9811">fixed in-memory dataset instead and skips</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="199.1632" x="3798.6139" y="1750.049">these three JSON files entirely.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="379.0147" x="3393.5993" y="1696.4812"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="359.0147" x="3403.5993" y="1721.4472">LoadSurnamesByCountry("surnames-by-country.json")</text><line style="stroke:#547461;stroke-width:0.3;" x1="3381.0403" x2="3381.0403" y1="60.842" y2="5304.1099"/><rect fill="#DCE8D8" height="5243.2679" style="stroke:#DCE8D8;stroke-width:1;" width="601.52" x="4121.3348" y="60.842"/><path d="M4325.2262,1239.9719 L4325.2262,1279.1077 L4305.2262,1283.1077 L4325.2262,1287.1077 L4325.2262,1326.2435 A0,0 0 0 0 4325.2262,1326.2435 L4717.8547,1326.2435 A0,0 0 0 0 4717.8547,1326.2435 L4717.8547,1249.9719 L4707.8547,1239.9719 L4325.2262,1239.9719 A0,0 0 0 0 4325.2262,1239.9719" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4707.8547,1239.9719 L4707.8547,1249.9719 L4717.8547,1249.9719 L4707.8547,1239.9719" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="302.5807" x="4331.2262" y="1259.9378">WikipediaEnrichmentService fetches a generic</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="330.5527" x="4331.2262" y="1279.0057">"brewing" extract and a "beer in {country}" extract</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="371.6286" x="4331.2262" y="1298.0736">(not a city/region-specific page). MockEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="285.2489" x="4331.2262" y="1317.1415">(--mocked) returns an empty string instead.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="177.8914" x="4127.3348" y="1263.5737"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="157.8914" x="4137.3348" y="1288.5397">GetLocationContext(loc)</text><line style="stroke:#547461;stroke-width:0.3;" x1="4121.3348" x2="4121.3348" y1="60.842" y2="5304.1099"/><rect fill="#E5EDE1" height="5243.2679" style="stroke:#E5EDE1;stroke-width:1;" width="2330.8601" x="4722.8547" y="60.842"/><polygon fill="#FAFCF9" points="5316.7135,2020.8207,5425.6051,2020.8207,5437.6051,2032.8207,5425.6051,2044.8207,5316.7135,2044.8207,5304.7135,2032.8207,5316.7135,2020.8207" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="102.9416" x="5375.1593" y="2059.7866">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="108.8916" x="5316.7135" y="2038.2527">Generator Mode</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="206.5353" x="5267.8917" y="2083.8886"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.5353" x="5277.8917" y="2108.8546">DeterministicHash & Format</text><polygon fill="#FAFCF9" points="5688.9643,2020.8207,5797.8559,2020.8207,5809.8559,2032.8207,5797.8559,2044.8207,5688.9643,2044.8207,5676.9643,2032.8207,5688.9643,2020.8207" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="107.3236" x="5747.4101" y="2059.7866">LlamaGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="108.8916" x="5688.9643" y="2038.2527">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="117.3616" x="5809.8559" y="2028.7187">OpenAIGenerator</text><path d="M5930.6645,2088.8886 L5930.6645,2099.4226 L5910.6645,2103.4226 L5930.6645,2107.4226 L5930.6645,2117.9565 A0,0 0 0 0 5930.6645,2117.9565 L6315.0752,2117.9565 A0,0 0 0 0 6315.0752,2117.9565 L6315.0752,2098.8886 L6305.0752,2088.8886 L5930.6645,2088.8886 A0,0 0 0 0 5930.6645,2088.8886" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M6305.0752,2088.8886 L6305.0752,2098.8886 L6315.0752,2098.8886 L6305.0752,2088.8886" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="363.4107" x="5936.6645" y="2108.8546">Resolves to USER_GENERATION.md inside --prompt-dir.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="334.5088" x="5576.1557" y="2083.8886"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="314.5088" x="5586.1557" y="2108.8546">prompt_directory_->Load("USER_GENERATION")</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="477.9663" x="5504.427" y="2213.4226"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="457.9663" x="5514.427" y="2238.3885">Infer(system_prompt, user_prompt, max_tokens, kUserJsonGrammar)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="200.6273" x="5643.0965" y="2278.3254"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="180.6273" x="5653.0965" y="2303.2913">ValidateUserJson(raw, user)</text><polygon fill="#FAFCF9" points="5698.4213,2343.2282,5788.399,2343.2282,5800.399,2355.2282,5788.399,2367.2282,5698.4213,2367.2282,5686.4213,2355.2282,5698.4213,2343.2282" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="89.9777" x="5698.4213" y="2360.6602">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="5664.6794" y="2351.1262">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="5800.399" y="2351.1262">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="89.7197" x="5786.668" y="2377.2282"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.7197" x="5796.668" y="2402.1941">Attempt++</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="282.471" x="5690.2924" y="2451.2961"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="262.471" x="5700.2924" y="2476.2621">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="5743.4101,2156.1896,5755.4101,2168.1896,5743.4101,2180.1896,5731.4101,2168.1896,5743.4101,2156.1896" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="5701.8723,2544.364,5784.948,2544.364,5796.948,2556.364,5784.948,2568.364,5701.8723,2568.364,5689.8723,2556.364,5701.8723,2544.364" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="83.0757" x="5701.8723" y="2561.796">Attempt < 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="5796.948" y="2552.2621">yes</text><polygon fill="#FAFCF9" points="5743.4101,2603.364,5755.4101,2615.364,5743.4101,2627.364,5731.4101,2615.364,5743.4101,2603.364" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M6722.908,2061.5877 L6722.908,2081.6556 L6702.908,2085.6556 L6722.908,2089.6556 L6722.908,2109.7235 A0,0 0 0 0 6722.908,2109.7235 L7048.7148,2109.7235 A0,0 0 0 0 7048.7148,2109.7235 L7048.7148,2071.5877 L7038.7148,2061.5877 L6722.908,2061.5877 A0,0 0 0 0 6722.908,2061.5877" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M7038.7148,2061.5877 L7038.7148,2071.5877 L7048.7148,2071.5877 L7038.7148,2061.5877" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="304.8069" x="6728.908" y="2081.5536">Same prompt file as LlamaGenerator - content</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="133.7135" x="6728.908" y="2100.6215">is backend-agnostic.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="334.5088" x="6368.3991" y="2066.1216"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="314.5088" x="6378.3991" y="2091.0876">prompt_directory_->Load("USER_GENERATION")</text><rect fill="#FAFCF9" height="58.1358" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="381.1567" x="6345.0752" y="2200.1896"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="361.1567" x="6355.0752" y="2225.1555">CallChatCompletionsApi(system_prompt, user_prompt,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="208.0532" x="6355.0752" y="2244.2234">kUserJsonSchema, max_tokens)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="200.6273" x="6435.3399" y="2284.1603"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="180.6273" x="6445.3399" y="2309.1262">ValidateUserJson(raw, user)</text><path d="M6592.6424,2349.0631 L6592.6424,2473.4706 L6879.3334,2473.4706 L6879.3334,2359.0631 L6869.3334,2349.0631 L6592.6424,2349.0631" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M6869.3334,2349.0631 L6869.3334,2359.0631 L6879.3334,2359.0631 L6869.3334,2349.0631" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="250.7811" x="6598.6424" y="2369.029">Structured Outputs (response_format:</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="216.2572" x="6598.6424" y="2388.097">json_schema, strict: true) already</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="238.6011" x="6598.6424" y="2407.1649">guarantees schema shape, so only 2</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="265.691" x="6598.6424" y="2426.2328">attempts are needed - retries here cover</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="234.8351" x="6598.6424" y="2445.3007">transient failures / placeholder text,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.5095" x="6598.6424" y="2464.3686">not malformed JSON.</text><polygon fill="#FAFCF9" points="6490.6647,2473.4706,6580.6424,2473.4706,6592.6424,2485.4706,6580.6424,2497.4706,6490.6647,2497.4706,6478.6647,2485.4706,6490.6647,2473.4706" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="89.9777" x="6490.6647" y="2490.9026">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="6456.9228" y="2481.3686">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="6592.6424" y="2481.3686">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="89.7197" x="6578.9114" y="2507.4706"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.7197" x="6588.9114" y="2532.4365">Attempt++</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="282.471" x="6482.5358" y="2581.5385"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="262.471" x="6492.5358" y="2606.5045">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="6535.6535,2142.9565,6547.6535,2154.9565,6535.6535,2166.9565,6523.6535,2154.9565,6535.6535,2142.9565" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="6494.1157,2647.364,6577.1914,2647.364,6589.1914,2659.364,6577.1914,2671.364,6494.1157,2671.364,6482.1157,2659.364,6494.1157,2647.364" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="83.0757" x="6494.1157" y="2664.796">Attempt < 2?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="6589.1914" y="2655.2621">yes</text><polygon fill="#FAFCF9" points="6535.6535,2699.6943,6547.6535,2711.6943,6535.6535,2723.6943,6523.6535,2711.6943,6535.6535,2699.6943" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4802.6766,3646.5091,4911.5682,3646.5091,4923.5682,3658.5091,4911.5682,3670.5091,4802.6766,3670.5091,4790.6766,3658.5091,4802.6766,3646.5091" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="102.9416" x="4861.1224" y="3685.4751">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="108.8916" x="4802.6766" y="3663.9411">Generator Mode</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="206.5353" x="4753.8547" y="3709.5771"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.5353" x="4763.8547" y="3734.543">DeterministicHash & Format</text><polygon fill="#FAFCF9" points="5170.5923,3646.5091,5279.4839,3646.5091,5291.4839,3658.5091,5279.4839,3670.5091,5170.5923,3670.5091,5158.5923,3658.5091,5170.5923,3646.5091" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="107.3236" x="5229.0381" y="3685.4751">LlamaGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="108.8916" x="5170.5923" y="3663.9411">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="117.3616" x="5291.4839" y="3654.4072">OpenAIGenerator</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="169.6174" x="5140.2294" y="3709.5771"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="149.6174" x="5150.2294" y="3734.543">PrepareRegionContext</text><path d="M5426.6004,3788.645 L5426.6004,3799.1789 L5406.6004,3803.1789 L5426.6004,3807.1789 L5426.6004,3817.7129 A0,0 0 0 0 5426.6004,3817.7129 L5839.627,3817.7129 A0,0 0 0 0 5839.627,3817.7129 L5839.627,3798.645 L5829.627,3788.645 L5426.6004,3788.645 A0,0 0 0 0 5426.6004,3788.645" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5829.627,3788.645 L5829.627,3798.645 L5839.627,3798.645 L5829.627,3788.645" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="392.0266" x="5432.6004" y="3808.6109">Resolves to BREWERY_GENERATION.md inside --prompt-dir.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="363.1247" x="5043.4757" y="3783.645"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="343.1247" x="5053.4757" y="3808.6109">prompt_directory_->Load("BREWERY_GENERATION")</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="501.9482" x="4974.064" y="3913.1789"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="481.9482" x="4984.064" y="3938.1449">Infer(system_prompt, user_prompt, max_tokens, kBreweryJsonGrammar)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="249.6831" x="5100.1965" y="3978.0818"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="229.6831" x="5110.1965" y="4003.0477">ValidateBreweryJson(raw, brewery)</text><path d="M5282.0269,4032.9846 L5282.0269,4081.1204 L5541.67,4081.1204 L5541.67,4042.9846 L5531.67,4032.9846 L5282.0269,4032.9846" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5531.67,4032.9846 L5531.67,4042.9846 L5541.67,4042.9846 L5531.67,4032.9846" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="238.6431" x="5288.0269" y="4052.9505">max_tokens is fixed across retries —</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="189.1953" x="5288.0269" y="4072.0184">it is not raised on truncation.</text><polygon fill="#FAFCF9" points="5180.0492,4081.1204,5270.0269,4081.1204,5282.0269,4093.1204,5270.0269,4105.1204,5180.0492,4105.1204,5168.0492,4093.1204,5180.0492,4081.1204" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="89.9777" x="5180.0492" y="4098.5524">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="5146.3073" y="4089.0184">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="5282.0269" y="4089.0184">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="89.7197" x="5268.296" y="4115.1204"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.7197" x="5278.296" y="4140.0863">Attempt++</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="282.471" x="5171.9203" y="4189.1883"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="262.471" x="5181.9203" y="4214.1543">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="5225.0381,3855.9459,5237.0381,3867.9459,5225.0381,3879.9459,5213.0381,3867.9459,5225.0381,3855.9459" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="5183.5002,4282.2562,5266.5759,4282.2562,5278.5759,4294.2562,5266.5759,4306.2562,5183.5002,4306.2562,5171.5002,4294.2562,5183.5002,4282.2562" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="83.0757" x="5183.5002" y="4299.6882">Attempt < 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="5278.5759" y="4290.1543">yes</text><polygon fill="#FAFCF9" points="5225.0381,4341.2562,5237.0381,4353.2562,5225.0381,4365.2562,5213.0381,4353.2562,5225.0381,4341.2562" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="169.6174" x="5975.3966" y="3687.2761"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="149.6174" x="5985.3966" y="3712.2421">PrepareRegionContext</text><path d="M6261.7677,3761.344 L6261.7677,3781.412 L6241.7677,3785.412 L6261.7677,3789.412 L6261.7677,3809.4799 A0,0 0 0 0 6261.7677,3809.4799 L6587.5745,3809.4799 A0,0 0 0 0 6587.5745,3809.4799 L6587.5745,3771.344 L6577.5745,3761.344 L6261.7677,3761.344 A0,0 0 0 0 6261.7677,3761.344" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M6577.5745,3761.344 L6577.5745,3771.344 L6587.5745,3771.344 L6577.5745,3761.344" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="304.8069" x="6267.7677" y="3781.31">Same prompt file as LlamaGenerator - content</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="133.7135" x="6267.7677" y="3800.3779">is backend-agnostic.</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="363.1247" x="5878.643" y="3765.878"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="343.1247" x="5888.643" y="3790.8439">prompt_directory_->Load("BREWERY_GENERATION")</text><rect fill="#FAFCF9" height="58.1358" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="381.1567" x="5869.627" y="3899.9459"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="361.1567" x="5879.627" y="3924.9119">CallChatCompletionsApi(system_prompt, user_prompt,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="232.0351" x="5879.627" y="3943.9798">kBreweryJsonSchema, max_tokens)</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="249.6831" x="5935.3638" y="3983.9166"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="229.6831" x="5945.3638" y="4008.8826">ValidateBreweryJson(raw, brewery)</text><path d="M6117.1942,4038.8195 L6117.1942,4125.0911 L6450.925,4125.0911 L6450.925,4048.8195 L6440.925,4038.8195 L6117.1942,4038.8195" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M6440.925,4038.8195 L6440.925,4048.8195 L6450.925,4048.8195 L6440.925,4038.8195" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="312.7308" x="6123.1942" y="4058.7854">Structured Outputs already guarantees schema</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="301.2928" x="6123.1942" y="4077.8533">shape, so only 2 attempts are needed - retries</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="275.5189" x="6123.1942" y="4096.9212">here cover transient failures / placeholder</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.3114" x="6123.1942" y="4115.9891">text, not malformed JSON.</text><polygon fill="#FAFCF9" points="6015.2165,4125.0911,6105.1942,4125.0911,6117.1942,4137.0911,6105.1942,4149.0911,6015.2165,4149.0911,6003.2165,4137.0911,6015.2165,4125.0911" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="89.9777" x="6015.2165" y="4142.5231">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="5981.4746" y="4132.9891">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="17.1219" x="6117.1942" y="4132.9891">no</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="89.7197" x="6103.4632" y="4159.0911"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.7197" x="6113.4632" y="4184.0571">Attempt++</text><rect fill="#FAFCF9" height="39.0679" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="282.471" x="6007.0876" y="4233.159"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="262.471" x="6017.0876" y="4258.125">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="6060.2053,3842.7129,6072.2053,3854.7129,6060.2053,3866.7129,6048.2053,3854.7129,6060.2053,3842.7129" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="6018.6675,4326.227,6101.7432,4326.227,6113.7432,4338.227,6101.7432,4350.227,6018.6675,4350.227,6006.6675,4338.227,6018.6675,4326.227" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="83.0757" x="6018.6675" y="4343.6589">Attempt < 2?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.7419" x="6113.7432" y="4334.125">yes</text><polygon fill="#FAFCF9" points="6060.2053,4385.227,6072.2053,4397.227,6060.2053,4409.227,6048.2053,4397.227,6060.2053,4385.227" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="5588.3729,3586.0432,5736.7303,3586.0432,5748.7303,3598.0432,5736.7303,3610.0432,5588.3729,3610.0432,5576.3729,3598.0432,5588.3729,3586.0432" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="107.9256" x="5666.5516" y="3625.0091">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="148.3574" x="5588.3729" y="3603.4752">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="35.2379" x="5541.135" y="3593.9412">Done</text><line style="stroke:#547461;stroke-width:0.3;" x1="4722.8547" x2="4722.8547" y1="60.842" y2="5304.1099"/><line style="stroke:#547461;stroke-width:0.3;" x1="7053.7148" x2="7053.7148" y1="60.842" y2="5304.1099"/><polygon fill="#628A5B" points="6595.5745,4334.5911,6599.5745,4324.5911,6603.5745,4334.5911" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="104.9099" y2="124.9099"/><polygon fill="#628A5B" points="248.0382,114.9099,256.0382,114.9099,252.0382,124.9099" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="163.9778" y2="188.0457"/><polygon fill="#628A5B" points="248.0382,178.0457,256.0382,178.0457,252.0382,188.0457" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="246.1815" y2="280.2495"/><polygon fill="#628A5B" points="248.0382,270.2495,256.0382,270.2495,252.0382,280.2495" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="429.9193" y2="455.8853"/><polygon fill="#628A5B" points="248.0382,445.8853,256.0382,445.8853,252.0382,455.8853" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="363.3174" y2="390.8513"/><polygon fill="#628A5B" points="248.0382,380.8513,256.0382,380.8513,252.0382,390.8513" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="333.5759" x2="345.5759" y1="351.3174" y2="351.3174"/><polygon fill="#628A5B" points="341.5759,425.8853,349.5759,425.8853,345.5759,435.8853" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="345.5759" x2="345.5759" y1="351.3174" y2="499.8853"/><line style="stroke:#628A5B;stroke-width:1;" x1="345.5759" x2="252.0382" y1="499.8853" y2="499.8853"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="499.8853" y2="519.8853"/><polygon fill="#628A5B" points="248.0382,509.8853,256.0382,509.8853,252.0382,519.8853" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="319.3174" y2="339.3174"/><polygon fill="#628A5B" points="248.0382,329.3174,256.0382,329.3174,252.0382,339.3174" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="558.9532" y2="583.0211"/><polygon fill="#628A5B" points="248.0382,573.0211,256.0382,573.0211,252.0382,583.0211" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="622.089" y2="656.157"/><polygon fill="#628A5B" points="248.0382,646.157,256.0382,646.157,252.0382,656.157" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="695.2249" y2="715.2249"/><polygon fill="#628A5B" points="248.0382,705.2249,256.0382,705.2249,252.0382,715.2249" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="5143.974" y2="5163.974"/><polygon fill="#628A5B" points="248.0382,5153.974,256.0382,5153.974,252.0382,5163.974" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="5203.042" y2="5223.042"/><polygon fill="#628A5B" points="248.0382,5213.042,256.0382,5213.042,252.0382,5223.042" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="5262.1099" y2="5282.1099"/><polygon fill="#628A5B" points="248.0382,5272.1099,256.0382,5272.1099,252.0382,5282.1099" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1324.0389" x2="1254.6632" y1="1372.6077" y2="1372.6077"/><line style="stroke:#628A5B;stroke-width:1;" x1="1254.6632" x2="1254.6632" y1="1372.6077" y2="1394.6077"/><polygon fill="#628A5B" points="1250.6632,1384.6077,1258.6632,1384.6077,1254.6632,1394.6077" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1443.1685" x2="1512.5443" y1="1372.6077" y2="1372.6077"/><line style="stroke:#628A5B;stroke-width:1;" x1="1512.5443" x2="1512.5443" y1="1372.6077" y2="1394.6077"/><polygon fill="#628A5B" points="1508.5443,1384.6077,1516.5443,1384.6077,1512.5443,1394.6077" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1254.6632" x2="1254.6632" y1="1433.6756" y2="1451.6756"/><line style="stroke:#628A5B;stroke-width:1;" x1="1254.6632" x2="1371.6037" y1="1451.6756" y2="1451.6756"/><polygon fill="#628A5B" points="1361.6037,1447.6756,1371.6037,1451.6756,1361.6037,1455.6756" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1512.5443" x2="1512.5443" y1="1433.6756" y2="1451.6756"/><line style="stroke:#628A5B;stroke-width:1;" x1="1512.5443" x2="1395.6037" y1="1451.6756" y2="1451.6756"/><polygon fill="#628A5B" points="1405.6037,1447.6756,1395.6037,1451.6756,1405.6037,1455.6756" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1463.6756" y2="1473.6756"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1897.178" y1="1473.6756" y2="1473.6756"/><polygon fill="#628A5B" points="1893.178,1340.6077,1897.178,1330.6077,1901.178,1340.6077" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1897.178" x2="1897.178" y1="1201.5059" y2="1473.6756"/><line style="stroke:#628A5B;stroke-width:1;" x1="1897.178" x2="1486.6944" y1="1201.5059" y2="1201.5059"/><polygon fill="#628A5B" points="1496.6944,1197.5059,1486.6944,1201.5059,1496.6944,1205.5059" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1280.5131" x2="1151.5714" y1="1201.5059" y2="1201.5059"/><polygon fill="#628A5B" points="1147.5714,1326.6077,1155.5714,1326.6077,1151.5714,1336.6077" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1151.5714" x2="1151.5714" y1="1201.5059" y2="1485.6756"/><line style="stroke:#628A5B;stroke-width:1;" x1="1151.5714" x2="1383.6037" y1="1485.6756" y2="1485.6756"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1485.6756" y2="1505.6756"/><polygon fill="#628A5B" points="1379.6037,1495.6756,1387.6037,1495.6756,1383.6037,1505.6756" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="1574.5749" y1="2846.7622" y2="2866.7622"/><polygon fill="#628A5B" points="1570.5749,2856.7622,1578.5749,2856.7622,1574.5749,2866.7622" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="1574.5749" y1="2905.8301" y2="2948.9659"/><polygon fill="#628A5B" points="1570.5749,2938.9659,1578.5749,2938.9659,1574.5749,2948.9659" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1791.8747" x2="1574.5749" y1="2775.6943" y2="2775.6943"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="1574.5749" y1="2775.6943" y2="2807.6943"/><polygon fill="#628A5B" points="1570.5749,2797.6943,1578.5749,2797.6943,1574.5749,2807.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1966.8361" x2="2181.3393" y1="2775.6943" y2="2775.6943"/><line style="stroke:#628A5B;stroke-width:1;" x1="2181.3393" x2="2181.3393" y1="2775.6943" y2="2807.6943"/><polygon fill="#628A5B" points="2177.3393,2797.6943,2185.3393,2797.6943,2181.3393,2807.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2181.3393" x2="2181.3393" y1="2846.7622" y2="3438.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="2181.3393" x2="1891.3554" y1="3438.9753" y2="3438.9753"/><polygon fill="#628A5B" points="1901.3554,3434.9753,1891.3554,3438.9753,1901.3554,3442.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1276.2361" x2="887.8521" y1="1929.7528" y2="1929.7528"/><line style="stroke:#628A5B;stroke-width:1;" x1="887.8521" x2="887.8521" y1="1929.7528" y2="1961.7528"/><polygon fill="#628A5B" points="883.8521,1951.7528,891.8521,1951.7528,887.8521,1961.7528" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1490.9714" x2="1879.3554" y1="1929.7528" y2="1929.7528"/><line style="stroke:#628A5B;stroke-width:1;" x1="1879.3554" x2="1879.3554" y1="1929.7528" y2="1961.7528"/><polygon fill="#628A5B" points="1875.3554,1951.7528,1883.3554,1951.7528,1879.3554,1961.7528" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="887.8521" x2="887.8521" y1="2000.8207" y2="3472.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="887.8521" x2="1371.6037" y1="3472.9753" y2="3472.9753"/><polygon fill="#628A5B" points="1361.6037,3468.9753,1371.6037,3472.9753,1361.6037,3476.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1879.3554" x2="1879.3554" y1="3450.9753" y2="3472.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="1879.3554" x2="1395.6037" y1="3472.9753" y2="3472.9753"/><polygon fill="#628A5B" points="1405.6037,3468.9753,1395.6037,3472.9753,1405.6037,3476.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1897.7528" y2="1917.7528"/><polygon fill="#628A5B" points="1379.6037,1907.7528,1387.6037,1907.7528,1383.6037,1917.7528" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1803.151" y2="1839.617"/><polygon fill="#628A5B" points="1379.6037,1829.617,1387.6037,1829.617,1383.6037,1839.617" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="3484.9753" y2="3494.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="2348.2998" y1="3494.9753" y2="3494.9753"/><polygon fill="#628A5B" points="2344.2998,2679.6943,2348.2998,2669.6943,2352.2998,2679.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2348.2998" x2="2348.2998" y1="1791.151" y2="3494.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="2348.2998" x2="1469.7824" y1="1791.151" y2="1791.151"/><polygon fill="#628A5B" points="1479.7824,1787.151,1469.7824,1791.151,1479.7824,1795.151" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1297.425" x2="792.7604" y1="1791.151" y2="1791.151"/><polygon fill="#628A5B" points="788.7604,2665.6943,796.7604,2665.6943,792.7604,2675.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="792.7604" x2="792.7604" y1="1791.151" y2="3506.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="792.7604" x2="1383.6037" y1="3506.9753" y2="3506.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="3506.9753" y2="3526.9753"/><polygon fill="#628A5B" points="1379.6037,3516.9753,1387.6037,3516.9753,1383.6037,3526.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1296.123" x2="1035.2519" y1="4461.227" y2="4461.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="1035.2519" x2="1035.2519" y1="4461.227" y2="4507.2949"/><polygon fill="#628A5B" points="1031.2519,4497.2949,1039.2519,4497.2949,1035.2519,4507.2949" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1471.0844" x2="1731.9555" y1="4461.227" y2="4461.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="1731.9555" x2="1731.9555" y1="4461.227" y2="4493.227"/><polygon fill="#628A5B" points="1727.9555,4483.227,1735.9555,4483.227,1731.9555,4493.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1731.9555" x2="1731.9555" y1="4532.2949" y2="4987.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="1731.9555" x2="1395.6037" y1="4987.3043" y2="4987.3043"/><polygon fill="#628A5B" points="1405.6037,4983.3043,1395.6037,4987.3043,1405.6037,4991.3043" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="2881.123" y1="876.9626" y2="920.0984"/><polygon fill="#628A5B" points="2877.123,910.0984,2885.123,910.0984,2881.123,920.0984" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3000.2794" x2="2979.8125" y1="3112.2376" y2="3112.2376"/><line style="stroke:#628A5B;stroke-width:1;" x1="2979.8125" x2="2979.8125" y1="3112.2376" y2="3134.2376"/><polygon fill="#628A5B" points="2975.8125,3124.2376,2983.8125,3124.2376,2979.8125,3134.2376" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3143.909" x2="3164.3759" y1="3112.2376" y2="3112.2376"/><line style="stroke:#628A5B;stroke-width:1;" x1="3164.3759" x2="3164.3759" y1="3112.2376" y2="3134.2376"/><polygon fill="#628A5B" points="3160.3759,3124.2376,3168.3759,3124.2376,3164.3759,3134.2376" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2979.8125" x2="2979.8125" y1="3173.3055" y2="3191.3055"/><line style="stroke:#628A5B;stroke-width:1;" x1="2979.8125" x2="3060.0942" y1="3191.3055" y2="3191.3055"/><polygon fill="#628A5B" points="3050.0942,3187.3055,3060.0942,3191.3055,3050.0942,3195.3055" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3164.3759" x2="3164.3759" y1="3173.3055" y2="3191.3055"/><line style="stroke:#628A5B;stroke-width:1;" x1="3164.3759" x2="3084.0942" y1="3191.3055" y2="3191.3055"/><polygon fill="#628A5B" points="3094.0942,3187.3055,3084.0942,3191.3055,3094.0942,3195.3055" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3080.2376" y2="3100.2376"/><polygon fill="#628A5B" points="3068.0942,3090.2376,3076.0942,3090.2376,3072.0942,3100.2376" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3203.3055" y2="3223.3055"/><polygon fill="#628A5B" points="3068.0942,3213.3055,3076.0942,3213.3055,3072.0942,3223.3055" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3188.2748" x2="3205.4448" y1="3294.3734" y2="3294.3734"/><polygon fill="#628A5B" points="3201.4448,3343.4413,3209.4448,3343.4413,3205.4448,3353.4413" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3205.4448" x2="3205.4448" y1="3294.3734" y2="3404.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="3205.4448" x2="3084.0942" y1="3404.9753" y2="3404.9753"/><polygon fill="#628A5B" points="3094.0942,3400.9753,3084.0942,3404.9753,3094.0942,3408.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3262.3734" y2="3282.3734"/><polygon fill="#628A5B" points="3068.0942,3272.3734,3076.0942,3272.3734,3072.0942,3282.3734" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2460.9565" x2="2440.4895" y1="4651.4986" y2="4651.4986"/><line style="stroke:#628A5B;stroke-width:1;" x1="2440.4895" x2="2440.4895" y1="4651.4986" y2="4673.4986"/><polygon fill="#628A5B" points="2436.4895,4663.4986,2444.4895,4663.4986,2440.4895,4673.4986" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2604.586" x2="2625.053" y1="4651.4986" y2="4651.4986"/><line style="stroke:#628A5B;stroke-width:1;" x1="2625.053" x2="2625.053" y1="4651.4986" y2="4673.4986"/><polygon fill="#628A5B" points="2621.053,4663.4986,2629.053,4663.4986,2625.053,4673.4986" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2440.4895" x2="2440.4895" y1="4712.5665" y2="4730.5665"/><line style="stroke:#628A5B;stroke-width:1;" x1="2440.4895" x2="2520.7712" y1="4730.5665" y2="4730.5665"/><polygon fill="#628A5B" points="2510.7712,4726.5665,2520.7712,4730.5665,2510.7712,4734.5665" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2625.053" x2="2625.053" y1="4712.5665" y2="4730.5665"/><line style="stroke:#628A5B;stroke-width:1;" x1="2625.053" x2="2544.7712" y1="4730.5665" y2="4730.5665"/><polygon fill="#628A5B" points="2554.7712,4726.5665,2544.7712,4730.5665,2554.7712,4734.5665" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4619.4986" y2="4639.4986"/><polygon fill="#628A5B" points="2528.7712,4629.4986,2536.7712,4629.4986,2532.7712,4639.4986" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4742.5665" y2="4762.5665"/><polygon fill="#628A5B" points="2528.7712,4752.5665,2536.7712,4752.5665,2532.7712,4762.5665" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2648.9518" x2="2929.791" y1="4833.6345" y2="4833.6345"/><polygon fill="#628A5B" points="2925.791,4887.2363,2933.791,4887.2363,2929.791,4897.2363" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2929.791" x2="2929.791" y1="4833.6345" y2="4953.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="2929.791" x2="2544.7712" y1="4953.3043" y2="4953.3043"/><polygon fill="#628A5B" points="2554.7712,4949.3043,2544.7712,4953.3043,2554.7712,4957.3043" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4801.6345" y2="4821.6345"/><polygon fill="#628A5B" points="2528.7712,4811.6345,2536.7712,4811.6345,2532.7712,4821.6345" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1110.438" y2="1130.438"/><polygon fill="#628A5B" points="3579.1066,1120.438,3587.1066,1120.438,3583.1066,1130.438" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1603.8114" y2="1623.8114"/><polygon fill="#628A5B" points="3579.1066,1613.8114,3587.1066,1613.8114,3583.1066,1623.8114" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1662.8794" y2="1696.4812"/><polygon fill="#628A5B" points="3579.1066,1686.4812,3587.1066,1686.4812,3583.1066,1696.4812" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2252.4905" y2="2278.3254"/><polygon fill="#628A5B" points="5739.4101,2268.3254,5747.4101,2268.3254,5743.4101,2278.3254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5831.5279" x2="5831.5279" y1="2416.2961" y2="2451.2961"/><polygon fill="#628A5B" points="5827.5279,2441.2961,5835.5279,2441.2961,5831.5279,2451.2961" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5686.4213" x2="5655.2924" y1="2355.2282" y2="2355.2282"/><line style="stroke:#628A5B;stroke-width:1;" x1="5655.2924" x2="5655.2924" y1="2355.2282" y2="2615.364"/><line style="stroke:#628A5B;stroke-width:1;" x1="5655.2924" x2="5731.4101" y1="2615.364" y2="2615.364"/><polygon fill="#628A5B" points="5721.4101,2611.364,5731.4101,2615.364,5721.4101,2619.364" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5800.399" x2="5831.5279" y1="2355.2282" y2="2355.2282"/><line style="stroke:#628A5B;stroke-width:1;" x1="5831.5279" x2="5831.5279" y1="2355.2282" y2="2377.2282"/><polygon fill="#628A5B" points="5827.5279,2367.2282,5835.5279,2367.2282,5831.5279,2377.2282" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5831.5279" x2="5831.5279" y1="2490.364" y2="2496.364"/><line style="stroke:#628A5B;stroke-width:1;" x1="5831.5279" x2="5743.4101" y1="2496.364" y2="2496.364"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2496.364" y2="2544.364"/><polygon fill="#628A5B" points="5739.4101,2534.364,5747.4101,2534.364,5743.4101,2544.364" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2317.3933" y2="2343.2282"/><polygon fill="#628A5B" points="5739.4101,2333.2282,5747.4101,2333.2282,5743.4101,2343.2282" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2180.1896" y2="2213.4226"/><polygon fill="#628A5B" points="5739.4101,2203.4226,5747.4101,2203.4226,5743.4101,2213.4226" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5796.948" x2="5994.7634" y1="2556.364" y2="2556.364"/><polygon fill="#628A5B" points="5990.7634,2355.7282,5994.7634,2345.7282,5998.7634,2355.7282" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5994.7634" x2="5994.7634" y1="2168.1896" y2="2556.364"/><line style="stroke:#628A5B;stroke-width:1;" x1="5994.7634" x2="5755.4101" y1="2168.1896" y2="2168.1896"/><polygon fill="#628A5B" points="5765.4101,2164.1896,5755.4101,2168.1896,5765.4101,2172.1896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2568.364" y2="2603.364"/><polygon fill="#628A5B" points="5739.4101,2593.364,5747.4101,2593.364,5743.4101,2603.364" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2122.9565" y2="2156.1896"/><polygon fill="#628A5B" points="5739.4101,2146.1896,5747.4101,2146.1896,5743.4101,2156.1896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2258.3254" y2="2284.1603"/><polygon fill="#628A5B" points="6531.6535,2274.1603,6539.6535,2274.1603,6535.6535,2284.1603" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6623.7713" x2="6623.7713" y1="2546.5385" y2="2581.5385"/><polygon fill="#628A5B" points="6619.7713,2571.5385,6627.7713,2571.5385,6623.7713,2581.5385" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6478.6647" x2="6447.5358" y1="2485.4706" y2="2485.4706"/><line style="stroke:#628A5B;stroke-width:1;" x1="6447.5358" x2="6447.5358" y1="2485.4706" y2="2711.6943"/><line style="stroke:#628A5B;stroke-width:1;" x1="6447.5358" x2="6523.6535" y1="2711.6943" y2="2711.6943"/><polygon fill="#628A5B" points="6513.6535,2707.6943,6523.6535,2711.6943,6513.6535,2715.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6592.6424" x2="6623.7713" y1="2485.4706" y2="2485.4706"/><line style="stroke:#628A5B;stroke-width:1;" x1="6623.7713" x2="6623.7713" y1="2485.4706" y2="2507.4706"/><polygon fill="#628A5B" points="6619.7713,2497.4706,6627.7713,2497.4706,6623.7713,2507.4706" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6623.7713" x2="6623.7713" y1="2620.6064" y2="2626.6064"/><line style="stroke:#628A5B;stroke-width:1;" x1="6623.7713" x2="6535.6535" y1="2626.6064" y2="2626.6064"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2626.6064" y2="2647.364"/><polygon fill="#628A5B" points="6531.6535,2637.364,6539.6535,2637.364,6535.6535,2647.364" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2323.2282" y2="2473.4706"/><polygon fill="#628A5B" points="6531.6535,2463.4706,6539.6535,2463.4706,6535.6535,2473.4706" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2166.9565" y2="2200.1896"/><polygon fill="#628A5B" points="6531.6535,2190.1896,6539.6535,2190.1896,6535.6535,2200.1896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6589.1914" x2="6891.3334" y1="2659.364" y2="2659.364"/><polygon fill="#628A5B" points="6887.3334,2414.2329,6891.3334,2404.2329,6895.3334,2414.2329" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6891.3334" x2="6891.3334" y1="2154.9565" y2="2659.364"/><line style="stroke:#628A5B;stroke-width:1;" x1="6891.3334" x2="6547.6535" y1="2154.9565" y2="2154.9565"/><polygon fill="#628A5B" points="6557.6535,2150.9565,6547.6535,2154.9565,6557.6535,2158.9565" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2671.364" y2="2699.6943"/><polygon fill="#628A5B" points="6531.6535,2689.6943,6539.6535,2689.6943,6535.6535,2699.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2105.1896" y2="2142.9565"/><polygon fill="#628A5B" points="6531.6535,2132.9565,6539.6535,2132.9565,6535.6535,2142.9565" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5371.1593" x2="5371.1593" y1="2044.8207" y2="2083.8886"/><polygon fill="#628A5B" points="5367.1593,2073.8886,5375.1593,2073.8886,5371.1593,2083.8886" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5371.1593" x2="5371.1593" y1="2122.9565" y2="2743.6943"/><polygon fill="#628A5B" points="5367.1593,2733.6943,5375.1593,2733.6943,5371.1593,2743.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2044.8207" y2="2083.8886"/><polygon fill="#628A5B" points="5739.4101,2073.8886,5747.4101,2073.8886,5743.4101,2083.8886" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5743.4101" x2="5743.4101" y1="2627.364" y2="2743.6943"/><polygon fill="#628A5B" points="5739.4101,2733.6943,5747.4101,2733.6943,5743.4101,2743.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5437.6051" x2="5676.9643" y1="2032.8207" y2="2032.8207"/><polygon fill="#628A5B" points="5666.9643,2028.8207,5676.9643,2032.8207,5666.9643,2036.8207" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1879.3554" x2="1879.3554" y1="2000.8207" y2="2005.8207"/><line style="stroke:#628A5B;stroke-width:1;" x1="1879.3554" x2="5371.1593" y1="2005.8207" y2="2005.8207"/><line style="stroke:#628A5B;stroke-width:1;" x1="5371.1593" x2="5371.1593" y1="2005.8207" y2="2020.8207"/><polygon fill="#628A5B" points="5367.1593,2010.8207,5375.1593,2010.8207,5371.1593,2020.8207" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5809.8559" x2="6535.6535" y1="2032.8207" y2="2032.8207"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2032.8207" y2="2066.1216"/><polygon fill="#628A5B" points="6531.6535,2056.1216,6539.6535,2056.1216,6535.6535,2066.1216" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6535.6535" x2="6535.6535" y1="2723.6943" y2="2743.6943"/><polygon fill="#628A5B" points="6531.6535,2733.6943,6539.6535,2733.6943,6535.6535,2743.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5371.1593" x2="6535.6535" y1="2743.6943" y2="2743.6943"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="3748.645" y2="3783.645"/><polygon fill="#628A5B" points="5221.0381,3773.645,5229.0381,3773.645,5225.0381,3783.645" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="3952.2469" y2="3978.0818"/><polygon fill="#628A5B" points="5221.0381,3968.0818,5229.0381,3968.0818,5225.0381,3978.0818" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5313.1558" x2="5313.1558" y1="4154.1883" y2="4189.1883"/><polygon fill="#628A5B" points="5309.1558,4179.1883,5317.1558,4179.1883,5313.1558,4189.1883" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5168.0492" x2="5136.9203" y1="4093.1204" y2="4093.1204"/><line style="stroke:#628A5B;stroke-width:1;" x1="5136.9203" x2="5136.9203" y1="4093.1204" y2="4353.2562"/><line style="stroke:#628A5B;stroke-width:1;" x1="5136.9203" x2="5213.0381" y1="4353.2562" y2="4353.2562"/><polygon fill="#628A5B" points="5203.0381,4349.2562,5213.0381,4353.2562,5203.0381,4357.2562" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5282.0269" x2="5313.1558" y1="4093.1204" y2="4093.1204"/><line style="stroke:#628A5B;stroke-width:1;" x1="5313.1558" x2="5313.1558" y1="4093.1204" y2="4115.1204"/><polygon fill="#628A5B" points="5309.1558,4105.1204,5317.1558,4105.1204,5313.1558,4115.1204" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5313.1558" x2="5313.1558" y1="4228.2562" y2="4234.2562"/><line style="stroke:#628A5B;stroke-width:1;" x1="5313.1558" x2="5225.0381" y1="4234.2562" y2="4234.2562"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="4234.2562" y2="4282.2562"/><polygon fill="#628A5B" points="5221.0381,4272.2562,5229.0381,4272.2562,5225.0381,4282.2562" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="4017.1497" y2="4081.1204"/><polygon fill="#628A5B" points="5221.0381,4071.1204,5229.0381,4071.1204,5225.0381,4081.1204" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="3879.9459" y2="3913.1789"/><polygon fill="#628A5B" points="5221.0381,3903.1789,5229.0381,3903.1789,5225.0381,3913.1789" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5278.5759" x2="5553.67" y1="4294.2562" y2="4294.2562"/><polygon fill="#628A5B" points="5549.67,4069.5525,5553.67,4059.5525,5557.67,4069.5525" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5553.67" x2="5553.67" y1="3867.9459" y2="4294.2562"/><line style="stroke:#628A5B;stroke-width:1;" x1="5553.67" x2="5237.0381" y1="3867.9459" y2="3867.9459"/><polygon fill="#628A5B" points="5247.0381,3863.9459,5237.0381,3867.9459,5247.0381,3871.9459" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="4306.2562" y2="4341.2562"/><polygon fill="#628A5B" points="5221.0381,4331.2562,5229.0381,4331.2562,5225.0381,4341.2562" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="3822.7129" y2="3855.9459"/><polygon fill="#628A5B" points="5221.0381,3845.9459,5229.0381,3845.9459,5225.0381,3855.9459" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="3726.344" y2="3765.878"/><polygon fill="#628A5B" points="6056.2053,3755.878,6064.2053,3755.878,6060.2053,3765.878" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="3958.0818" y2="3983.9166"/><polygon fill="#628A5B" points="6056.2053,3973.9166,6064.2053,3973.9166,6060.2053,3983.9166" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6148.3231" x2="6148.3231" y1="4198.159" y2="4233.159"/><polygon fill="#628A5B" points="6144.3231,4223.159,6152.3231,4223.159,6148.3231,4233.159" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6003.2165" x2="5972.0876" y1="4137.0911" y2="4137.0911"/><line style="stroke:#628A5B;stroke-width:1;" x1="5972.0876" x2="5972.0876" y1="4137.0911" y2="4397.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="5972.0876" x2="6048.2053" y1="4397.227" y2="4397.227"/><polygon fill="#628A5B" points="6038.2053,4393.227,6048.2053,4397.227,6038.2053,4401.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6117.1942" x2="6148.3231" y1="4137.0911" y2="4137.0911"/><line style="stroke:#628A5B;stroke-width:1;" x1="6148.3231" x2="6148.3231" y1="4137.0911" y2="4159.0911"/><polygon fill="#628A5B" points="6144.3231,4149.0911,6152.3231,4149.0911,6148.3231,4159.0911" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6148.3231" x2="6148.3231" y1="4272.227" y2="4278.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="6148.3231" x2="6060.2053" y1="4278.227" y2="4278.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="4278.227" y2="4326.227"/><polygon fill="#628A5B" points="6056.2053,4316.227,6064.2053,4316.227,6060.2053,4326.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="4022.9846" y2="4125.0911"/><polygon fill="#628A5B" points="6056.2053,4115.0911,6064.2053,4115.0911,6060.2053,4125.0911" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="3866.7129" y2="3899.9459"/><polygon fill="#628A5B" points="6056.2053,3889.9459,6064.2053,3889.9459,6060.2053,3899.9459" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6113.7432" x2="6462.925" y1="4338.227" y2="4338.227"/><polygon fill="#628A5B" points="6458.925,4084.9213,6462.925,4074.9213,6466.925,4084.9213" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6462.925" x2="6462.925" y1="3854.7129" y2="4338.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="6462.925" x2="6072.2053" y1="3854.7129" y2="3854.7129"/><polygon fill="#628A5B" points="6082.2053,3850.7129,6072.2053,3854.7129,6082.2053,3858.7129" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="4350.227" y2="4385.227"/><polygon fill="#628A5B" points="6056.2053,4375.227,6064.2053,4375.227,6060.2053,4385.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="3804.9459" y2="3842.7129"/><polygon fill="#628A5B" points="6056.2053,3832.7129,6064.2053,3832.7129,6060.2053,3842.7129" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4857.1224" x2="4857.1224" y1="3670.5091" y2="3709.5771"/><polygon fill="#628A5B" points="4853.1224,3699.5771,4861.1224,3699.5771,4857.1224,3709.5771" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4857.1224" x2="4857.1224" y1="3748.645" y2="4429.227"/><polygon fill="#628A5B" points="4853.1224,4419.227,4861.1224,4419.227,4857.1224,4429.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="3670.5091" y2="3709.5771"/><polygon fill="#628A5B" points="5221.0381,3699.5771,5229.0381,3699.5771,5225.0381,3709.5771" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5225.0381" x2="5225.0381" y1="4365.2562" y2="4429.227"/><polygon fill="#628A5B" points="5221.0381,4419.227,5229.0381,4419.227,5225.0381,4429.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4923.5682" x2="5158.5923" y1="3658.5091" y2="3658.5091"/><polygon fill="#628A5B" points="5148.5923,3654.5091,5158.5923,3658.5091,5148.5923,3662.5091" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5662.5516" x2="5662.5516" y1="3610.0432" y2="3631.5091"/><line style="stroke:#628A5B;stroke-width:1;" x1="5662.5516" x2="4857.1224" y1="3631.5091" y2="3631.5091"/><line style="stroke:#628A5B;stroke-width:1;" x1="4857.1224" x2="4857.1224" y1="3631.5091" y2="3646.5091"/><polygon fill="#628A5B" points="4853.1224,3636.5091,4861.1224,3636.5091,4857.1224,3646.5091" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5291.4839" x2="6060.2053" y1="3658.5091" y2="3658.5091"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="3658.5091" y2="3687.2761"/><polygon fill="#628A5B" points="6056.2053,3677.2761,6064.2053,3677.2761,6060.2053,3687.2761" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6060.2053" x2="6060.2053" y1="4409.227" y2="4429.227"/><polygon fill="#628A5B" points="6056.2053,4419.227,6064.2053,4419.227,6060.2053,4429.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4857.1224" x2="6060.2053" y1="4429.227" y2="4429.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="5576.3729" x2="4741.8547" y1="3598.0432" y2="3598.0432"/><polygon fill="#628A5B" points="4737.8547,4336.4746,4745.8547,4336.4746,4741.8547,4346.4746" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.8547" x2="4741.8547" y1="3598.0432" y2="5026.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.8547" x2="2881.123" y1="5026.3043" y2="5026.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="2881.123" y1="5026.3043" y2="5041.3043"/><polygon fill="#628A5B" points="2877.123,5031.3043,2885.123,5031.3043,2881.123,5041.3043" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="754.2928" y2="763.8268"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="1383.6037" y1="763.8268" y2="763.8268"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="763.8268" y2="778.8268"/><polygon fill="#628A5B" points="1379.6037,768.8268,1387.6037,768.8268,1383.6037,778.8268" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="817.8947" y2="822.8947"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="2881.123" y1="822.8947" y2="822.8947"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="2881.123" y1="822.8947" y2="837.8947"/><polygon fill="#628A5B" points="2877.123,827.8947,2885.123,827.8947,2881.123,837.8947" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="2881.123" y1="959.1663" y2="993.2343"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="1383.6037" y1="993.2343" y2="993.2343"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="993.2343" y2="1012.3022"/><polygon fill="#628A5B" points="1379.6037,1002.3022,1387.6037,1002.3022,1383.6037,1012.3022" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1051.3701" y2="1056.3701"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="3583.1066" y1="1056.3701" y2="1056.3701"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1056.3701" y2="1071.3701"/><polygon fill="#628A5B" points="3579.1066,1061.3701,3587.1066,1061.3701,3583.1066,1071.3701" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4216.2805" x2="4216.2805" y1="1302.6416" y2="1331.9426"/><line style="stroke:#628A5B;stroke-width:1;" x1="4216.2805" x2="1383.6037" y1="1331.9426" y2="1331.9426"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1331.9426" y2="1360.6077"/><polygon fill="#628A5B" points="1379.6037,1350.6077,1387.6037,1350.6077,1383.6037,1360.6077" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1213.5059" y2="1234.9719"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="4216.2805" y1="1234.9719" y2="1234.9719"/><line style="stroke:#628A5B;stroke-width:1;" x1="4216.2805" x2="4216.2805" y1="1234.9719" y2="1263.5737"/><polygon fill="#628A5B" points="4212.2805,1253.5737,4220.2805,1253.5737,4216.2805,1263.5737" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1169.5059" y2="1174.5059"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="1383.6037" y1="1174.5059" y2="1174.5059"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1174.5059" y2="1189.5059"/><polygon fill="#628A5B" points="1379.6037,1179.5059,1387.6037,1179.5059,1383.6037,1189.5059" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1544.7435" y2="1549.7435"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="3583.1066" y1="1549.7435" y2="1549.7435"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1549.7435" y2="1564.7435"/><polygon fill="#628A5B" points="3579.1066,1554.7435,3587.1066,1554.7435,3583.1066,1564.7435" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="1574.5749" y1="2988.0338" y2="3022.1018"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="3072.0942" y1="3022.1018" y2="3022.1018"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3022.1018" y2="3041.1697"/><polygon fill="#628A5B" points="3068.0942,3031.1697,3076.0942,3031.1697,3072.0942,3041.1697" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3306.3734" y2="3320.1404"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="1574.5749" y1="3320.1404" y2="3320.1404"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="1574.5749" y1="3320.1404" y2="3333.9074"/><polygon fill="#628A5B" points="1570.5749,3323.9074,1578.5749,3323.9074,1574.5749,3333.9074" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="1574.5749" y1="3372.9753" y2="3379.2083"/><line style="stroke:#628A5B;stroke-width:1;" x1="1574.5749" x2="3072.0942" y1="3379.2083" y2="3379.2083"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3379.2083" y2="3392.9753"/><polygon fill="#628A5B" points="3068.0942,3382.9753,3076.0942,3382.9753,3072.0942,3392.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="3072.0942" y1="3416.9753" y2="3420.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="3072.0942" x2="1849.3554" y1="3420.9753" y2="3420.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="1849.3554" x2="1849.3554" y1="3420.9753" y2="3438.9753"/><line style="stroke:#628A5B;stroke-width:1;" x1="1849.3554" x2="1867.3554" y1="3438.9753" y2="3438.9753"/><polygon fill="#628A5B" points="1857.3554,3434.9753,1867.3554,3438.9753,1857.3554,3442.9753" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="6158.3032" x2="6158.3032" y1="2743.6943" y2="2748.6943"/><line style="stroke:#628A5B;stroke-width:1;" x1="6158.3032" x2="1879.3554" y1="2748.6943" y2="2748.6943"/><line style="stroke:#628A5B;stroke-width:1;" x1="1879.3554" x2="1879.3554" y1="2748.6943" y2="2763.6943"/><polygon fill="#628A5B" points="1875.3554,2753.6943,1883.3554,2753.6943,1879.3554,2763.6943" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="3583.1066" y1="1735.5491" y2="1764.151"/><line style="stroke:#628A5B;stroke-width:1;" x1="3583.1066" x2="1383.6037" y1="1764.151" y2="1764.151"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="1764.151" y2="1779.151"/><polygon fill="#628A5B" points="1379.6037,1769.151,1387.6037,1769.151,1383.6037,1779.151" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1035.2519" x2="1035.2519" y1="4546.3628" y2="4565.4307"/><line style="stroke:#628A5B;stroke-width:1;" x1="1035.2519" x2="2532.7712" y1="4565.4307" y2="4565.4307"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4565.4307" y2="4580.4307"/><polygon fill="#628A5B" points="2528.7712,4570.4307,2536.7712,4570.4307,2532.7712,4580.4307" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4845.6345" y2="4861.6684"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="1035.2519" y1="4861.6684" y2="4861.6684"/><line style="stroke:#628A5B;stroke-width:1;" x1="1035.2519" x2="1035.2519" y1="4861.6684" y2="4877.7024"/><polygon fill="#628A5B" points="1031.2519,4867.7024,1039.2519,4867.7024,1035.2519,4877.7024" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1035.2519" x2="1035.2519" y1="4916.7703" y2="4926.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="1035.2519" x2="2532.7712" y1="4926.3043" y2="4926.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4926.3043" y2="4941.3043"/><polygon fill="#628A5B" points="2528.7712,4931.3043,2536.7712,4931.3043,2532.7712,4941.3043" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="2532.7712" y1="4965.3043" y2="4969.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="2532.7712" x2="1353.6037" y1="4969.3043" y2="4969.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="1353.6037" x2="1353.6037" y1="4969.3043" y2="4987.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="1353.6037" x2="1371.6037" y1="4987.3043" y2="4987.3043"/><polygon fill="#628A5B" points="1361.6037,4983.3043,1371.6037,4987.3043,1361.6037,4991.3043" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5662.5516" x2="5662.5516" y1="4429.227" y2="4434.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="5662.5516" x2="1383.6037" y1="4434.227" y2="4434.227"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="4434.227" y2="4449.227"/><polygon fill="#628A5B" points="1379.6037,4439.227,1387.6037,4439.227,1383.6037,4449.227" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="4999.3043" y2="5009.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="6599.5745" y1="5009.3043" y2="5009.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="6599.5745" x2="6599.5745" y1="3598.0432" y2="5009.3043"/><line style="stroke:#628A5B;stroke-width:1;" x1="6599.5745" x2="5748.7303" y1="3598.0432" y2="3598.0432"/><polygon fill="#628A5B" points="5758.7303,3594.0432,5748.7303,3598.0432,5758.7303,3602.0432" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="1383.6037" y1="3566.0432" y2="3571.0432"/><line style="stroke:#628A5B;stroke-width:1;" x1="1383.6037" x2="5662.5516" y1="3571.0432" y2="3571.0432"/><line style="stroke:#628A5B;stroke-width:1;" x1="5662.5516" x2="5662.5516" y1="3571.0432" y2="3586.0432"/><polygon fill="#628A5B" points="5658.5516,3576.0432,5666.5516,3576.0432,5662.5516,3586.0432" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="2881.123" y1="5080.3722" y2="5089.9061"/><line style="stroke:#628A5B;stroke-width:1;" x1="2881.123" x2="252.0382" y1="5089.9061" y2="5089.9061"/><line style="stroke:#628A5B;stroke-width:1;" x1="252.0382" x2="252.0382" y1="5089.9061" y2="5104.9061"/><polygon fill="#628A5B" points="248.0382,5094.9061,256.0382,5094.9061,252.0382,5104.9061" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="50.3998" x="369.1803" y="75.8079">main.cc</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="207.2832" x="1466.8884" y="75.8079">BiergartenPipelineOrchestrator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="126.2795" x="2811.0303" y="75.8079">SqliteExportService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="73.5977" x="3714.3887" y="75.8079">JsonLoader</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3435" x="4358.423" y="75.8079">IEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="98.5596" x="5839.005" y="75.8079">DataGenerator</text><?plantuml-src vLdRRXiv4dtNLn0UO20Zbk8ubytAGHQwEUjP9yv8oGGB113eRahYk9li8TcsjV40yn7pXVCbUuhiRhKklcBcPLSFjjHTLInMdQewxBRdKcNSy9HPjqW4_XePkJnD6hQw4uifpnDtf9Nxm5F1TWRlsPWhkxDTPYp_8zYp5xMRJhf4BDL_qidvN5_iR9FmoWVxjLjdF3gV6PshkAyJRTXtHzsZ_j7VjwzTY1oyVlxYeBlD_aq2NMFqPN7prS7hxijUxUO7xKHltOrXzsX_-7fTIfjOc4BYvOk_lNZrhBv8vEI5T8lUdLkg9EzbRo1vgbLyVxEbGjtwngwNtjueChwKQSBL7TjUbVeqbz6v4jQo_VRpHiDdXdsQ2zQJmiouSKAn0NUSVPIPIAGIhDdFZH7AiJz--vsD5ogQ6wrqRWinxkQxZSRrTqS7Hw-EzgzJBbKxYguRri5OezCtWZjOfxY8k3_dIedapOcU3PKpYxSiqRD95AuUDZhZZ5ygkiPYQJFkehampCrX8_wgcj0QL9SxdL6kchkxXms5p3CZPtFNO7uhMYKB5caLUSUZ1PCAHWIBYeranTOwaEV0RomZ-1WN2x7OO0-sxXdZAeRiL9jBRcBBOCH8OPdJp6OnkOjRVWdSaGRUvAeDXHyqLe71t4WrOtQUkrXZVtpgiAsw_IZHLjXsGwYOqNOQdO_SMD4ripo5ITlaPXRjCVozm8Rbb3MxM8MNjza5JsJyZrroGR6cqhjOl8DmCO72CkmfoosV2SHXgWznopgTDKHYaTo5iBkqh9ms6frZ9HqxpOGQZq_OBD5dF84ivUzxTfBmb1F68JocQqXNB3kTb9-BYLG_YyXfqsots-iPwKc5a1t3cvamU-nugD3ZvkJtM9WB6OazZwHtGWd3OMCFEiV3gqoRfS3nHwFJ33t6fDmvClD5dFKJITayurPGThHYhLQguM3CBcoRfJeMIOlw5oxGZtfuIuVRaSVd6-lYJYTNyfTSJ39dtYoheQo3KmFKeJ-JYs_VDh7Bpkr21K3Nek6lCUciIAPCMcPh1KK5PdcQmT9i3r0guqGHcONmIAts28rC-00ndYHipZEaZFRlvh0OK5pRB8epTClhsns-3W2Gm1AcmFZ74mc_mpg7tiZ-i3lSlnx_ak36IeAW-Kwupoxw95DOmnQmnobIXdvXdKYHNq6taCKBYIPqM5zf8qIzN2P038S5OUVih79wOeM89sy-V-gp61OTBBvjM-yEcyf4ACmtw7Sf7Dw0GdaWYCpcqwcyOgWRgb5NEedeKQWMsAIqpaALi8_6rcDzZRgCADouEhmIKUvGxsC4A-LiC3WXDyMCsiGdWrdCW-XZGlvZBipYH4S-jvQ2GSe7mzwWV_s3rUf4SqGCWiiVdGxzN-hi9ENNziyGsY5iUa33jPcmdOu7bMW2B9DAT0_LKlveHMZFRZqFw_VBIU_xthFzHo7iSeuyiIOAcGaUpGFSKP_bPj330E7cID0SeQOP0IRKeXYx_cxG7xuUlBxUx23NrEw0mD8AikV4bMl2_rtgTolROkoBF8TpiUGRXjXKq70XxFY2av5Ns3apuXBUx00fs4daV0boN1Tev9Wktto0pEBNIiBheHD3bFQmU6e05qJIPYAIKs0oGqFURRFtQ5WRRWJbifljCYDSRe0rhfX06rnudeZW07_ErpfZLIueKFTC1gEAm5JLvtd6fXoPMSwGHGXwCKOmzfHlIg0LcTyFXJLCa31j83Y6KS72PZ3g8VIjJCWU2zkVH24plnu6bp5ryBS0nK0hiVkGqYb6XlXiXR5DKImyAI1pOo7Hbu_Gq8gZThBYsx9qw3u0wjk9xItw8RNDdMbvhNMsQ1K9NzKQ8qjhIhQuj4rd1PP3AeU8-ZaA8EAqau8eO5YWlHaBuaAaWB9Dg04j8zP2ixD4xpR846-HLp0cLIiLgJOBQfwOcQw4ZmSp9POw8BAFfD8C4Uo7yUa7trXjmMkInPzIz7M8t5BmdR5l3dHgQLQndvmj9aKSzxugK9aYllNhhEnRRMdrysUlNasU-JP0Q2ThYCe5qCxFu1KHjq9lZJ_T0_hB8WckCa9Y0ItM19s0zPIX2ySw9JoIAABsSZWOFhjU8JtN_XuvM5r2acDHkaG9h-w4DR7gG00VAU9cdOp-oJ4ilsU18nrw4VBoPfkUqMqQpJpLciJ8Dp6anQJrbh3TtFay7eucxuOVXgFkf-FJ3pkxXuNAMdkbpqXOdLm4Yhocrqu9YnOy01CcBDR2Okr2jzR8w6D41e9MsGLlc0hJj9vMJ8Bs7jYjCDMFb5zDd0PDnOWxfuHGyR_3IIZbfd8PbduYpbnq3n9f6duPJDMaA7h7DbJ2Joiakyfz-612yFFgzsfdB1RiWhd2moTF3bUkUhOI6Bm7RS7P4JZKCAerx6kf4zfcFJgiAB1Y0VQ6FI_Agd8oE4Jqfdly5wLyJ4yNWYNVD1YtR1LYhCLy_rTB9JXv5iuKBJvJcd1yJo3qqIfnd7HzJPNdAKqtaxSXuwkgu128N1qh_o_8E5X7nlPSEfD7620O6wUvot9Ce2R8U8OWYydKTvXE9KpZR6ABY8OdM1q60sWq1S6kH6SvHpTq0eqXAE1Gp3CSyAmEf_Q3IfG7bz6hGIeKY3zyQVcDqybxBd0rqXV2L0gEYBW_4HALWUyMvzuiuP6OwoIcvmWW7dkLE56pb2Uq6LYcD6u5Nd4qBZhtVNdLIYkdpDayYeIrqppP1XFYhYC_9VfQczX-aJZ9gH6nzoPDd4b4JnmGffVdAQYKcbKuxFZ3qX33CsdI7FGmZISqJGFNJoOW3Mu9xueqqPdiTDgJnisRTOjRqE2jUPP0LJ7HqyaPgVdC5ETIVm8F7w1ovhijQXarYd6i1FB4JaxUjtZkvfZaSRkIhiNe2HAAtKj53nn-bdJEfmSfnR2eDC0IaUl5quYU0x6CX4G4lRQVlgFmdSSn061hsRu4gJ8UEzyef4GIr4owF4RC4ZX0ttxTW43n-_R3Rn5Pd6ufny63vjAPAhI1RGTgGgS6p_AsjutEI22H5P6PoBWqijb0C1EnbglEK201VRBCZWU7ZStEK8gJWo1b_-hKLobPId1sU1M9p9kCU0v4b4-ofBUmtVC7LSawos8xAuyTYaF9parxNsvh_SwgqHh8WiN0vZBSRBVRXVdIs9zsBEdXq2W8SJSSJRRIm4TovGSnnpjuuyDP8w0lq6R4o1_oYjDtYEhDtA8t6duPZlwzXLvijA0wcznKkvLGhZJp5GxnK2ePqhdOnYOhnb2J2QJXB5nOQG7tO0rrph2buBVmXOUoXMNft9j3RgHb6HuI3ATC7XbjRJMd__ZjztBdZeHewXekCQFyyqgqz-AajfwiMmZhNussHn3P6sdiBV1x586j0UmM3li_YSU3E_6uXRMMJtWtY6UXiau_RwUTXTAIVDv9EWiDJprlf9nrs9Tqyu4FyUv9DHzBD3T2VM_QHdIj3C9MqbP0T2jlUn1hM-LiTpEsDRvMJksujr8Yz-PiDp6s3MPo5rjRLa8fMdXq8rbx75Lx855x04tRSeJmxueJcWmeuSpWGA3eZIk0q2g0K8dI6zpo3QrlirBbo3yWHKjlFwIjnBWYSgkFfn_A24ipDp6rRGpnjZTaHwYGhU-xC01IUiPRVvE4g_wLi0ySlU6ilv6gFu9TV-tUyNfhhzNfFVJsj-guEV9FYjd-OSE_5lul?></g></svg> |