diff --git a/.dotnet-home/.dotnet/.workloadAdvertisingManifestSentinel10.0.100 b/.dotnet-home/.dotnet/.workloadAdvertisingManifestSentinel10.0.100
new file mode 100644
index 0000000..e69de29
diff --git a/.dotnet-home/.dotnet/10.0.103.aspNetCertificateSentinel b/.dotnet-home/.dotnet/10.0.103.aspNetCertificateSentinel
new file mode 100644
index 0000000..e69de29
diff --git a/.dotnet-home/.dotnet/10.0.103.dotnetFirstUseSentinel b/.dotnet-home/.dotnet/10.0.103.dotnetFirstUseSentinel
new file mode 100644
index 0000000..e69de29
diff --git a/.dotnet-home/.dotnet/10.0.103.toolpath.sentinel b/.dotnet-home/.dotnet/10.0.103.toolpath.sentinel
new file mode 100644
index 0000000..e69de29
diff --git a/.dotnet-home/.dotnet/10.0.103_IsDockerContainer.dotnetUserLevelCache b/.dotnet-home/.dotnet/10.0.103_IsDockerContainer.dotnetUserLevelCache
new file mode 100644
index 0000000..c1f22fb
--- /dev/null
+++ b/.dotnet-home/.dotnet/10.0.103_IsDockerContainer.dotnetUserLevelCache
@@ -0,0 +1 @@
+False
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/10.0.103_MachineId.dotnetUserLevelCache b/.dotnet-home/.dotnet/10.0.103_MachineId.dotnetUserLevelCache
new file mode 100644
index 0000000..4fc80b8
--- /dev/null
+++ b/.dotnet-home/.dotnet/10.0.103_MachineId.dotnetUserLevelCache
@@ -0,0 +1 @@
+0329a74f90c02a155aa8f8964a334e98cb5d3918ab5927ae0ab94685a48ba627
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/MachineId.v1.dotnetUserLevelCache b/.dotnet-home/.dotnet/MachineId.v1.dotnetUserLevelCache
new file mode 100644
index 0000000..4fc80b8
--- /dev/null
+++ b/.dotnet-home/.dotnet/MachineId.v1.dotnetUserLevelCache
@@ -0,0 +1 @@
+0329a74f90c02a155aa8f8964a334e98cb5d3918ab5927ae0ab94685a48ba627
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065547_ceda295872c94c4a8799b87bd4a10bc2.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065547_ceda295872c94c4a8799b87bd4a10bc2.trn
new file mode 100644
index 0000000..b91cafe
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065547_ceda295872c94c4a8799b87bd4a10bc2.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqxUy07kRhT9Fau2sT31fnjHdDMKQgxoaCVRdvW4hgrucqtchiDEv0d2wwwwyiJSNpZ1dR/nnnPqPqFk94A6dHI4nN5DKhOqUYlriGIqG8waSnZYdkJ0XLWSasUx+xPVKJ7DI+qQ4t4Tb6BhIKHhAYvGsd43IYAhmARMBV962psJdU/IxjbAffTQjtNvkKc4JtSh32MK48My28bWD+Mc2jwOcJamYpNfwGxPr893l1fNhhO8ufx8zJxgWhq0MaAOBWlwz7FpvOxNwz0VjWE9biyDIG3PiMH+WBZTgZzs0E7h7geGMJYExXe0pazFDTXouUbBFrvAdnaC3eNhQbLStF3i9Rpef7sndA8ZdbR+JfTY7pMf4qf95OY4hE/rF9XokMcD5BJhZWRdchhsiWOqXmZshgipoBp9XkquZ+9hmlCHvthhgtfwabqJCb5ku4eHMd99Pc5tv57uUI2u8vgX+HJlyy3qEFHeSu2lp72kRJBeEMcd9JLJnhJChPfG9cYISwFT7RRog4WTmHojnDGoRpfX1dVgSz/m/TvBro8anP0HCa5PNqfJugHCx5V2Nt9AQR0SUjhgvabSSRusYbonFpgJ3jEpQDsVNCjFKLNeeKyJJ4oIa5QQSjJKUI0urL+NCaqzLeoQZtRYxXuDPaaWCGGt7rWR3DLGwWjvRGCGaOuEocoCts5wqYXl2llJFarRZkwlpnmcp+osFbjJq2JvNri8rk6yv40FfJnzosUfcrH+VR7D7Ev1w2oEt7glmC1FcznMpfoGIWbwZaVkl+eXfh9KqKQYL1DmnCGValG3+tVOi8Tcc0cosTiYnhGqlfasx0IRwqhhwmntQu9xTzhRVDCClfTMOKm8wiTQxZewOLtaH5NyRIugRSMJFw23lDdWaN4IiqUwCph2/B3H1eUQ/h+e33j7zfp6YYy0Sq6svVL68ly4RjU6h5xgeEPZRfR5nMa+VC9urd6R+GbONk6HwT7+NO4XTzkTnsH3/M0t+LufzfttTsvRrNZX8BBT8/eq/Hb0d5CrxTk2puU+fK+4mIcSd7cZbIBwMQb42PS5Rnuw05xhv57l9VIkyCuM7Xx031m6iMMQJ/BjChPqqJFGtIpz/YL33xM1My3j/Pn5+fkfAAAA//8DAEvu+ZMFBgAA
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065607_22ced4349eac471da27de815e37a294b.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065607_22ced4349eac471da27de815e37a294b.trn
new file mode 100644
index 0000000..e863b49
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065607_22ced4349eac471da27de815e37a294b.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqyUTW/cNhCG/4rAsyTz+0O31E5Rwwi8iBdp0duQHMVEtNKCopwGxv73grID170V6I0YcIYvn3lnnskMJyQD+XA+f3zCuaykJSXtIU657qjoODtSPSg9UNM7R7k18k/SknSHP8hAjAyBBYedQI2djFR1XoyhixEdoyxSrmStCV9XMjwTSH3EpxSwX9YvmNe0zGQgv6c5Lt/r25D6MC1b7PMy4e28FphDFXPz8eHueH/oriWj1/e/vNxcca0F+hTJQIRmo0HNO+617aS0tPNC2I76EWXkJkSoQiD1aS6YZ5j6NX570xCXMmMJA++56GnHHbm0JEKBKtvDiscf56pkx3RT4+0e3o/DM3nCTAbe/gT6Uu4qTOlq3fyETzidIa+Yr8JyOsEcSUvOeTljLgl3NE+Y/bKmUqmGYMBaxqIFI5WJViguTBQUo6VGRRcdaKlHHpQao7fOyFFGzmTUKKU3pCU7vGmCkpa5edV+PSWcC2nJ/UNzmKCMSz69w//wQvT2PwCtsuttqoQ2BqUQApz2nGI0OmjNfQBqRs+RBaTKSeOYoUw4Tp1Q2lgTgbpAWvIJwmOasbm9IQOhgjswcnQ0UA5MKQA7WqclCCHR2eBVFI5Z8MpxA0jBO6mtAmk9aF4JXC9zSfO2bGtzOxf8mncWZCC/wrTiC4UPOTymgqFsuQL6Q9cvHfISt1CaN3Mw2tOeUVGTtnLeSvMZY8oYClZUx7y91vtXCtec0iplyxnn0hygPDa/wfpIBiKD9IwzoNGNgnFrbBAjVYYxwZ1Q3lofx0BHJpnhSjBqdBDOaxMMZZFXA2H1YrPbnwMPbrSyc8LJTiotOhet6Jw1oraR+pG9Y9zcTzXvf+D8E9eryaQlLbnDPOP0DxyfUsjLuoyleXVb8w7Q522ua6fZnfc9zd1feydulvANc1M7CWmuE/bavEtLTgjrlvG0b63hmRzqeDXHfXkJ03MrRUseCuSynd/CljJ1uVwufwMAAP//AwCxFX/O+gQAAA==
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065607_e5d933c8cef74d689e8b5c8619c5489a.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065607_e5d933c8cef74d689e8b5c8619c5489a.trn
new file mode 100644
index 0000000..82bc023
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065607_e5d933c8cef74d689e8b5c8619c5489a.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqyUy27dNhCGX0XgWpJ5Ey/apXaKukZgIzbaIrshObKJ6FAHFOU0MM67F5RP4Lq7AtkRA87w5zf/zAtJcEAykg/H48dnTGUlLSlxD3HKVUdFx9kDVeOgRqp7y9UwMPuFtCTe4HcyEi29Z95iJ1BhJwMdOicm34WAllEWKB9krQmPKxlfCMQ+4HP02C/rH5jXuCQykj9jCsu3+jbE3s/LFvq8zHid1gLJVzFXH+9vHm7vukvJ6OXtL683V1xrgT4GMhKh2KRR8Y47ZTopDe2cEKajbkIZuPYBqhCIfUwFc4K5X8PXNw1hKQmLH3nPRU87bsmpJQEKVNkOVnz4fqxKdkxXNd7u4f04vpBnzGTk7Q+gr+Uu/BwvynKc8RnnI+QV84VfDgdIgbTkmJcj5hJxR7P/dp6hxCU158cu54ipkJbc3jd3M5RpyYd3vO5fEVz/DwLPmF29TQehtEYphACrHKcYtPJKceeB6slxZB7pYKW2TFMmLKdWDEobHYBaT1ryOC8O5t/XnZ/l1JlANVccJVoulbKeojA4DRppAKWcMt4GYTSXJhgBFoBZh9pb5auyT+CfYsLm+oqMhApuQcvJUk85sGEAMJOxSoIQEq3xbgjCMgNusFwDUnBWKjOANA4U16Qll0sqMW3LtjbXqeBj3tmSkfwK84qvVD9k/xQL+rLlCvwvVYXc5SVsvjRv7mC0pz2joiZt5biV5jOGmNEXrOgf8nau958UrjilVcqWM6bS3EF5an6D9YmMRHrpGGdAg50E40YbLyY6aMYEt2JwxrgweToxyTQfBKNaeWGd0l5TFnh1EFYzNrv/Q0AmGbWd1tp30nvdgZC8G+ggndc+KMXfMW5u55r3Ezj/wHU2rTSkJTeYE87/wvEp+rysy1Sas3ubd4A+b6nunWZ38reYur/3Tlwt/ivmpnYSYqojdm7eqSUHhHXLeNjX1vhC7up8NQ/79hK650aKltwXyGU7voUNZcPpdDr9AwAA//8DAKenY437BAAA
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_09175bd58edc4b548e4954bae5f02f2e.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_09175bd58edc4b548e4954bae5f02f2e.trn
new file mode 100644
index 0000000..0464826
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_09175bd58edc4b548e4954bae5f02f2e.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqxUTU/kRhD9K1ZfY3v7292+sTOsghAL2hklUW79UYYOpj1qtyEIzX+P2sAusMohUi6WVeqqevXeq3pC0dwB6tHJ4XB6DzHPqEY5rCGKqWwwayjZY9kL2WPVasKoZt2fqEbhHB5RjzruHHEaGgYSGu6xaCwbXOM9aIKJx1TwUtNcz6h/Qia0Hu6Dg3aaf4M0hymiHv0eop8eSm8TWjdOi2/TNMJZnLOJroDZnu7O95dXzYYTvLn8/PxyhrkUaINHPWKSDB1I2lArVcO5wo1lTDXYDsA97Zw3BYgJbYgZUjRjO/vbHxj8lCNk19OWshY3VKNjjbzJpsC2Zob946EgWWnalni9htff/gndQ0I9rV8JfS73yY3h091slzD6T+sX1eiQpgOkHGBlZB1yHE0OU6xeemzGADGjGn0uKbvFOZhn1KMvZpzhNXwar0OEL8ncwcOUbr8+922/nu5Rja7S9Be4fGXyDeoR6ZyRyklHB0mJIIMgllsYJJMDJYQI57QdtBaGAqbKdqA0FlZi6rSwWqMaXe6qq9HkYUp37wTbPWtw9h8k2J1sTqOxI/iPI+1NuoaMegTMYsc51WpwxBGuzWAH7pTWcrCactoZ4AS45Npqxp3hWmhNbKcEtUoIVKML425ChOpsi3qEGdWm44PGDlNDhDBGDUpLbhjjoJWzwjNNlLFCl9rYWM2lEoYrayTtUI02U8whLtMyV2cxw3VaFXszweWuOknuJmRweUlFiz9kGfcqTX5xufphNYJb3BLMStKSD0uuvoEPCVxeKdmn5aXehxQqKcYFypISxFwVdatfzVwk5o5bQonBXg+MUNUpxwYsOrJurLBKWT84PBBOOioYwZ10TFvZuQ4TT4svoTi7WpdJGk2FZrgxjLGGE8YaTQbdUA3EM46lgfccV5ej/394fuPtN+OrwhhpO7my9krpy7pwhWp0DinC+Iayi+DSNE9Drl7cWr0j8U2fbZgPo3n8qd0vjnImHIPv7zc34G5/Nu+3JZajWa1b8BBi8/eq/HZyt5Cq4hwTYrkP3zMuljGH/U0C48FfTB4+Fj3W6A7MvCS4W8/yeikipBXGdnl231m8COMYZnBT9DPqldKt6IR+Qftvz7RSLRFYHo/H4z8AAAD//wMAel4/lAIGAAA=
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_14a755847d76495ab0b8cebe8a4d33ba.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_14a755847d76495ab0b8cebe8a4d33ba.trn
new file mode 100644
index 0000000..af32ddf
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_14a755847d76495ab0b8cebe8a4d33ba.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqxUTW/jNhD9KwLPkkJSlEQJ6CF1smiQpjYSb7fojR/DmIhMGhSVbBDkvxeUlbWzvfTQGzHkzLx57w3fkBN7QD26PByun8HFEeUo2jlEMW0KXBWUbHHT102PeVnXlDe4+RvlyN7CK+pRy5QiqoOiggYKpnFdyMqoQmvoCCYa05qlmuJxRP0bErbU8GwVlH78E8JovUM9+mad9i+pt7ClGvyky+AHuHFjFE4lMFfXD7fb9aZYMYJX61+PL0cYU4HSatSjqiGmhYYWVDa8YIzjQlYVL7A0wDRtlRYJiLCldRGCE0M56qcTBu2jg6h6WtKqxAXt0HuOtIgiwZZihO3rISGZabpK8XwOz8f+DT1DQD3NPwg9lrtQg73Yj3Kyg76IIjxCNEHs4cWHJ3gWA8rRIfgDhGhh5mf9kJ0gEVzikjYUY5SjO6F21kF2c5WthzQwrmgnWmY6rDAVpK6F4IZ3DRNVxaDjSta66ggXsu5oKwAL2bGG14JxKRraohzdQnAwnHW8syr40ZuYLZJknzCsvIvWTX4asxsX4TGIeMz7IoYRUI42kxzsuLsHoV+3/n5Kd24a0pyrKQRwMduIuMt+E+MO9YgpJgklAuvOVITylqvK4LolpKJdVUvOpTYKG8JIS+uK4LZRVSebVrWYaKpRjtZTPExx0eabddffz3Bsg93vQZ9AbGcJNoOIxof9jQYXrbFJuTMPzrYbhnm2bKm8Giy4+EmG/0eClXfGPk4/mMTGaFaZmvNGdpJgoKblDLdGYq1MpTpdS2hpi1sOvFMYy5oRLjuFNZCaJUo2wetJxZ+NRHCFcnQ/ubTf2U1i5cW64nvDToRtgo9e+eHE2L8UXfn9wY82JlbMIvvXEe68S7fL3/E5+dLHUwzS/mTzypKu0TXFvFCK6ILxShdd25qiq0FyAwzaWqIcXXn1BCFL5hPWzWJ9+G39kF0GtbMRVJxC6vzXPM5R5y8fq3ZiovzjervyAS4Ph3yJ/vLMy2Tu9UP2YYxPdvg6ptc7P6YhYpjO/PUAg/mAdeayoyeze9A2gIrz1faYuFD0yXlL1mWI1ggVx7Qhv3s1O2Kx3/Lk535n/P/IPjY/02Bxw1KJ8bnO/HHOHvhP/+b7+/v7PwAAAP//AwB7sYkoLAYAAA==
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_3167b92a11824165bd80b48bf3ddd69c.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_3167b92a11824165bd80b48bf3ddd69c.trn
new file mode 100644
index 0000000..fbdd422
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_3167b92a11824165bd80b48bf3ddd69c.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqxTy27UMBT9leiu49SvOE52MC2iqlArWgFi59g3jNXUHjlOAVXz78jpVFB2SOysK9/j8/ITBPOAMMCbw+HiEUNeoIbstxGnXBEqCGd3VA2tGqhueiZaIfhXqMFf4U8YoJPWMtsjEaiQSEdbMorJEuewZ5Q5yltZMM23BYYnML5x+OgtNnH5hGnxMcAAn31w8Xt52/jGznF1TYozXoYlm2ALmfOL26u76xuyk4zurt8+31xwKQCNdzCAUGzqUHHCR6WJlJqSUQhN6DihdLyzzhQixjc+ZEzBzM3i7n9zcDEHzHbgDRcNJbyHYw3OZFNoj2bBu5+HwmSz6bzM6228HYcneMQEA69fDH2GO7OzP7Px4cEEdzb54Jc91HBI8YApe9ws2VTOs8k+hur0yG72GDLUcH1b3cwmTzE9vPLp9ln65T8o/2Ds3gesLs9hACp4bzo59dRSbljbGqMn3StphJDYazu2TvRMm7HteWeQmrGXSrdG6tEo3kENuxiyD2tcl+oyZPyWNgUwwDszL/jM/U2ye5/R5jUVWV9UIYI/fN5FVwYMarhJ0a02V7+jYLShDaOiYKz5sObqIzqf0GYseu/SeoL/a4UrTmlhtqaEIVc3Ju+r92bZwwDSypFxZqjrJ8G47rQVE207xgTvRTtqPbrJ0olJ1vFWMNopK/pRdbajzHFXeJfkq61sivVKdB0lVAlNpOWOGOUm4iztbOco14y/sry6nsvef7D9xa5TU6SGGq4wBZz/sOODtykuccrVqTLVK4M+rqF88mqrz3cfyI8tmPNo7zFVJVjjQ+nzKcvj8Xj8BQAA//8DAF1B08wrBAAA
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_79946041cc58406696cb587c67ef82b1.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_79946041cc58406696cb587c67ef82b1.trn
new file mode 100644
index 0000000..fea9072
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_79946041cc58406696cb587c67ef82b1.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqxUS2/jNhD+K8KcJYUPvW+79i4apKmDtbstehuRI4eITBoUlW0Q+L8XlJ1mve2hh96E0eCb7zHDV7B4IOjgw/H46ZlsmCCFYJaSYKLKmMwE37GqK6uONTmTVVMy+QekYO7oBTqoC6W4aimTVFFWaFZmvRxUpjW1nHHNRFlETNxP0L0CmlzTs1GUu+kr+ck4Cx38Zqx23+JsNLka3axz70a6tVNAqyKZ9aft3W7zkK0Kzlabj+fOiaYIkBsNHciKDzVVIhN91WRF0bCsl7LJWD9QoUWtNEYiaHJjA3mLYz7pp3cO2gVLQXUiFzJnmWjhlILGgJF2jxPtXo6RyWLTOtbTpbx8dq/wTB46kb4Zeoa7UaO5OUz9bEZ9M7r93tj9ytnB7GePIQ5O4ejdkXwwtBi02SbvnDjLWS4qwRikcI/q0VhKbtfJZoyKmRQt1sXQMsUE8rJEbIamrQqUsqC2UX2pZcsb7MtW1EgM+7aomhKLpsdK1JDCHXlL43cT743ybnJDSC6ZJFccVs4GY2c3T8mtDbS/iOjgM44TxYbZe7IhecDwmPyE0yN0UKii54Ij0+0guWjqRsmBlTXnUrSy7Jum14NiAy94LUrJWV0p2fZVrWrGtdCQwo78wVgcf3b7ffT573nXP9Y04DyGrZv9sjWTfoIUPhqL/uXc8etE+tL1yzmoN6Rl2cZxEZRcsl6Nhmy48v7/8f3BOz2r8GPUnElI4cts4wkmtzHkb8Zmf1bFDzK+401xH5PlBGopK2SNyqhElRWMRIai5VlRtqWs6gaxrSCFtVNP5JOYJRp7BbbZJh+8ejSBVJh9tOD3ZfZmmzyMGAbnD1fnupnDcQ7JF9LGkwoUWez8HKE+m5H+QfZN98Xfojnv1OTeer+S791kQnxa7o01Bxwhhe350BdD/uOdX6G+s/rXfYEOcA4OTqfT6S8AAAD//wMASF6U/hIFAAA=
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_b0b21002b0e64d4a8088817a7f0ea171.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_b0b21002b0e64d4a8088817a7f0ea171.trn
new file mode 100644
index 0000000..09ec27d
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_b0b21002b0e64d4a8088817a7f0ea171.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqyTT2/cNhDFv4owZ1HmP1GkbunaRQ0jWCNepEFvFDmKCcvUgqKcBMZ+94LaNRL3FqAXQRhoZt77zdMrRPuM0MOH4/HmBWNeoIYcthKnXBEqCGcHqvpW9VQ3hlHO2u4fqCHc4Q/ooZPOMWeQCFRIpKctGcToiPdoGGWe8laWmfbrAv0r2NB4fAkOm3n5jGkJc4Qe/g7Rz9/KbhsaN82rb9I84W1cso2uiLm+ebg77O/JTjK62/9x/nLBpQxogocehGJjh4oTPihNpNSUDEJoQocRpeed87YIsaEJMWOKdmoW//RTg59zxOx63nDRUMINnGrwNtsie7ALHn4ci5IN03Wp11t5e+1f4QUT9Lx+A3oed+WmcPW8DGuY/NX5me3yVJwe03zElANuXDar02RzmGN12bSbAsYMNewfqvvJ5nFOz+9gPZz93/6G/UPZfvMd3ZrR7+Y15tIroIaP1j2GiNXtNfRABTe2k6OhjnLL2tZaPWqjpBVCotFuaL0wTNuhNbyzSO1gpNKtlXqwindQw26OOcR1XpfqNmb8mjZv0MOfdlrw7OpDco8ho8trKoa/qCLxPs1+dbn6eRpGG9owWlTu13xcc/UJfUjoMhbrh7Re5v2nhStOaZGypoQxV/c2P1Z/2eURepBODowzS70ZBeO6006MtO0YE9yIdtB68KOjI5Os461gtFNOmEF1rqPMcw81YElCtYXPeqWoc0hGrTyRQ+eJMV1HqOGojDZOSf6OcbWfSt//wPkN1yU0UkMNd5giTr/g+Bhcmpd5zNUlPdU7QJ/WWH76akvStxDJ9+0S17N7wlSVS9oQS74vxzudTqd/AQAA//8DAGz3os87BAAA
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_fb9e276d6f974f60b688ed0ce61cd777.trn b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_fb9e276d6f974f60b688ed0ce61cd777.trn
new file mode 100644
index 0000000..ddaee3a
--- /dev/null
+++ b/.dotnet-home/.dotnet/TelemetryStorageService/20260321065608_fb9e276d6f974f60b688ed0ce61cd777.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACqSUTW/cOAyG/4rBs+3owx+yb+kkxQZBkaAZdBd7oyW6EeJIA0lOGwTz3xfyTJF2L4tFL4JAi69ePqT8Bg6fCUa4PByuX8ilCCUku4UEE13FZCX4nnVj241M1QNTrOuHv6EEe0uvMELfaM31QJWkjqrGsLaa5KwrY2jgjBsm2iZr4tcI4xugrQ29WE21j18oROsdjPCndcZ/y3ejrfXiV1MHv9CNiwmdzmaurh9u93f31a7hbHf34XQyUswCtTUwguz43FMnKjF1qmoaxapJSlWxaabGiF4bzEbQ1tYlCg6XOpqndw/GJ0dJj6IWsmaVGOBYgsGE2faEkfavh+xkw3SV4+UW3rbjG7xQgFGUP4Ce5C70Yi+e47TaxVyc1oTxKW7rjDr58AolHII/UEiWNkaXMdLztLzuMT59PJ3J23j9nfSayOz86lKuWEAJG6NlwWS9K84Wd4sll7aPKVgXrf4vKQ4l3D0U9wum2YfnX1rycKJ88z8gf0L9aB0VN1cwApNiwL6ZB6aZQN62iGpWQ9eglA0NSk+tkQNXOLWD6JEYTkPTqRYbNWEneihh512ybvVrLG5coq9hKxdG+IhLpJP3y6AfbSKd1pAZ/NVlI/fBm1Wn4r3NnNWs5kzmpDUd1lR8JmMD6US5wH1Yz3r/ShGdYCxbWUMgl4p7TI/FHxgfYYRGNxMXHJkZZsmF6pWWM2t7zqUYZDspNZlZs5k3vBet5KzvtBymrtc940YYKIHyVBXbIDOakfLbQ0Zt1bB2qLAlVUnF275F3Umd3b8zLu6WLe/3Of/AdZ6jRkEJtxQcLT/h+GR18NHPqTjPSPELoM+ryz+QYpuXb9ZV37dOXHn9RKHInUTr8ls5N+94PB7/AQAA//8DAGR77q+HBAAA
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/10.0.105/microsoft.net.workloads.workloadset.json b/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/10.0.105/microsoft.net.workloads.workloadset.json
new file mode 100644
index 0000000..bf81b44
--- /dev/null
+++ b/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/10.0.105/microsoft.net.workloads.workloadset.json
@@ -0,0 +1,18 @@
+{
+ "Microsoft.NET.Workload.Emscripten.Current": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Emscripten.net6": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Emscripten.net7": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Emscripten.net8": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Emscripten.net9": "10.0.105/10.0.100",
+ "Microsoft.NET.Sdk.Android": "36.1.43/10.0.100",
+ "Microsoft.NET.Sdk.iOS": "26.2.10217/10.0.100",
+ "Microsoft.NET.Sdk.MacCatalyst": "26.2.10217/10.0.100",
+ "Microsoft.NET.Sdk.macOS": "26.2.10217/10.0.100",
+ "Microsoft.NET.Sdk.Maui": "10.0.20/10.0.100",
+ "Microsoft.NET.Sdk.tvOS": "26.2.10217/10.0.100",
+ "Microsoft.NET.Workload.Mono.ToolChain.Current": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Mono.ToolChain.net6": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Mono.ToolChain.net7": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Mono.ToolChain.net8": "10.0.105/10.0.100",
+ "Microsoft.NET.Workload.Mono.ToolChain.net9": "10.0.105/10.0.100"
+}
diff --git a/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/AdvertisedManifestFeatureBand.txt b/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/AdvertisedManifestFeatureBand.txt
new file mode 100644
index 0000000..2ce303b
--- /dev/null
+++ b/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/AdvertisedManifestFeatureBand.txt
@@ -0,0 +1 @@
+10.0.100
\ No newline at end of file
diff --git a/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/workloadVersion.txt b/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/workloadVersion.txt
new file mode 100644
index 0000000..3c326bc
--- /dev/null
+++ b/.dotnet-home/.dotnet/sdk-advertising/10.0.100/microsoft.net.workloads/workloadVersion.txt
@@ -0,0 +1 @@
+10.0.105
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260310080049_fe57fa3c8dce4114aa109c3897db6b79.trn b/.dotnet/.dotnet/TelemetryStorageService/20260310080049_fe57fa3c8dce4114aa109c3897db6b79.trn
deleted file mode 100644
index 03a9cc3..0000000
--- a/.dotnet/.dotnet/TelemetryStorageService/20260310080049_fe57fa3c8dce4114aa109c3897db6b79.trn
+++ /dev/null
@@ -1,5 +0,0 @@
-https://dc.services.visualstudio.com/v2/track
-Content-Type:application/x-json-stream
-Content-Encoding:gzip
-
-H4sIAAAAAAAACoxUTW/jNhD9K8KcRYWkPqnbrr2LBmnqYO1ui974MXKIyKRBUdkGgf/7grLTrLc99CZQw/fevHnDV3DygNDDh+Px0zO6OEEO0S5HnPKG0JIwuqNdT2lfiUKUVccq+hfkYO/wBXpoK62ZFkhKbJBUhtZElYMmxqBglBnK6yphyv0E/StIWxh8thoLP33FMFnvoIc/rDP+W+KWttCjn00R/Ii3borS6SRm/Wl7t9s8kFXF6Grz8Vw54ZQACmugh7qklRBMkbZuNKm4aolANhAjmBAlMllKeb5mXcTg5FhM5uldg/HRYdQ9L3hZUMIFnHIwMsokW8kJdy/HpGSxaZ3O8+V4+exf4RkD9Dx/M/QMd6NHe3OY1GxHczP6/d66/cq7we7nIGMizuEY/BFDtLgYtNlm75oYLWjBG04p5HAv9aN1mN2us82YOjZS06ZpkIiBNqRSqiVdZTQxtK5U1w6qpAJyuMPgcPwB9d7q4Cc/xOzie3bFs/IuWjf7ecpuXcT9RWgPn+U4YSqYQ0AXswcZH7Nf5PQIPVS6UowzSY0YSsa7ttPlQOuWsZKLslZdp8yg6cAq1vK6ZLRtdClU0+qWMsMN5LDDcLBOjr/6/T55+Q/f9Y81DnIe49bPYUnGZJ4gh4/WyfByrvh9QnOp+u08jDekJVDjuDSUXea5Gi26eOVv6qdB0amWEUrr5K0WRPDWkE52XBhUWA0D5PAQvJl1/HlkjJaQw5fZpVXKbtOwvllH/m6qn6T+oA1TrrIlykoyKpHXpOSoSKWZIYqZlpSNNB3DgbU0pW/t9ROGLM1LWncFttlmH4J+tBF1nENq88+Fe7PNHkYZBx8OV2tn8Pm8lgs/N0y0Q9cR1RpNqtoIIkxriNSlZpzSGtvEv5njcY7ZFzQ2oI6Yru7CnPg/2xH/1eGbWRfjq+4ctsm/1X7FoPxkY3pX7q2zBzlCDtvzli8u/s8lv0J9V/WfQYIe5Bw9nE6n03cAAAD//wMAt9L/qg8FAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260310080050_d86d5e63fb3144f7a374479b757caeb9.trn b/.dotnet/.dotnet/TelemetryStorageService/20260310080050_d86d5e63fb3144f7a374479b757caeb9.trn
deleted file mode 100644
index 6aa362b..0000000
--- a/.dotnet/.dotnet/TelemetryStorageService/20260310080050_d86d5e63fb3144f7a374479b757caeb9.trn
+++ /dev/null
@@ -1,5 +0,0 @@
-https://dc.services.visualstudio.com/v2/track
-Content-Type:application/x-json-stream
-Content-Encoding:gzip
-
-H4sIAAAAAAAACoxUTW/jNhD9KwLPokJSHxQN9JA6WTRIUxuJt1v0xo9hTEQWDYpyNgj83xeUlbWzvfQmjDgz7715M++olztAC3S9398eoI8DylF0U4gR1mBSYko2pF0QsqhJISrGK0L+RTly9/CGFohXWlMtAJfQAK4MqbEqrcbGgKCEGsLqKtWUzwNavCPpCgMHp6Hww98QBud7tEDfXG/8a+otXaE7P5oi+A7u+iHKXicwN7dP95vVGi8rSpar308vBxhSgcIZtEB1SSohqMK8bjSumOJYALXYCCpECVSWUp7SXB8h9LIrBvNyxmB87CHqBStYWRDMBDrmyMgoE2wlB9i87ROSSaabFM+n8PS5eEcHCGjB8g9BT+WudOeudoMaXWeuogzPEG2QO3j14QUOskM52ge/hxAdTPqsnrIzJEoKUrCGEYJy9CD11vWQ3d1kqy4RNlKTpmkAC0saXCnFcVsZjQ2pK9Vyq0oiUI7uIfTQXVR9cDr4wduYzbJnn/osfR9dP/pxyO76CM9BxlPeF9kNgHK0HlXnhu0jSPO28Y9j+tePXeKyHEOAPmZrGbfZH3LYogWqdKUoo5IYYUvKWt7q0pKaU1oyUdaqbZWxmlhaUc7qkhLe6FKohmtOqGEG5Wg1xv0YZ/2/uf72+wWOTXC7HZgziM0k87qT0fqwuzPQR2ddms6FzyZrdd3ELZsrLzsHffwkdcLfgGgVp5iQOsmsBRaMG9zKlgkDCiprT7JZ9zz+VItYa6rS1m3bKKEoAWZ5WxFuFTHallqYWgFnnPAWWqEJUXVFWyU0MUDrKtFeB29GHX81BCUlytHj2Kc9ze4S81fX4+9NdRZlHXz02ndnVf4ztaXf7f3gYmJu59F+HeDB9+nvfAM+J1/7eI5B2oNsWj1Sa1LyWmJTyhZXykosaEkxF8q0oA0jdZLoxusXCFkymHT9NJAPT62esuugty6CjmNInf+Z6Jxm+eVjZc5KFH/dbpY+wPV+n8/R3w5tkQy8eso+hv9p5F+H9Hrrh3jBeGb2BJ39wHVhJQOH07VyKcgMFdy2LVbcaFzVRmBhuMFSl5oyQmrg6Sic3Jo9gnEBdJzqbcKYus3CfvLk3Oo6RGeljkPanT+9nnw0G3N+8ivIi6n9zD41v5jc7KG5UtVOdaazOTnnf13N4/F4/AEAAP//AwCP62h1KgYAAA==
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_58017f47d274449798afca13d1b137ed.trn b/.dotnet/.dotnet/TelemetryStorageService/20260310080053_58017f47d274449798afca13d1b137ed.trn
deleted file mode 100644
index 5f5272e..0000000
--- a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_58017f47d274449798afca13d1b137ed.trn
+++ /dev/null
@@ -1,5 +0,0 @@
-https://dc.services.visualstudio.com/v2/track
-Content-Type:application/x-json-stream
-Content-Encoding:gzip
-
-H4sIAAAAAAAACpSUTW/cNhCG/4owZ1HmhySKurlrBzWMwEa8SIre+DGKCcvUgqScGMb+94LaDez0UvRCECPO8J1nXuoNgn5GGOHycLh+wZAT1JD9FuKU94QKwuieDiOlYycazkQnJP8bavC3+AojyNZaZhUSgT2S1tGOGDFZ4hwqRpmjvGtLTf09wfgG2jcOX7zFZklfMSa/BBjhmw9u+VHu1r6x87K6Ji4z3oSUdbBFzNX1w+3+7p7sWkZ3d3+cTiZMpUDjHYzQCdoqxQyRXW9Jy40kCtlEnGJKCWRaaH1K8yFjDHpuknt61+CWHDDbkTdcNJRwBccanM66yDY64f71UJRsmK5KvN7C23Z8gxeMMPL6F9BTuQs7+4vnZFY/u4vTmnV6Sts6aZuX+Ao1HOJywJg9bowuU8JnM7/udXr6dDpTtun6J9o1o9sta8gwAmsZ1LBBmmed/RKqs8bd7DHk7WOOPiRv/7MWhRruHqr7Wedpic+/DeXhxPnmf2D+rO2jD1jdXMEIbY9qMJIRSruetMYqorh0ZNADVw4NttMENeyWkH1YlzVVNyHj97j1BCN80nPCk77LaB99RpvXWBr9qy/muo+LW22u3ofJaEMbRkVJWvNhzdUXdD6izVia2Mf1XO9fKbzntJDYrTFiyNW9zo/Vnzo9li5saxhnmjo1CcYHOVgx0U4yJrgSnRkG4yZLJ9YyyTvBqOytUKaXVlLmuIMasHin2uxKJ9cOvRqI1oUJDo4MHbOEM5ykoQo7XZi8c6zu5pLntKV93yNREy0sjSRD6yxxtGvNICcjqPqA5GyIdoAaHL6c3t4mgDum5DQMxEhnSds5RZSTjmgrLOOUdijLIG8xBpw/cPrsbVzSMuXqbJDqN3Jf1lD+H9Vmlh8+kJ/biK4W+4SxKiPWPpSncp7q8Xg8/gMAAP//AwBNtW+XhgQAAA==
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_6ca94d7e0ff3474182ec36646efb7e4f.trn b/.dotnet/.dotnet/TelemetryStorageService/20260310080053_6ca94d7e0ff3474182ec36646efb7e4f.trn
deleted file mode 100644
index 5091248..0000000
--- a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_6ca94d7e0ff3474182ec36646efb7e4f.trn
+++ /dev/null
@@ -1,5 +0,0 @@
-https://dc.services.visualstudio.com/v2/track
-Content-Type:application/x-json-stream
-Content-Encoding:gzip
-
-H4sIAAAAAAAACpRUy27dNhT8FYHbigof4ku7xHZQw3Bs5F60RXd8HNmsZeqCouwGgf89oK6d2Am66EYQDjiHc2aG5ytK9h7QgN4fDmcPkMqCWlTiVmKESUw4pmRP9EDIIHjHqOkV03+jFsUL+IIGpHrvqTeAOUjAfSACOz56HAIYSmggTPS1p71Z0PAV2dgFeIgeunn5A/IS54QG9GdMYX6sd9vY+WleQ5fnCc7TUmzylczp2e5if3WNT3pKTq4+HE8usNQGXQxoQIKT3hjqsBLS4545hQ3QEQdDjeFALbf2CIupQE526pZw94NDmEuC4gfWMd4RzAx6alGwxVbazi6w/3KoTDaZTmu93crb7/AVPUBGA2tfBD22e+en+O5+cWucwrvti1p0yPMBcomwKbINOU22xDk1z3ecTBFSQS36UCG71XtYFjSgfV7hpXqWbmKCj9new+Oc7z4dr+0+ne1Ri67z/A/4cm3LLRoQVd5K7aVno2RU0FFQ1zsYJZcjo5QK740bjRGWAWHaKdCGCCcJ80Y4Y1CLrnbN9WTLOOf7N37tjhac/w8Hdu9PzpJ1E1TMRzst30fa23wDpXaSwgEfNZNO2mAN1yO1wE3wjksB2qmgQSnOuPXCE009VVRYo4RQkjOKWnRp/W1M0JyfogH1Eox2imJChMS98wYbpgLWVjMTwEE/jqhFJ3MqMa3zujTnqcBN3kx5xfJq17zP/jYW8GXNVe+/ZE33dZ7D6kvzI02UdKSjhFfQWg5raT5DiBl82cZ+NvJq9zOESUZIpbLmDKk01cHmd7tUG3vfO8qoJcGMnDKttOcjEYpSzgwXTmsXRk9G2lPFBKdESc+Nk8orQgOr0YMa3mZ7L+PYe+eCx6EnDvecSOyI1ph7LSVoUHaENzo2V1PFBeuJlBKwGUnV0ims+9qGiN5pNTpOzNuMvhpRV1Vop+SmzItsz6nvNWpRgIfjgthIskCNGrXGTgWPexEMNkEFbD33lBEiQNVIXUBOML3S8jL6PC/zWJrnqDZv1H1F7jQuh8l++YXjb571XHgO38+f3IK/+zW5n9dUF2azPYHHmPC/WyROZ38HuamRsjHV3fAdcblOJe5vM9gA4XIO8HPTpxbdg13WDPfbSt62RIK80Thdj7E8T5dxmuICfk5hQQNnRnWc9PKZ7n+e41p2TBH99PT09A0AAP//AwBhk8DZAAYAAA==
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_920ed87e48274350a20f048a7bcaaf7a.trn b/.dotnet/.dotnet/TelemetryStorageService/20260310080053_920ed87e48274350a20f048a7bcaaf7a.trn
deleted file mode 100644
index 61423bc..0000000
--- a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_920ed87e48274350a20f048a7bcaaf7a.trn
+++ /dev/null
@@ -1,5 +0,0 @@
-https://dc.services.visualstudio.com/v2/track
-Content-Type:application/x-json-stream
-Content-Encoding:gzip
-
-H4sIAAAAAAAACpRTS2/UMBD+K9Gc49SPOI5zg20RVYVa0RUgbn5MqNXUWTlOAVX735Gzi6DcuFjWyDPzvfwC0TwhDPDmcLh6xpgXqCGHrcQp7wgVhNE97QdKBykazmTHhPgKNYQb/AkDqNY55jQSgR2S1lNJrBgd8R41o8xTLtsy03xbYHgBExqPz8FhMy+fMC1hjjDA5xD9/L3sNqFx07z6Js0TXsclm+gKmMur+5v97R3ZtYzubt+eXi64lAFN8DCAFLTVmlmiZOdIy60iGtlIvGZaC2RGGHNqCzFjimZqFv/4B4Ofc8TsBt5w0VDCNRxr8CabAtuaBfc/DwXJJtNlqddbebsOL/CMCQZe/xb0NO7CTeHiabFrmPzF6cxmeSxMD2k+YMoBN102qtNkcphjdd60mwLGDDXc3ld3k8njnJ5eiXV/4n/9H/T3ZfvVD3RrRr+b15hhACYZ1PDBuIcQsbq+hAHaDnVvFSOUyo601mmiufKkNz3XHi224wg17OaYQ1zndamuY8ZvaSMAA7wz04In6G+SewgZXV5TYfWlK3m4S7NfXa7+6M9oQxtGRWla82HN1Uf0IaHLWPjt03qe908L7zilBcqaEsZc3Zn8UL03y0Nh4VrLODPU61Ew3qveiZFKxZjgWkjb99aPjo6sZYpLwajqnNC2U05R5rmHGrDYXW0JU16MQnBPcBw1aSmTxPpRkk5b2wnZITL5Ssfqdip93jjadR0SPdKipVWkb70jnsrW9mq0guq/JDm73/ZQg8fn03fZAHDPtBr7nljlHWml10R75YlxwjFOqURVPL7BFHH6S6cPwaV5mcdcnbNTvVLu4xrLl6+2HH0PkfzYLLqc3SOmqlhsQizpPrt6PB6PvwAAAP//AwAozg9nOQQAAA==
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_bb53297b186f41e9bb847d79ac633e12.trn b/.dotnet/.dotnet/TelemetryStorageService/20260310080053_bb53297b186f41e9bb847d79ac633e12.trn
deleted file mode 100644
index a715bbf..0000000
--- a/.dotnet/.dotnet/TelemetryStorageService/20260310080053_bb53297b186f41e9bb847d79ac633e12.trn
+++ /dev/null
@@ -1,5 +0,0 @@
-https://dc.services.visualstudio.com/v2/track
-Content-Type:application/x-json-stream
-Content-Encoding:gzip
-
-H4sIAAAAAAAACpSTW0/cMBCF/0rk5zj4ljjOG12oihACFdRWffNlwloEe+U4XIT2v1fObgX0rW/WyHN85jvjNxT0I6ABne52508Q8oxqlP1aYoR1mHBMyR3pB0KGljeMql4o/hvVyF/CKxqQFNZSqwBz6AALR1ps+Gixc6AooY6wVhRNfT+j4Q1p3zh48haaOP+ANPsY0IB++uDic3lb+8ZOcXFNihNchDnrYIuZs/Pby7vrG7wRlGyuvxxuzjAXgcY7NKCWE6EUNVi2ncWCGYkV0BE7RZXiQDXX+tDmQ4YU9NTM7uHdg4s5QLYDaxhvCGYK7WvkdNbFttEz3L3uipMV01mp12t5PQ5v6AkSGlj9F+hB7sRO/sTGx0cd3Mnog5+3qEa7FHeQsocVyTrlNOnsY6iOj2wmDyGjGl3fVjeTzmNMj5843R5Gv/iPya+03foA1cUZGpDoQPVGUkxI22FhrMKKSYd73TPlwIAYR1SjTQzZhyUuc3URMtyn1SUa0Fc9zXDwd5rs1meweUnF+q+u5A0vPm+iKwWCanSToltsrt5xU9KQhhJeNJa8W3L1HZxPYDOUme7ScpT/p4V1jBTFzZIShFzd6Lytvul5W4aywlBGNXFq5JT1srd8JK2klDPFW9P3xo2WjFRQyVpOiewsV6aTVhLqmCu+S7rVulCjVYSB7DAxrMdCOIqVVQZTp3nbaRjb3n7CWl1Ppc9pS7quA6xGUtAaiXvhLHakFaaXo+FEfUByTFz0qEYOng6/YzXAHFVy7HtspLNYtE5h5aTD2nJLGSEtyJLrJaQA0wdOV96mOMcxV8d9qT6R+76E8sOrdXeefcAva2Jn0T5Aqkri2oeyzMeQ9/v9/g8AAAD//wMADd66CygEAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081458_f54c6b474e104810804f925b4cb25391.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081458_f54c6b474e104810804f925b4cb25391.trn
new file mode 100644
index 0000000..2b01698
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081458_f54c6b474e104810804f925b4cb25391.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACoxUTW/cNhD9K8KcRZmkqA/qlngT1HDdNbJuWvTGj9GasJZcUJRTw/B/D6i162zaQ28CNXzvzZs3fAavDggDfDgePz2iTzOUkNx6xClvCa0JZ3e0H5gYmr6ijMpO1n9BCe4an2CAThjDjERSY4tEWNoQXY+GWIuSUWYpb0TGVPsZhmdQrrL46AxWYf6KcXbBwwB/OG/Dt8ytXGWmsNgqhgmv/JyUN1nM5tPu+m57Sy4Fo5fbj6fKGecMUDkLA7T9iIxyRXSLhoi2VkQp5GRsBa9rSnUt2tM15xNGr6Zqtg/vGmxIHpMZeMXrihIu4aUEq5LKsrWa8e7pmJWsNm3yebker5/DMzxihIGXb4ae4C7M5C4Os17cZC+msN87v78MfnT7JaqUiUs4xnDEmByuBm13xbsmRita8ZZTCiXcKHPvPBZXm2I75Y6tMrRtWyRypC0RWnekF9YQSxuh+27UNZVQwjVGj9MPqDfOxDCHMRWvvhdnPJfBJ+eXsMzFlU+4fxU6wGc1zZgLlhjRp+JWpfviFzXfwwDCCM04U9TKsWa873pTj7TpGKu5rBvd99qOho5MsI43NaNda2qp2850lFluoYQ7jAfn1fRr2O+zl//wnf/Y4KiWKe3CEtdkzPYBSvjovIpPp4rfZ7SvVb+dhvGGtAZqmtaGitd5Xk4OfTrzN/fToux1xwilTfbWSCJ5Z0mvei4tahTjCCXcxmAXk34eGaM1lPBl8XmViqs8rG/Ok79b8ZPUH7RhzlWxRhlr2dum50RILYhAw4iSkpOeoVBaGa07DiVsgnnAWOR5KefPwLa74kM09y6hSUvMbf65cm93xe2k0hji4WztLD6e1nLl55bJbux7ojtriGisJNJ2lihTG8YpbbDL6d8u6bik4gtaF9EkzFfv4pL5P7sJ/9Xhm1mvxov+FLY5vNV+xajD7FJ+V26cdwc1QQm705avLv7PJT9DfVf1n0GCAdSSAry8vLx8BwAA//8DAAq+LnwPBQAA
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081506_25d900ec72df437991da4e4e784d0146.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_25d900ec72df437991da4e4e784d0146.trn
new file mode 100644
index 0000000..876e8ee
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_25d900ec72df437991da4e4e784d0146.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpSTT2/UMBDFv0o05zj1v8RxbrAtoqpQK7oCxM2xx9Rq6qwcp4Cq/e7I2UUFblyiaOQZv/eb5xeI5glhgDeHw9UzxrxADTlsJU55R6ggnO1pP7B2oF1DudY9b79CDeEGf8IASlrLrEYisEMiHW3JKLwlzqFmlDnKW1lmmm8LDC9gQuPwOVhs5uUTpiXMEQb4HKKbv5e7TWjsNK+uSfOE13HJJtoi5vLq/mZ/e0d2ktHd7dvTyQWXMqAJDgboeo+MckPGDi2RnTDEGOTEd5ILQekoZHdqCzFjimZqFvf4qsHNOWK2A2+4aCjhGo41OJNNkT2aBfc/D0XJhumy1OutvP0OL/CMCQZe/wZ6Gndhp3DxtIxrmNzF6ZvN8licHtJ8wJQDblw2q9Nkcphjdb5pNwWMGWq4va/uJpP9nJ7+gnV/8n/9H/b35farH2jXjG43rzHDAKzVUMMHYx9CxOr6EgaQHep+VIxQ2nZEjlYTzZUjvem5djii9B5q2M0xh7jO61Jdx4zf0mYABnhnpgVP0t8k+xAy2rym4upLV/Jwl2a32ly98me0oQ2jojSt+bDm6iO6kNBmLP72aT3P+6eFd5zSImVNCWOu7kx+qN6b5aG4sHJknBnqtBeM96q3wtNWMSa4Fu3Y96PzlnommeKtYFR1VuixU1ZR5riDGrCsu9oSxhn1KKwhznhFpDGGaCMUMUxSqxnl0hf1rxyr26n0OWNp13VItKeF5ahIL50ljrZy7JUfBS38fyM5b1/2UIPD59NzOQlwTCvf92RUzhLZOk20U44YKyzjlLaoSipvMEWc/uD0Idg0L7PP1Tk71V/kPq6xPPlqy9H3EMmPbUWXs33EVJUVmxBLus9bPR6Px18AAAD//wMAGISxOzkEAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081506_4d6a0af3296f4462b519a3b5f845b419.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_4d6a0af3296f4462b519a3b5f845b419.trn
new file mode 100644
index 0000000..c3e5d0a
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_4d6a0af3296f4462b519a3b5f845b419.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpSTT2/UMBDFv0rkc5yO/8RxcoMtiKpCrWgFiJtjj1mL1Fk5TgFV+92Rs4vacuNmjTzPb35v/ESieUAykDeHw7tHjHkhNclhK3HgioKgnN2DHlg7gGpA8L4F+EZqEq7xNxlIJ61ltkcqUCGVDlo6Cm+pc9gzYA54K4um+b6Q4YmY0Dh8DBabefmMaQlzJAP5EqKbf5a3TWjsNK+uSfOEV3HJJtpi5vLd3fX9zS3dSQa7m7enmwsuRaAJjgxEaY8MuKGjQkulEoYag5x6JbkQAKOQ6tQWYsYUzdQs7sezBzfniNkOvOGiAcp7cqyJM9kU26NZ8P73oTjZMF2Wer2Vt+PwRB4xkYHXf4Ge5C7sFC7s/PBgorvwIYZlT2pySPMBUw64IdmmnCaTwxyr8yO7KWDMpCY3d9XtZLKf08MrTnen0a/+Y/KPxu5DxOrqkgxEKuz12DEK0CoqR9vTnneOaqN573BE6T2pyW6OOcR1XpfqKmb8njaXZCDvzbTgyd+bZPcho81rKta/qpI3/gp5N7tSAFKT2zS71ebqGTeDBhoGomis+bDm6hO6kNBmLDPdp/Us/08LVxyK4m5NCWOubk3eVx/Msi9DWTkyzgy43gvGdaet8NB2jAnei3bUenTegmeSdbwVDDplRT+qznbAHHfFd0m32hZKgrbetZo6Lzoq285RY1pHtTC6ZQBaiYLoGWt1M5U+ZywopZD2HgrasaNaOksdtHLUnR8F9C+QnBOXmtTE4ePpd2wGuGN957WmY+csla3rae+KCyss4wAtdmUJrzFFnF5w+hhsmpfZ5+q8L9Urcp/WWH54te3OzxDpry2xy9n+wFSVxE2IZZnPIR+Px+MfAAAA//8DAAzhFqUoBAAA
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081506_8403d32623ed4fbf934f7cdcd95f2f59.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_8403d32623ed4fbf934f7cdcd95f2f59.trn
new file mode 100644
index 0000000..3748b9e
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_8403d32623ed4fbf934f7cdcd95f2f59.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpRUXW/cKhT8KxbPxuHL2Pgtd5OqUVQlalbt1X3j49CgOHgFOG0U7X+v8G7V5qm6Lwgdc4Y5M4PfUNTPgCZ0eThcv0AsGbWohK3ECJOYcMzonowT7SciO8JG0gv1H2pRuIVXNKFBWEutAsxBAhaO9Nhwb7FzoCihjrBeVEz9LaPpDenQOXgJFrolf4GUwxLRhL6G6Jbv9W4dOjsvq+vSMsNNzEVHW8lcXT/c7u/u8U5Qsrv753QyQ64AXXBoQnL0QAnT2EiwWEiusdbAsJeCcU6I4UKe2kIskKKeu+yefnNwS4lQ7MQ6xjuCmULHFjlddKVtdIb966Ey2WS6qvV2K2/b6Q29QEITa38JeoK7sHO4eM5mDbO7OK1F56e8rV7bsqRX1KJDWg6QSoBNo8uc4dnMr3udnz6cztRtvv4Bdi3gdssaC5oQ7XvUok2kedYlLLE5c9zNAWLZPpYUYg72b1jVo7uH5n7WxS/p+Z0nDyeZb/6Hyp+0fQwRmpurii1BjWagmJBeYmGswooNDo96ZMqBAeE9atFuiSXEdVlzcxMLfEvbSGhCH/Sc4cTvMtnHUMCWNdU5/5WV931a3GpL89tLSjrSUcJr01oOa2k+gwsJbIE6xD6tZ7wv71uYZIRUKmtKEEtzr8tj81HnxzqFFYYyqolTnlM2DqPlnvQDpZwp3ptxNM5b4qmgA+s5JYO0XBk52IFQxxxqEdToNFtavTPMS+8xtaCxMKPCynOFSU8FUWYAx+k7HZu7ufY5bYmUErDypGppBjwKZ7EjvTDj4A0n6g9JznkQI2qRg5fT09sIMEfV4McRm8FZLHqnsHKDw9pySxkhPQw14beQIsx/6PQp2LTkxZfmHJDmnXKf11h/H80Wlu8h4h+bRVeLfYLUVIt1iPWlnF09Ho/HnwAAAP//AwBxb007hQQAAA==
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081506_95672ba2d4624f788e24bb2c7fcefaf3.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_95672ba2d4624f788e24bb2c7fcefaf3.trn
new file mode 100644
index 0000000..bde7597
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081506_95672ba2d4624f788e24bb2c7fcefaf3.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpRU207kOBD9lciv2874Fl/yxgCjRYgBTbd2V/vmSxm8BKflOLAI8e+jpIGBGe3DvkRRyad86pzjekLZ3gHq0dF+f3oPuU5og2paS4wwiQnHjO6I7mnXE9kSziQ1/G+0QekcHlGPlPCeegOYgwQsAumw49HjEMBQQgNhnVh62usJ9U/IpjbAffLQjtMfUKY0ZtSjP1MO48Nyt02tH8Y5tGUc4CxP1Wa/kDk53Z7vLq/wsaDk+PLz4eQE09KgTQH1SOoIlDCLnQSPheQWWwsMRykY54Q4LuQBlnKFku3QTuH2B4cw1gzV96xlvCWYGfS8QcFWu9B2doLd435hssp0stQ3a3n97Z/QPRTUs82roId2n/yQPt1Nbk5D+LR+0Qbty7iHUhOsiqxDDoOtaczNyx3HQ4Jc0QZ9XiDb2XuYJtSjXZnhtXqar1OGL8XewcNYbr8erm2/nu7QBl2V8R/w9crWG9QjwxQDQ6SQ1itqFaHGd6oj3kWpjI9RdpZEFwKjhGoliKJaiNBxrgzRZpHtcttcDbbGsdx98Gt7sODsfziwPTo+zdYNsGC+2GF6G2lnyzVU1CPgjnghmNHRU0+FsdFF4bUxMjrDBFMWBAUhhXGGC2+F6YyhTumOOd11aIMurL9JGZqzE9QjIcFopygmpJNYOG+wYSpgbTUzARyIGNEGHY+5pjyP89Sc5QrXZTXlHcvLbXNU/E2q4OtcFr3/kku6r8oYZl+bH2mipCUtJXwBzXU/1+YbhFTA13XsFyMvtz9DmGSELFTmUiDXZnGw+d1Oi43CC0cZtSSYyCnTSnseSaco5czwzmntQvQkUkEV6zglSnpunFReERrYEj1Ywtus7yVICibGDjvNOywCF9gpGrDuBFex00LI+EHH5nJYcdYTKSVgE8mipVNYi+BxIJ1wWkXHifmY0Xcj6kUV2iq5KvMq20vqhUYbFOD+sCBWkixQo6LW2KngseiCwSaogK3nnjJCOlDLOzyHkmF4p+VF8mWcxlibl6g2H9R9R+4kTfvBPv7C8TfPBO88h7fzxzfgb39N7rc5LwuzWZ/AQ8r43zUSJ6O/hdIskbIpL7vhDXExDzXtbgrYAOFiDPBz0+cNugM7zQXu1pW8bokMZaVxMh9ieZYv0jCkCfyYw4R6TThrpTHyhe5/nqOUtKbj8vn5+fk7AAAA//8DALIzaaEABgAA
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081854_17fa287a99c144e88cfb615706a4a137.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081854_17fa287a99c144e88cfb615706a4a137.trn
new file mode 100644
index 0000000..5e2d1a7
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081854_17fa287a99c144e88cfb615706a4a137.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACoxUTW/jNhD9K8KcRYWUKFHSbdfeRYM0dbB2t0Vv/Bg5RGTSoKhsg8D/fUHZadbbHnoTqOF7b9684Ss4eUDo4cPx+OkZXZwgh2iXo5KWDaEVKdmOtj1r+5oXXUW7htO/IAd7hy/Qg+BaM90hqbBBwg2tiaoGTYzBjlFmaFnzhCn3E/SvIG1h8NlqLPz0FcNkvYMe/rDO+G+JW9pCj342RfAj3ropSqeTmPWn7d1u80BWnNHV5uO5csIpARTWQA8t6tYIKYgUhhKuKkZaKioiqpq3wtR0EOJ8zbqIwcmxmMzTuwbjo8Oo+7Ioq4KSsoNTDkZGmWQrOeHu5ZiULDat03m+HC+f/Ss8Y4C+zN8MPcPd6NHeHCY129HcjH6/t26/8m6w+znImIhzOAZ/xBAtLgZtttm7JkYLWpRNSSnkcC/1o3WY3a6zzZg6NlLTpmmQdANtCFdKkJYbTQytuWrFoCraQQ53GByOP6DeWx385IeYXXzPrnhW3kXrZj9P2a2LuL8I7eGzHCdMBXMI6GL2IONj9oucHqEHrrliJZPUdEPFyla0uhpoLRiryq6qVdsqM2g6MM5EWVeMikZXnWqEFpSZ0kAOOwwH6+T4q9/vk5f/8F3/WOMg5zFu/RyWZEzmCXL4aJ0ML+eK3yc0l6rfzsN4Q1oCNY5LQ9llnqvRootX/qZ+GuxaJRihtE7e6o50pTCklW3ZGVTIhwFyeAjezDr+PDJGK8jhy+zSKmW3aVjfrCN/N/wnqT9ow5SrbImyUrJSHdaENVQTjlqStqM1Qa5orXglha4hh7XXTxiyNC9p3RXYZpt9CPrRRtRxDqnNPxfuzTZ7GGUcfDhcrZ3B5/NaLvylYZ0Y2pYoYTThtelIZ4QhUlealZTWKFL6N3M8zjH7gsYG1BHT1V2YE/9nO+K/Onwz62I8b89hm/xb7VcMyk82pnfl3jp7kCPksD1v+eLi/1zyK9R3Vf8ZJOhBztHD6XQ6fQcAAP//AwA1E43PDwUAAA==
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081854_1b8e6f3a63a2438cbc87934336e3ea7b.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081854_1b8e6f3a63a2438cbc87934336e3ea7b.trn
new file mode 100644
index 0000000..b07a3fe
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081854_1b8e6f3a63a2438cbc87934336e3ea7b.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpSUTW/cOAyG/4qhs+Xo+8O3btLFBkGRoAm6xd4kkW6MeuyBLE+3COa/L+RJ0WZvvRmESb18+JIvZA4HJD15dzy+P+FcVtKSMu4hwYShTFLBn5jrueu16py3ijHzD2nJeIffSU+sSoknj1SiQaqAaRrlkCgAes44MKFVrRm+rKR/IWHsAE9jwm5ZP2Fex2UmPfl7nGH5Vt8OY5emZYMuLxPezmsJc6pibt4/3j3dP9Brxdn1/R+XP1dca4FuBNITh8mBDZYGC4yqKDl1zEpqpVbOgmaDtZe0cS6Y5zB1K3z9qQGWMmNJveiE7BgVnpxbAqGEKjuGFZ++H6uSHdNNjbd7eP/sX8gJM+lF+wPopdxVmsardYsTnnA6hrxivkrL4RBmIC055uWIuYy4ozlhjss6lko1JRuc4xxcsEpbcFILaUEyBMesBg8+GGUGkbQeINaxDAoEV2BQqVgb3eFNUyjjMjev2q+nEedCWnL/2DxMoQxLPrzB/3ghevsbQKts0hPJtDTWopJSBm+iYAjWJGNETIHZIQrkCZn2ynpuGZdeMC+1sc5CYD6RlnwI6Xmcsbm9IT1RBr2LllPGtKEqJk+9sEBdcMIDRlTDQFpyvcxlnLdlW5vbueCXvPdLevJnmFa8dPoup+exYCpbrhA+m2rIh7zAlkrz0wCcdazjTNakrRy30nxEGDOmghXHU95e6/0vRRjBWJWy5YxzaR5CeW7+Cutz7SKpyAUPDPwguXDWJTkwbTmXwksdnYswJDZwxa3QkjNrkvTR2GQZB1FNgtVvzW5xo4zjXCP1XkaqklY0BgZ0QOUDRK9Qqjccm/up5kFIzBiD1A+ssoyWOgWJAtMqOjtEyfwvSF7NohxpCeDpsq+7AAHc28E5Gi0kqjR46sECDUkmLhjTaOta3GGecfqF04cx5WVdhtK8Wq15Q+7jNteb0+y2+zbO9N99RDdL+oq5qSMO41zX63Wq55YcMKxbxsN+svoX8lB3q3naL5fknfeKt+SxhFy244+w6aRg5nw+n/8DAAD//wMA4RImNfcEAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081854_32cc04825a5748dc88ae842da141b90d.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081854_32cc04825a5748dc88ae842da141b90d.trn
new file mode 100644
index 0000000..d364adc
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081854_32cc04825a5748dc88ae842da141b90d.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpSUy27dNhCGX0XgWpSHF/GiXWqnqGsENmKjLbrjZWQL0aEOKOqkgXHevaCOg8TddScMNDM/v/lnXklyByQD+XA8fjxhKitpSZn2EAeuKAjK2ROYgZmhl53h2jBh/iYtme7wGxmIliGwYJEKVEhlhJ56MQYaI1oGLALvZa3pnlcyvBI3dRFPU8BuWf/AvE5LIgP5c0px+Vp7u6kL87LFLi8z3qa1uBSqmJuPj3dP9w/0WjK4vv/l8ueKay3QTZEMxGAwUTtNnY5ApReMGtCCatFLo2MPo9aXtCkVzMnN3Rq//NAQl5KwhIF3XHRAuSXnlkRXXJXt3YpP345VyY7ppsbbPbx/Dq/khJkMvP0O9FLuKszTVVmOM55wPrq8Yr4Ky+HgUiQtOebliLlMuKPZXzvPrkxLat6aXc8TpkJacv/YPMyujEs+vOP1eEFw+z8InDB7MhABvVBaoxRCOKs8B4xaBaW4Dw706DmygNBbqS3TwITlYEWvtNHRgQ2kJc/z4t38+7rzsxy8iaC54ijRcqmUDYDC4NhrhOiU8soEG4XRXJpohLPOMetRB6tCNcknF16mhM3tDRmIVGiN14wC9IpKHyy1XEdqnOE2okc5jqQl10sqU9qWbW1uU8HnvPMjA/nVzSteyH3I4WUqGMqWK9S/VG32kJe4hdL8cACDDjoGoiZt5biV5jPGKWMoWPE+5e2t3n9SuOIAVcqWM6bSPLjy0vzm1pf6iiA948xBtKNg3GgTxAi9ZkxwK3pvjI9jgJFJpnkvGGgVhPVKBw0s8uoSrIZrdo+PIGKP4KlnIKgEpal3uqfBaMmU59j3+I5jcz/XvOgCKKWQ2hEqS6+pkTHQCL30Ro9egP0JyZv5pCEtiXi6LOwugEdm9WgM9ToGKvtoqY06UhdEYBygR1334g5zwvknTp+mkJd1GUvzZt3mHbnPW6pHp9lt/HVK9J99RDdL+IK5qSN2U6r79TbVc0sO6NYt42G/WcMreajL1Tztp0uwzlrJWvJYXC7b8XtYdYKDOp/P538BAAD//wMANx7CC/gEAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081855_020c14a63ebe4ed7913246e59d819fa1.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081855_020c14a63ebe4ed7913246e59d819fa1.trn
new file mode 100644
index 0000000..737f2a0
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081855_020c14a63ebe4ed7913246e59d819fa1.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACoxUTW/jNhD9KwLPokLqi5SBHlIniwZpaiP2dove+DGMicikQVHOBkH++4Kysna2l96EEWfmzXtv5g05sQe0QNeHw+0RXBxQjqKdQiUpW0wqXNIt4QvKF01TVLxuK0L/RTmy9/CKFojVSlHVAa6gBVxr0mBZGYW1ho4SqknZ1KmmeBrQ4g0JW2g4WgWFH/6GMFjv0AJ9s077l9Rb2EL1ftRF8D3cuSEKpxKYm9vN/Xa1xsuakuXq99PLAYZUoLAaLRAHxTUTDAumCa5lRTEnrMKsamrOdEMMY6c06yIEJ/pi0M9nDNpHB1EtyqKsCoLLDr3nSIsoEmwpBti+HhKSiaabFM+n8PS5eENHCGhR5h+Enspdqd5e7Qc52l5fRRGeIJog9vDiwzMcRY9ydAj+ACFamPhZbbIzJEoKUpRtSQjK0YNQO+sgu7vJVn0aWAtF2rYF3BnS4lpKhnmtFdakqSVnRlakQzm6h+Cgv6j6YFXwgzcxm2nPPvVZehetG/04ZHcuwlMQ8ZT3RfQDoBytR9nbYfcIQr9u/eOY/rmxT7MsxxDAxWwt4i77Qww7tEC1qiUtqSC6MxUtOeOqMqRhlFZlVzWSc6mNIobWlJVNRQlrVdXJlilGqC41ytFqjIcxzvx/s+72+wWObbD7PegziO1E87oX0fiwv9PgojU2qXPhs8lafT/Nls2Vl70FFz9RnfC30HHJKCakSTSrDncl05gLXnYaJNTGnGgz9mn8yRYxRteVaThvZScpgdIwXhNmJNHKVKrTjQRWMsI48E4RIpuactkpooE2dRp7HbweVfzVEJRUKEePo0t7mt2lyV+sw9/b+kzKOvjole/PrPxHtaXfH/xgY5rczNJ+HeDBu/R3vgGfk699PMcg7UE2rV5HGDRMamxASVx3aQlN2+CmYaZirJVccpSjG6+eIWTJYMK6SZAPT6022XVQOxtBxTGkzv9M45y0/PKxMmcmir9ut0sf4PpwyOfob0deJAOvNtmH+J8k/zqk1zs/pCFiGC88tIHefMC6cJKG4+lY2RQsNe2Y4RxLphWuG93hTjONhaoULQlpgKWbcDJr9gjaBlBxqrc9dZt5/WTJudV1iNYIFYe0On96Ndlo9uX85FeQF6L9zD41vxButtBcqU4ybE5XczLO/zqa7+/v7z8AAAD//wMAj+SLDikGAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081856_cdeab151eead4f12b0750e21d80db1c8.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081856_cdeab151eead4f12b0750e21d80db1c8.trn
new file mode 100644
index 0000000..ced27d3
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081856_cdeab151eead4f12b0750e21d80db1c8.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACoxUTW/jNhD9KwLPokJSlEgZ6CF1smiQpjYSb7fojR/DmIgsGhSVbBDkvy8oO2tne+lNGHFm3rz3Zt7QoHaAFuhyv79+hiGNqETJzyFGWItJjRndELmgctG0FWMtE23zLyqRv4VXtECCG0NNB7iGFjC3pMG6dgZbCx0l1BLW8FxTPY5o8YaUryw8ewNVGP+GOPowoAX65gcbXnJv5SvTh8lWMfRwM4xJDSaDubp+uN2s1njJKVmufj+8HGHMBSpv0QJJMNIKJbASlmCua4olETUWdcOlsA1xQhzS/JAgDqqvRvt0wmBDGiCZBatYXRHMOvReIquSyrC1GmHzus9IZpqucrycw/Pn4g09Q0QLVn4Qeih3YXp/sRv15Ht7kVR8hOSi2sFLiE/wrHpUon0Me4jJw8zP6qE4QaKkIhVrGSGoRHfKbP0Axc1VserzwFYZ0rYt4M6RFnOtBZbcGmxJw7UUTtekQyW6hThAf1b1zpsYxuBScaS9+NRnGYbkhylMY3EzJHiMKh3yvqh+BFSi9aR7P27vQdnXTbif8r9h6vMsyylGGFKxVmlb/KHGLVogbrimjCpiO1dTJoU0tSONoLRmXd1oKbV1hjjKqWBNTYloTd3pVhhBqGUWlWg1pf2Ujvx/88P19zMcm+h3O7AnEJuZ5nWvkgtxd2NhSN75rM6Zz2Zr9f08W3GsvOw9DOkT1Rl/C53UgmJCmkyz6XDHhMVSSdZZ0MCdO9Dm/OP0ky3inOW1a6RsdacpAeaE5EQ4Taxxtelso0EwQYQE2RlCdMOp1J0hFmjD89jrGOxk0q+GoKRGJbqfhrynxU2e/MUP+HvLT6SsY0jBhP7Eyn9UW4bdPow+5cndUdqvI9yFIf893oDPyZchnWKQ96CYV4+YTjnFOeZSMMzb2mHNOom1bKRtOgaKNahEV8E8QSyywZQfZkE+PLV6KC6j2foEJk0xd/5nHueg5ZePlTkxUf11vVmGCJf7fXmM/vYsq2zg1UPxIf4nyb+O+fU2jHmIFKczDz1A7z5gnTnJwvPhWPkcZJZ2wkmJtbAG88Z2uLPCYmVqQxkhDYh8Ew5mLe7B+ggmzfU2h25HXj9Z8tjqMibvlEljXp0/g5ltdPTl8cmvIM9E+5l9aH4m3NFCx0pcznXmqzkb538dzff39/cfAAAA//8DAKMPt6spBgAA
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081858_3af34ea49dc64bf791280cf5811f449c.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_3af34ea49dc64bf791280cf5811f449c.trn
new file mode 100644
index 0000000..8c08c04
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_3af34ea49dc64bf791280cf5811f449c.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpRTy27UMBT9lcjrOPUrsZMdTEFUFWpFK0DsHN8bxiK1R45TQNX8O3JmUFt27Kwr3+Pz8hMJ9gHJQN4cDu8eMeSF1CT7bSSY6CiTVPB7ZgZuhtY0PedMaPmN1MRf428yEK2c465HKrFDqoC1dJSTowDYc8aBiVYVTPt9IcMTsb4BfPQOm7h8xrT4GMhAvvgA8Wd52/rGzXGFJsUZr8KSbXCFzOW7u+v7m1u6U5ztbt6ebi64FIDGAxmIQWdAW02tBkbVKDk1TEuqZauMhpZNWp/WfMiYgp2bBX48c4CYA2Y3iEbIhlHRk2NNwGZbaI92wfvfh8Jks+myzOttvB2HJ/KIiQyi/mvoCe7Czf7CxYcHG+Bi8sEve1KTQ4oHTNnjZsmmcp5t9jFU50d2s8eQSU1u7qrb2eYppodXPt2dpF/9h/KP1u19wOrqkgxEddibUXPKWNtRNbqe9kIDNdaIHnBENU2kJrsYsg9rXJfqKmT8njaWZCDv7bzgid+b5PY+o8trKtS/diVv/OXzLkIZMFKT2xRhdbl6tpuzhjWcyYKx5sOaq08IPqHLWDTdp/UM/8+K6AQriLs1JQy5urV5X32wy76IcmrkglsG/SS5MNo4ObFWcy5FL9vRmBEmxyauuBat5Ex3TvZjp51mHAQU3iXdaiuUbIVqOyNoN3JNlRCaju1oqXHMQGctTNK8srW6mcseWMe6rkPaT6xYO2pqFDgKrFWj0dMoWf/CknPiqmABPp5+x0ZAAO/1ZAwdNTiqWuhpDxqoddJxwViLupTwGlPA+YVPH71LcYlTrs59qV4592kN5YdXW3d++kB/bYldRvcDU1UStz6UMp9DPh6Pxz8AAAD//wMAA/VUBigEAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081858_475a8e39836e4dbfa5791fb416077c93.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_475a8e39836e4dbfa5791fb416077c93.trn
new file mode 100644
index 0000000..f763a86
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_475a8e39836e4dbfa5791fb416077c93.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpSTT2/UMBDFv0rkc5z6TxLbucG2iKpCregKEDfbM6FWU2flOAVU7XdHzi4qcOMSRSPP+L3fPL+QaJ+QDOTN4XD1jDEvpCY5bCXBRE+ZpILvmR64HjrdGKa57uVXUpNwgz/JQFTrPfcGqcQeaQuso06OngKg4YwDE11bZtpvCxleiA0N4HPw2MzLJ0xLmCMZyOcQYf5e7rah8dO8QpPmCa/jkm30Rczl1f3N/vaO7lrOdrdvTycXXMqAJgAZiEavQVlFrQJGWyc51UxJqmTXagUdG5U6tYWYMUU7NQs8vmqAOUfMfhCNkA2jwpBjTcBmW2Q7u+D+56Eo2TBdlnq9lbff4YU8YyKDqH8DPY278FO4eFrcGia4OH2zXR6L00OaD5hywI3LZnWabA5zrM437aaAMZOa3N5Xd5PN45ye/oJ1f/J//R/29+X2qx/o14ywm9eYyUB4Z0hNPlj/ECJW15dkIG2PRjvFKWNdT1vnDTVCAdVWCwPosB1HUpPdHHOI67wu1XXM+C1tBshA3tlpwZP0N8k/hIw+r6m4+tKXPNylGVafq1f+nDWs4UyWpjUf1lx9RAgJfcbib5/W87x/WkQvGCtS1pQw5urO5ofqvV0eigvfOi64ZWBGyYVW2suRdYpzKYzsnNYORs9G3nIlOsmZ6r00rldeMQ4CSE2wrLs6JUyOFhEtBQaGtp1E6gwfqVcjgtStdmNR/8qxup1KH1jP+r5HakZWWDpFdQueAutap9XoJCv8fyM5b7/VpCaAz6fnsgkQwI0ataZOgadtB4YaUECtl54LxjpUJZU3mCJOf3D6EHyal3nM1Tk71V/kPq6xPPlqy9H3EOmPbUWXs3/EVJUV2xBLus9bPR6Px18AAAD//wMAXAx0szkEAAA=
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081858_77171fc7a3af416a8435581c5d517c06.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_77171fc7a3af416a8435581c5d517c06.trn
new file mode 100644
index 0000000..afda26e
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_77171fc7a3af416a8435581c5d517c06.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpRUTU/kOBD9K5Gv2874M7ZzY4DRIsSAplu7q735owJegtNyHFiE+O8jp4GBGe1hL1FUqlf16tVzPaFk7wD16Gi/P72HVGa0QSWuIUZYhwnHjO6I7qnupW4NpVII9jfaoHgOj6hHSnhPvQHMoQMsApHY8cHjEMBQQgNhUtSa9npG/ROysQ1wHz200/wH5DlOCfXoz5jC9FB729j6cVpCm6cRztJcbPKVzMnp9nx3eYWPBSXHl58PmTPMtUAbA+qRBq+DsgpbFQgWjlOsieJYcSm0CpIMSh1gMRXIyY7tHG5/cAhTSVB8z1rGW4KZQc8bFGyxlbazM+we95XJKtNJjW/W8PrbP6F7yKhnm1dBD+U++TF+upvdEsfwaf2iDdrnaQ+5RFgVWYccR1vilJqXHsdjhFTQBn2ukO3iPcwz6tEuL/AaPU3XMcGXbO/gYcq3Xw9t26+nO7RBV3n6B3y5suUG9cgwxcCQTnTWK2oVocZLJYl3Q6eMH4ZOWjK4EBglVCtBFNVCBMm5MkSbDm3Q5ba5Gm0Zpnz3YV/bwwrO/scGtkfHp8m6ESrmix3nt5F2Nl9DQT0C7ogXghk9eOqpMHZwg/DamG5whgmmLAgKohPGGS68FUYaQ53SkjktJdqgC+tvYoLm7AT1SHRgtFMUEyI7LJw32DAVsLaamQAOxDCgDTqeUolpmZa5OUsFrvO6lHcsL7fNUfY3sYAvS656/9VVd1/lKSy+ND/cRElLWkp4BS1lv5TmG4SYwZd17JdFXm5/hrCOEVKpLDlDKk3dYPO7nesahReOMmpJMAOnTCvt+UCkopQzw6XT2oXBk4EKqpjklKjOc+M65RWhgVXrQTVvs74XaQlxmgP2lEssKA3YggxYUlDcqEGIoD/o2FyOFResJ13XATYDqVo6hbUIHgcihdNqcJyYjx59N6KuqtBWdasyr7K9uF7UfgHuDwdiJckCNWrQGjsVPBYyGGyCCth67ikjRIKq7/AccoLxnZYX0edpnobSvFi1+aDuO3Incd6P9vEXjr95Jrj0HN7yj2/A3/7q3G9LqgezWZ/AQ0z439USJ5O/hdxUS9mY6m14Q1wsY4m7mww2QLiYAvxc9HmD7sDOS4a79SSvVyJBXmmcLAdbnqWLOI5xBj+lMKOeG8Narjr1Qve/8gTRXcsEE8/Pz8/fAQAA//8DAGtTrSYABgAA
\ No newline at end of file
diff --git a/.dotnet/.dotnet/TelemetryStorageService/20260321081858_92c0643083f648be967b3bba8498efd0.trn b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_92c0643083f648be967b3bba8498efd0.trn
new file mode 100644
index 0000000..0afa739
--- /dev/null
+++ b/.dotnet/.dotnet/TelemetryStorageService/20260321081858_92c0643083f648be967b3bba8498efd0.trn
@@ -0,0 +1,5 @@
+https://dc.services.visualstudio.com/v2/track
+Content-Type:application/x-json-stream
+Content-Encoding:gzip
+
+H4sIAAAAAAAACpRUXW/cKhT8KxbPxuHDNthvuZtUjaIqUbNqr+4bcI4bFAevAKeNov3vFd6t2jxV9wWhA2c8Z2bwGwnmGclILg+H6xcMOZGaZL+VBBM9ZZIKvmd65HrsdDOwXijB/iM18bf4SkaiWue4G5BK7JG2wDpq5eQoAA6ccWCiawum+ZbI+EaMbwBfvMNmSV8wJr8EMpKvPsDyvXzb+MbNywpNXGa8CSmb4AqZq+uH2/3dPd21nO3u/jndTJgKQOOBjESj06CMokYBo62VnGqmJFWya7WCjk1Kndp8yBiDmZsET785wJIDZjeKRsiGUTGQY03AZFNoW5Nw/3ooTDaZrkq93srbdnwjLxjJKOpfgp7gLtzsL56TXf0MF6c1m/SUtnUyLi/xldTkEJcDxuxx0+gyJXy28+vepKcPpztlm65/oFszwm5ZQyYj4V1HarKJNM8m+yVUZ4672WPI22GOPiTv/oZVPLp7qO5nk6clPr/z5OEk883/UPmTcY8+YHVzVbB7HLRVnDLW9bS1bqCDUEC10WIAtNhOE6nJbgnZh3VZU3UTMn6L20hkJB/MnPDE7zK6R5/R5TWWOf/tC+/7uMDqcvXbS84a1nAmS9OaD2uuPiP4iC5jGWIf1zPel/ctoheMFSprjBhydW/yY/XRpMcyhWstF9wwGCbJhVbayYl1inMpBtlZrS1Mjk285Up0kjPVOznYXjnFOAggNcESnWpLq5K8HDDKUVnadi2juhU9FYN0egIBvR7e6VjdzaUPjGN93yMdJla0tIrqFhwF1rVWq8lKVvp+SXLOQ6tJTQBfTk9vIyCAD2rSmloFjrYdDHQABdQ46bhgrENVEn6LMeD8h06fvItLWqZcnQNSvVPu8xrK76PawvLdB/pjs+hqcU8Yq2Kx8aG8lLOrx+Px+BMAAP//AwACjRCuhQQAAA==
\ No newline at end of file
diff --git a/Cardiopulmonarybypasssystems/MainWindow.xaml b/Cardiopulmonarybypasssystems/MainWindow.xaml
index fd28943..1ff66bc 100644
--- a/Cardiopulmonarybypasssystems/MainWindow.xaml
+++ b/Cardiopulmonarybypasssystems/MainWindow.xaml
@@ -1,4 +1,4 @@
-
-
+
+
+
+
+
@@ -34,31 +47,31 @@
Foreground="White"
TextTrimming="CharacterEllipsis" />
-
+
-
+
-
+
-
+
-
+
@@ -72,8 +85,14 @@
TextTrimming="CharacterEllipsis" />
-
+
+
+
+
+
+
+
@@ -143,50 +162,50 @@
Background="#FF6B8791" />
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -334,35 +382,46 @@
-
+
+
+
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
@@ -536,75 +595,133 @@
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -620,45 +737,77 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -706,14 +855,28 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -723,52 +886,57 @@
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
@@ -986,13 +1154,18 @@
-
-
+
+
diff --git a/Cardiopulmonarybypasssystems/Models/ManufacturerLimitSettings.cs b/Cardiopulmonarybypasssystems/Models/ManufacturerLimitSettings.cs
index 9b268d6..6cef194 100644
--- a/Cardiopulmonarybypasssystems/Models/ManufacturerLimitSettings.cs
+++ b/Cardiopulmonarybypasssystems/Models/ManufacturerLimitSettings.cs
@@ -12,4 +12,4 @@ public sealed class ManufacturerLimitSettings
public double PressureDropLimit100 { get; set; } = 24;
public double AntiCollapseAllowedIncreaseRate { get; set; } = 50;
public double RecirculationAllowedLimit { get; set; } = 8;
-}
+}
\ No newline at end of file
diff --git a/Cardiopulmonarybypasssystems/Services/ModbusTelemetryService.cs b/Cardiopulmonarybypasssystems/Services/ModbusTelemetryService.cs
index 86ee28c..cc966c2 100644
--- a/Cardiopulmonarybypasssystems/Services/ModbusTelemetryService.cs
+++ b/Cardiopulmonarybypasssystems/Services/ModbusTelemetryService.cs
@@ -94,7 +94,7 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
{
_ipAddress = Environment.GetEnvironmentVariable("CPB_MODBUS_IP") ?? DefaultIpAddress;
_port = ParseIntSetting("CPB_MODBUS_PORT", DefaultPort);
- _slaveId = (byte)ParseIntSetting("CPB_MODBUS_SLAVE_ID", DefaultSlaveId);
+ _slaveId = ParseByteSetting("CPB_MODBUS_SLAVE_ID", DefaultSlaveId);
ApplyUnavailableDeviceState();
}
@@ -161,13 +161,15 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
lock (_syncRoot)
{
- var liveReadSucceeded = TryReadPumpStatesAndFlows();
- TryReadPressureChannels(liveReadSucceeded);
+ var liveReadSucceeded = TryReadPumpStatesAndFlows(out var failedFlowRegisterCount);
+ var pressureReadSucceeded = TryReadPressureChannels(liveReadSucceeded);
SyncDerivedChannels();
- if (liveReadSucceeded)
+ if (liveReadSucceeded && pressureReadSucceeded && _master is not null)
{
_lastSuccessfulReadAt = DateTime.Now;
- _lastErrorMessage = "实时数据正常";
+ _lastErrorMessage = failedFlowRegisterCount > 0
+ ? $"实时数据已更新,但有 {failedFlowRegisterCount} 路流量寄存器无数据"
+ : "实时数据正常";
}
return BuildAlarms();
@@ -297,8 +299,9 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
}
}
- private bool TryReadPumpStatesAndFlows()
+ private bool TryReadPumpStatesAndFlows(out int failedFlowRegisterCount)
{
+ failedFlowRegisterCount = 0;
if (_master is null)
{
ApplyUnavailableDeviceState();
@@ -326,11 +329,20 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
foreach (var pump in _pumpControls.Where(item => item.FlowAddress.HasValue))
{
- var registerValue = _master.ReadHoldingRegisters(_slaveId, (ushort)pump.FlowAddress!.Value, 1)[0];
- var flowValue = ConvertRegisterToFlow(registerValue);
- pump.FlowValue = flowValue;
- pump.FlowAvailable = true;
- SetChannelValue(FlowChannelNames[pump.Key], flowValue, true);
+ try
+ {
+ var registerValue = _master.ReadHoldingRegisters(_slaveId, (ushort)pump.FlowAddress!.Value, 1)[0];
+ var flowValue = ConvertRegisterToFlow(registerValue);
+ pump.FlowValue = flowValue;
+ pump.FlowAvailable = true;
+ SetChannelValue(FlowChannelNames[pump.Key], flowValue, true);
+ }
+ catch
+ {
+ failedFlowRegisterCount++;
+ pump.FlowAvailable = false;
+ SetChannelAvailability(FlowChannelNames[pump.Key], false);
+ }
}
return true;
@@ -342,13 +354,13 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
}
}
- private void TryReadPressureChannels(bool liveReadSucceeded)
+ private bool TryReadPressureChannels(bool liveReadSucceeded)
{
if (_master is null || !liveReadSucceeded)
{
SetChannelAvailability("近端压力", false);
SetChannelAvailability("远端压力", false);
- return;
+ return false;
}
try
@@ -357,10 +369,12 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
var distalRaw = _master.ReadHoldingRegisters(_slaveId, DistalPressureRegister, 1)[0];
SetChannelValue("近端压力", ConvertRegisterToPressure(proximalRaw, Channel("近端压力")), true);
SetChannelValue("远端压力", ConvertRegisterToPressure(distalRaw, Channel("远端压力")), true);
+ return true;
}
catch (Exception ex)
{
HandleConnectionFailure($"读取压力失败:{ex.Message}");
+ return false;
}
}
@@ -429,6 +443,16 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
});
}
+ foreach (var pump in _pumpControls.Where(item => item.StateAvailable && item.FlowAddress.HasValue && !item.FlowAvailable))
+ {
+ alarms.Add(new AlarmMessage
+ {
+ Timestamp = DateTime.Now,
+ Level = "中",
+ Message = $"{pump.Name} 流量寄存器 D{pump.FlowAddress!.Value} 无数据,请核对 PLC 点表和寄存器映射。"
+ });
+ }
+
return alarms;
}
@@ -495,6 +519,14 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
: fallback;
}
+ private static byte ParseByteSetting(string key, byte fallback)
+ {
+ var rawValue = Environment.GetEnvironmentVariable(key);
+ return byte.TryParse(rawValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) && parsed is >= 1 and <= 247
+ ? parsed
+ : fallback;
+ }
+
private static double ConvertRegisterToFlow(ushort rawValue) => rawValue * FlowRegisterScale;
private static double ConvertRegisterToPressure(ushort rawValue, DeviceChannel channel)
diff --git a/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs b/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs
index f2737fb..dd3fc4c 100644
--- a/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs
+++ b/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs
@@ -12,7 +12,7 @@ using QuestPDF.Fluent;
namespace Cardiopulmonarybypasssystems.ViewModels;
-public partial class MainViewModel : ObservableObject
+public partial class MainViewModel : ObservableObject, IDisposable
{
private readonly IModbusTelemetryService _telemetryService;
private readonly DispatcherTimer _timer;
@@ -214,7 +214,7 @@ public partial class MainViewModel : ObservableObject
TraceEvents.Insert(0, NewTrace("任务初始化", $"已载入 {InspectionItems.Count} 项检测标准,实时端点 {_telemetryService.EndpointDescription}"));
_timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
- _timer.Tick += (_, _) => RefreshTelemetry();
+ _timer.Tick += OnTelemetryTimerTick;
_timer.Start();
}
@@ -250,6 +250,7 @@ public partial class MainViewModel : ObservableObject
public ObservableCollection HemolysisBloodSourceOptions { get; } = new(["肝素化牛血", "肝素化猪血", "肝素化羊血"]);
public ObservableCollection HemolysisAnticoagulantOptions { get; } = new(["肝素", "枸橼酸钠", "其他"]);
public bool HasFilteredItems => !FilteredItemsView.IsEmpty;
+ public bool HasSelectedItem => SelectedItem is not null;
public IEnumerable FlowSensorChannels => Channels.Where(IsFlowSensorChannel);
public IEnumerable OtherChannels => Channels.Where(channel => !IsFlowSensorChannel(channel));
public bool IsTelemetryOnline => _telemetryService.IsLiveConnected;
@@ -364,14 +365,30 @@ public partial class MainViewModel : ObservableObject
public bool IsAntiCollapseSelected => SelectedItem?.Clause == "4.3.2";
public bool IsRecirculationSelected => SelectedItem?.Clause == "4.3.3";
public bool IsHemolysisSelected => SelectedItem?.Clause == "4.3.4";
+ public bool IsHemolysisPrimaryInputSelected => IsHemolysisSelected && string.Equals(SelectedItem?.Item, "血细胞破坏", StringComparison.Ordinal);
+ public bool IsHemolysisReductionSelected => IsHemolysisSelected && string.Equals(SelectedItem?.Item, "血小板/白细胞减少率", StringComparison.Ordinal);
public string HemolysisStandardSummary =>
- "血细胞破坏记录要点:试验介质应采用肝素化牛血、猪血或羊血;装配两个通用且等同的回路;两个回路初始血液通道试验液容积差不应超过 1%;关键条件包括血流量为制造商临床使用规定的最大值、血中葡萄糖 10 mmol/L、血红蛋白 12 g/dL;标准取样点为试验前、30 min、180 min、360 min。";
+ IsHemolysisReductionSelected
+ ? "共用记录要点:血小板/白细胞减少率与“血细胞破坏”共用同一套试样运行与取样记录,减少率以前后标准取样点的细胞计数变化计算。"
+ : "血细胞破坏记录要点:试验介质应采用肝素化牛血、猪血或羊血;装配两个通用且等同的回路;两个回路初始血液通道试验液容积差不应超过 1%;关键条件包括血流量为制造商临床使用规定的最大值、血中葡萄糖 10 mmol/L、血红蛋白 12 g/dL;标准取样点为试验前、30 min、180 min、360 min。";
public string HemolysisTemplateGuidance =>
- "录入建议:先填写试验血液准备和回路运行条件,再在下方表格录入取样数据;系统会自动汇总 ΔfHb、NIH、白细胞减少率和血小板减少率。";
+ IsHemolysisReductionSelected
+ ? "录入建议:本项复用“血细胞破坏”已维护的基础条件,仅需核对下方共用取样表和减少率计算结果,无需重复录入试样准备。"
+ : "录入建议:先填写试验血液准备和回路运行条件,再在下方表格录入取样数据;系统会自动汇总 ΔfHb、NIH、白细胞减少率和血小板减少率。";
+ public string HemolysisSharedRecordHint =>
+ IsHemolysisReductionSelected
+ ? "当前为“血小板/白细胞减少率”项目。本区沿用“血细胞破坏”同一批试样运行与取样记录,基础条件不重复录入,只核对共用记录和减少率结果。"
+ : "当前录入的试样运行与取样记录会同时服务“血细胞破坏”和“血小板/白细胞减少率”两项,建议先完成基础条件,再统一录入标准取样点。";
public string HemolysisSamplingCompletionSummary => BuildHemolysisSamplingCompletionSummary();
public bool HemolysisHasMissingRequiredPoints => GetHemolysisMissingRequiredPoints().Count > 0;
public string HemolysisRequiredPointAlert => BuildHemolysisRequiredPointAlert();
public string HemolysisCalculationSummary => BuildHemolysisCalculationSummary();
+ public string HemolysisCalculationTitle => IsHemolysisReductionSelected ? "减少率计算摘要" : "自动计算摘要";
+ public string HemolysisCalculationDetail =>
+ IsHemolysisReductionSelected
+ ? $"白细胞减少率 {FormatHemolysisDisplay(GetHemolysisWhiteCellReduction(), "F1", "%")};血小板减少率 {FormatHemolysisDisplay(GetHemolysisPlateletReduction(), "F1", "%")};{BuildHemolysisSamplingCompletionSummary()}"
+ : BuildHemolysisCalculationSummary();
+ public string HemolysisSamplingSectionTitle => IsHemolysisReductionSelected ? "共用试样运行与取样记录" : "试样运行与取样记录";
public string PressureTrendCurrentSummary => $"近端 {ProximalPressureDisplay} / 远端 {DistalPressureDisplay} / ΔP {DeltaPressureDisplay}";
public string FlowTrendCurrentSummary => BuildFlowTrendCurrentSummary();
public string HemolysisRecordTemplate =>
@@ -455,6 +472,7 @@ public partial class MainViewModel : ObservableObject
partial void OnSelectedItemChanged(InspectionItem? value)
{
+ OnPropertyChanged(nameof(HasSelectedItem));
OnPropertyChanged(nameof(SelectedItemTitle));
OnPropertyChanged(nameof(SelectedItemStatusText));
OnPropertyChanged(nameof(SelectedItemCaptureModeText));
@@ -469,12 +487,18 @@ public partial class MainViewModel : ObservableObject
OnPropertyChanged(nameof(IsAntiCollapseSelected));
OnPropertyChanged(nameof(IsRecirculationSelected));
OnPropertyChanged(nameof(IsHemolysisSelected));
+ OnPropertyChanged(nameof(IsHemolysisPrimaryInputSelected));
+ OnPropertyChanged(nameof(IsHemolysisReductionSelected));
OnPropertyChanged(nameof(HemolysisStandardSummary));
OnPropertyChanged(nameof(HemolysisTemplateGuidance));
+ OnPropertyChanged(nameof(HemolysisSharedRecordHint));
OnPropertyChanged(nameof(HemolysisSamplingCompletionSummary));
OnPropertyChanged(nameof(HemolysisHasMissingRequiredPoints));
OnPropertyChanged(nameof(HemolysisRequiredPointAlert));
+ OnPropertyChanged(nameof(HemolysisCalculationTitle));
+ OnPropertyChanged(nameof(HemolysisCalculationDetail));
OnPropertyChanged(nameof(HemolysisCalculationSummary));
+ OnPropertyChanged(nameof(HemolysisSamplingSectionTitle));
OnPropertyChanged(nameof(PressureTrendCurrentSummary));
OnPropertyChanged(nameof(FlowTrendCurrentSummary));
OnPropertyChanged(nameof(HasAntiCollapseBaseline));
@@ -498,7 +522,13 @@ public partial class MainViewModel : ObservableObject
if (value is not null)
{
LoadSelectedItemDraft(value);
+ return;
}
+
+ ResultValue = string.Empty;
+ ResultNote = string.Empty;
+ ResultOperator = OperatorName;
+ SelectedResultStatusText = "待检";
}
[RelayCommand]
@@ -827,9 +857,9 @@ public partial class MainViewModel : ObservableObject
[RelayCommand]
private void ExportReport()
{
- var outputDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
+ var outputDirectory = ResolveReportOutputDirectory();
var timestamp = DateTime.Now.ToString("yyyyMMdd-HHmmss");
- var batchToken = string.IsNullOrWhiteSpace(BatchNumber) ? "未填写批号" : BatchNumber.Trim();
+ var batchToken = string.IsNullOrWhiteSpace(BatchNumber) ? "未填写批号" : SanitizeFileNameSegment(BatchNumber.Trim());
var pdfPath = Path.Combine(outputDirectory, $"检查报告-{batchToken}-{timestamp}.pdf");
try
@@ -1060,6 +1090,7 @@ public partial class MainViewModel : ObservableObject
var filtered = FilteredItemsView.Cast().ToList();
if (filtered.Count == 0)
{
+ SelectedItem = null;
return;
}
@@ -2158,6 +2189,7 @@ public partial class MainViewModel : ObservableObject
OnPropertyChanged(nameof(HemolysisSamplingCompletionSummary));
OnPropertyChanged(nameof(HemolysisHasMissingRequiredPoints));
OnPropertyChanged(nameof(HemolysisRequiredPointAlert));
+ OnPropertyChanged(nameof(HemolysisCalculationDetail));
OnPropertyChanged(nameof(HemolysisCalculationSummary));
OnPropertyChanged(nameof(SelectedItemLiveDisplay));
@@ -2236,6 +2268,78 @@ public partial class MainViewModel : ObservableObject
private double PressureDropFlowPoint(double ratio) =>
Math.Max(RatedMaxFlow, 0) * ratio;
+ public void Dispose()
+ {
+ _timer.Stop();
+ _timer.Tick -= OnTelemetryTimerTick;
+
+ foreach (var entry in PressureDropEntries)
+ {
+ entry.PropertyChanged -= OnPressureDropEntryPropertyChanged;
+ }
+
+ foreach (var entry in KinkResistanceEntries)
+ {
+ entry.PropertyChanged -= OnKinkResistanceEntryPropertyChanged;
+ }
+
+ foreach (var entry in RecirculationEntries)
+ {
+ entry.PropertyChanged -= OnRecirculationEntryPropertyChanged;
+ }
+
+ foreach (var entry in HemolysisSamplingEntries)
+ {
+ entry.PropertyChanged -= OnHemolysisSamplingEntryPropertyChanged;
+ }
+
+ HemolysisTestParameters.PropertyChanged -= OnHemolysisTestParametersPropertyChanged;
+
+ if (_telemetryService is IDisposable disposableTelemetryService)
+ {
+ disposableTelemetryService.Dispose();
+ }
+ }
+
+ private void OnTelemetryTimerTick(object? sender, EventArgs e) => RefreshTelemetry();
+
+ private static string ResolveReportOutputDirectory()
+ {
+ foreach (var folder in new[]
+ {
+ Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
+ Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
+ Path.Combine(
+ Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
+ "Cardiopulmonarybypasssystems",
+ "Reports")
+ })
+ {
+ if (string.IsNullOrWhiteSpace(folder))
+ {
+ continue;
+ }
+
+ try
+ {
+ Directory.CreateDirectory(folder);
+ return folder;
+ }
+ catch
+ {
+ }
+ }
+
+ return AppContext.BaseDirectory;
+ }
+
+ private static string SanitizeFileNameSegment(string value)
+ {
+ var invalidChars = Path.GetInvalidFileNameChars();
+ var sanitized = new string(value.Select(ch => invalidChars.Contains(ch) ? '_' : ch).ToArray()).Trim();
+ return string.IsNullOrWhiteSpace(sanitized) ? "未填写批号" : sanitized;
+ }
+
private readonly record struct AntiCollapseComparison(
bool HasBaseline,
double BaselinePressureDrop,
diff --git a/tmp_MainWindow.xaml b/tmp_MainWindow.xaml
new file mode 100644
index 0000000..1d34880
--- /dev/null
+++ b/tmp_MainWindow.xaml
@@ -0,0 +1,1297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+