VEU.WathBody/1-docs/2-arch/hld.svg

1 line
44 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" data-diagram-type="DESCRIPTION" style="width:1613px;height:1764px;background:#FFFFFF;" width="1613px" height="1764px" viewBox="0 0 1613 1764" zoomAndPan="magnify" preserveAspectRatio="none" contentStyleType="text/css"><?plantuml 1.2026.8?><defs><filter id="b1l5mbpstvt54g0" x="0" y="0" width="1" height="1"><feFlood flood-color="#FFF4D6" result="flood"/><feComposite in="SourceGraphic" in2="flood" operator="over"/></filter><filter id="b1l5mbpstvt54g1" x="0" y="0" width="1" height="1"><feFlood flood-color="#BFBFBF" result="flood"/><feComposite in="SourceGraphic" in2="flood" operator="over"/></filter></defs><g font-family="sans-serif" lengthAdjust="spacing"><g class="title" data-source-line="7"><text x="586.961" y="22.995" fill="#000" font-size="14" textLength="432.688" font-weight="700" font-family="Segoe UI">Феникс 6X: часы + телефон атлета + личный сервер</text><text x="605.086" y="39.292" fill="#000" font-size="14" textLength="396.437" font-weight="700" font-family="Segoe UI">(v1.0; серым — v2, жёлтым — внешние системы)</text></g><!--cluster Watch--><g class="cluster" data-qualified-name="Watch" id="ent0001" data-source-line="26"><polygon points="751.409,69.594,761.409,59.594,1042.409,59.594,1042.409,204.504,1032.409,214.504,751.409,214.504,751.409,69.594" fill="none" style="stroke:#181818;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line x1="1032.409" y1="69.594" x2="1042.409" y2="59.594" style="stroke:#181818;stroke-width:1;"/><line x1="751.409" y1="69.594" x2="1032.409" y2="69.594" style="stroke:#181818;stroke-width:1;"/><line x1="1032.409" y1="69.594" x2="1032.409" y2="214.504" style="stroke:#181818;stroke-width:1;"/><text x="849.424" y="83.732" fill="#000" font-size="12" textLength="86.971" font-weight="700" font-family="Segoe UI">Часы атлета</text><text x="821.559" y="97.701" fill="#000" font-size="12" textLength="142.699" font-weight="700" font-family="Segoe UI">(Garmin, Connect IQ)</text></g><!--cluster Phone--><g class="cluster" data-qualified-name="Phone" id="ent0003" data-source-line="30"><polygon points="608.409,301.504,618.409,291.504,1188.409,291.504,1188.409,940.154,1178.409,950.154,608.409,950.154,608.409,301.504" fill="none" style="stroke:#181818;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line x1="1178.409" y1="301.504" x2="1188.409" y2="291.504" style="stroke:#181818;stroke-width:1;"/><line x1="608.409" y1="301.504" x2="1178.409" y2="301.504" style="stroke:#181818;stroke-width:1;"/><line x1="1178.409" y1="301.504" x2="1178.409" y2="950.154" style="stroke:#181818;stroke-width:1;"/><text x="837.957" y="315.642" fill="#000" font-size="12" textLength="112.904" font-weight="700" font-family="Segoe UI">Телефон атлета</text><text x="837.89" y="329.611" fill="#000" font-size="12" textLength="113.039" font-weight="700" font-family="Segoe UI">(Android, Kotlin)</text></g><!--cluster Server--><g class="cluster" data-qualified-name="Server" id="ent0010" data-source-line="39"><path d="M58.453,1032.426 C79.404,1001.318 105.105,1001.634 124.865,1033.678 C142.01,1005.306 164.044,1009.764 179.478,1035.409 C194.696,1007.981 225.972,1002.975 244.402,1031.696 C265.398,1001.756 289.822,998.015 312.535,1029.8 C335,995.701 357.064,997.144 379.518,1029.812 C397.943,995.408 422.379,997.075 446.006,1024.189 C469.114,991.988 496.351,994.878 515.961,1027.939 C533.361,1000.345 554.378,1001.868 574.881,1024.283 C595.043,987.409 626.247,992.219 646.065,1024.636 C669.135,1001.844 690.276,1000.938 707.451,1031.428 C728.003,997.389 755.932,993.127 776.971,1030.956 C791.382,1004.284 815.351,1005.924 832.01,1028.44 C851.354,992.831 881.578,990.848 900.781,1028.572 C922.202,1001.252 952.183,998.523 968.409,1034.154 C976.8,1033.316 980.365,1037.008 978.141,1045.376 C1000.844,1058.852 997.599,1083.506 976.049,1095.122 C1007.688,1115.207 1006.229,1137.135 981.318,1161.695 C1015.163,1177.138 1010.632,1198.377 988.738,1220.816 C1018.625,1243.958 1019.654,1264.185 988.144,1286.773 C1014.527,1304.311 1010.32,1323.006 986.282,1338.738 C1014.817,1359.258 1011.133,1384.948 984.502,1403.963 C1011.287,1430.798 1003.97,1453.549 971.74,1468.761 C993.538,1489.936 995.59,1516.926 961.409,1528.404 C966.428,1528.765 969.569,1531.72 966.61,1536.941 C943.417,1564.354 923.092,1569.138 900.382,1536.41 C879.794,1565.731 855.402,1565.551 836.89,1534.236 C817.809,1564.658 786.878,1564.646 767.792,1534.243 C753.287,1565.134 721.958,1569.944 701.113,1541.35 C683.873,1569.847 658.452,1569.073 643.479,1539.115 C622.894,1568.188 597.024,1570.781 576.435,1539.12 C561.978,1570.909 533.353,1573.536 514.935,1543.031 C492.694,1576.459 464.038,1572.997 443.869,1540.788 C428.448,1566.912 398.484,1574.549 382.377,1541.501 C361.546,1570.914 328.487,1570.116 309.436,1539.344 C286.616,1566.142 262.471,1570.862 244.991,1533.943 C226.596,1560.394 199.054,1566.139 181.356,1533.196 C166.545,1567.948 142.933,1562.97 121.266,1540.381 C91.245,1572.255 54.622,1560.264 41.409,1521.404 C44.482,1521.408 46.216,1523.444 44.536,1526.415 C12.027,1510.49 19.447,1484.166 43.419,1467.177 C20.247,1449.915 21.402,1423.047 48.338,1410.103 C16.196,1394.557 11.301,1361.615 45.785,1343.515 C16.765,1326.644 6,1303.296 37.302,1278.548 C9.739,1262.352 13.763,1234.465 39.699,1220.477 C13.642,1196.334 8.817,1176.549 44.738,1157.354 C18.65,1137.836 23.957,1116.722 48.445,1100.501 C12.657,1079.822 10.609,1047.868 48.409,1027.154 C54.58,1023.588 57.609,1025.844 58.453,1032.426" style="stroke:#181818;stroke-width:1;" fill="none"/><text x="451.656" y="1043.292" fill="#000" font-size="12" textLength="106.506" font-weight="700" font-family="Segoe UI">Личный сервер</text><text x="457.694" y="1057.261" fill="#000" font-size="12" textLength="94.43" font-weight="700" font-family="Segoe UI">(C# / .NET 10)</text></g><!--cluster WebApp--><g class="cluster" data-qualified-name="Server.WebApp" id="ent0011" data-source-line="41"><path d="M59.909,1073.154 L153.903,1073.154 A3.75,3.75 0 0 1 156.403,1075.654 L163.403,1107.091 L479.909,1107.091 A2.5,2.5 0 0 1 482.409,1109.591 L482.409,1204.564 A2.5,2.5 0 0 1 479.909,1207.064 L59.909,1207.064 A2.5,2.5 0 0 1 57.409,1204.564 L57.409,1075.654 A2.5,2.5 0 0 1 59.909,1073.154" style="stroke:#000;stroke-width:1.5;" fill="none"/><line x1="57.409" y1="1107.091" x2="163.403" y2="1107.091" style="stroke:#000;stroke-width:1.5;"/><text x="79.69" y="1086.292" fill="#000" font-size="12" textLength="56.432" font-weight="700" font-family="Segoe UI">WebApp</text><text x="61.409" y="1100.261" fill="#000" font-size="12" textLength="92.994" font-weight="700" font-family="Segoe UI">ASP.NET Core</text></g><!--cluster FitPipeline--><g class="cluster" data-qualified-name="Server.FitPipeline" id="ent0014" data-source-line="46"><path d="M567.909,1268.064 L681.016,1268.064 A3.75,3.75 0 0 1 683.516,1270.564 L690.516,1302.001 L949.909,1302.001 A2.5,2.5 0 0 1 952.409,1304.501 L952.409,1399.464 A2.5,2.5 0 0 1 949.909,1401.964 L567.909,1401.964 A2.5,2.5 0 0 1 565.409,1399.464 L565.409,1270.564 A2.5,2.5 0 0 1 567.909,1268.064" style="stroke:#000;stroke-width:1.5;" fill="none"/><line x1="565.409" y1="1302.001" x2="690.516" y2="1302.001" style="stroke:#000;stroke-width:1.5;"/><text x="589.167" y="1281.202" fill="#000" font-size="12" textLength="72.592" font-weight="700" font-family="Segoe UI">FitPipeline</text><text x="569.409" y="1295.171" fill="#000" font-size="12" textLength="112.107" font-weight="700" font-family="Segoe UI">забор и парсинг</text></g><!--entity DataField--><g class="entity" data-qualified-name="Watch.DataField" id="ent0002" data-source-line="27"><rect x="775.839" y="118.594" width="223.146" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="978.986" y="123.594" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="976.986" y="125.594" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="976.986" y="129.594" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="837.638" y="149.732" fill="#000" font-size="12" textLength="89.549" font-family="Segoe UI">FenixDataField</text><text x="806.554" y="163.701" fill="#000" font-size="12" textLength="151.717" font-family="Segoe UI">поле данных «Феникс»:</text><text x="790.839" y="177.67" fill="#000" font-size="12" textLength="183.146" font-family="Segoe UI">пульс, зоны, подходы, вибро</text></g><!--entity VoiceInput--><g class="entity" data-qualified-name="Phone.VoiceInput" id="ent0004" data-source-line="31"><rect x="885.589" y="350.504" width="259.639" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="1125.228" y="355.504" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1123.228" y="357.504" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1123.228" y="361.504" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="978.44" y="381.642" fill="#000" font-size="12" textLength="63.938" font-family="Segoe UI">VoiceInput</text><text x="900.589" y="395.611" fill="#000" font-size="12" textLength="219.639" font-family="Segoe UI">офлайн-STT + грамматика команд</text></g><!--entity TrainingUi--><g class="entity" data-qualified-name="Phone.TrainingUi" id="ent0005" data-source-line="32"><rect x="632.679" y="497.434" width="277.469" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="890.148" y="502.434" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="888.148" y="504.434" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="888.148" y="508.434" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="735.798" y="528.572" fill="#000" font-size="12" textLength="61.23" font-family="Segoe UI">TrainingUi</text><text x="647.679" y="542.541" fill="#000" font-size="12" textLength="237.469" font-family="Segoe UI">экран тренировки, таймеры, история</text></g><!--entity WorkoutCore--><g class="entity" data-qualified-name="Phone.WorkoutCore" id="ent0006" data-source-line="33"><rect x="660.349" y="616.374" width="218.119" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="858.468" y="621.374" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="856.468" y="623.374" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="856.468" y="627.374" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="725.019" y="647.512" fill="#000" font-size="12" textLength="78.779" font-family="Segoe UI">WorkoutCore</text><text x="675.349" y="661.481" fill="#000" font-size="12" textLength="178.119" font-family="Segoe UI">логика тренировки, допуск,</text><text x="701.915" y="675.45" fill="#000" font-size="12" textLength="124.986" font-family="Segoe UI">дневник, перерывы</text></g><!--entity LocalDb--><g class="entity" data-qualified-name="Phone.LocalDb" id="ent0007" data-source-line="34"><rect x="694.449" y="749.284" width="117.924" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="792.373" y="754.284" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="790.373" y="756.284" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="790.373" y="760.284" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="724.326" y="780.422" fill="#000" font-size="12" textLength="48.17" font-family="Segoe UI">LocalDb</text><text x="709.449" y="794.391" fill="#000" font-size="12" textLength="77.924" font-family="Segoe UI">Room/SQLite</text></g><!--entity SyncQueue--><g class="entity" data-qualified-name="Phone.SyncQueue" id="ent0008" data-source-line="35"><rect x="635.089" y="868.214" width="222.643" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="837.732" y="873.214" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="835.732" y="875.214" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="835.732" y="879.214" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="707.238" y="899.352" fill="#000" font-size="12" textLength="68.344" font-family="Segoe UI">SyncQueue</text><text x="650.089" y="913.321" fill="#000" font-size="12" textLength="182.643" font-family="Segoe UI">очередь + идемпотентность</text></g><!--entity WatchChannel--><g class="entity" data-qualified-name="Phone.WatchChannel" id="ent0009" data-source-line="36"><rect x="632.149" y="350.504" width="218.518" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="830.667" y="355.504" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="828.667" y="357.504" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="828.667" y="361.504" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="692.712" y="381.642" fill="#000" font-size="12" textLength="87.393" font-family="Segoe UI">WatchChannel</text><text x="647.149" y="395.611" fill="#000" font-size="12" textLength="178.518" font-family="Segoe UI">companion-канал Connect IQ</text></g><!--entity MetricsEngine--><g class="entity" data-qualified-name="Server.MetricsEngine" id="ent0017" data-source-line="51"><rect x="352.249" y="1321.044" width="194.318" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="526.567" y="1326.044" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="524.567" y="1328.044" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="524.567" y="1332.044" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="402.065" y="1352.182" fill="#000" font-size="12" textLength="84.686" font-family="Segoe UI">MetricsEngine</text><text x="367.249" y="1366.151" fill="#000" font-size="12" textLength="154.318" font-family="Segoe UI">adherence, тоннаж, 1ПМ</text></g><!--entity ProgressionRules--><g class="entity" data-qualified-name="Server.ProgressionRules" id="ent0018" data-source-line="52"><rect x="501.439" y="1126.144" width="215.945" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="697.384" y="1131.144" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="695.384" y="1133.144" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="695.384" y="1137.144" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="552.84" y="1157.282" fill="#000" font-size="12" textLength="103.143" font-family="Segoe UI">ProgressionRules</text><text x="516.439" y="1171.251" fill="#000" font-size="12" textLength="175.945" font-family="Segoe UI">правила прогрессии → draft</text></g><!--entity ProgramStore--><g class="entity" data-qualified-name="Server.ProgramStore" id="ent0019" data-source-line="53"><rect x="123.899" y="1321.044" width="193.023" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="296.922" y="1326.044" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="294.922" y="1328.044" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="294.922" y="1332.044" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="173.868" y="1352.182" fill="#000" font-size="12" textLength="83.086" font-family="Segoe UI">ProgramStore</text><text x="138.899" y="1366.151" fill="#000" font-size="12" textLength="153.023" font-family="Segoe UI">версии программ (JSON)</text></g><!--entity Db--><g class="entity" data-qualified-name="Server.Db" id="ent0020" data-source-line="55"><path d="M170.799,1473.464 C170.799,1463.464 220.408,1463.464 220.408,1463.464 C220.408,1463.464 270.018,1463.464 270.018,1473.464 L270.018,1510.401 C270.018,1520.401 220.408,1520.401 220.408,1520.401 C220.408,1520.401 170.799,1520.401 170.799,1510.401 L170.799,1473.464" style="stroke:#7A8899;stroke-width:0.5;" fill="#F5F7FA"/><path d="M170.799,1473.464 C170.799,1483.464 220.408,1483.464 220.408,1483.464 C220.408,1483.464 270.018,1483.464 270.018,1473.464" style="stroke:#7A8899;stroke-width:0.5;" fill="none"/><text x="185.8" y="1498.602" fill="#000" font-size="12" textLength="69.217" font-family="Segoe UI">PostgreSQL</text><text x="180.799" y="1512.571" fill="#000" font-size="12" textLength="79.219" font-family="Segoe UI">слои src | ref</text></g><!--entity RestApi--><g class="entity" data-qualified-name="Server.WebApp.RestApi" id="ent0012" data-source-line="42"><rect x="270.659" y="1119.154" width="195.496" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="446.155" y="1124.154" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="444.155" y="1126.154" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="444.155" y="1130.154" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="340.488" y="1150.292" fill="#000" font-size="12" textLength="45.838" font-family="Segoe UI">RestApi</text><text x="285.659" y="1164.261" fill="#000" font-size="12" textLength="155.496" font-family="Segoe UI">sync, workouts, programs</text><text x="305.751" y="1178.23" fill="#000" font-size="12" textLength="115.313" font-family="Segoe UI">(X-Api-Key атлета)</text></g><!--entity AdminWeb--><g class="entity" data-qualified-name="Server.WebApp.AdminWeb" id="ent0013" data-source-line="43"><rect x="72.919" y="1119.154" width="162.971" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="215.89" y="1124.154" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="213.89" y="1126.154" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="213.89" y="1130.154" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="116.744" y="1150.292" fill="#000" font-size="12" textLength="65.32" font-family="Segoe UI">AdminWeb</text><text x="87.919" y="1164.261" fill="#000" font-size="12" textLength="122.971" font-family="Segoe UI">консоль владельца</text><text x="101.771" y="1178.23" fill="#000" font-size="12" textLength="95.268" font-family="Segoe UI">(логин/пароль)</text></g><!--entity FitFetcher--><g class="entity" data-qualified-name="Server.FitPipeline.FitFetcher" id="ent0015" data-source-line="47"><rect x="750.209" y="1314.064" width="186.396" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="916.606" y="1319.064" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="914.606" y="1321.064" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="914.606" y="1325.064" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="808.182" y="1345.202" fill="#000" font-size="12" textLength="60.451" font-family="Segoe UI">FitFetcher</text><text x="765.209" y="1359.171" fill="#000" font-size="12" textLength="146.396" font-family="Segoe UI">клиент Garmin Connect</text><text x="779.061" y="1373.14" fill="#000" font-size="12" textLength="118.693" font-family="Segoe UI">(+ папка импорта)</text></g><!--entity FitParser--><g class="entity" data-qualified-name="Server.FitPipeline.FitParser" id="ent0016" data-source-line="48"><rect x="581.239" y="1321.044" width="134.342" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="695.581" y="1326.044" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="693.581" y="1328.044" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="693.581" y="1332.044" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="616.893" y="1352.182" fill="#000" font-size="12" textLength="53.033" font-family="Segoe UI">FitParser</text><text x="596.239" y="1366.151" fill="#000" font-size="12" textLength="94.342" font-family="Segoe UI">Garmin FIT SDK</text></g><!--entity LlmPlanner--><g class="entity" data-qualified-name="LlmPlanner" id="ent0021" data-source-line="58"><rect x="992.489" y="1126.144" width="211.844" height="57.938" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="1184.333" y="1131.144" width="15" height="10" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1182.333" y="1133.144" width="4" height="2" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1182.333" y="1137.144" width="4" height="2" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;"/><text x="1059.831" y="1157.282" fill="#000" font-size="12" textLength="67.16" font-family="Segoe UI">LlmPlanner</text><text x="1007.489" y="1171.251" fill="#000" font-size="12" textLength="171.844" font-family="Segoe UI">еженедельный контур LLM</text></g><!--entity GarminConnect--><g class="entity" data-qualified-name="GarminConnect" id="ent0022" data-source-line="60"><path d="M1002.505,1471.095 C1005.109,1464.758 1009.762,1465.245 1013.6,1469.843 C1016.262,1464.175 1020.012,1463.572 1023.961,1468.596 C1026.034,1463.573 1030.883,1462.339 1034.508,1466.884 C1036.698,1460.954 1041.721,1459.874 1045.68,1465.116 C1049.339,1458.193 1053.257,1459.336 1057.999,1463.96 C1062.3,1458.341 1065.707,1458.367 1069.249,1464.676 C1073.285,1461.566 1077.566,1462.894 1079.14,1467.738 C1082.945,1463.167 1087.394,1462.526 1090.525,1468.467 C1094.95,1462.493 1099.27,1463.196 1102.633,1469.513 C1106.941,1464.619 1111.514,1467.051 1113.407,1472.123 C1124.436,1476.035 1126.463,1484.285 1117.281,1492.114 C1127.948,1500.876 1125.99,1508.266 1114.075,1513.668 C1111.123,1519.242 1107.255,1520.255 1102.348,1516.002 C1099.965,1521.908 1094.219,1521.824 1090.698,1517.269 C1087.866,1521.684 1084.503,1522.998 1080.658,1518.398 C1076.855,1523.666 1073.263,1524.631 1068.772,1519.158 C1066.377,1525.685 1062.851,1525.705 1057.859,1521.902 C1052.248,1527.316 1048.78,1525.113 1046.043,1518.965 C1041.613,1523.754 1037.88,1522.432 1034.992,1517.255 C1032.357,1521.8 1027.807,1521.83 1024.768,1517.733 C1019.936,1521.389 1015.575,1520.607 1013.715,1514.402 C1009.996,1520.389 1005.245,1519.929 1001.32,1514.628 C995.257,1512.374 994.231,1508.392 998.335,1503.428 C991.635,1503.031 989.311,1499.299 992.613,1493.268 C988.364,1487.68 990.444,1482.986 997.219,1481.84 C993.627,1476.281 995.903,1471.639 1002.505,1471.095" style="stroke:#181818;stroke-width:0.5;" fill="#FFF4D6"/><text x="1007.589" y="1489.102" fill="#000" font-size="12" textLength="97.646" font-family="Segoe UI">Garmin Connect</text><text x="1017.699" y="1503.071" fill="#000" font-size="12" textLength="77.426" font-family="Segoe UI">(облако, .fit)</text></g><g class="entity" data-qualified-name="GMN40" id="ent0041" data-source-line="91"><path d="M1220.119,353.514 L1220.119,405.42 L1554.689,405.42 L1554.689,363.514 L1544.689,353.514 L1220.119,353.514" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><path d="M1544.689,353.514 L1544.689,363.514 L1554.689,363.514 L1544.689,353.514" style="stroke:#181818;stroke-width:1;" fill="#FEFFDD"/><text x="1230.47" y="369.652" fill="#000" font-size="12" textLength="304.869" font-family="Segoe UI">Инвариант: часы автономны — запись .fit ведёт</text><text x="1226.119" y="383.621" fill="#000" font-size="12" textLength="313.57" font-family="Segoe UI">платформа Garmin, поле — только отображение.</text><text x="1238.849" y="397.59" fill="#000" font-size="12" textLength="288.111" font-family="Segoe UI">Один код поля — сборки под модели Garmin.</text></g><g class="entity" data-qualified-name="GMN43" id="ent0044" data-source-line="97"><path d="M1220.199,507.434 L1220.199,545.371 L1598.609,545.371 L1598.609,517.434 L1588.609,507.434 L1220.199,507.434" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><path d="M1588.609,507.434 L1588.609,517.434 L1598.609,517.434 L1588.609,507.434" style="stroke:#181818;stroke-width:1;" fill="#FEFFDD"/><text x="1229.088" y="523.572" fill="#000" font-size="12" textLength="351.633" font-family="Segoe UI">Инвариант офлайн-first: все данные сначала в LocalDb;</text><text x="1226.199" y="537.541" fill="#000" font-size="12" textLength="357.41" font-family="Segoe UI">сеть — только SyncQueue. Каждой записи — client_guid.</text></g><g class="entity" data-qualified-name="GMN46" id="ent0047" data-source-line="102"><path d="M55.739,1591.404 L55.739,1629.341 A0,0 0 0 0 55.739,1629.341 L385.083,1629.341 A0,0 0 0 0 385.083,1629.341 L385.083,1601.404 L375.083,1591.404 L224.409,1591.404 L220.409,1520.824 L216.409,1591.404 L55.739,1591.404 A0,0 0 0 0 55.739,1591.404" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><path d="M375.083,1591.404 L375.083,1601.404 L385.083,1601.404 L375.083,1591.404" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><text x="61.739" y="1607.542" fill="#000" font-size="12" textLength="308.344" font-family="Segoe UI">Инвариант изоляции атлетов: ключ → athlete_id,</text><text x="133.534" y="1621.511" fill="#000" font-size="12" textLength="164.754" font-family="Segoe UI">все выборки — по атлету.</text></g><!--link DataField to WatchChannel--><g class="link" data-entity-1="ent0002" data-entity-2="ent0009" id="lnk23" data-source-line="64" data-link-type="dependency"><path d="M864.279,190.874 C835.409,234.944 789.359,305.261 762.769,345.851" style="stroke:#444;stroke-width:1;" fill="none" id="DataField-to-WatchChannel"/><polygon points="760.029,350.034,768.307,344.697,762.769,345.851,761.615,340.313,760.029,350.034" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="841.676" y="250.642" fill="#000" font-size="12" textLength="78.773" font-family="Segoe UI">пульс, зоны,</text><text x="832.779" y="264.611" fill="#000" font-size="12" textLength="96.568" font-family="Segoe UI">таймер отдыха</text></g><!--link WatchChannel to TrainingUi--><g class="link" data-entity-1="ent0009" data-entity-2="ent0005" id="lnk24" data-source-line="65" data-link-type="dependency"><path d="M747.269,408.754 C752.549,434.294 759.276,466.778 764.556,492.288" style="stroke:#444;stroke-width:1;" fill="none" id="WatchChannel-to-TrainingUi"/><polygon points="765.569,497.184,767.662,487.56,764.556,492.288,759.828,489.181,765.569,497.184" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="777.671" y="450.572" fill="#000" font-size="12" textLength="73.682" font-family="Segoe UI">live-данные</text><text x="760.099" y="464.541" fill="#000" font-size="12" textLength="108.826" font-family="Segoe UI">(если связь есть)</text></g><!--link VoiceInput to TrainingUi--><g class="link" data-entity-1="ent0004" data-entity-2="ent0005" id="lnk25" data-source-line="66" data-link-type="dependency"><path d="M972.019,408.784 C945.049,426.134 909.509,448.564 877.409,467.434 C860.499,477.374 846.2,485.392 829.27,494.612" style="stroke:#444;stroke-width:1;" fill="none" id="VoiceInput-to-TrainingUi"/><polygon points="824.879,497.004,834.696,496.212,829.27,494.612,830.87,489.186,824.879,497.004" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="924.429" y="457.572" fill="#000" font-size="12" textLength="56.613" font-family="Segoe UI">команды</text></g><!--link TrainingUi to WorkoutCore--><g class="link" data-entity-1="ent0005" data-entity-2="ent0006" id="lnk26" data-source-line="67" data-link-type="dependency"><path d="M770.949,555.834 C770.659,573.704 770.37,591.884 770.06,610.934" style="stroke:#444;stroke-width:1;" fill="none" id="TrainingUi-to-WorkoutCore"/><polygon points="769.979,615.934,774.125,607,770.06,610.934,766.126,606.87,769.979,615.934" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link WorkoutCore to LocalDb--><g class="link" data-entity-1="ent0006" data-entity-2="ent0007" id="lnk27" data-source-line="68" data-link-type="dependency"><path d="M764.869,688.504 C762.389,707.684 760.01,726.145 757.69,744.105" style="stroke:#444;stroke-width:1;" fill="none" id="WorkoutCore-to-LocalDb"/><polygon points="757.049,749.064,762.169,740.65,757.69,744.105,754.235,739.625,757.049,749.064" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link LocalDb to SyncQueue--><g class="link" data-entity-1="ent0007" data-entity-2="ent0008" id="lnk28" data-source-line="69" data-link-type="dependency"><path d="M751.719,807.554 C750.619,825.804 749.509,844.463 748.409,862.743" style="stroke:#444;stroke-width:1;" fill="none" id="LocalDb-to-SyncQueue"/><polygon points="748.109,867.734,752.642,858.99,748.409,862.743,744.657,858.51,748.109,867.734" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link SyncQueue to RestApi--><g class="link" data-entity-1="ent0008" data-entity-2="ent0012" id="lnk29" data-source-line="70" data-link-type="dependency"><path d="M638.749,926.634 C584.399,944.674 519.729,972.104 470.409,1011.154 C433.239,1040.584 405.999,1082.633 388.449,1114.543" style="stroke:#444;stroke-width:1;" fill="none" id="SyncQueue-to-RestApi"/><polygon points="386.039,1118.924,393.881,1112.965,388.449,1114.543,386.871,1109.11,386.039,1118.924" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="539.792" y="986.292" fill="#000" font-size="12" textLength="38.537" font-family="Segoe UI">HTTPS</text><text x="525.539" y="1000.261" fill="#000" font-size="12" textLength="67.043" font-family="Segoe UI">POST /sync</text></g><!--link FitFetcher to GarminConnect--><g class="link" data-entity-1="ent0015" data-entity-2="ent0022" id="lnk30" data-source-line="71" data-link-type="dependency"><path d="M897.159,1386.324 C933.149,1409.964 975.7,1437.919 1009.22,1459.939" style="stroke:#444;stroke-width:1;" fill="none" id="FitFetcher-to-GarminConnect"/><polygon points="1013.399,1462.684,1008.073,1454.399,1009.22,1459.939,1003.681,1461.085,1013.399,1462.684" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="963.659" y="1430.102" fill="#000" font-size="12" textLength="115.805" font-family="Segoe UI">.fit по расписанию</text></g><!--link FitParser to Db--><g class="link" data-entity-1="ent0016" data-entity-2="ent0020" id="lnk31" data-source-line="72" data-link-type="dependency"><path d="M622.469,1379.434 C610.059,1391.064 594.249,1403.334 577.409,1409.964 C548.829,1421.234 469.729,1413.014 439.409,1417.964 C364.389,1430.234 345.219,1435.334 274.409,1462.964 C273.029,1463.504 276.257,1462.122 274.857,1462.712" style="stroke:#444;stroke-width:1;" fill="none" id="FitParser-to-Db"/><polygon points="270.249,1464.654,280.096,1464.845,274.857,1462.712,276.989,1457.473,270.249,1464.654" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="440.409" y="1430.102" fill="#000" font-size="12" textLength="83.824" font-family="Segoe UI">workout_facts</text></g><!--link MetricsEngine to Db--><g class="link" data-entity-1="ent0017" data-entity-2="ent0020" id="lnk32" data-source-line="73" data-link-type="dependency"><path d="M403.069,1379.334 C363.079,1403.764 309.906,1436.257 270.166,1460.537" style="stroke:#444;stroke-width:1;" fill="none" id="MetricsEngine-to-Db"/><polygon points="265.899,1463.144,275.664,1461.865,270.166,1460.537,271.494,1455.038,265.899,1463.144" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link ProgressionRules to ProgramStore--><g class="link" data-entity-1="ent0018" data-entity-2="ent0019" id="lnk33" data-source-line="74" data-link-type="dependency"><path d="M555.509,1184.434 C533.329,1195.214 507.089,1206.854 482.409,1215.064 C466.029,1220.504 460.739,1217.484 444.409,1223.064 C416.379,1232.624 412.669,1243.184 384.409,1252.064 C362.939,1258.804 355.039,1251.084 334.409,1260.064 C301.499,1274.394 273.428,1297.055 251.848,1317.275" style="stroke:#444;stroke-width:1;" fill="none" id="ProgressionRules-to-ProgramStore"/><polygon points="248.199,1320.694,257.502,1317.459,251.848,1317.275,252.032,1311.621,248.199,1320.694" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="445.409" y="1242.202" fill="#000" font-size="12" textLength="76.852" font-family="Segoe UI">draft-версия</text></g><!--link ProgramStore to Db--><g class="link" data-entity-1="ent0019" data-entity-2="ent0020" id="lnk34" data-source-line="75" data-link-type="dependency"><path d="M220.409,1379.334 C220.409,1403.764 220.409,1433.864 220.409,1458.144" style="stroke:#444;stroke-width:1;" fill="none" id="ProgramStore-to-Db"/><polygon points="220.409,1463.144,224.409,1454.144,220.409,1458.144,216.409,1454.144,220.409,1463.144" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link RestApi to Db--><g class="link" data-entity-1="ent0012" data-entity-2="ent0020" id="lnk35" data-source-line="76" data-link-type="dependency"><path d="M304.269,1191.514 C287.949,1199.824 270.249,1208.234 253.409,1215.064 C190.099,1240.744 147.039,1205.134 106.409,1260.064 C66.789,1313.624 75.839,1350.764 106.409,1409.964 C119.999,1436.284 142.147,1453.478 166.197,1466.818" style="stroke:#444;stroke-width:1;" fill="none" id="RestApi-to-Db"/><polygon points="170.569,1469.244,164.639,1461.38,166.197,1466.818,160.758,1468.376,170.569,1469.244" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link AdminWeb to Db--><g class="link" data-entity-1="ent0013" data-entity-2="ent0020" id="lnk36" data-source-line="77" data-link-type="dependency"><path d="M101.909,1191.534 C92.379,1200.604 83.769,1211.204 78.409,1223.064 C39.999,1308.084 26.379,1355.534 78.409,1432.964 C98.829,1463.364 133.39,1476.776 165.54,1483.666" style="stroke:#444;stroke-width:1;" fill="none" id="AdminWeb-to-Db"/><polygon points="170.429,1484.714,162.467,1478.917,165.54,1483.666,160.791,1486.739,170.429,1484.714" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link RestApi to ProgramStore--><g class="link" data-entity-1="ent0012" data-entity-2="ent0019" id="lnk37" data-source-line="78" data-link-type="dependency"><path d="M341.259,1191.494 C312.719,1228.694 271.433,1282.507 245.133,1316.787" style="stroke:#444;stroke-width:1;" fill="none" id="RestApi-to-ProgramStore"/><polygon points="242.089,1320.754,250.741,1316.048,245.133,1316.787,244.394,1311.178,242.089,1320.754" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="317.309" y="1235.202" fill="#000" font-size="12" textLength="58.881" font-family="Segoe UI">активная</text><text x="324.906" y="1249.171" fill="#000" font-size="12" textLength="43.688" font-family="Segoe UI">версия</text></g><!--link LlmPlanner to MetricsEngine--><g class="link" data-entity-1="ent0021" data-entity-2="ent0017" id="lnk38" data-source-line="79" data-link-type="dependency"><path d="M1059.009,1184.454 C1024.379,1207.564 971.659,1238.514 920.409,1252.064 C882.269,1262.144 602.629,1246.964 565.409,1260.064 C530.459,1272.364 501.226,1296.081 479.486,1317.191" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="LlmPlanner-to-MetricsEngine"/><polygon points="475.899,1320.674,485.142,1317.274,479.486,1317.191,479.569,1311.534,475.899,1320.674" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="993.299" y="1235.202" fill="#000" font-size="12" textLength="94.102" font-family="Segoe UI">сводка недели</text><text x="1028.3" y="1249.171" fill="#000" font-size="12" textLength="24.1" font-family="Segoe UI">(v2)</text></g><!--link LlmPlanner to ProgramStore--><g class="link" data-entity-1="ent0021" data-entity-2="ent0019" id="lnk39" data-source-line="80" data-link-type="dependency"><path d="M1050.839,1184.564 C1028.949,1196.194 1002.159,1208.454 976.409,1215.064 C943.429,1223.524 857.359,1220.494 823.409,1223.064 C692.919,1232.924 660.949,1242.944 530.409,1252.064 C508.669,1253.584 354.869,1252.554 334.409,1260.064 C299.999,1272.684 271.323,1296.337 249.973,1317.347" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="LlmPlanner-to-ProgramStore"/><polygon points="246.409,1320.854,255.63,1317.392,249.973,1317.347,250.018,1311.69,246.409,1320.854" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="824.409" y="1235.202" fill="#000" font-size="12" textLength="87.375" font-family="Segoe UI">предложение</text><text x="856.047" y="1249.171" fill="#000" font-size="12" textLength="24.1" font-family="Segoe UI">(v2)</text></g><!--link Watch to GMN40--><g class="link" data-entity-1="ent0001" data-entity-2="ent0041" id="lnk42" data-source-line="91" data-link-type="association"><path d="M1042.517,160.668 C1042.694,160.78 1042.874,160.894 1043.057,161.009 C1043.787,161.47 1044.559,161.958 1045.374,162.472 C1051.889,166.587 1061.065,172.382 1072.241,179.441 C1094.595,193.558 1124.953,212.729 1158.043,233.625 C1224.222,275.416 1301.324,324.104 1347.159,353.044" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="Watch-GMN40"/></g><!--link Phone to GMN43--><g class="link" data-entity-1="ent0003" data-entity-2="ent0044" id="lnk45" data-source-line="97" data-link-type="association"><path d="M1188.438,392.728 C1188.57,392.909 1188.703,393.091 1188.837,393.273 C1189.374,394.002 1189.93,394.744 1190.505,395.491 C1191.654,396.987 1192.875,398.507 1194.154,400.009 C1196.712,403.012 1199.502,405.939 1202.409,408.434 C1252.999,451.854 1322.139,487.044 1366.289,507.104" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="Phone-GMN43"/></g><g class="legend" data-source-line="82"><rect x="617.685" y="1650.341" width="371.238" height="95.484" fill="none" style="stroke:#000;stroke-width:1;" rx="7.5" ry="7.5"/><text x="627.559" y="1670.336" fill="#000" font-size="14" textLength="45.11" font-weight="700" font-family="Segoe UI">Связь</text><text x="695.461" y="1670.336" fill="#000" font-size="14" textLength="77.15" font-weight="700" font-family="Segoe UI">Значение</text><text x="622.685" y="1686.633" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1686.633" fill="#000" font-size="14" textLength="50.572" font-family="monospace">A -> B</text><text x="677.708" y="1686.633" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1686.633" fill="#000" font-size="14" textLength="205.406" font-family="Segoe UI">A зависит от / использует B</text><text x="622.685" y="1702.93" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1702.93" fill="#000" font-size="14" textLength="59.001" font-family="monospace">A ..> B</text><text x="686.137" y="1702.93" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1702.93" fill="#000" font-size="14" textLength="284.437" font-family="Segoe UI">связь версии v2 (в v1 не реализована)</text><text x="622.685" y="1719.227" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1719.227" fill="#000" font-size="14" textLength="58.481" font-family="Segoe UI" filter="url(#b1l5mbpstvt54g0)">жёлтый</text><text x="685.617" y="1719.227" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1719.227" fill="#000" font-size="14" textLength="129.678" font-family="Segoe UI">внешняя система</text><text x="622.685" y="1735.524" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1735.524" fill="#000" font-size="14" textLength="45.35" font-family="Segoe UI" filter="url(#b1l5mbpstvt54g1)">серый</text><text x="672.485" y="1735.524" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1735.524" fill="#000" font-size="14" textLength="131.858" font-family="Segoe UI">задумано, не в v1</text><line x1="622.685" y1="1657.341" x2="983.924" y2="1657.341" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1673.638" x2="983.924" y2="1673.638" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1689.935" x2="983.924" y2="1689.935" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1706.232" x2="983.924" y2="1706.232" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1722.529" x2="983.924" y2="1722.529" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1738.826" x2="983.924" y2="1738.826" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1657.341" x2="622.685" y2="1738.826" style="stroke:#000;stroke-width:1;"/><line x1="690.587" y1="1657.341" x2="690.587" y2="1738.826" style="stroke:#000;stroke-width:1;"/><line x1="983.924" y1="1657.341" x2="983.924" y2="1738.826" style="stroke:#000;stroke-width:1;"/></g><?plantuml-src hLXVRnDN5d-VJt6KFa24dHH4Inje91FgBOM2mUxIXqXeuhbnHendh9bnQBiW9Q65bS8swgfIL-t-KQlLxiE-61E38OaZzHFCV8L-alsTSyUUEtRQXwg9OiPpx_b_VhzxBgVelT_nnpf5oR-JGNAK39FNwJQz_GdzlFKDRRYj3VBKflB8KP7RykbqieyjlUHvkeNFG_psI1vV9lraa6wbE-akddgiATsRNs35_qX6wKxIIn_pgoMgK7cPBej-IFMmUvXkuszdKHwEar5oa3vDNgQFe73d8lPVMfv8OCC8Bi1Iya9aiEjO7EX3QeybnEP_n1rOfTDEsGbRvVFpIvIyIB_6BdRn5RrHhLRFNtbR-z67luFqp_oP32wo5Ov5jbskyg_UXcNifSspREDtpRyLkx6dfekmHEaJ96uxtQKpX6W6oG4S-m8fE2Aytv6l7EGPmkCGcu_4QUs_hiYgVnh-lca4TIZ1R9uhcGavd4x44B5ANRR5y66wEszPqJtNxzYXtQPemtQ2-wxVedNRYvInugXrk-l53VLfNF7GCstbnzJ4XmgDNMjsyruh3Bg-in9uGIZbmC-idchWnpVijgAwQWMAFhvwyfQw-xcYi-UCnKeO1lSpvUVbnrXi1krEuBDdVxA8BiyuyrRrGhN2Aq7eg31xUw7opZlllcizD3smOtlDZjHlKcF5GKl56og4jEK7ZgAvvBzPlStoeeH_iCEswvTe9V1zrOpfwgtvER8ZkcF7pGqndaSqLrM---aLU5PrbUUi-XfJtBlxWamqIVeb_VG_izj-EbZYZO0Jm9TkbnYR8zw99nRVJx-KJ_uEn2RFq5yZSM5YY2FAelZn5riLiLHy9mnSfqJNWjXpVHr8RGFEJmVony1jggj-fnl3jn6q7S3_LybHkTveSCyRB0JTY0DGmCU8No2mVT6SAoagRuIswwE1FtPN_VGlo07hEWBCy21fuGWHw-jaM6BmiUL33I7aGEDYX3qWDR6JwolQkHE4zu9kl1A42b4SGEVppDMJJQ588ou4mFUw18bzOQM-BfHKWx6jeTnFTtKRv3QAngy7JTkxihRgtmw2zcBzrdKtLYAHBHHtrp_pcxUwggiatK-q8HJzAITxoBoB31mBdSDjV1xX6Nb8duhEYVXK0hX7LpPiTAwtwlE2xRk1N-OSG4ClEJ3QEk_gJ8Axgka5NGTjzVqlSzpA6xH82pVURz3PDtL7rLMugQ55r04oxHOwyuvQgtGwgtwbNfFDd35jKXQa0GlEtrPHNEcWHI84LwBxEj5HYJfXq083HB3zIHaxojVKPuLErrvayjDgAmxW39j8z6l1sRO-zXXStEISQWRYOq7Cf6kE5f7-ddGBLhM5iIgOU5Y8jUh6DRUZ036k9n-rpxXXKKdIMfZUKO3deiROFPi5B5OLQg92SVY0JmTk0DAyDAuVN3qZkl4dM1nc_RAL9oHNTOAHcXr6R2DJMxtQeFgLQnF_P7KSfo7vaOf3jnczxxSaLjk1TkKtbU1sn8m7brwKw6poh-JlegqWKLHMuyAgA4ABtkvwAX9Qr1F6a6j3ydKav3D0ztCIX_Jpux-I4zhhiMQpAHqdMB3RzLXJWXwSj1f3jn0RdVwmVlF6VAuq4-C4JCwUkLeGnR07U8FAjgLRXXI5JNf0eLhNBBqcG3AOmMlNF4OObtI0QMeWF9CrNWQoh3btm4PRTFtwHvew9fBZwMY2q9bsWFWpQMWeAj72kXlhMFJ6CUopMOmzF3Kp628DGZ88QP6A8wAGPayFAzRa7A8onaMJGcY9JZpPa2o3rabuRP_FngHd5UHPOKxlKEUvcwgSdwR9W4CTIEg7p4nzZA8l6Sq3JO_pLduApMepZwnqrpBM91A3surdMHkpUFQllCjPUF8axpCcWhqF6erQVTMltQmtQ95vpSf1ALkBrLcIkiaO8BE-L83heAVyhwm9D4KORYoDUVBkkjsC8wk0jcoJDOqHUM_sEDG8eievGj8zgx0ZKpKEBViwPiIJbgSCS6VAwC3dQo_TC-48OqQhBomi5ra3qbnfkOy8sKtWamnvw3utFoq-RVjO7w-2rnVPA3R8H2rFjPJlq5eGnq7RUl0U9JzCseg_VIiEFncBqGFh0StDwSlLt1oGNvcwNab_pq18tx9mknhBiwDQWTd79aTjdiCra6z1-a8aGVJaJCW1sPiNXPTup5_AuBrithykBVBICipaTuvqBzqht3cGLKEBvfhb_79cwE18zn6BHX6e9h-hGGKIgTF90sgiigHIiAvf0boQ_0q2VJbQ-NeBoZFkNfp5x21Xd0BmEKa94f0X3P6-Z4jVfpkiyfY93z5-8MCY1pEUuYS3kLnfTx9QW0Kq1urakkxbFR70wlufL-yZpHRxcGuaBBiMozdE4sGshnFpvhWVCyiBd0dY5CmaGkRl4nD1XSbxtGsZ6BtRvpAGIO7iX6x9dZuc-sDwkWYzKZKmuMp84vPQeEGxYPe7u5T6UlbuXLJJSt5otMrrNUTN0f6PzgGeT7iYO_mV4PocV5P3rmeB7wHVfK_aABVZ3K_5wYwkAQmkYnRZjf5dwG4cnLnJ-YZtxFy0?></g></svg>