Files
the-biergarten-app/docs/website/diagrams-out/deployment.svg

1 line
108 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="DESCRIPTION" height="1226px" preserveAspectRatio="none" style="width:6706px;height:1226px;background:#FFFFFF;" version="1.1" viewBox="0 0 6706 1226" width="6706px" zoomAndPan="magnify"><?plantuml 1.2026.6?><defs/><g><g class="title" data-source-line="6"><text fill="#000000" font-family="Arial" font-size="22" font-weight="700" lengthAdjust="spacing" textLength="342.3213" x="3180.8394" y="35.6357">Docker Deployment Architecture</text></g><!--cluster Development Environment\n(docker-compose.dev.yaml)--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml." data-source-line="12" id="ent0003"><path d="M13.5,340.1079 L199.6719,340.1079 A3.75,3.75 0 0 1 202.1719,342.6079 L209.1719,378.3051 L1921.5,378.3051 A2.5,2.5 0 0 1 1924,380.8051 L1924,1208.9079 A2.5,2.5 0 0 1 1921.5,1211.4079 L13.5,1211.4079 A2.5,2.5 0 0 1 11,1208.9079 L11,342.6079 A2.5,2.5 0 0 1 13.5,340.1079" fill="#E3F2FD" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="11" x2="209.1719" y1="378.3051" y2="378.3051"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="177.3652" x="18.9033" y="355.2397">Development Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="185.1719" x="15" y="371.3383">(docker-compose.dev.yaml)</text></g><!--cluster DevDB--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB" data-source-line="14" id="ent0004"><polygon fill="#FFFFFF" points="956,850.8679,966,840.8679,1334,840.8679,1334,1169.4079,1324,1179.4079,956,1179.4079,956,850.8679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="1324" x2="1334" y1="850.8679" y2="840.8679"/><line style="stroke:#000000;stroke-width:1;" x1="956" x2="1324" y1="850.8679" y2="850.8679"/><line style="stroke:#000000;stroke-width:1;" x1="1324" x2="1324" y1="850.8679" y2="1179.4079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="76.2617" x="1102.8691" y="866.9997">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="302.6816" x="989.6592" y="883.0983">(mcr.microsoft.com/mssql/server:2022-latest)</text></g><!--cluster DevDBInner--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.DevDBInner" data-source-line="15" id="ent0005"><path d="M988,972.1879 C988,962.1879 1033,962.1879 1033,962.1879 C1033,962.1879 1078,962.1879 1078,972.1879 L1078,1145.4079 C1078,1155.4079 1033,1155.4079 1033,1155.4079 C1033,1155.4079 988,1155.4079 988,1145.4079 L988,972.1879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M988,972.1879 C988,982.1879 1033,982.1879 1033,982.1879 C1033,982.1879 1078,982.1879 1078,972.1879" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="70.0205" x="997.9897" y="997.3197">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="62.2549" x="1001.8726" y="1013.4183">Database</text></g><!--cluster DevAPI--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI" data-source-line="29" id="ent0010"><polygon fill="#FFFFFF" points="718.5,435.1079,728.5,425.1079,1342,425.1079,1342,798.8679,1332,808.8679,718.5,808.8679,718.5,435.1079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="1332" x2="1342" y1="435.1079" y2="425.1079"/><line style="stroke:#000000;stroke-width:1;" x1="718.5" x2="1332" y1="435.1079" y2="435.1079"/><line style="stroke:#000000;stroke-width:1;" x1="1332" x2="1332" y1="435.1079" y2="808.8679"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="92.5654" x="979.9673" y="451.2397">API Container</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="68.4482" x="992.0259" y="467.3383">(API.Core)</text></g><!--cluster DevMig--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig" data-source-line="48" id="ent0017"><polygon fill="#FFFFFF" points="1374,628.0779,1384,618.0779,1614,618.0779,1614,1011.0879,1604,1021.0879,1374,1021.0879,1374,628.0779" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="1604" x2="1614" y1="628.0779" y2="618.0779"/><line style="stroke:#000000;stroke-width:1;" x1="1374" x2="1604" y1="628.0779" y2="628.0779"/><line style="stroke:#000000;stroke-width:1;" x1="1604" x2="1604" y1="628.0779" y2="1021.0879"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="70.7793" x="1454.6104" y="644.2097">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="69.2139" x="1455.3931" y="660.3083">(run-once)</text></g><!--cluster DevSeed--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed" data-source-line="58" id="ent0022"><polygon fill="#FFFFFF" points="1654,628.0779,1664,618.0779,1892,618.0779,1892,1018.5579,1882,1028.5579,1654,1028.5579,1654,628.0779" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="1882" x2="1892" y1="628.0779" y2="618.0779"/><line style="stroke:#000000;stroke-width:1;" x1="1654" x2="1882" y1="628.0779" y2="628.0779"/><line style="stroke:#000000;stroke-width:1;" x1="1882" x2="1882" y1="628.0779" y2="1028.5579"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="33.4619" x="1752.269" y="644.2097">Seed</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="69.2139" x="1734.3931" y="660.3083">(run-once)</text></g><!--cluster DevMailpit--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit" data-source-line="69" id="ent0027"><polygon fill="#FFFFFF" points="35,715.1279,45,705.1279,572,705.1279,572,1011.0879,562,1021.0879,35,1021.0879,35,715.1279" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="562" x2="572" y1="715.1279" y2="705.1279"/><line style="stroke:#000000;stroke-width:1;" x1="35" x2="562" y1="715.1279" y2="715.1279"/><line style="stroke:#000000;stroke-width:1;" x1="562" x2="562" y1="715.1279" y2="1021.0879"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="44.3311" x="277.3345" y="731.2597">Mailpit</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="102.6826" x="248.1587" y="747.3583">(axllent/mailpit)</text></g><!--cluster Test Environment\n(docker-compose.test.yaml)--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml." data-source-line="82" id="ent0033"><path d="M2289.5,57.2979 L2476.4443,57.2979 A3.75,3.75 0 0 1 2478.9443,59.7979 L2485.9443,95.4951 L3751.5,95.4951 A2.5,2.5 0 0 1 3754,97.9951 L3754,1056.6879 A2.5,2.5 0 0 1 3751.5,1059.1879 L2289.5,1059.1879 A2.5,2.5 0 0 1 2287,1056.6879 L2287,59.7979 A2.5,2.5 0 0 1 2289.5,57.2979" fill="#FFF3E0" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2287" x2="2485.9443" y1="95.4951" y2="95.4951"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="118.2412" x="2324.8516" y="72.4297">Test Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="185.9443" x="2291" y="88.5283">(docker-compose.test.yaml)</text></g><!--cluster TestDB--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB" data-source-line="84" id="ent0034"><polygon fill="#FFFFFF" points="2902,601.2779,2912,591.2779,3290,591.2779,3290,1017.1879,3280,1027.1879,2902,1027.1879,2902,601.2779" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="3280" x2="3290" y1="601.2779" y2="591.2779"/><line style="stroke:#000000;stroke-width:1;" x1="2902" x2="3280" y1="601.2779" y2="601.2779"/><line style="stroke:#000000;stroke-width:1;" x1="3280" x2="3280" y1="601.2779" y2="1027.1879"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="76.2617" x="3053.8691" y="617.4097">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="122.917" x="3030.5415" y="633.5083">(isolated instance)</text></g><!--cluster TestDBInner--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.TestDBInner" data-source-line="85" id="ent0035"><path d="M2926,715.1279 C2926,705.1279 2980,705.1279 2980,705.1279 C2980,705.1279 3034,705.1279 3034,715.1279 L3034,993.1879 C3034,1003.1879 2980,1003.1879 2980,1003.1879 C2980,1003.1879 2926,1003.1879 2926,993.1879 L2926,715.1279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2926,715.1279 C2926,725.1279 2980,725.1279 2980,725.1279 C2980,725.1279 3034,725.1279 3034,715.1279" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="70.0205" x="2944.9897" y="740.2597">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="94.9307" x="2932.5347" y="756.3583">Test Database</text></g><!--cluster TestMig--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestMig" data-source-line="98" id="ent0040"><polygon fill="#FFFFFF" points="2563,348.0679,2573,338.0679,2799,338.0679,2799,462.1579,2789,472.1579,2563,472.1579,2563,348.0679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="2789" x2="2799" y1="348.0679" y2="338.0679"/><line style="stroke:#000000;stroke-width:1;" x1="2563" x2="2789" y1="348.0679" y2="348.0679"/><line style="stroke:#000000;stroke-width:1;" x1="2789" x2="2789" y1="348.0679" y2="472.1579"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="70.7793" x="2641.6104" y="364.1997">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="34.2207" x="2659.8896" y="380.2983">(test)</text></g><!--cluster TestSeed--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed" data-source-line="102" id="ent0042"><polygon fill="#FFFFFF" points="2319,134.2979,2329,124.2979,2523,124.2979,2523,466.5379,2513,476.5379,2319,476.5379,2319,134.2979" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="2513" x2="2523" y1="134.2979" y2="124.2979"/><line style="stroke:#000000;stroke-width:1;" x1="2319" x2="2513" y1="134.2979" y2="134.2979"/><line style="stroke:#000000;stroke-width:1;" x1="2513" x2="2513" y1="134.2979" y2="476.5379"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="33.4619" x="2400.269" y="150.4297">Seed</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="34.2207" x="2399.8896" y="166.5283">(test)</text></g><!--cluster Specs--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs" data-source-line="111" id="ent0047"><polygon fill="#FFFFFF" points="3330,306.3179,3340,296.3179,3722,296.3179,3722,503.9079,3712,513.9079,3330,513.9079,3330,306.3179" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="3712" x2="3722" y1="306.3179" y2="296.3179"/><line style="stroke:#000000;stroke-width:1;" x1="3330" x2="3712" y1="306.3179" y2="306.3179"/><line style="stroke:#000000;stroke-width:1;" x1="3712" x2="3712" y1="306.3179" y2="513.9079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="68.4756" x="3487.7622" y="322.4497">API.Specs</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="122.1172" x="3460.9414" y="338.5483">(Integration Tests)</text></g><!--cluster UnitTests--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..UnitTests" data-source-line="125" id="ent0052"><polygon fill="#FFFFFF" points="2852,283.8979,2862,273.8979,3290,273.8979,3290,526.3279,3280,536.3279,2852,536.3279,2852,283.8979" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="3280" x2="3290" y1="283.8979" y2="273.8979"/><line style="stroke:#000000;stroke-width:1;" x1="2852" x2="3280" y1="283.8979" y2="283.8979"/><line style="stroke:#000000;stroke-width:1;" x1="3280" x2="3280" y1="283.8979" y2="536.3279"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="62.2275" x="3035.8862" y="300.0297">unit.tests</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="217.0547" x="2958.4727" y="316.1283">(Features.*.Tests, one container)</text></g><!--cluster Production Environment\n(docker-compose.prod.yaml)--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml." data-source-line="144" id="ent0057"><path d="M4660.5,126.3479 L4853.6514,126.3479 A3.75,3.75 0 0 1 4856.1514,128.8479 L4863.1514,164.5451 L5813.5,164.5451 A2.5,2.5 0 0 1 5816,167.0451 L5816,1010.5879 A2.5,2.5 0 0 1 5813.5,1013.0879 L4660.5,1013.0879 A2.5,2.5 0 0 1 4658,1010.5879 L4658,128.8479 A2.5,2.5 0 0 1 4660.5,126.3479" fill="#FCE4EC" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="4658" x2="4863.1514" y1="164.5451" y2="164.5451"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="163.3379" x="4676.4067" y="141.4797">Production Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="192.1514" x="4662" y="157.5783">(docker-compose.prod.yaml)</text></g><!--cluster ProdDB--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdDB" data-source-line="146" id="ent0058"><polygon fill="#FFFFFF" points="4996,586.3279,5006,576.3279,5374,576.3279,5374,783.9179,5364,793.9179,4996,793.9179,4996,586.3279" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="5364" x2="5374" y1="586.3279" y2="576.3279"/><line style="stroke:#000000;stroke-width:1;" x1="4996" x2="5364" y1="586.3279" y2="586.3279"/><line style="stroke:#000000;stroke-width:1;" x1="5364" x2="5364" y1="586.3279" y2="793.9179"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="76.2617" x="5142.8691" y="602.4597">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="302.6816" x="5029.6592" y="618.5583">(mcr.microsoft.com/mssql/server:2022-latest)</text></g><!--cluster ProdMig--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdMig" data-source-line="160" id="ent0063"><polygon fill="#FFFFFF" points="4690,348.0679,4700,338.0679,4956,338.0679,4956,739.0779,4946,749.0779,4690,749.0779,4690,348.0679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="4946" x2="4956" y1="348.0679" y2="338.0679"/><line style="stroke:#000000;stroke-width:1;" x1="4690" x2="4946" y1="348.0679" y2="348.0679"/><line style="stroke:#000000;stroke-width:1;" x1="4946" x2="4946" y1="348.0679" y2="749.0779"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="70.7793" x="4783.6104" y="364.1997">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="69.2139" x="4784.3931" y="380.2983">(run-once)</text></g><!--cluster ProdAPI--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI" data-source-line="168" id="ent0068"><polygon fill="#FFFFFF" points="5125.5,221.3479,5135.5,211.3479,5792,211.3479,5792,503.9079,5782,513.9079,5125.5,513.9079,5125.5,221.3479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="5782" x2="5792" y1="221.3479" y2="211.3479"/><line style="stroke:#000000;stroke-width:1;" x1="5125.5" x2="5782" y1="221.3479" y2="221.3479"/><line style="stroke:#000000;stroke-width:1;" x1="5782" x2="5782" y1="221.3479" y2="513.9079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="92.5654" x="5408.4673" y="237.4797">API Container</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="68.4482" x="5420.5259" y="253.5783">(API.Core)</text></g><!--cluster Database-only Environment\n(docker-compose.db.yaml)--><g class="cluster" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml." data-source-line="197" id="ent0084"><path d="M5842.5,129.2479 L6028.6514,129.2479 A3.75,3.75 0 0 1 6031.1514,131.7479 L6038.1514,167.4451 L6165.5,167.4451 A2.5,2.5 0 0 1 6168,169.9451 L6168,760.9979 A2.5,2.5 0 0 1 6165.5,763.4979 L5842.5,763.4979 A2.5,2.5 0 0 1 5840,760.9979 L5840,131.7479 A2.5,2.5 0 0 1 5842.5,129.2479" fill="#EDE7F6" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="5840" x2="6038.1514" y1="167.4451" y2="167.4451"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="185.1514" x="5844" y="144.3797">Database-only Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="178.1514" x="5847.5" y="160.4783">(docker-compose.db.yaml)</text></g><!--cluster DbOnlyDB--><g class="cluster" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlyDB" data-source-line="199" id="ent0085"><polygon fill="#FFFFFF" points="5984,356.5179,5994,346.5179,6136,346.5179,6136,469.7079,6126,479.7079,5984,479.7079,5984,356.5179" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="6126" x2="6136" y1="356.5179" y2="346.5179"/><line style="stroke:#000000;stroke-width:1;" x1="5984" x2="6126" y1="356.5179" y2="356.5179"/><line style="stroke:#000000;stroke-width:1;" x1="6126" x2="6126" y1="356.5179" y2="479.7079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="76.2617" x="6017.8691" y="372.6497">SQL Server</text></g><!--cluster Minimal Environment\n(docker-compose.min.yaml)--><g class="cluster" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml." data-source-line="227" id="ent0098"><path d="M6194.5,129.2479 L6381.4375,129.2479 A3.75,3.75 0 0 1 6383.9375,131.7479 L6390.9375,167.4451 L6688.5,167.4451 A2.5,2.5 0 0 1 6691,169.9451 L6691,753.5279 A2.5,2.5 0 0 1 6688.5,756.0279 L6194.5,756.0279 A2.5,2.5 0 0 1 6192,753.5279 L6192,131.7479 A2.5,2.5 0 0 1 6194.5,129.2479" fill="#FFF9C4" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6192" x2="6390.9375" y1="167.4451" y2="167.4451"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="141.5723" x="6218.1826" y="144.3797">Minimal Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="185.9375" x="6196" y="160.4783">(docker-compose.min.yaml)</text></g><!--cluster MinDB--><g class="cluster" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinDB" data-source-line="229" id="ent0099"><polygon fill="#FFFFFF" points="6507,356.5179,6517,346.5179,6659,346.5179,6659,469.7079,6649,479.7079,6507,479.7079,6507,356.5179" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="6649" x2="6659" y1="356.5179" y2="346.5179"/><line style="stroke:#000000;stroke-width:1;" x1="6507" x2="6649" y1="356.5179" y2="356.5179"/><line style="stroke:#000000;stroke-width:1;" x1="6649" x2="6649" y1="356.5179" y2="479.7079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="76.2617" x="6540.8691" y="372.6497">SQL Server</text></g><!--cluster MinMailpit--><g class="cluster" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinMailpit" data-source-line="239" id="ent0102"><polygon fill="#FFFFFF" points="6258.375,221.3479,6268.375,211.3479,6372.375,211.3479,6372.375,443.1079,6362.375,453.1079,6258.375,453.1079,6258.375,221.3479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="6362.375" x2="6372.375" y1="221.3479" y2="211.3479"/><line style="stroke:#000000;stroke-width:1;" x1="6258.375" x2="6362.375" y1="221.3479" y2="221.3479"/><line style="stroke:#000000;stroke-width:1;" x1="6362.375" x2="6362.375" y1="221.3479" y2="453.1079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="44.3311" x="6289.2095" y="237.4797">Mailpit</text></g><!--cluster Results--><g class="cluster" data-qualified-name="Results" data-source-line="260" id="ent0114"><path d="M4050.5,620.0279 L4172.8311,620.0279 A3.75,3.75 0 0 1 4175.3311,622.5279 L4182.3311,658.2251 L4623.5,658.2251 A2.5,2.5 0 0 1 4626,660.7251 L4626,1026.0579 A2.5,2.5 0 0 1 4623.5,1028.5579 L4050.5,1028.5579 A2.5,2.5 0 0 1 4048,1026.0579 L4048,622.5279 A2.5,2.5 0 0 1 4050.5,620.0279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="4048" x2="4182.3311" y1="658.2251" y2="658.2251"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="79.3584" x="4072.9863" y="635.1597">test-results/</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="121.3311" x="4052" y="651.2583">(mounted volume)</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.GMN7" data-source-line="19" id="ent0008"><path d="M1113.9,904.8679 L1113.9,958.4079 L1066.33,962.4079 L1113.9,966.4079 L1113.9,1019.509 A0,0 0 0 0 1113.9,1019.509 L1284.1017,1019.509 A0,0 0 0 0 1284.1017,1019.509 L1284.1017,914.8679 L1274.1017,904.8679 L1113.9,904.8679 A0,0 0 0 0 1113.9,904.8679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1274.1017,904.8679 L1274.1017,914.8679 L1284.1017,914.8679 L1274.1017,904.8679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="1119.9" y="922.0617">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.1235" x="1119.9" y="937.0104">- ACCEPT_EULA=Y</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="131.1235" x="1119.9" y="951.9592">- SA_PASSWORD=***</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="149.2017" x="1119.9" y="966.9079">- MSSQL_PID=Developer</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1119.9" y="981.8566">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="54.1899" x="1119.9" y="996.8054">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="121.3989" x="1119.9" y="1011.7541">- biergarten-dev-data</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.DevDBInner.1433" data-source-line="16" id="ent0006"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="31.1445" x="1044.4277" y="941.2211">1433</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="1054" y="956.1879"/></g><!--entity API1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.API1" data-source-line="30" id="ent0011"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="153.5996" x="1164.2" y="682.0779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1297.7996" y="687.0779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1295.7996" y="689.0779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1295.7996" y="693.0779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="113.5996" x="1179.2" y="715.2097">ASP.NET Core 10</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.DevPort1" data-source-line="31" id="ent0012"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="115.9443" x="678.5278" y="404.1411">8080:8080 (HTTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="730.5" y="419.1079"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.DevPort2" data-source-line="32" id="ent0013"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="125.2822" x="803.1889" y="404.1411">8081:8081 (HTTPS)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="859.83" y="419.1079"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.GMN14" data-source-line="35" id="ent0015"><path d="M823,625.3779 L823,784.8652 A0,0 0 0 0 823,784.8652 L1128.9907,784.8652 A0,0 0 0 0 1128.9907,784.8652 L1128.9907,635.3779 L1118.9907,625.3779 L882,625.3779 L878,430.9579 L874,625.3779 L823,625.3779 A0,0 0 0 0 823,625.3779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1118.9907,625.3779 L1118.9907,635.3779 L1128.9907,635.3779 L1118.9907,625.3779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="829" y="642.5717">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="284.9907" x="829" y="657.5204">- ASPNETCORE_ENVIRONMENT=Development</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="151.3472" x="829" y="672.4692">- DB_SERVER=sql-server</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.3599" x="829" y="687.4179">- DB_NAME=Biergarten</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="148.8018" x="829" y="702.3666">- DB_USER/PASSWORD</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="94.6118" x="829" y="717.3154">- JWT_SECRET</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.3008" x="829" y="732.2641">- SMTP_* (10+ variables)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="829" y="747.2128">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.6499" x="829" y="762.1615">Health Check:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="92.5234" x="829" y="777.1103">/health endpoint</text></g><!--entity Mig1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig.Mig1" data-source-line="49" id="ent0018"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="168.3994" x="1417.8" y="682.0779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1566.1994" y="687.0779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1564.1994" y="689.0779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1564.1994" y="693.0779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="128.3994" x="1432.8" y="715.2097">Database.Migrations</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig.GMN19" data-source-line="51" id="ent0020"><path d="M1406.04,927.2879 L1406.04,997.0828 A0,0 0 0 0 1406.04,997.0828 L1589.9653,997.0828 A0,0 0 0 0 1589.9653,997.0828 L1589.9653,937.2879 L1579.9653,927.2879 L1506,927.2879 L1502,728.3879 L1498,927.2879 L1406.04,927.2879 A0,0 0 0 0 1406.04,927.2879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1579.9653,927.2879 L1579.9653,937.2879 L1589.9653,937.2879 L1579.9653,927.2879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.3862" x="1412.04" y="944.4817">Runs: DbUp migrations</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="1412.04" y="959.4304">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="162.9253" x="1412.04" y="974.3792">- CLEAR_DATABASE=false</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.3989" x="1412.04" y="989.3279">Depends on: sql-server</text></g><!--entity Seed1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed.Seed1" data-source-line="59" id="ent0023"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="136.5166" x="1708.74" y="682.0779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1825.2566" y="687.0779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1823.2566" y="689.0779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1823.2566" y="693.0779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="96.5166" x="1723.74" y="715.2097">Database.Seed</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed.GMN24" data-source-line="61" id="ent0025"><path d="M1685.94,919.8179 L1685.94,1004.5615 A0,0 0 0 0 1685.94,1004.5615 L1868.0562,1004.5615 A0,0 0 0 0 1868.0562,1004.5615 L1868.0562,929.8179 L1858.0562,919.8179 L1781,919.8179 L1777,728.3879 L1773,919.8179 L1685.94,919.8179 A0,0 0 0 0 1685.94,919.8179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1858.0562,919.8179 L1858.0562,929.8179 L1868.0562,929.8179 L1858.0562,919.8179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.1309" x="1691.94" y="937.0117">Creates:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="89.5972" x="1691.94" y="951.9604">- 100 test users</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="161.1162" x="1691.94" y="966.9092">- Location data (US/CA/MX)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="106.939" x="1691.94" y="981.8579">- test.user account</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="137.2998" x="1691.94" y="996.8066">Depends on: migrations</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit.DevMailpitWeb" data-source-line="70" id="ent0028"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="91.0342" x="177.9829" y="684.1611">8025 (Web UI)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="217.5" y="699.1279"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit.DevMailpitSmtp" data-source-line="71" id="ent0029"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="83.248" x="281.206" y="684.1611">1025 (SMTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="316.83" y="699.1279"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit.GMN30" data-source-line="73" id="ent0031"><path d="M58.81,927.2879 L58.81,997.0828 A0,0 0 0 0 58.81,997.0828 L335.1826,997.0828 A0,0 0 0 0 335.1826,997.0828 L335.1826,937.2879 L325.1826,927.2879 L320.84,927.2879 L316.84,710.9779 L312.84,927.2879 L58.81,927.2879 A0,0 0 0 0 58.81,927.2879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M325.1826,927.2879 L325.1826,937.2879 L335.1826,937.2879 L325.1826,927.2879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="240.6016" x="64.81" y="944.4817">Local SMTP catcher for dev email testing.</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="64.81" y="959.4304">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="222.1426" x="64.81" y="974.3792">- MP_SMTP_AUTH_ACCEPT_ANY=1</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="255.3726" x="64.81" y="989.3279">- MP_SMTP_AUTH_ALLOW_INSECURE=1</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.GMN37" data-source-line="89" id="ent0038"><path d="M3075.54,655.2779 L3075.54,701.4079 L3022.23,705.4079 L3075.54,709.4079 L3075.54,754.9702 A0,0 0 0 0 3075.54,754.9702 L3246.4653,754.9702 A0,0 0 0 0 3246.4653,754.9702 L3246.4653,665.2779 L3236.4653,655.2779 L3075.54,655.2779 A0,0 0 0 0 3075.54,655.2779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3236.4653,655.2779 L3236.4653,665.2779 L3246.4653,665.2779 L3236.4653,655.2779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="139.4644" x="3081.54" y="672.4717">Fresh instance each run</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="149.9253" x="3081.54" y="687.4204">CLEAR_DATABASE=true</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="3081.54" y="702.3692">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="54.1899" x="3081.54" y="717.3179">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="121.3926" x="3081.54" y="732.2666">- biergarten-test-data</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.0845" x="3081.54" y="747.2154">(ephemeral)</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.TestDBInner.1434" data-source-line="86" id="ent0036"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="31.1445" x="3000.4277" y="684.1611">1434</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="3010" y="699.1279"/></g><!--entity Database.Migrations--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestMig.Database.Migrations" data-source-line="99" id="ent0041"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="168.3994" x="2586.8" y="402.0679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2735.1994" y="407.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2733.1994" y="409.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2733.1994" y="413.0679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="128.3994" x="2601.8" y="435.1997">Database.Migrations</text></g><!--entity Database.Seed--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed.Database.Seed" data-source-line="103" id="ent0043"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="136.5166" x="2342.74" y="188.2979"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2459.2566" y="193.2979"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2457.2566" y="195.2979"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2457.2566" y="199.2979"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="96.5166" x="2357.74" y="221.4297">Database.Seed</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed.GMN44" data-source-line="105" id="ent0045"><path d="M2355.7,397.6879 L2355.7,452.534 A0,0 0 0 0 2355.7,452.534 L2466.3035,452.534 A0,0 0 0 0 2466.3035,452.534 L2466.3035,407.6879 L2456.3035,397.6879 L2415,397.6879 L2411,234.6279 L2407,397.6879 L2355.7,397.6879 A0,0 0 0 0 2355.7,397.6879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2456.3035,397.6879 L2456.3035,407.6879 L2466.3035,407.6879 L2456.3035,397.6879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.1963" x="2361.7" y="414.8817">Minimal seed:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.2554" x="2361.7" y="429.8304">- test.user only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="89.6035" x="2361.7" y="444.7792">- Essential data</text></g><!--entity SpecsComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs.SpecsComp" data-source-line="112" id="ent0048"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="139.9893" x="3354.01" y="402.0679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="3473.9993" y="407.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3471.9993" y="409.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3471.9993" y="413.0679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="99.9893" x="3369.01" y="435.1997">Reqnroll + xUnit</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs.GMN49" data-source-line="114" id="ent0050"><path d="M3529.21,360.3179 L3529.21,421.4079 L3494.37,425.4079 L3529.21,429.4079 L3529.21,489.9077 A0,0 0 0 0 3529.21,489.9077 L3678.7881,489.9077 A0,0 0 0 0 3678.7881,489.9077 L3678.7881,370.3179 L3668.7881,360.3179 L3529.21,360.3179 A0,0 0 0 0 3529.21,360.3179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3668.7881,360.3179 L3668.7881,370.3179 L3678.7881,370.3179 L3668.7881,360.3179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="3535.21" y="377.5117">Tests:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="104.0381" x="3535.21" y="392.4604">- Registration flow</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="66.479" x="3535.21" y="407.4092">- Login flow</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.8271" x="3535.21" y="422.3579">- Validation rules</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.3989" x="3535.21" y="437.3066">- 404 handling</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="3535.21" y="452.2554">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.2554" x="3535.21" y="467.2041">Uses: TestApiFactory</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="128.5781" x="3535.21" y="482.1528">Mocks: Email services</text></g><!--entity UnitComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..UnitTests.UnitComp" data-source-line="126" id="ent0053"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="115.0859" x="2876.46" y="402.0679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2971.5459" y="407.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2969.5459" y="409.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2969.5459" y="413.0679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="75.0859" x="2891.46" y="435.1997">xUnit + Moq</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..UnitTests.GMN54" data-source-line="128" id="ent0055"><path d="M3026.99,337.8979 L3026.99,421.4079 L2991.9,425.4079 L3026.99,429.4079 L3026.99,512.3339 A0,0 0 0 0 3026.99,512.3339 L3247.0081,512.3339 A0,0 0 0 0 3247.0081,512.3339 L3247.0081,347.8979 L3237.0081,337.8979 L3026.99,337.8979 A0,0 0 0 0 3026.99,337.8979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3237.0081,337.8979 L3237.0081,347.8979 L3247.0081,347.8979 L3237.0081,337.8979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="168.3398" x="3032.99" y="355.0917">Builds Dockerfile.tests, which</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="188.5889" x="3032.99" y="370.0404">restores/builds against Core.slnx</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181.3652" x="3032.99" y="384.9892">then runs `dotnet test` for every</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181.3525" x="3032.99" y="399.9379">Features/*.Tests project in turn:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="132.1963" x="3032.99" y="414.8866">- Features.Users.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="156.0444" x="3032.99" y="429.8354">- Features.Breweries.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="137.2554" x="3032.99" y="444.7841">- Features.Emails.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="3032.99" y="459.7328">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="199.0181" x="3032.99" y="474.6815">Uses: Moq to mock each handler's</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="186.437" x="3032.99" y="489.6303">repository/service dependencies</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.0024" x="3032.99" y="504.579">No real database needed</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..GMN81" data-source-line="190" id="ent0082"><path d="M5225.09,927.2879 L5225.09,997.0828 L5438.9191,997.0828 L5438.9191,937.2879 L5428.9191,927.2879 L5225.09,927.2879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5428.9191,927.2879 L5428.9191,937.2879 L5438.9191,937.2879 L5428.9191,927.2879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="192.8291" x="5231.09" y="944.4817">Prod Network (bridge: prodnet)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="183.5234" x="5231.09" y="959.4304">Isolated from dev/test networks.</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="169.7998" x="5231.09" y="974.3792">Volumes: sqlserverdata-prod,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.8989" x="5231.09" y="989.3279">nuget-cache-prod</text></g><!--entity ProdDBInner--><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdDB.ProdDBInner" data-source-line="147" id="ent0059"><path d="M5019.7,684.5279 C5019.7,674.5279 5061.9964,674.5279 5061.9964,674.5279 C5061.9964,674.5279 5104.2928,674.5279 5104.2928,684.5279 L5104.2928,725.7251 C5104.2928,735.7251 5061.9964,735.7251 5061.9964,735.7251 C5061.9964,735.7251 5019.7,735.7251 5019.7,725.7251 L5019.7,684.5279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5019.7,684.5279 C5019.7,694.5279 5061.9964,694.5279 5061.9964,694.5279 C5061.9964,694.5279 5104.2928,694.5279 5104.2928,684.5279" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5928" x="5029.7" y="711.6597">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="59.9307" x="5029.7" y="727.7583">Database</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdDB.GMN60" data-source-line="149" id="ent0061"><path d="M5139.05,640.3279 L5139.05,701.4079 L5104.63,705.4079 L5139.05,709.4079 L5139.05,769.9177 A0,0 0 0 0 5139.05,769.9177 L5296.9563,769.9177 A0,0 0 0 0 5296.9563,769.9177 L5296.9563,650.3279 L5286.9563,640.3279 L5139.05,640.3279 A0,0 0 0 0 5139.05,640.3279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5286.9563,640.3279 L5286.9563,650.3279 L5296.9563,650.3279 L5286.9563,640.3279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="5145.05" y="657.5217">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.1235" x="5145.05" y="672.4704">- ACCEPT_EULA=Y</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="131.1235" x="5145.05" y="687.4192">- SA_PASSWORD=***</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="136.9063" x="5145.05" y="702.3679">- MSSQL_PID=Express</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="5145.05" y="717.3166">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="54.1899" x="5145.05" y="732.2654">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="116.3271" x="5145.05" y="747.2141">- sqlserverdata-prod</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="133.6943" x="5145.05" y="762.1628">No host port published.</text></g><!--entity ProdMig1--><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdMig.ProdMig1" data-source-line="161" id="ent0064"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="168.3994" x="4734.8" y="402.0679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="4883.1994" y="407.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="4881.1994" y="409.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="4881.1994" y="413.0679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="128.3994" x="4749.8" y="435.1997">Database.Migrations</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdMig.GMN65" data-source-line="163" id="ent0066"><path d="M4714.21,685.1779 L4714.21,725.0753 A0,0 0 0 0 4714.21,725.0753 L4923.7989,725.0753 A0,0 0 0 0 4923.7989,725.0753 L4923.7989,695.1779 L4913.7989,685.1779 L4823,685.1779 L4819,448.5079 L4815,685.1779 L4714.21,685.1779 A0,0 0 0 0 4714.21,685.1779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4913.7989,685.1779 L4913.7989,695.1779 L4923.7989,695.1779 L4913.7989,685.1779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="188.5889" x="4720.21" y="702.3717">Depends on: sql-server (healthy)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="158.2661" x="4720.21" y="717.3204">No seed step in production.</text></g><!--entity ProdAPI1--><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.ProdAPI1" data-source-line="169" id="ent0069"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="153.5996" x="5614.2" y="402.0679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="5747.7996" y="407.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="5745.7996" y="409.0679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="5745.7996" y="413.0679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="113.5996" x="5629.2" y="435.1997">ASP.NET Core 10</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.ProdPort1" data-source-line="170" id="ent0070"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="115.9443" x="5085.5278" y="190.3811">8080:8080 (HTTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="5137.5" y="205.3479"/></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.ProdPort2" data-source-line="171" id="ent0071"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="125.2822" x="5210.1889" y="190.3811">8081:8081 (HTTPS)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="5266.83" y="205.3479"/></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.GMN72" data-source-line="173" id="ent0073"><path d="M5214.95,360.3179 L5214.95,489.9077 A0,0 0 0 0 5214.95,489.9077 L5579.0472,489.9077 A0,0 0 0 0 5579.0472,489.9077 L5579.0472,370.3179 L5569.0472,360.3179 L5289,360.3179 L5285,217.0679 L5281,360.3179 L5214.95,360.3179 A0,0 0 0 0 5214.95,360.3179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5569.0472,360.3179 L5569.0472,370.3179 L5579.0472,370.3179 L5569.0472,360.3179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="5220.95" y="377.5117">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="270.5435" x="5220.95" y="392.4604">- ASPNETCORE_ENVIRONMENT=Production</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="247.0444" x="5220.95" y="407.4092">- DB_SERVER/NAME/USER/PASSWORD</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="343.0972" x="5220.95" y="422.3579">- ACCESS/REFRESH/CONFIRMATION_TOKEN_SECRET</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="141.5972" x="5220.95" y="437.3066">- WEBSITE_BASE_URL</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="5220.95" y="452.2554">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="196.5298" x="5220.95" y="467.2041">Depends on: sql-server (healthy) -</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="193.667" x="5220.95" y="482.1528">does not wait on migrations/seed.</text></g><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..GMN89" data-source-line="214" id="ent0090"><path d="M5937.69,662.7579 L5937.69,747.5015 L6152.3189,747.5015 L6152.3189,672.7579 L6142.3189,662.7579 L5937.69,662.7579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6142.3189,662.7579 L6142.3189,672.7579 L6152.3189,672.7579 L6142.3189,662.7579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="191.4834" x="5943.69" y="679.9517">Same devnet volumes/images as</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="193.6289" x="5943.69" y="694.9004">docker-compose.dev.yaml, minus</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="187.8589" x="5943.69" y="709.8492">api.core and mailpit - for working</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="165.5088" x="5943.69" y="724.7979">against the database without</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.228" x="5943.69" y="739.7466">running the API.</text></g><!--entity DbOnlyDBInner--><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlyDB.DbOnlyDBInner" data-source-line="200" id="ent0086"><path d="M6007.7,404.5179 C6007.7,394.5179 6049.9964,394.5179 6049.9964,394.5179 C6049.9964,394.5179 6092.2928,394.5179 6092.2928,404.5179 L6092.2928,445.7151 C6092.2928,455.7151 6049.9964,455.7151 6049.9964,455.7151 C6049.9964,455.7151 6007.7,455.7151 6007.7,445.7151 L6007.7,404.5179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6007.7,404.5179 C6007.7,414.5179 6049.9964,414.5179 6049.9964,414.5179 C6049.9964,414.5179 6092.2928,414.5179 6092.2928,404.5179" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5928" x="6017.7" y="431.6497">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="59.9307" x="6017.7" y="447.7483">Database</text></g><!--entity DbOnlyMig--><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlyMig" data-source-line="205" id="ent0087"><polygon fill="#FFFFFF" points="5951.71,190.2479,5961.71,180.2479,6056.2891,180.2479,6056.2891,232.4451,6046.2891,242.4451,5951.71,242.4451,5951.71,190.2479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="6046.2891" x2="6056.2891" y1="190.2479" y2="180.2479"/><line style="stroke:#000000;stroke-width:1;" x1="5951.71" x2="6046.2891" y1="190.2479" y2="190.2479"/><line style="stroke:#000000;stroke-width:1;" x1="6046.2891" x2="6046.2891" y1="190.2479" y2="242.4451"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5791" x="5966.71" y="213.3797">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5791" x="5966.71" y="229.4783">(run-once)</text></g><!--entity DbOnlySeed--><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlySeed" data-source-line="209" id="ent0088"><polygon fill="#FFFFFF" points="5855.71,404.0179,5865.71,394.0179,5960.2891,394.0179,5960.2891,446.2151,5950.2891,456.2151,5855.71,456.2151,5855.71,404.0179" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="5950.2891" x2="5960.2891" y1="404.0179" y2="394.0179"/><line style="stroke:#000000;stroke-width:1;" x1="5855.71" x2="5950.2891" y1="404.0179" y2="404.0179"/><line style="stroke:#000000;stroke-width:1;" x1="5950.2891" x2="5950.2891" y1="404.0179" y2="456.2151"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="32.6963" x="5870.71" y="427.1497">Seed</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5791" x="5870.71" y="443.2483">(run-once)</text></g><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..GMN105" data-source-line="248" id="ent0106"><path d="M6444.72,670.2279 L6444.72,740.0228 L6675.2879,740.0228 L6675.2879,680.2279 L6665.2879,670.2279 L6444.72,670.2279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6665.2879,670.2279 L6665.2879,680.2279 L6675.2879,680.2279 L6665.2879,670.2279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181.7397" x="6450.72" y="687.4217">Database + mailpit only, no API</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="209.5679" x="6450.72" y="702.3704">container - for frontend development</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="187.8779" x="6450.72" y="717.3192">against an API.Core process run</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.3208" x="6450.72" y="732.2679">outside Docker.</text></g><!--entity MinDBInner--><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinDB.MinDBInner" data-source-line="230" id="ent0100"><path d="M6530.7,404.5179 C6530.7,394.5179 6572.9964,394.5179 6572.9964,394.5179 C6572.9964,394.5179 6615.2928,394.5179 6615.2928,404.5179 L6615.2928,445.7151 C6615.2928,455.7151 6572.9964,455.7151 6572.9964,455.7151 C6572.9964,455.7151 6530.7,455.7151 6530.7,445.7151 L6530.7,404.5179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6530.7,404.5179 C6530.7,414.5179 6572.9964,414.5179 6572.9964,414.5179 C6572.9964,414.5179 6615.2928,414.5179 6615.2928,404.5179" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5928" x="6540.7" y="431.6497">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="59.9307" x="6540.7" y="447.7483">Database</text></g><!--entity MinMig--><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinMig" data-source-line="235" id="ent0101"><polygon fill="#FFFFFF" points="6474.71,190.2479,6484.71,180.2479,6579.2891,180.2479,6579.2891,232.4451,6569.2891,242.4451,6474.71,242.4451,6474.71,190.2479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="6569.2891" x2="6579.2891" y1="190.2479" y2="180.2479"/><line style="stroke:#000000;stroke-width:1;" x1="6474.71" x2="6569.2891" y1="190.2479" y2="190.2479"/><line style="stroke:#000000;stroke-width:1;" x1="6569.2891" x2="6569.2891" y1="190.2479" y2="242.4451"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5791" x="6489.71" y="213.3797">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5791" x="6489.71" y="229.4783">(run-once)</text></g><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinMailpit.8025 . 1025" data-source-line="240" id="ent0103"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="73.958" x="6243.521" y="190.3811">8025 / 1025</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="6274.5" y="205.3479"/></g><!--entity MinSeed--><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinSeed" data-source-line="243" id="ent0104"><polygon fill="#FFFFFF" points="6378.71,404.0179,6388.71,394.0179,6483.2891,394.0179,6483.2891,446.2151,6473.2891,456.2151,6378.71,456.2151,6378.71,404.0179" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="6473.2891" x2="6483.2891" y1="404.0179" y2="394.0179"/><line style="stroke:#000000;stroke-width:1;" x1="6378.71" x2="6473.2891" y1="404.0179" y2="404.0179"/><line style="stroke:#000000;stroke-width:1;" x1="6473.2891" x2="6473.2891" y1="404.0179" y2="456.2151"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="32.6963" x="6393.71" y="427.1497">Seed</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="64.5791" x="6393.71" y="443.2483">(run-once)</text></g><!--entity Result1--><g class="entity" data-qualified-name="Results.Result1" data-source-line="261" id="ent0115"><path d="M4071.77,681.5279 L4071.77,728.7251 A2.5,2.5 0 0 0 4074.27,731.2251 L4157.7251,731.2251 A2.5,2.5 0 0 0 4160.2251,728.7251 L4160.2251,689.0279 L4150.2251,679.0279 L4074.27,679.0279 A2.5,2.5 0 0 0 4071.77,681.5279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4150.2251,679.0279 L4150.2251,686.5279 A2.5,2.5 0 0 0 4152.7251,689.0279 L4160.2251,689.0279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="63.8066" x="4081.77" y="702.1597">api-specs/</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="60.6758" x="4089.5493" y="718.2583">results.trx</text></g><!--entity Result2--><g class="entity" data-qualified-name="Results.Result2" data-source-line="262" id="ent0116"><path d="M4195.37,689.5779 L4195.37,720.6765 A2.5,2.5 0 0 0 4197.87,723.1765 L4366.1249,723.1765 A2.5,2.5 0 0 0 4368.6249,720.6765 L4368.6249,697.0779 L4358.6249,687.0779 L4197.87,687.0779 A2.5,2.5 0 0 0 4195.37,689.5779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4358.6249,687.0779 L4358.6249,694.5779 A2.5,2.5 0 0 0 4361.1249,697.0779 L4368.6249,697.0779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="153.2549" x="4205.37" y="710.2097">Features.Users.Tests.trx</text></g><!--entity Result3--><g class="entity" data-qualified-name="Results.Result3" data-source-line="263" id="ent0117"><path d="M4071.53,946.6379 L4071.53,977.7365 A2.5,2.5 0 0 0 4074.03,980.2365 L4267.9675,980.2365 A2.5,2.5 0 0 0 4270.4675,977.7365 L4270.4675,954.1379 L4260.4675,944.1379 L4074.03,944.1379 A2.5,2.5 0 0 0 4071.53,946.6379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4260.4675,944.1379 L4260.4675,951.6379 A2.5,2.5 0 0 0 4262.9675,954.1379 L4270.4675,954.1379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="178.9375" x="4081.53" y="967.2697">Features.Breweries.Tests.trx</text></g><!--entity Result5--><g class="entity" data-qualified-name="Results.Result5" data-source-line="264" id="ent0118"><path d="M4403.65,689.5779 L4403.65,720.6765 A2.5,2.5 0 0 0 4406.15,723.1765 L4579.8531,723.1765 A2.5,2.5 0 0 0 4582.3531,720.6765 L4582.3531,697.0779 L4572.3531,687.0779 L4406.15,687.0779 A2.5,2.5 0 0 0 4403.65,689.5779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4572.3531,687.0779 L4572.3531,694.5779 A2.5,2.5 0 0 0 4574.8531,697.0779 L4582.3531,697.0779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="158.7031" x="4413.65" y="710.2097">Features.Emails.Tests.trx</text></g><g class="entity" data-qualified-name="Results.GMN119" data-source-line="267" id="ent0120"><path d="M4435.18,919.8179 L4435.18,1004.5615 A0,0 0 0 0 4435.18,1004.5615 L4550.8236,1004.5615 A0,0 0 0 0 4550.8236,1004.5615 L4550.8236,929.8179 L4540.8236,919.8179 L4497,919.8179 L4493,723.6179 L4489,919.8179 L4435.18,919.8179 A0,0 0 0 0 4435.18,919.8179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4540.8236,919.8179 L4540.8236,929.8179 L4550.8236,929.8179 L4540.8236,919.8179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="66.4536" x="4441.18" y="937.0117">TRX format</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.6099" x="4441.18" y="951.9604">Readable by:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="83.8208" x="4441.18" y="966.9092">- Visual Studio</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="92.4727" x="4441.18" y="981.8579">- Azure DevOps</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="94.6436" x="4441.18" y="996.8066">- GitHub Actions</text></g><!--entity Developer--><g class="entity" data-qualified-name="Developer" data-source-line="9" id="ent0001"><ellipse cx="1993.9967" cy="181.7979" fill="#FFFFFF" rx="8" ry="8" style="stroke:#000000;stroke-width:1;"/><path d="M1993.9967,189.7979 L1993.9967,216.7979 M1980.9967,197.7979 L2006.9967,197.7979 M1993.9967,216.7979 L1980.9967,231.7979 M1993.9967,216.7979 L2006.9967,231.7979" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="63.8135" x="1962.09" y="246.9297">Developer</text></g><!--entity Host--><g class="entity" data-qualified-name="Host" data-source-line="10" id="ent0002"><path d="M1950.2238,412.2205 C1952.5433,407.0054 1957.1764,405.2968 1961.5056,409.9148 C1965.5161,405.0599 1968.8662,405.0685 1972.1817,410.6272 C1974.8475,404.3946 1978.1877,403.0964 1983.3597,408.1437 C1986.3638,402.9259 1990.5803,402.8848 1994.152,407.5221 C1998.5891,401.7746 2004.4403,402.5711 2007.4661,409.058 C2010.3088,404.6383 2014.4114,404.6812 2017.3866,408.906 C2021.0741,402.9983 2026.3778,404.5159 2028.9902,410.001 C2033.0299,406.0127 2037.0976,405.2929 2039.8091,411.4214 C2047.2757,414.2259 2047.8124,419.5502 2043.1394,425.2732 C2050.7148,431.7341 2048.5716,437.5637 2040.3446,441.2624 C2037.1717,446.1029 2033.5099,446.1002 2029.9191,441.7357 C2026.79,447.3724 2023.0121,448.4153 2018.2219,443.5936 C2015.6485,450.3624 2011.1843,449.4993 2006.8399,445.4583 C2004.1975,450.8347 2000.1262,451.9407 1995.8279,447.2739 C1992.4522,453.3583 1987.1266,452.2543 1984.1526,446.8652 C1978.9937,451.6517 1974.1549,450.8937 1972.0035,443.7918 C1968.5359,448.7422 1965.2163,447.9342 1961.8274,443.7045 C1956.94,447.6084 1952.2593,447.1413 1950.4093,440.4356 C1941.6961,439.0303 1940.2013,432.4102 1944.8067,425.8788 C1940.9166,419.7361 1941.4491,413.3401 1950.2238,412.2205" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="77.0205" x="1955.49" y="430.1997">Docker Host</text></g><g class="entity" data-qualified-name="GMN148" data-source-line="305" id="ent0149"><path d="M1940.01,1079.5079 L1940.01,1149.3028 L2189.9954,1149.3028 L2189.9954,1089.5079 L2179.9954,1079.5079 L1940.01,1079.5079" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2179.9954,1079.5079 L2179.9954,1089.5079 L2189.9954,1089.5079 L2179.9954,1079.5079" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="228.9854" x="1946.01" y="1096.7017">Dev Network (bridge: biergarten-dev)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="78.0317" x="1946.01" y="1111.6504">Internal DNS:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="226.8525" x="1946.01" y="1126.5992">- sql-server (resolves to SQL container)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="182.0762" x="1946.01" y="1141.5479">- api (resolves to API container)</text></g><g class="entity" data-qualified-name="GMN151" data-source-line="312" id="ent0152"><path d="M3770.21,942.2379 L3770.21,982.1353 L4023.7945,982.1353 L4023.7945,952.2379 L4013.7945,942.2379 L3770.21,942.2379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4013.7945,942.2379 L4013.7945,952.2379 L4023.7945,952.2379 L4013.7945,942.2379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="700" lengthAdjust="spacing" textLength="232.5845" x="3776.21" y="959.4317">Test Network (bridge: biergarten-test)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="161.8652" x="3776.21" y="974.3804">All test components isolated</text></g><g class="entity" data-qualified-name="GMN154" data-source-line="318" id="ent0155"><path d="M2082.69,382.7379 L2082.69,467.4815 L2271.3189,467.4815 L2271.3189,392.7379 L2261.3189,382.7379 L2082.69,382.7379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2261.3189,382.7379 L2261.3189,392.7379 L2271.3189,392.7379 L2261.3189,382.7379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.3672" x="2088.69" y="399.9317">Startup Order:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="167.6289" x="2088.69" y="414.8804">1. SQL Server (health check)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="137.998" x="2088.69" y="429.8292">2. Migrations (run-once)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.3926" x="2088.69" y="444.7779">3. Seed (run-once)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="119.9517" x="2088.69" y="459.7266">4. API (long-running)</text></g><g class="entity" data-qualified-name="GMN157" data-source-line="326" id="ent0158"><path d="M3769.92,183.9179 L3769.92,238.764 L3918.0889,238.764 L3918.0889,193.9179 L3908.0889,183.9179 L3769.92,183.9179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3908.0889,183.9179 L3908.0889,193.9179 L3918.0889,193.9179 L3908.0889,183.9179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="89.5972" x="3775.92" y="201.1117">Test Execution:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="127.1689" x="3775.92" y="216.0604">All tests run in parallel</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="112.7407" x="3775.92" y="231.0092">Results aggregated</text></g><!--link ProdMig to ProdDB--><g class="link" data-entity-1="ent0063" data-entity-2="ent0058" data-link-type="dependency" data-source-line="184" id="lnk75"><path d="M4956.3578,597.4079 C4956.6154,597.4079 4956.8786,597.4079 4957.1474,597.4079 C4957.685,597.4079 4958.2446,597.4079 4958.826,597.4079 C4961.1516,597.4079 4963.8247,597.4079 4966.8186,597.4079 C4972.8063,597.4079 4980.0771,597.4079 4988.4172,597.4079 C4990.5022,597.4079 4992.6541,597.4079 4994.8694,597.4079 C4995.1463,597.4079 4995.4242,597.4079 4995.7031,597.4079 C4995.7728,597.4079 4990.8426,597.4079 4990.9125,597.4079" fill="none" id="ProdMig-to-ProdDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4995.9125,597.4079,4986.9125,593.4079,4990.9125,597.4079,4986.9125,601.4079,4995.9125,597.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.8799" x="5059.62" y="594.6017">1. Run migrations</text></g><!--reverse link ProdDB to ProdMig--><g class="link" data-entity-1="ent0058" data-entity-2="ent0063" data-link-type="dependency" data-source-line="186" id="lnk78"><path d="M5379.6998,705.4079 C5381.2345,705.4079 5378.9441,705.4079 5380.5356,705.4079 C5406,705.4079 5438.4975,705.4079 5470.51,705.4079 C5534.535,705.4079 5596.62,705.4079 5596.62,705.4079 C5596.62,705.4079 5596.62,349.4079 5596.62,349.4079 C5596.62,349.4079 5434.465,349.4079 5272.31,349.4079 C5191.2325,349.4079 5110.155,349.4079 5049.3469,349.4079 C5018.9428,349.4079 4993.6061,349.4079 4975.8704,349.4079 C4971.4365,349.4079 4967.4776,349.4079 4964.0334,349.4079 C4962.3113,349.4079 4960.7178,349.4079 4959.258,349.4079 C4958.5281,349.4079 4957.8316,349.4079 4957.1691,349.4079 C4956.8379,349.4079 4956.5151,349.4079 4956.201,349.4079" fill="none" id="ProdDB-backto-ProdMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="5374.6998,705.4079,5383.6998,709.4079,5379.6998,705.4079,5383.6998,701.4079,5374.6998,705.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="5472.82" y="346.6017">depends_on</text></g><!--link ProdAPI to ProdDB--><g class="link" data-entity-1="ent0068" data-entity-2="ent0058" data-link-type="dependency" data-source-line="185" id="lnk76"><path d="M5332,513.9973 C5332,515.5817 5332,517.2963 5332,519.1297 C5332,522.7966 5332,526.939 5332,531.4664 C5332,540.5214 5332,551.1166 5332,562.5286 C5332,565.3816 5332,568.2856 5332,571.2294 C5332,572.7013 5332,574.1832 5332,575.6735 C5332,575.8598 5332,571.0463 5332,571.2328" fill="none" id="ProdAPI-to-ProdDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="5332,576.2328,5336,567.2328,5332,571.2328,5328,567.2328,5332,576.2328" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5571" x="5211.82" y="498.6017">2. Connect &amp; serve</text></g><!--reverse link ProdDB to ProdAPI--><g class="link" data-entity-1="ent0058" data-entity-2="ent0068" data-link-type="dependency" data-source-line="187" id="lnk80"><path d="M5152.7,570.8473 C5152.7,570.2556 5152.7,573.7757 5152.7,573.1791 C5152.7,568.406 5152.7,563.4779 5152.7,558.4479 C5152.7,548.3879 5152.7,537.9204 5152.7,527.4704 C5152.7,524.8579 5152.7,522.2464 5152.7,519.6428 C5152.7,518.3409 5152.7,517.041 5152.7,515.7439 C5152.7,515.4196 5152.7,515.0955 5152.7,514.7716 C5152.7,514.6096 5152.7,514.4477 5152.7,514.2858" fill="none" id="ProdDB-backto-ProdAPI" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="5152.7,575.8473,5156.7,566.8473,5152.7,570.8473,5148.7,566.8473,5152.7,575.8473" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="5112.94" y="629.6017">depends_on</text></g><!--link ProdDB to GMN81--><g class="link" data-entity-1="ent0058" data-entity-2="ent0082" data-link-type="association" data-source-line="190" id="lnk83"><path d="M5332,794.2756 C5332,794.6292 5332,794.9833 5332,795.3379 C5332,840.7179 5332,893.1129 5332,926.8979" fill="none" id="ProdDB-GMN81" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link DbOnlyDB to GMN89--><g class="link" data-entity-1="ent0085" data-entity-2="ent0090" data-link-type="association" data-source-line="214" id="lnk91"><path d="M6128,480.3886 C6128,481.0322 6128,481.6795 6128,482.3307 C6128,483.6329 6128,484.9501 6128,486.2813 C6128,496.9314 6128,508.4844 6128,520.5291 C6128,568.7079 6128,624.7529 6128,662.3379" fill="none" id="DbOnlyDB-GMN89" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link DbOnlyMig to DbOnlyDB--><g class="link" data-entity-1="ent0087" data-entity-2="ent0085" data-link-type="dependency" data-source-line="221" id="lnk92"><path d="M6056.44,233.4079 C6094.98,233.4079 6140.66,233.4079 6140.66,233.4079 C6140.66,233.4079 6140.66,425.4079 6140.66,425.4079 C6140.66,425.4079 6140.0544,425.4079 6139.108,425.4079 C6138.6348,425.4079 6138.0764,425.4079 6137.4659,425.4079 C6137.1606,425.4079 6136.8424,425.4079 6136.5152,425.4079 C6136.3516,425.4079 6141.1858,425.4079 6141.0183,425.4079" fill="none" id="DbOnlyMig-to-DbOnlyDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6136.0183,425.4079,6145.0183,429.4079,6141.0183,425.4079,6145.0183,421.4079,6136.0183,425.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.8799" x="6038.66" y="290.5517">1. Run migrations</text></g><!--reverse link DbOnlyDB to DbOnlyMig--><g class="link" data-entity-1="ent0085" data-entity-2="ent0087" data-link-type="dependency" data-source-line="223" id="lnk95"><path d="M6109.65,341.103 C6109.65,339.6549 6109.65,342.1173 6109.65,340.6621 C6109.65,337.7516 6109.65,334.8297 6109.65,331.9079 C6109.65,285.1579 6109.65,238.4079 6109.65,238.4079 C6109.65,238.4079 6083.03,238.4079 6056.51,238.4079" fill="none" id="DbOnlyDB-backto-DbOnlyMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6109.65,346.103,6113.65,337.103,6109.65,341.103,6105.65,337.103,6109.65,346.103" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="6037.65" y="311.3117">depends_on</text></g><!--link DbOnlySeed to DbOnlyDB--><g class="link" data-entity-1="ent0088" data-entity-2="ent0085" data-link-type="dependency" data-source-line="222" id="lnk93"><path d="M5957.43,393.6279 C5957.43,387.2279 5957.43,382.4079 5957.43,382.4079 C5957.43,382.4079 5960.0952,382.4079 5964.7592,382.4079 C5967.0912,382.4079 5969.9229,382.4079 5973.1711,382.4079 C5974.7952,382.4079 5976.5233,382.4079 5978.3452,382.4079 C5979.2562,382.4079 5980.1905,382.4079 5981.147,382.4079 C5981.6253,382.4079 5982.109,382.4079 5982.5982,382.4079 C5982.8428,382.4079 5978.0887,382.4079 5978.3359,382.4079" fill="none" id="DbOnlySeed-to-DbOnlyDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="5983.3359,382.4079,5974.3359,378.4079,5978.3359,382.4079,5974.3359,386.4079,5983.3359,382.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.728" x="5984.09" y="379.6017">2. Seed data</text></g><!--reverse link DbOnlyMig to DbOnlySeed--><g class="link" data-entity-1="ent0087" data-entity-2="ent0088" data-link-type="dependency" data-source-line="224" id="lnk97"><path d="M5954.57,247.8879 C5954.57,288.4179 5954.57,353.3679 5954.57,393.7879" fill="none" id="DbOnlyMig-backto-DbOnlySeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="5954.57,242.8879,5950.57,251.8879,5954.57,247.8879,5958.57,251.8879,5954.57,242.8879" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="5882.57" y="315.5317">depends_on</text></g><!--link MinDB to GMN105--><g class="link" data-entity-1="ent0099" data-entity-2="ent0106" data-link-type="association" data-source-line="248" id="lnk107"><path d="M6651,480.3527 C6651,480.6854 6651,481.0191 6651,481.3538 C6651,484.0315 6651,486.7739 6651,489.5739 C6651,500.7736 6651,512.8941 6651,525.4804 C6651,575.8254 6651,633.6229 6651,669.7579" fill="none" id="MinDB-GMN105" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link MinMig to MinDB--><g class="link" data-entity-1="ent0101" data-entity-2="ent0099" data-link-type="dependency" data-source-line="254" id="lnk108"><path d="M6579.51,221.4079 C6606.03,221.4079 6632.65,221.4079 6632.65,221.4079 C6632.65,221.4079 6632.65,272.4079 6632.65,323.4079 C6632.65,329.7829 6632.65,336.1579 6632.65,342.4332 C6632.65,343.2177 6632.65,344.0005 6632.65,344.7816 C6632.65,345.1722 6632.65,340.5623 6632.65,340.952" fill="none" id="MinMig-to-MinDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6632.65,345.952,6636.65,336.952,6632.65,340.952,6628.65,336.952,6632.65,345.952" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.8799" x="6530.65" y="302.8117">1. Run migrations</text></g><!--reverse link MinDB to MinMig--><g class="link" data-entity-1="ent0099" data-entity-2="ent0101" data-link-type="dependency" data-source-line="256" id="lnk111"><path d="M6664.0039,425.4079 C6664.3306,425.4079 6660.1447,425.4079 6660.4496,425.4079 C6661.0593,425.4079 6661.617,425.4079 6662.0897,425.4079 C6663.035,425.4079 6663.64,425.4079 6663.64,425.4079 C6663.64,425.4079 6663.64,201.4079 6663.64,201.4079 C6663.64,201.4079 6617.97,201.4079 6579.44,201.4079" fill="none" id="MinDB-backto-MinMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6659.0039,425.4079,6668.0039,429.4079,6664.0039,425.4079,6668.0039,421.4079,6659.0039,425.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="6591.64" y="274.5517">depends_on</text></g><!--link MinSeed to MinDB--><g class="link" data-entity-1="ent0104" data-entity-2="ent0099" data-link-type="dependency" data-source-line="255" id="lnk109"><path d="M6480.43,393.5579 C6480.43,381.8679 6480.43,371.4079 6480.43,371.4079 C6480.43,371.4079 6483.0952,371.4079 6487.7592,371.4079 C6490.0912,371.4079 6492.9229,371.4079 6496.1711,371.4079 C6497.7952,371.4079 6499.5233,371.4079 6501.3452,371.4079 C6502.2562,371.4079 6503.1905,371.4079 6504.147,371.4079 C6504.6253,371.4079 6505.109,371.4079 6505.5982,371.4079 C6505.8428,371.4079 6501.0887,371.4079 6501.3359,371.4079" fill="none" id="MinSeed-to-MinDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6506.3359,371.4079,6497.3359,367.4079,6501.3359,371.4079,6497.3359,375.4079,6506.3359,371.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.728" x="6507.19" y="368.6017">2. Seed data</text></g><!--reverse link MinMig to MinSeed--><g class="link" data-entity-1="ent0101" data-entity-2="ent0104" data-link-type="dependency" data-source-line="257" id="lnk113"><path d="M6477.57,247.8879 C6477.57,288.4179 6477.57,353.3679 6477.57,393.7879" fill="none" id="MinMig-backto-MinSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6477.57,242.8879,6473.57,251.8879,6477.57,247.8879,6481.57,251.8879,6477.57,242.8879" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="6405.57" y="315.5317">depends_on</text></g><!--link Developer to Host--><g class="link" data-entity-1="ent0001" data-entity-2="ent0002" data-link-type="dependency" data-source-line="276" id="lnk122"><path d="M1994,250.0579 C1994,294.2179 1994,360.0079 1994,396.5679" fill="none" id="Developer-to-Host" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1994,401.5679,1998,392.5679,1994,396.5679,1990,392.5679,1994,401.5679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="113.4517" x="1880" y="323.0117">docker compose up</text></g><!--link Host to DevAPI--><g class="link" data-entity-1="ent0002" data-entity-2="ent0010" data-link-type="dependency" data-source-line="277" id="lnk123"><path d="M1994,448.4779 C1994,451.9579 1994,454.4079 1994,454.4079 C1994,454.4079 1678.0825,454.4079 1362.165,454.4079 C1357.2288,454.4079 1357.2926,454.4079 1352.3576,454.4079" fill="none" id="Host-to-DevAPI" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1347.3576,454.4079,1356.3576,458.4079,1352.3576,454.4079,1356.3576,450.4079,1347.3576,454.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="116.3589" x="1132.82" y="451.6017">http://localhost:8080</text></g><!--link DevMig to DevDB--><g class="link" data-entity-1="ent0017" data-entity-2="ent0004" data-link-type="dependency" data-source-line="280" id="lnk124"><path d="M1373.9913,962.4079 C1373.9169,962.4079 1373.8421,962.4079 1373.7669,962.4079 C1373.6166,962.4079 1373.4647,962.4079 1373.3113,962.4079 C1373.0044,962.4079 1372.6916,962.4079 1372.3731,962.4079 C1371.736,962.4079 1371.0762,962.4079 1370.3965,962.4079 C1369.0372,962.4079 1367.5982,962.4079 1366.1022,962.4079 C1363.1101,962.4079 1359.8897,962.4079 1356.6213,962.4079 C1350.0844,962.4079 1343.3553,962.4079 1337.8761,962.4079 C1336.5063,962.4079 1340.2146,962.4079 1339.0236,962.4079" fill="none" id="DevMig-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1334.0236,962.4079,1343.0236,966.4079,1339.0236,962.4079,1343.0236,958.4079,1334.0236,962.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.8799" x="1280" y="859.0117">1. Run migrations</text></g><!--reverse link DevDB to DevMig--><g class="link" data-entity-1="ent0004" data-entity-2="ent0017" data-link-type="dependency" data-source-line="284" id="lnk129"><path d="M1326,834.4386 C1326,830.5551 1326,831.6646 1326,827.7816 C1326,765.6529 1326,705.4079 1326,705.4079 C1326,705.4079 1338.305,705.4079 1351.3788,705.4079 C1357.9156,705.4079 1364.6447,705.4079 1370.1239,705.4079 C1371.4937,705.4079 1372.7854,705.4079 1373.9764,705.4079" fill="none" id="DevDB-backto-DevMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1326,839.4386,1330,830.4386,1326,834.4386,1322,830.4386,1326,839.4386" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="1254" y="802.9417">depends_on</text></g><!--link DevSeed to DevDB--><g class="link" data-entity-1="ent0022" data-entity-2="ent0004" data-link-type="dependency" data-source-line="281" id="lnk125"><path d="M1653.7025,1000.4079 C1651.9201,1000.4079 1649.8713,1000.4079 1647.5767,1000.4079 C1638.3982,1000.4079 1625.2861,1000.4079 1609.5516,1000.4079 C1578.0825,1000.4079 1536.1238,1000.4079 1494.165,1000.4079 C1452.2063,1000.4079 1410.2475,1000.4079 1378.7784,1000.4079 C1363.0439,1000.4079 1349.9318,1000.4079 1340.7533,1000.4079 C1338.4587,1000.4079 1336.4099,1000.4079 1334.6275,1000.4079 C1334.5161,1000.4079 1339.4057,1000.4079 1339.2964,1000.4079" fill="none" id="DevSeed-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1334.2964,1000.4079,1343.2964,1004.4079,1339.2964,1000.4079,1343.2964,996.4079,1334.2964,1000.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.728" x="1548.61" y="997.6017">2. Seed data</text></g><!--link DevAPI to DevDB--><g class="link" data-entity-1="ent0010" data-entity-2="ent0004" data-link-type="dependency" data-source-line="282" id="lnk126"><path d="M732,809.0203 C732,809.203 732,809.3852 732,809.567 C732,809.9306 732,810.2924 732,810.6525 C732,811.3727 732,812.0859 732,812.7916 C732,814.2029 732,815.5842 732,816.9317 C732,822.3216 732,827.1712 732,831.2418 C732,839.3829 732,844.4079 732,844.4079 C732,844.4079 767.5594,844.4079 820.8984,844.4079 C847.568,844.4079 878.6824,844.4079 912.0193,844.4079 C920.3536,844.4079 928.8267,844.4079 937.404,844.4079 C941.6927,844.4079 946.0074,844.4079 950.3438,844.4079 C951.4279,844.4079 947.5133,844.4079 948.6001,844.4079" fill="none" id="DevAPI-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="953.6001,844.4079,944.6001,840.4079,948.6001,844.4079,944.6001,848.4079,953.6001,844.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5571" x="917.18" y="841.6017">3. Connect &amp; serve</text></g><!--link DevAPI to DevMailpit--><g class="link" data-entity-1="ent0010" data-entity-2="ent0027" data-link-type="dependency" data-source-line="283" id="lnk127"><path d="M676,725.5279 C676,784.2479 676,949.4079 676,949.4079 C676,949.4079 659.0125,949.4079 634.5438,949.4079 C622.3094,949.4079 608.2047,949.4079 593.418,949.4079 C589.7213,949.4079 585.982,949.4079 582.2186,949.4079 C580.3369,949.4079 578.4492,949.4079 576.5578,949.4079 C575.6121,949.4079 574.6655,949.4079 573.7183,949.4079 C573.2446,949.4079 577.7709,949.4079 577.297,949.4079" fill="none" id="DevAPI-to-DevMailpit" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="572.297,949.4079,581.297,953.4079,577.297,949.4079,581.297,945.4079,572.297,949.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="133.6309" x="542" y="898.5617">4. SMTP_HOST/PORT</text></g><!--reverse link DevMig to DevSeed--><g class="link" data-entity-1="ent0017" data-entity-2="ent0022" data-link-type="dependency" data-source-line="285" id="lnk131"><path d="M1619.5018,668.4079 C1620.339,668.4079 1617.4297,668.4079 1618.25,668.4079 C1631.375,668.4079 1642.3125,668.4079 1649.9688,668.4079 C1650.9258,668.4079 1651.8315,668.4079 1652.6839,668.4079 C1653.1101,668.4079 1653.5229,668.4079 1653.9221,668.4079" fill="none" id="DevMig-backto-DevSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1614.5018,668.4079,1623.5018,672.4079,1619.5018,668.4079,1623.5018,664.4079,1614.5018,668.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="1450" y="665.6017">depends_on</text></g><!--reverse link DevSeed to DevAPI--><g class="link" data-entity-1="ent0022" data-entity-2="ent0010" data-link-type="dependency" data-source-line="286" id="lnk133"><path d="M1648.9187,705.4079 C1648.6893,705.4079 1653.1149,705.4079 1652.8797,705.4079 C1652.4094,705.4079 1651.9282,705.4079 1651.438,705.4079 C1650.4575,705.4079 1649.4407,705.4079 1648.4024,705.4079 C1646.3257,705.4079 1644.1628,705.4079 1642.0313,705.4079 C1633.505,705.4079 1625.48,705.4079 1625.48,705.4079 C1625.48,705.4079 1625.48,540.4079 1625.48,540.4079 C1625.48,540.4079 1571.3356,540.4079 1490.1191,540.4079 C1449.5108,540.4079 1402.1345,540.4079 1351.3741,540.4079 C1349.7878,540.4079 1348.1983,540.4079 1346.6055,540.4079" fill="none" id="DevSeed-backto-DevAPI" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1653.9187,705.4079,1644.9187,701.4079,1648.9187,705.4079,1644.9187,709.4079,1653.9187,705.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="1148.62" y="537.6017">depends_on</text></g><!--link TestMig to TestDB--><g class="link" data-entity-1="ent0040" data-entity-2="ent0034" data-link-type="dependency" data-source-line="289" id="lnk134"><path d="M2799.0705,425.4079 C2799.1328,425.4079 2799.1953,425.4079 2799.258,425.4079 C2799.7599,425.4079 2800.2776,425.4079 2800.8091,425.4079 C2805.0606,425.4079 2810.1913,425.4079 2815.1425,425.4079 C2825.045,425.4079 2834.23,425.4079 2834.23,425.4079 C2834.23,425.4079 2834.23,568.4079 2834.23,568.4079 C2834.23,568.4079 3258.34,568.4079 3258.34,568.4079 C3258.34,568.4079 3258.34,576.9704 3258.34,589.8141 C3258.34,590.2155 3258.34,585.621 3258.34,586.0306" fill="none" id="TestMig-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3258.34,591.0306,3262.34,582.0306,3258.34,586.0306,3254.34,582.0306,3258.34,591.0306" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="57.8018" x="2975.58" y="565.6017">1. Migrate</text></g><!--reverse link TestDB to TestMig--><g class="link" data-entity-1="ent0034" data-entity-2="ent0040" data-link-type="dependency" data-source-line="294" id="lnk139"><path d="M2894.8956,762.4079 C2891.6949,762.4079 2888.7057,762.4079 2885.6061,762.4079 C2879.4069,762.4079 2873.4172,762.4079 2867.6672,762.4079 C2821.6669,762.4079 2791,762.4079 2791,762.4079 C2791,762.4079 2791,681.9904 2791,599.6879 C2791,558.5366 2791,516.9141 2791,484.6369 C2791,480.6023 2791,476.7136 2791,472.9902" fill="none" id="TestDB-backto-TestMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2899.8956,762.4079,2890.8956,758.4079,2894.8956,762.4079,2890.8956,766.4079,2899.8956,762.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="2824.28" y="759.6017">depends_on</text></g><!--link TestSeed to TestDB--><g class="link" data-entity-1="ent0042" data-entity-2="ent0034" data-link-type="dependency" data-source-line="290" id="lnk135"><path d="M2523.4753,199.4079 C2529.0027,199.4079 2537.1095,199.4079 2547.4272,199.4079 C2568.0627,199.4079 2597.542,199.4079 2632.9172,199.4079 C2703.6675,199.4079 2798.0013,199.4079 2892.335,199.4079 C3081.0025,199.4079 3269.67,199.4079 3269.67,199.4079 C3269.67,199.4079 3269.67,325.6579 3269.67,451.9079 C3269.67,483.4704 3269.67,515.0329 3269.67,544.6227 C3269.67,559.4176 3269.67,573.7194 3269.67,587.2814 C3269.67,588.129 3269.67,583.9737 3269.67,584.8155" fill="none" id="TestSeed-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3269.67,589.8155,3273.67,580.8155,3269.67,584.8155,3265.67,580.8155,3269.67,589.8155" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="44.8145" x="3100.35" y="196.6017">2. Seed</text></g><!--link Specs to TestDB--><g class="link" data-entity-1="ent0047" data-entity-2="ent0034" data-link-type="dependency" data-source-line="291" id="lnk136"><path d="M3714,514.041 C3714,514.5385 3714,515.037 3714,515.5365 C3714,517.5344 3714,519.5479 3714,521.5748 C3714,537.7907 3714,554.8735 3714,571.8279 C3714,639.6454 3714,705.4079 3714,705.4079 C3714,705.4079 3611.0025,705.4079 3505.5913,705.4079 C3452.8856,705.4079 3399.5766,705.4079 3358.237,705.4079 C3337.5673,705.4079 3319.8899,705.4079 3306.7765,705.4079 C3300.2198,705.4079 3299.8041,705.4079 3295.7259,705.4079" fill="none" id="Specs-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3290.7259,705.4079,3299.7259,709.4079,3295.7259,705.4079,3299.7259,701.4079,3290.7259,705.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="100.4517" x="3537.1" y="702.6017">3. Integration test</text></g><!--link UnitTests to TestDB--><g class="link" data-entity-1="ent0052" data-entity-2="ent0034" data-link-type="dependency" data-source-line="292" id="lnk137"><path d="M3282,537.7651 C3282,538.774 3282,539.7848 3282,540.7974 C3282,548.8982 3282,557.111 3282,565.3229 C3282,573.5347 3282,581.7457 3282,589.8427 C3282,590.0957 3282,585.3486 3282,585.6014" fill="none" id="UnitTests-to-TestDB" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="3282,590.6014,3286,581.6014,3282,585.6014,3278,581.6014,3282,590.6014" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="133.707" x="3137.731" y="532.3417">depends_on for startup</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="153.1689" x="3128" y="547.2904">ordering only (Moq mocks,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5698" x="3149.2996" y="562.2392">no real connection)</text></g><!--reverse link TestMig to TestSeed--><g class="link" data-entity-1="ent0040" data-entity-2="ent0042" data-link-type="dependency" data-source-line="295" id="lnk141"><path d="M2791,332.4208 C2791,326.0035 2791,319.7174 2791,313.2541 C2791,261.5479 2791,211.4079 2791,211.4079 C2791,211.4079 2726.245,211.4079 2659.4663,211.4079 C2626.0769,211.4079 2592.1816,211.4079 2565.6217,211.4079 C2552.3418,211.4079 2540.8957,211.4079 2532.2637,211.4079 C2530.1057,211.4079 2528.1236,211.4079 2526.3327,211.4079 C2525.4372,211.4079 2524.5895,211.4079 2523.7916,211.4079 C2523.5921,211.4079 2523.3957,211.4079 2523.2025,211.4079" fill="none" id="TestMig-backto-TestSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2791,337.4208,2795,328.4208,2791,332.4208,2787,328.4208,2791,337.4208" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="2687.94" y="208.6017">depends_on</text></g><!--reverse link TestSeed to Specs--><g class="link" data-entity-1="ent0042" data-entity-2="ent0047" data-link-type="dependency" data-source-line="296" id="lnk143"><path d="M2528.9315,219.4079 C2535.2996,219.4079 2539.9626,219.4079 2548.1607,219.4079 C2580.953,219.4079 2627.7991,219.4079 2684.0144,219.4079 C2796.445,219.4079 2946.3525,219.4079 3096.26,219.4079 C3396.075,219.4079 3695.89,219.4079 3695.89,219.4079 C3695.89,219.4079 3695.89,232.2829 3695.89,251.5954 C3695.89,261.2516 3695.89,272.5172 3695.89,284.5875 C3695.89,287.6051 3695.89,290.673 3695.89,293.7786 C3695.89,294.555 3695.89,295.3337 3695.89,296.1146" fill="none" id="TestSeed-backto-Specs" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2523.9315,219.4079,2532.9315,223.4079,2528.9315,219.4079,2532.9315,215.4079,2523.9315,219.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="3123.13" y="216.6017">depends_on</text></g><!--reverse link TestSeed to UnitTests--><g class="link" data-entity-1="ent0042" data-entity-2="ent0052" data-link-type="dependency" data-source-line="297" id="lnk145"><path d="M2528.6138,246.4079 C2534.2314,246.4079 2537.4707,246.4079 2547.957,246.4079 C2568.9297,246.4079 2598.8906,246.4079 2634.8438,246.4079 C2706.75,246.4079 2802.625,246.4079 2898.5,246.4079 C3090.25,246.4079 3282,246.4079 3282,246.4079 C3282,246.4079 3282,256.7216 3282,272.3936 C3282,272.8834 3282,273.3784 3282,273.8784" fill="none" id="TestSeed-backto-UnitTests" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2523.6138,246.4079,2532.6138,250.4079,2528.6138,246.4079,2532.6138,242.4079,2523.6138,246.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="2898.12" y="243.6017">depends_on</text></g><!--link Specs to Results--><g class="link" data-entity-1="ent0047" data-entity-2="ent0114" data-link-type="dependency" data-source-line="300" id="lnk146"><path d="M3722.7517,425.4079 C3723.131,425.4079 3723.5222,425.4079 3723.9251,425.4079 C3725.5366,425.4079 3727.3355,425.4079 3729.3154,425.4079 C3737.2346,425.4079 3748.0477,425.4079 3761.3336,425.4079 C3787.9053,425.4079 3824.368,425.4079 3867.3536,425.4079 C3953.3247,425.4079 4065.3869,425.4079 4176.5938,425.4079 C4399.0075,425.4079 4618,425.4079 4618,425.4079 C4618,425.4079 4618,491.0354 4618,558.7141 C4618,575.6338 4618,592.6817 4618,608.8644 C4618,610.8872 4618,612.8966 4618,614.8904 C4618,615.8873 4618,616.8804 4618,617.8694 C4618,618.3639 4618,652.0546 4618,652.547" fill="none" id="Specs-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4618,657.547,4622,648.547,4618,652.547,4614,648.547,4618,657.547" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="67.1836" x="4237.79" y="422.6017">Export TRX</text></g><!--link UnitTests to Results--><g class="link" data-entity-1="ent0052" data-entity-2="ent0114" data-link-type="dependency" data-source-line="301" id="lnk147"><path d="M3290.078,425.4079 C3290.1911,425.4079 3290.3051,425.4079 3290.4197,425.4079 C3290.6491,425.4079 3290.8814,425.4079 3291.1164,425.4079 C3291.5864,425.4079 3292.0674,425.4079 3292.5574,425.4079 C3293.5374,425.4079 3294.5536,425.4079 3295.5913,425.4079 C3297.6668,425.4079 3299.8284,425.4079 3301.9588,425.4079 C3310.48,425.4079 3318.5,425.4079 3318.5,425.4079 C3318.5,425.4079 3318.5,745.4079 3318.5,745.4079 C3318.5,745.4079 3643.375,745.4079 3968.25,745.4079 C3988.5547,745.4079 4008.8594,745.4079 4029.0847,745.4079 C4034.1411,745.4079 4034.1925,745.4079 4039.2377,745.4079" fill="none" id="UnitTests-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4044.2377,745.4079,4035.2377,741.4079,4039.2377,745.4079,4035.2377,749.4079,4044.2377,745.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="174.8271" x="3635" y="742.6017">Export TRX (one .trx per slice)</text></g><!--link DevDB to GMN148--><g class="link" data-entity-1="ent0004" data-entity-2="ent0149" data-link-type="association" data-source-line="305" id="lnk150"><path d="M1334.2207,1084.4079 C1334.7275,1084.4079 1335.2557,1084.4079 1335.8052,1084.4079 C1338.0029,1084.4079 1340.5398,1084.4079 1343.3975,1084.4079 C1354.8285,1084.4079 1371.3938,1084.4079 1391.9314,1084.4079 C1433.0066,1084.4079 1489.9706,1084.4079 1553.5263,1084.4079 C1680.6375,1084.4079 1834.115,1084.4079 1939.58,1084.4079" fill="none" id="DevDB-GMN148" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link TestDB to GMN151--><g class="link" data-entity-1="ent0034" data-entity-2="ent0152" data-link-type="association" data-source-line="312" id="lnk153"><path d="M3290.0844,962.4079 C3291.7677,962.4079 3293.7117,962.4079 3295.903,962.4079 C3304.6682,962.4079 3317.3908,962.4079 3333.2203,962.4079 C3364.8794,962.4079 3408.9663,962.4079 3458.6775,962.4079 C3558.1,962.4079 3680.02,962.4079 3770.01,962.4079" fill="none" id="TestDB-GMN151" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GMN154 to DevMig--><g class="link" data-entity-1="ent0155" data-entity-2="ent0017" data-link-type="association" data-source-line="318" id="lnk156"><path d="M2082.42,461.4079 C1877.72,461.4079 1411.92,461.4079 1411.92,461.4079 C1411.92,461.4079 1411.92,522.4079 1411.92,583.4079 C1411.92,591.0329 1411.92,598.6579 1411.92,606.1637 C1411.92,609.9166 1411.92,613.6398 1411.92,617.3183" fill="none" id="GMN154-DevMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GMN157 to Specs--><g class="link" data-entity-1="ent0158" data-entity-2="ent0047" data-link-type="association" data-source-line="326" id="lnk159"><path d="M3769.51,227.4079 C3740.46,227.4079 3714,227.4079 3714,227.4079 C3714,227.4079 3714,239.0041 3714,256.5797 C3714,265.3675 3714,275.6502 3714,286.7256 C3714,289.4944 3714,292.3128 3714,295.1698 C3714,295.5269 3714,295.8846 3714,296.2429" fill="none" id="GMN157-Specs" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><?plantuml-src lLdfRzl85V_ElsBg1Hev6v6MxMstmZg0BD6rMkkeZcGN2A2boB743JN3S8O-MkH_xtjpyD3XA4bHVp0apcyUtttfJt9DDvIaIH0pHtoCMHfamOOiW_3ZAkCvYxeyuHdvuKRzLH0HlG_oHDvm9eS1KEXaSP1KpfEOKVcSKi8pkUQE8sEPKDBZuKUQaHvD4_wyeKp2lN0TInhAFAEEyuhuJv9cB4Y8U1QIReGJX9BZZGUQy9HcJfZmF28dXj8j5_A4149zS9mK-0vM58urNht2PmznnXb-_i0QaRhO3FacvOAw4NrmduDDSdf2Vl0lRivlUkG_ZaC8un6GcVxhZanfza0pkBa9CtSJXnaN_5wwGC3R2F4fyOG2jC_Fpi-RII2faAUA9U2XTmtK2Fn5WGoMWG2Irp7DLa4cAVl0UkPf2Uyp1bBfEuIaeBoOaPFMvSN5YNhsMVrdN5AInQkrDC2AY6tpg4awtQu_dYty-LtdwhVYwRIp67Ucq_UZIU_gzUlNnVF158HTZFkzgrBNvl0TJ_8D5INbPI534_JNHE7K6MMHuir1HWibTiPzqWK_0HTJUeJlRfTdjD0I0hJ8oYeCZNRIcOxTeJyZY2IjCuK5OCkfAkRdiv_FslYFD6vdit51SGpdEyWM8biQEQr1pvslKUjq37nrHnD_uG_VzIUZuS0Vpgug7bT0UzUBgJzvvq-km4-Qsa-gXyFEmByg7Q9wD8UBdZLKSV2FzpEWs9tuizAUWzbuyPeqMcS_aeS0ed2PK75gJNTBWqIkINTDmuzM16-j7uArKXuRTlURRX2lia36d0cmMvQp9cTXQJSutRMRzMctlAlmyBLLQdd9fUGRmz0aPw9DUijvIZR5fPTCqBtpEvD5hpFhN7Uc_jLza0Xg3Y6rW2Y2SDOcMqhVB-AKqcYVSFZy1UdmM47nmo71kXd5V50otZex8vWWI0vyYUBn7G-Lq2fDaCPywdKxtk3NqmA0TroyGu8mXBGizqYxfRe31WtY98qn3mPFIG8YUHlzf3Ig_cv4ByFd_2VIU4-NPDxVXiBJ6hQbiEYNsyZfHgRx8mqra2XV9g2AS0sItaFQX-n2A7AeD12pbVkIMmp62nKDdVdiTc6oNsVusrNh0EBkRlH-qHz2GCqdla7LrVQvKb9cQBSNQucoaYqcK2ul_BE3nIGM76j5H68cP50u7hxa2qL3yL6h7FhImT9n-MBfkCceM1TS41g4QmB1O3su7caoo-anLG4rKPO5GXeqnJuZ2vBJOxDDMKTHlADJpTxWhjCw9h8F1FGWPl46cnF0jFT49sV9S_7O5m8eGrj4lbmWtMbAGnIxpoGrmYXcXUPR7UyoFQ6VMCQJXFn8dkOibYMs2w3z1bTKI-OdT1KBQTvud_37IbPQnLkFtWL976bebaETAGukpox9Ec0Hj7qhwo1p0TwXNjT9unlLnrdb321muCnNeOqfEWxfIsah1zbKUA6ARY2fGhSetDUkakKDg9s2Lao7eHM6sb2dkqfJcWAD3VYd0dfONTTvd426rVtcVPpeC8UNFgxZS6r0m0r8HuMtrEXW5M14gUR55GbxCZZejb5pJ93V8owXGrQ-yxlATT0_5Fgn8df6H99c_0zeaY5E2Homqdo5CkPOKJHwz_0weuyqY-b1WBA4FQtP3xH492SRa5yd1sLcchqIXUoG_68qhcSi2MaRon9bOLouo903q8I2ocaCGeX6NyYvuun7UQZyxSNC2-g9oipRzI_zxl-iZKSUlgQFrtYLZVyFpRh_b8BznC6a399fmP3p9kgfDCWQPYPLA4YQBvDOh6daVbipY39_LJTeBXngdFPtSQIXEzVdqr86pCG49iKKGoCjtCNzvda4EJjw837W8uOIH1uxbLZi-VTF9MK0xGub7euVtlv10zrnElKc_it4dzvwtT7mfZyPT6RzqN0n6_tJ7swF8U_zwsb_vY-mJLZC9tVEaPOaJGECE1KeAtaC83j3m9Vzh8T6tczHwtZDvbiRg6tISd6ag3V4rgmruBcBZi0miVvPbI5Q8UdcgLl1wfmc5agJbjfXZ5DpQyBl3Kf9ySloBNuZGoeVUVQHD9PP7AreMpamL8NJNxpbMuNispRnFkEuT7dmrFZ0z4MXbMA3Va-mlz4kbA-eR8QGlQbD0OKYg-dMHciJ-vWlx4sMvTgav__rvY_xywqU09OZeFTLkn1puvYUziXnLL7ylZPo7yKZcydFUnp22gakJt691lR5dk11szE3LdC5GH7e6dfWSVK6_9pb6XAaCHGqI4zGeeaPx20siRj0Ty7UJC5CTmBTI6cCnrYkUQvp30ZA0Am0c1sh_WAVIrrYD1NMtHzu5JLjeI7wr6FJ7PTKTLHLaBNOgn2i0l5Y3LbrRDktl-ZIeCVgzFQtxkKBFWqKlyQX5VoOvTvntWpalj6LpIHUK3ayxNi41_bZ8W7eV4SOADMecnOElRbrNan4R-06kg6XRWgtyMl8Yp0nWND6M_itw-G18xR0Otg5EKCKyotukuWZkvRUTdEZPFHQRUtz3cwbh-AsNDjGqkvgCJMdjaGAo3vtlkT918AVgEaQkhuyaSB3ZXOtGd1Pvmrjaua-LZR1gOMSG79e2XmDuOgQMF3SbTbJ1TygqFlcYYtm-IvuQyxOkd2nUw4wTsoXVzho5MMnsUHNDFicq4QUq232XITPFkjM24RKMEIuIf9v57FphFDlU1dkeKQfC8_-7ilRV4aweJLZjI1MVeO8GlGOfzY9ApFZZmre7VqRXCaV94yTTQ3IdDvgjybQohJjUGdkjx3VLeqXlg7w2qLjNZABLKFbWDlP1MKLLNCwmq3r_6Atsp4ertrRNVsroQMhzygte-dC6uycCykLoRY6OiKzBKC5OCU1xRiiGC7hFTChjIsegyDkVr0IinrJ2j4PZZh5HgS6CBfmzDwaTWHgg2vPC9YSSbk0gYYW9MygrmW9gJrFFp2UGHnYWLHzKWD7P9oFnPiFZ9avDzIQXZUSEeKCMlOzv4ifIiYE0hKi9M1NWHKnNa1PDPiKGEWJvlsAgcpkQ4COgF4Gegv2-n24D70FWr5CC5144aE1mBVPDXV3IpZRNH3wagDwOlYusnBNVskodJ5QKCLdRpZ5o6_MXWkGZ2SFq3f9Jh1kbxiX1OLCMCUWNrOmPH7OubLRJZEhLFWIjsg3ODZj97g3NHP7GUm6kFAwLv2sb8j1U7xAAUvZApgJF3KA0zS0eXOxGcz49K1Kb5sA7R58YB_zeE3dDcWmWv2oXiFHXKaTjOUG150nZOIpLTEqX3lACKmfvt7qSX5SWeOvlgLT4LrLNJMa1rcG93HnIE55mMgLqLLT6Vy5?></g></svg>