mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-05-31 17:53:59 +00:00
1 line
44 KiB
XML
1 line
44 KiB
XML
<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="CLASS" height="1130px" preserveAspectRatio="none" style="width:2127px;height:1130px;background:#FAFCF9;" version="1.1" viewBox="0 0 2127 1130" width="2127px" zoomAndPan="magnify"><title>The Biergarten Data Pipeline - Class Diagram</title><defs/><g><rect fill="#FAFCF9" height="1130" style="stroke:none;stroke-width:1;" width="2127" x="0" y="0"/><g class="title" data-source-line="25"><text fill="#28342A" font-family="'Volkhov'" font-size="20" font-weight="bold" lengthAdjust="spacing" textLength="443.18" x="835.0007" y="29.42">The Biergarten Data Pipeline - Class Diagram</text></g><!--class BiergartenDataGenerator--><g class="entity" data-qualified-name="BiergartenDataGenerator" data-source-line="27" id="ent0002"><rect fill="#FAFCF9" height="190.052" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="441.7737" x="1016.42" y="53.8"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="441.7737" x="1016.42" y="53.8"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="441.7737" x="1016.42" y="79.528"/><rect fill="none" height="190.052" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="441.7737" x="1016.42" y="53.8"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.6743" x="1155.4697" y="72.688">BiergartenDataGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="1017.42" x2="1457.1937" y1="82.028" y2="82.028"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="93.642"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="366.6779" x="1035.42" y="99.916">context_service_ : std::unique_ptr<IEnrichmentService></text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="111.87"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="294.8859" x="1035.42" y="118.144">generator_ : std::unique_ptr<DataGenerator></text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="130.098"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.2809" x="1035.42" y="136.372">exporter_ : std::unique_ptr<IExportService></text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="148.326"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="366.9547" x="1035.42" y="154.6">generated_breweries_ : std::vector<GeneratedBrewery></text><line style="stroke:#547461;stroke-width:0.5;" x1="1017.42" x2="1457.1937" y1="162.94" y2="162.94"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1027.42" cy="177.554" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="73.5806" x="1035.42" y="180.828">Run() : bool</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="192.782"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="332.658" x="1035.42" y="199.056">QueryCitiesWithCountries() : std::vector<Location></text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="211.01"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="416.7737" x="1035.42" y="217.284">GenerateBreweries(cities : std::span<const EnrichedCity>) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1024.42" y="229.238"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="118.9687" x="1035.42" y="235.512">LogResults() : void</text></g><!--class IEnrichmentService--><g class="entity" data-qualified-name="IEnrichmentService" data-source-line="38" id="ent0003"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="379.3302" x="28.64" y="342.08"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="379.3302" x="28.64" y="342.08"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="379.3302" x="28.64" y="386.036"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="379.3302" x="28.64" y="342.08"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="182.7311" y="360.968">«interface»</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="125.692" x="155.4591" y="379.196">IEnrichmentService</text><line style="stroke:#547461;stroke-width:0.5;" x1="29.64" x2="406.9702" y1="388.536" y2="388.536"/><line style="stroke:#547461;stroke-width:0.5;" x1="29.64" x2="406.9702" y1="396.536" y2="396.536"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="39.64" cy="411.15" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="354.3302" x="47.64" y="414.424">GetLocationContext(loc : const Location&) : std::string</text></g><!--class WikipediaService--><g class="entity" data-qualified-name="WikipediaService" data-source-line="42" id="ent0004"><rect fill="#FAFCF9" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="422.6147" x="7" y="593.9"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="422.6147" x="7" y="593.9"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="422.6147" x="7" y="619.628"/><rect fill="none" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="422.6147" x="7" y="593.9"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.7306" x="162.442" y="612.788">WikipediaService</text><line style="stroke:#547461;stroke-width:0.5;" x1="8" x2="428.6147" y1="622.128" y2="622.128"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="15" y="633.742"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="238.9101" x="26" y="640.016">client_ : std::unique_ptr<WebClient></text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="15" y="651.97"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="397.6147" x="26" y="658.244">extract_cache_ : std::unordered_map<std::string, std::string></text><line style="stroke:#547461;stroke-width:0.5;" x1="8" x2="428.6147" y1="666.584" y2="666.584"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="18" cy="681.198" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="354.3302" x="26" y="684.472">GetLocationContext(loc : const Location&) : std::string</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="15" y="696.426"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="318.5638" x="26" y="702.7">FetchExtract(query : std::string_view) : std::string</text></g><!--class WebClient--><g class="entity" data-qualified-name="WebClient" data-source-line="49" id="ent0005"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="50.79" y="863.95"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="50.79" y="863.95"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="50.79" y="907.906"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="50.79" y="863.95"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="182.7331" y="882.838">«interface»</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="68.222" x="184.1961" y="901.066">WebClient</text><line style="stroke:#547461;stroke-width:0.5;" x1="51.79" x2="384.8242" y1="910.406" y2="910.406"/><line style="stroke:#547461;stroke-width:0.5;" x1="51.79" x2="384.8242" y1="918.406" y2="918.406"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="61.79" cy="933.02" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.8552" x="69.79" y="936.294">Get(url : const std::string&) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="61.79" cy="951.248" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="310.0342" x="69.79" y="954.522">UrlEncode(value : const std::string&) : std::string</text></g><!--class CURLWebClient--><g class="entity" data-qualified-name="CURLWebClient" data-source-line="54" id="ent0006"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="50.79" y="1042.87"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="50.79" y="1042.87"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="50.79" y="1068.598"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="50.79" y="1042.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="103.1695" x="166.7223" y="1061.758">CURLWebClient</text><line style="stroke:#547461;stroke-width:0.5;" x1="51.79" x2="384.8242" y1="1071.098" y2="1071.098"/><line style="stroke:#547461;stroke-width:0.5;" x1="51.79" x2="384.8242" y1="1079.098" y2="1079.098"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="61.79" cy="1093.712" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.8552" x="69.79" y="1096.986">Get(url : const std::string&) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="61.79" cy="1111.94" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="310.0342" x="69.79" y="1115.214">UrlEncode(value : const std::string&) : std::string</text></g><!--class DataGenerator--><g class="entity" data-qualified-name="DataGenerator" data-source-line="59" id="ent0007"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="653.8885" x="443.36" y="332.96"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="653.8885" x="443.36" y="332.96"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="653.8885" x="443.36" y="376.916"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="653.8885" x="443.36" y="332.96"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="734.7302" y="351.848">«interface»</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="97.062" x="721.7732" y="370.076">DataGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="444.36" x2="1096.2485" y1="379.416" y2="379.416"/><line style="stroke:#547461;stroke-width:0.5;" x1="444.36" x2="1096.2485" y1="387.416" y2="387.416"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="454.36" cy="402.03" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="628.8885" x="462.36" y="405.304">GenerateBrewery(location : const Location&, region_context : const std::string&) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="454.36" cy="420.258" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="343.1897" x="462.36" y="423.532">GenerateUser(locale : const std::string&) : UserResult</text></g><!--class MockGenerator--><g class="entity" data-qualified-name="MockGenerator" data-source-line="64" id="ent0008"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="374.5106" x="524.05" y="603.02"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="374.5106" x="524.05" y="603.02"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="374.5106" x="524.05" y="628.748"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="374.5106" x="524.05" y="603.02"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="660.571" y="621.908">MockGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="525.05" x2="897.5606" y1="631.248" y2="631.248"/><line style="stroke:#547461;stroke-width:0.5;" x1="525.05" x2="897.5606" y1="639.248" y2="639.248"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="535.05" cy="653.862" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.0966" x="543.05" y="657.136">GenerateBrewery(...) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="535.05" cy="672.09" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.4403" x="543.05" y="675.364">GenerateUser(...) : UserResult</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="532.05" y="687.318"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="349.5106" x="543.05" y="693.592">DeterministicHash(location : const Location&) : size_t</text></g><!--class LlamaGenerator--><g class="entity" data-qualified-name="LlamaGenerator" data-source-line="70" id="ent0009"><rect fill="#FAFCF9" height="226.508" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="397.138" x="933.74" y="539.22"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="397.138" x="933.74" y="539.22"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="397.138" x="933.74" y="564.948"/><rect fill="none" height="226.508" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="397.138" x="933.74" y="539.22"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="1080.0469" y="558.108">LlamaGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="934.74" x2="1329.878" y1="567.448" y2="567.448"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="579.062"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.1239" x="952.74" y="585.336">model_ : ModelHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="597.29"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="167.0061" x="952.74" y="603.564">context_ : ContextHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="615.518"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="372.138" x="952.74" y="621.792">prompt_formatter_ : std::unique_ptr<IPromptFormatter></text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="633.746"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="123.1442" x="952.74" y="640.02">rng_ : std::mt19937</text><line style="stroke:#547461;stroke-width:0.5;" x1="934.74" x2="1329.878" y1="648.36" y2="648.36"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="944.74" cy="662.974" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.0966" x="952.74" y="666.248">GenerateBrewery(...) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="944.74" cy="681.202" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.4403" x="952.74" y="684.476">GenerateUser(...) : UserResult</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="696.43"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="285.3309" x="952.74" y="702.704">Load(model_path : const std::string&) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="714.658"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.0454" x="952.74" y="720.932">Infer(...) : std::string</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="732.886"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="190.817" x="952.74" y="739.16">InferFormatted(...) : std::string</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="941.74" y="751.114"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="275.2861" x="952.74" y="757.388">LoadBrewerySystemPrompt(...) : std::string</text></g><!--class IPromptFormatter--><g class="entity" data-qualified-name="IPromptFormatter" data-source-line="83" id="ent0010"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="580.1605" x="842.23" y="873.07"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="580.1605" x="842.23" y="873.07"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="580.1605" x="842.23" y="917.026"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="580.1605" x="842.23" y="873.07"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="1096.7363" y="891.958">«interface»</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="116.48" x="1074.0703" y="910.186">IPromptFormatter</text><line style="stroke:#547461;stroke-width:0.5;" x1="843.23" x2="1421.3905" y1="919.526" y2="919.526"/><line style="stroke:#547461;stroke-width:0.5;" x1="843.23" x2="1421.3905" y1="927.526" y2="927.526"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="853.23" cy="942.14" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="555.1605" x="861.23" y="945.414">Format(system_prompt : std::string_view, user_prompt : std::string_view) : std::string</text></g><!--class Gemma4JinjaPromptFormatter--><g class="entity" data-qualified-name="Gemma4JinjaPromptFormatter" data-source-line="87" id="ent0011"><rect fill="#FAFCF9" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="580.1605" x="842.23" y="1051.98"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="580.1605" x="842.23" y="1051.98"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="580.1605" x="842.23" y="1077.708"/><rect fill="none" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="580.1605" x="842.23" y="1051.98"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="202.5557" x="1031.0324" y="1070.868">Gemma4JinjaPromptFormatter</text><line style="stroke:#547461;stroke-width:0.5;" x1="843.23" x2="1421.3905" y1="1080.208" y2="1080.208"/><line style="stroke:#547461;stroke-width:0.5;" x1="843.23" x2="1421.3905" y1="1088.208" y2="1088.208"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="853.23" cy="1102.822" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="555.1605" x="861.23" y="1106.096">Format(system_prompt : std::string_view, user_prompt : std::string_view) : std::string</text></g><!--class JsonLoader--><g class="entity" data-qualified-name="JsonLoader" data-source-line="91" id="ent0012"><rect fill="#FAFCF9" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="522.092" x="1132.26" y="351.19"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="522.092" x="1132.26" y="351.19"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="522.092" x="1132.26" y="376.918"/><rect fill="none" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="522.092" x="1132.26" y="351.19"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="1355.513" y="370.078">JsonLoader</text><line style="stroke:#547461;stroke-width:0.5;" x1="1133.26" x2="1653.352" y1="379.418" y2="379.418"/><line style="stroke:#547461;stroke-width:0.5;" x1="1133.26" x2="1653.352" y1="387.418" y2="387.418"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1143.26" cy="402.032" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" text-decoration="underline" textLength="497.092" x="1151.26" y="405.306">LoadLocations(filepath : const std::filesystem::path&) : std::vector<Location></text></g><!--class IExportService--><g class="entity" data-qualified-name="IExportService" data-source-line="95" id="ent0013"><rect fill="#FAFCF9" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="409.0383" x="1689.79" y="323.85"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="409.0383" x="1689.79" y="323.85"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="409.0383" x="1689.79" y="367.806"/><rect fill="none" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="409.0383" x="1689.79" y="323.85"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="1858.7351" y="342.738">«interface»</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="93.786" x="1847.4161" y="360.966">IExportService</text><line style="stroke:#547461;stroke-width:0.5;" x1="1690.79" x2="2097.8283" y1="370.306" y2="370.306"/><line style="stroke:#547461;stroke-width:0.5;" x1="1690.79" x2="2097.8283" y1="378.306" y2="378.306"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1700.79" cy="392.92" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="100.4677" x="1708.79" y="396.194">Initialize() : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1700.79" cy="411.148" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="384.0383" x="1708.79" y="414.422">ProcessRecord(brewery : const GeneratedBrewery&) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1700.79" cy="429.376" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="95.8547" x="1708.79" y="432.65">Finalize() : void</text></g><!--class SqliteExportService--><g class="entity" data-qualified-name="SqliteExportService" data-source-line="101" id="ent0014"><rect fill="#FAFCF9" height="262.964" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="451.7415" x="1668.44" y="520.99"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="451.7415" x="1668.44" y="520.99"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="451.7415" x="1668.44" y="546.718"/><rect fill="none" height="262.964" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="451.7415" x="1668.44" y="520.99"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3512" x="1830.6351" y="539.878">SqliteExportService</text><line style="stroke:#547461;stroke-width:0.5;" x1="1669.44" x2="2119.1815" y1="549.218" y2="549.218"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="560.832"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="387.0232" x="1687.44" y="567.106">date_time_provider_ : std::unique_ptr<IDateTimeProvider></text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="579.06"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="215.2222" x="1687.44" y="585.334">run_timestamp_utc_ : std::string</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="597.288"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.0218" x="1687.44" y="603.562">database_path_ : std::filesystem::path</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="615.516"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="140.5635" x="1687.44" y="621.79">db_handle_ : sqlite3*</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="633.744"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="248.1571" x="1687.44" y="640.018">insert_location_stmt_ : sqlite3_stmt*</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="651.972"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.4312" x="1687.44" y="658.246">insert_brewery_stmt_ : sqlite3_stmt*</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="670.2"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="164.4616" x="1687.44" y="676.474">transaction_open_ : bool</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="688.428"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="426.7415" x="1687.44" y="694.702">location_cache_ : std::unordered_map<std::string, sqlite3_int64></text><line style="stroke:#547461;stroke-width:0.5;" x1="1669.44" x2="2119.1815" y1="703.042" y2="703.042"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1679.44" cy="717.656" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="100.4677" x="1687.44" y="720.93">Initialize() : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1679.44" cy="735.884" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="384.0383" x="1687.44" y="739.158">ProcessRecord(brewery : const GeneratedBrewery&) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1679.44" cy="754.112" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="95.8547" x="1687.44" y="757.386">Finalize() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="1676.44" y="769.34"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.6842" x="1687.44" y="775.614">InitializeSchema() : void</text></g><!--class IDateTimeProvider--><g class="entity" data-qualified-name="IDateTimeProvider" data-source-line="116" id="ent0015"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="1779.67" y="873.07"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="1779.67" y="873.07"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="1779.67" y="917.026"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="1779.67" y="873.07"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="1858.7297" y="891.958">«interface»</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="120.176" x="1834.2157" y="910.186">IDateTimeProvider</text><line style="stroke:#547461;stroke-width:0.5;" x1="1780.67" x2="2007.9373" y1="919.526" y2="919.526"/><line style="stroke:#547461;stroke-width:0.5;" x1="1780.67" x2="2007.9373" y1="927.526" y2="927.526"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1790.67" cy="942.14" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.2673" x="1798.67" y="945.414">GetUtcTimestamp() : std::string</text></g><!--class SystemDateTimeProvider--><g class="entity" data-qualified-name="SystemDateTimeProvider" data-source-line="120" id="ent0016"><rect fill="#FAFCF9" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="1779.67" y="1051.98"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="1779.67" y="1051.98"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="1779.67" y="1077.708"/><rect fill="none" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="1779.67" y="1051.98"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="165.4241" x="1811.5916" y="1070.868">SystemDateTimeProvider</text><line style="stroke:#547461;stroke-width:0.5;" x1="1780.67" x2="2007.9373" y1="1080.208" y2="1080.208"/><line style="stroke:#547461;stroke-width:0.5;" x1="1780.67" x2="2007.9373" y1="1088.208" y2="1088.208"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="1790.67" cy="1102.822" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.2673" x="1798.67" y="1106.096">GetUtcTimestamp() : std::string</text></g><!--reverse link BiergartenDataGenerator to IEnrichmentService--><g class="link" data-entity-1="ent0002" data-entity-2="ent0003" data-link-type="composition" data-source-line="125" id="lnk17"><path codeLine="125" d="M1004.451,196.0127 C840.941,229.2827 624.9,275.1 426.31,323.85 C404.11,329.3 380.68,335.42 357.87,341.58" fill="none" id="BiergartenDataGenerator-backto-IEnrichmentService" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1016.21,193.62,1009.5329,190.8966,1004.451,196.0127,1011.128,198.736,1016.21,193.62" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="626.67" y="288.738">owns</text></g><!--reverse link BiergartenDataGenerator to DataGenerator--><g class="link" data-entity-1="ent0002" data-entity-2="ent0007" data-link-type="composition" data-source-line="126" id="lnk18"><path codeLine="126" d="M1036.2697,249.5221 C975.0797,279.8721 920.52,306.92 868.73,332.61" fill="none" id="BiergartenDataGenerator-backto-DataGenerator" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1047.02,244.19,1039.8675,243.2726,1036.2697,249.5221,1043.4222,250.4395,1047.02,244.19" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="976.85" y="288.738">owns</text></g><!--reverse link BiergartenDataGenerator to IExportService--><g class="link" data-entity-1="ent0002" data-entity-2="ent0013" data-link-type="composition" data-source-line="127" id="lnk19"><path codeLine="127" d="M1469.6777,231.7386 C1558.3777,262.9986 1647.49,294.42 1729.59,323.36" fill="none" id="BiergartenDataGenerator-backto-IExportService" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1458.36,227.75,1462.6893,233.5169,1469.6777,231.7386,1465.3484,225.9717,1458.36,227.75" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="1644.97" y="288.738">owns</text></g><!--reverse link IEnrichmentService to WikipediaService--><g class="link" data-entity-1="ent0003" data-entity-2="ent0004" data-link-type="extension" data-source-line="129" id="lnk20"><path codeLine="129" d="M218.31,441.26 C218.31,486.33 218.31,542.12 218.31,593.55" fill="none" id="IEnrichmentService-backto-WikipediaService" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="218.31,423.26,212.31,441.26,224.31,441.26,218.31,423.26" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="219.31" y="485.878">implements</text></g><!--reverse link WikipediaService to WebClient--><g class="link" data-entity-1="ent0004" data-entity-2="ent0005" data-link-type="composition" data-source-line="130" id="lnk21"><path codeLine="130" d="M218.31,723.26 C218.31,769.02 218.31,820.22 218.31,863.5" fill="none" id="WikipediaService-backto-WebClient" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="218.31,711.26,214.31,717.26,218.31,723.26,222.31,717.26,218.31,711.26" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="219.31" y="828.838">owns</text></g><!--reverse link WebClient to CURLWebClient--><g class="link" data-entity-1="ent0005" data-entity-2="ent0006" data-link-type="extension" data-source-line="132" id="lnk22"><path codeLine="132" d="M218.31,980.94 C218.31,1006.21 218.31,1018.71 218.31,1042.54" fill="none" id="WebClient-backto-CURLWebClient" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="218.31,962.94,212.31,980.94,224.31,980.94,218.31,962.94" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="219.31" y="1007.758">implements</text></g><!--reverse link DataGenerator to MockGenerator--><g class="link" data-entity-1="ent0007" data-entity-2="ent0008" data-link-type="extension" data-source-line="134" id="lnk23"><path codeLine="134" d="M718.0412,446.8401 C709.9012,458.8501 712.66,457.32 708.31,470.99 C694.63,513.99 697.28,565.72 702.23,602.76" fill="none" id="DataGenerator-backto-MockGenerator" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="728.14,431.94,713.0745,443.4738,723.0079,450.2064,728.14,431.94" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="709.31" y="485.878">implements</text></g><!--reverse link DataGenerator to LlamaGenerator--><g class="link" data-entity-1="ent0007" data-entity-2="ent0009" data-link-type="extension" data-source-line="135" id="lnk24"><path codeLine="135" d="M850.7459,442.9815 C891.1259,472.8815 930.08,501.73 980.42,539" fill="none" id="DataGenerator-backto-LlamaGenerator" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="836.28,432.27,847.1754,447.8035,854.3164,438.1595,836.28,432.27" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="909.24" y="485.878">implements</text></g><!--reverse link LlamaGenerator to IPromptFormatter--><g class="link" data-entity-1="ent0009" data-entity-2="ent0010" data-link-type="composition" data-source-line="137" id="lnk25"><path codeLine="137" d="M1132.31,777.92 C1132.31,816 1132.31,844.07 1132.31,872.67" fill="none" id="LlamaGenerator-backto-IPromptFormatter" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1132.31,765.92,1128.31,771.92,1132.31,777.92,1136.31,771.92,1132.31,765.92" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="30.044" x="1133.31" y="828.838">uses</text></g><!--reverse link IPromptFormatter to Gemma4JinjaPromptFormatter--><g class="link" data-entity-1="ent0010" data-entity-2="ent0011" data-link-type="extension" data-source-line="139" id="lnk26"><path codeLine="139" d="M1132.31,972.18 C1132.31,1002.03 1132.31,1024.29 1132.31,1051.64" fill="none" id="IPromptFormatter-backto-Gemma4JinjaPromptFormatter" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="1132.31,954.18,1126.31,972.18,1138.31,972.18,1132.31,954.18" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="1133.31" y="1007.758">implements</text></g><!--link BiergartenDataGenerator to JsonLoader--><g class="link" data-entity-1="ent0002" data-entity-2="ent0012" data-link-type="dependency" data-source-line="141" id="lnk27"><path codeLine="141" d="M1300.76,244.02 C1326.49,282.22 1351.0478,318.6838 1369.4178,345.9538" fill="none" id="BiergartenDataGenerator-to-JsonLoader" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#628A5B" points="1372.77,350.93,1371.0592,341.2309,1369.9765,346.7831,1364.4243,345.7004,1372.77,350.93" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="30.044" x="1334.87" y="288.738">uses</text></g><!--reverse link IExportService to SqliteExportService--><g class="link" data-entity-1="ent0013" data-entity-2="ent0014" data-link-type="extension" data-source-line="143" id="lnk28"><path codeLine="143" d="M1894.31,459.25 C1894.31,482.65 1894.31,492.68 1894.31,520.53" fill="none" id="IExportService-backto-SqliteExportService" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="1894.31,441.25,1888.31,459.25,1900.31,459.25,1894.31,441.25" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="1895.31" y="485.878">implements</text></g><!--reverse link SqliteExportService to IDateTimeProvider--><g class="link" data-entity-1="ent0014" data-entity-2="ent0015" data-link-type="composition" data-source-line="144" id="lnk29"><path codeLine="144" d="M1894.31,796.08 C1894.31,828.38 1894.31,848.59 1894.31,872.66" fill="none" id="SqliteExportService-backto-IDateTimeProvider" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1894.31,784.08,1890.31,790.08,1894.31,796.08,1898.31,790.08,1894.31,784.08" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="1895.31" y="828.838">owns</text></g><!--reverse link IDateTimeProvider to SystemDateTimeProvider--><g class="link" data-entity-1="ent0015" data-entity-2="ent0016" data-link-type="extension" data-source-line="145" id="lnk30"><path codeLine="145" d="M1894.31,972.18 C1894.31,1002.03 1894.31,1024.29 1894.31,1051.64" fill="none" id="IDateTimeProvider-backto-SystemDateTimeProvider" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="1894.31,954.18,1888.31,972.18,1900.31,972.18,1894.31,954.18" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="1895.31" y="1007.758">implements</text></g><?plantuml-src lLTjJoCt4FwUNs5HYUOEI0_8SH15aI0Gu0GL9L0-hfpT8V6nQo-sDrnwlV_UiVSb--AbIAtuWc3dyJpZPruyg2V6OoffH9HUXO0_9VDr4eKTLLW2UAH9g2U2wzzf16JZz9fCALSRRioK_GLajryoQgP3M1__KuHF2x7SS27iuRrF9TEC-azpAH8UZ4Ke9FbbSZmPJuxSt1baxt2_ltViyjy6E9PIl6J6Wxt3uyyddPBL3wbIv4U7a9EMQ0Yv01g0RDZFZYUVpWxDII7HddtztF_IFzZ5hmvUGfg1_Yn7muK6Tp3_GkRqQwKXTmiW9mpad4eDd9nIJSaDYo5a7CWE6Li1JXcTOm2TJgh76c_Wvy11KetEJMWxn4So-Auz1NB9VF3808ih60mIpfuJy68jXvTd7Ajj4G7cFKMDxD5vxifrgCALuk5xB30CwUQmHfT_2BoPX1UG35HnT0a--XsUvv0JYrYPWrlaDk7T3uYS2H5QJtyaQ1ipZHuUc5wCCHVQkBEeihyhuLFD14y3oBsVvFHTt_h83wcOyY4Ag3H99O80ILOZutKfM62TN8dvBIWi_9JDViTyCfHTFb8VI5DUCXmMvj789ceBWz5vTECqPzrG-EWn3I2tRHPNCZE2pmrNMWSFx0ah9M0qPyaA86J8xCh90yp6rfYdJqlgQy-dUD4ItjOm9YcYyR14l5sEOlIVhc3O9w3znLaQGlVPvBCAyfOCNXntN-jSNATDtcuYmoAOaXj7F5laNePdt1S1T9SqJE1DvufKZEzlhzRXl6i0Qpsgqy2jIRd-LoPPDa7DZ6qJ2NFynSl6IMiqcQkq8oeazpY1B4FOVXU3oOuMMbuB_wawr9g1ztgzDv1dg1A9ARnJG5aYnfdIpB-WQl6A35PlV1gzKdnN8OqQKpV2l8McXwxDBnUK1o5KnZ6QiXOf6MCfebXxZq96LBSDqXiBckIOj7SbDaWEZlJkqT7-b_zTg2j1WsvwiPZgHMiIYybuoH_NpkhzRetvBO8sbE7CWfskb8OelRqBNfsvDPMSvPzQkyewzbBn7KDdcoGeHBkzTGgSGnJH_bV6lz5wEEyJm5Sbk56m8FoXD1Qo_zFgcbUrwZwo49efDL_Jq0O3OzriVqnhxrtvgNSgVydndQKXTbAtL35R16NoGQbRyF7HwQPRmQg8ghuCR5REJXYlUInqc3w7J4CrhBHF0tJdQHQ1KNV9WfQUmr4ATuYwoK1PqoNSdaLHezXBjEyvAXWPw8mgi3rJ0EhQfj2Pjx33mC9ipFiVhOLnB03jvOF9KphI9P3zkuBCf7i5Y0yjL_ZM6dSY1kwLzwc2wEsxG4Q0kJxeZzunoUaioPcc66v4snQnUXhR5eLxxT_bUUssTbSwa1e-t-pbLpBLCi7_yYGDoIs4QJCkMAp8R_WgOKu2uFuAR_SDR9uwRPl-nvqTrvOv8EA5grTFLR-yuK2jkRCJ7TUE-tUlrzn91uH5SGW6g3eDgs5Oxqsvyz9YPtnMbwkAmqvjvp7mwlvGWJlGjTUywhrcj7hK9_l036kZIEC5CkvVUHAgL6qvwFL6vR5UiDLchk5oJRqAYGjWxzIewImJZWQoHEv6g73z0m00?></g></svg> |