Commit: c7adfe2
Parent: b4f58a7

Add weather panel from SMHI

Mårten Åsberg committed on 2026-06-10 at 12:30
.containerfile +2 -0
diff --git a/.containerfile b/.containerfile
index c5fd6d2..17ab037 100644
@@ -6,12 +6,14 @@ COPY ./MMirror.slnx ./global.json ./dotnet-tools.json ./Directory.Packages.props
COPY ./src/Integrations/Vasttrafik/Vasttrafik.csproj ./src/Integrations/Vasttrafik/packages.lock.json ./src/Integrations/Vasttrafik/
COPY ./src/Integrations/FaceCamera/FaceCamera.csproj ./src/Integrations/FaceCamera/packages.lock.json ./src/Integrations/FaceCamera/
COPY ./src/Integrations/Smhi/Smhi.csproj ./src/Integrations/Smhi/packages.lock.json ./src/Integrations/Smhi/
COPY ./src/App/App.csproj ./src/App/packages.lock.json ./src/App/
RUN dotnet restore --locked-mode ./src/App/App.csproj
COPY ./src/Integrations/Vasttrafik/ ./src/Integrations/Vasttrafik/
COPY ./src/Integrations/FaceCamera/ ./src/Integrations/FaceCamera/
COPY ./src/Integrations/Smhi/ ./src/Integrations/Smhi/
COPY ./src/App/ ./src/App/
ARG SixLaborsLicenseKey
Directory.Packages.props +1 -0
diff --git a/Directory.Packages.props b/Directory.Packages.props
index b1dc875..115f3be 100644
@@ -36,6 +36,7 @@
/>
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="SixLabors.ImageSharp" Version="4.0.0" />
<PackageVersion Include="Svg.Controls.Skia.Avalonia" Version="12.0.0.11" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.19.1" />
</ItemGroup>
</Project>
MMirror.slnx +2 -0
diff --git a/MMirror.slnx b/MMirror.slnx
index c997e5d..5c78015 100644
@@ -4,10 +4,12 @@
</Folder>
<Folder Name="/src/Integrations/">
<Project Path="src/Integrations/FaceCamera/FaceCamera.csproj" />
<Project Path="src/Integrations/Smhi/Smhi.csproj" />
<Project Path="src/Integrations/Vasttrafik/Vasttrafik.csproj" />
</Folder>
<Folder Name="/tests/Integrations/">
<Project Path="tests/Integrations/FaceCamera/FaceCamera.csproj" />
<Project Path="tests/Integrations/Smhi/Smhi.csproj" />
<Project Path="tests/Integrations/Vasttrafik/Vasttrafik.csproj" />
</Folder>
</Solution>
src/App/App.axaml.cs +2 -1
diff --git a/src/App/App.axaml.cs b/src/App/App.axaml.cs
index 2b8b7e3..b6109de 100644
@@ -7,6 +7,7 @@ using Microsoft.Extensions.Hosting;
using MMirror.App.ViewModels;
using MMirror.App.Views;
using MMirror.Integrations.FaceCamera;
using MMirror.Integrations.Smhi;
using MMirror.Integrations.Vasttrafik;
namespace MMirror.App;
@@ -26,7 +27,7 @@ public partial class App : Application
#if DEBUG
builder.Configuration.AddUserSecrets<App>();
#endif
builder.Services.AddViews().AddViewModels().AddVasttrafikServices().AddFaceCameraServices();
builder.Services.AddViews().AddViewModels().AddSmhiServices().AddVasttrafikServices().AddFaceCameraServices();
host = builder.Build();
src/App/App.csproj +3 -1
diff --git a/src/App/App.csproj b/src/App/App.csproj
index 44dd362..b0526a5 100644
@@ -7,9 +7,10 @@
<UserSecretsId>97e2d350-b20e-4c6b-b7cd-35a8f3ec03fa</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<AvaloniaResource Include="Assets\**" />
<AvaloniaResource Include="Assets\**\*" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Integrations\Smhi\Smhi.csproj" />
<ProjectReference Include="..\Integrations\Vasttrafik\Vasttrafik.csproj" />
<ProjectReference Include="..\Integrations\FaceCamera\FaceCamera.csproj" />
</ItemGroup>
@@ -29,5 +30,6 @@
<PackageReference Include="CommunityToolkit.Mvvm" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.ML.OnnxRuntime" />
<PackageReference Include="Svg.Controls.Skia.Avalonia" />
</ItemGroup>
</Project>
src/App/Assets/smhi/1.svg +5 -0
diff --git a/src/App/Assets/smhi/1.svg b/src/App/Assets/smhi/1.svg
new file mode 100644
index 0000000..dc6b6fb
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="M17 23.79c-3.742 0-6.79-3.048-6.79-6.79s3.048-6.79 6.79-6.79 6.79 3.048 6.79 6.79-3.048 6.79-6.79 6.79m0-14.977c-4.516 0-8.187 3.671-8.187 8.187s3.671 8.188 8.187 8.188 8.188-3.672 8.188-8.188S21.516 8.813 17 8.813M17 6.672a.7.7 0 0 1-.7-.703v-3.39a.7.7 0 1 1 1.4 0v3.39a.7.7 0 0 1-.7.703M17 32.125a.7.7 0 0 1-.7-.7v-3.394c0-.386.313-.703.7-.703s.7.317.7.703v3.395c0 .387-.313.699-.7.699M24.8 9.902a.701.701 0 0 1-.495-1.195l2.398-2.402a.703.703 0 0 1 .992.992l-2.402 2.398a.7.7 0 0 1-.492.207M6.8 27.898a.7.7 0 0 1-.495-.203.703.703 0 0 1 0-.992l2.402-2.398a.698.698 0 1 1 .988.988l-2.398 2.402a.7.7 0 0 1-.496.203M9.2 9.902a.7.7 0 0 1-.493-.207L6.305 7.297a.703.703 0 0 1 .992-.992l2.398 2.402A.701.701 0 0 1 9.2 9.902M27.2 27.898a.7.7 0 0 1-.497-.203l-2.398-2.402a.698.698 0 1 1 .988-.988l2.402 2.398a.703.703 0 0 1 0 .992.7.7 0 0 1-.496.203M5.969 17.7h-3.39a.7.7 0 1 1 0-1.4h3.39c.386 0 .703.313.703.7s-.317.7-.703.7M31.422 17.7h-3.39a.7.7 0 0 1-.704-.7c0-.387.317-.7.703-.7h3.39a.7.7 0 1 1 0 1.4"
style="stroke:none;fill-rule:nonzero;fill:currentColor" />
</svg>
src/App/Assets/smhi/10.svg +19 -0
diff --git a/src/App/Assets/smhi/10.svg b/src/App/Assets/smhi/10.svg
new file mode 100644
index 0000000..26ecba6
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.863a6.32 6.32 0 0 0-6.238 5.32 3.9 3.9 0 0 0-2.074-.585 3.984 3.984 0 0 0-3.992 3.988 3.95 3.95 0 0 0 2.582 3.727h11.21a6.31 6.31 0 0 0 4.829-6.133 6.32 6.32 0 0 0-6.317-6.317"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.313a3.95 3.95 0 0 1-2.582-3.727 3.986 3.986 0 0 1 6.066-3.402 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133ZM23.027 9.46a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.268 3.496 5.038l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.46-7.72-7.715-7.72M10.7 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348M15.598 33.512a.699.699 0 0 1-.602-1.055l3.5-6a.7.7 0 0 1 .957-.25c.332.195.45.621.25.957l-3.5 6a.7.7 0 0 1-.605.348M20.5 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.253-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 14.094a6.08 6.08 0 0 1 6.073-6.074c3.348 0 6.07 2.726 6.07 6.074s-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.352-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.926a.7.7 0 0 1-.703-.7V1.189a.702.702 0 0 1 1.402 0v3.039c0 .386-.312.699-.699.699M23.84 7.816a.701.701 0 0 1-.496-1.195l2.148-2.148a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .992l-2.148 2.144a.7.7 0 0 1-.496.207M9.883 7.816a.7.7 0 0 1-.496-.207L7.242 5.465a.703.703 0 0 1 0-.992.7.7 0 0 1 .988 0L10.38 6.62a.701.701 0 0 1-.496 1.195M6.992 14.793H3.957a.699.699 0 1 1 0-1.398h3.035a.699.699 0 1 1 0 1.398"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.313a3.95 3.95 0 0 1-2.582-3.727 3.986 3.986 0 0 1 6.066-3.402 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133ZM23.027 9.46a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.268 3.496 5.038l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.46-7.72-7.715-7.72M10.7 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348M15.598 33.512a.699.699 0 0 1-.602-1.055l3.5-6a.7.7 0 0 1 .957-.25c.332.195.45.621.25.957l-3.5 6a.7.7 0 0 1-.605.348M20.5 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.253-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/11.svg +28 -0
diff --git a/src/App/Assets/smhi/11.svg b/src/App/Assets/smhi/11.svg
new file mode 100644
index 0000000..b8890f3
@@ -0,0 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask1">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.375a6.32 6.32 0 0 0-6.238 5.32 3.9 3.9 0 0 0-2.074-.586 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.726h11.21a6.31 6.31 0 0 0 4.829-6.133 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 22.824a3.95 3.95 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.586a6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.253-3.46-7.718-7.715-7.718M16.934 33.023a.7.7 0 0 1-.352-.097.7.7 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.499 6a.7.7 0 0 1-.605.347M21.832 33.023a.7.7 0 0 1-.602-1.055l3.5-6a.7.7 0 0 1 1.207.707l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
<mask id="mask2">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M11.031 34a.7.7 0 0 1-.344-.094.7.7 0 0 1-.261-.953l3.238-5.664-3.492.695a.7.7 0 0 1-.727-1.062l5.5-8.504a.7.7 0 0 1 1.176.762l-4.598 7.11 3.372-.677a.701.701 0 0 1 .746 1.035l-4 7a.7.7 0 0 1-.61.352"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 13.605a6.08 6.08 0 0 1 6.073-6.074c3.348 0 6.07 2.727 6.07 6.074s-2.722 6.075-6.07 6.075a6.08 6.08 0 0 1-6.074-6.075m6.074-7.472c-4.12 0-7.472 3.351-7.472 7.472s3.351 7.473 7.472 7.473 7.473-3.351 7.473-7.473c0-4.12-3.352-7.472-7.473-7.472M16.863 4.438a.7.7 0 0 1-.703-.7V.7a.702.702 0 0 1 1.402 0v3.04c0 .386-.312.699-.699.699M23.84 7.328a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.12a.7.7 0 0 1-.496.207M9.883 7.328a.7.7 0 0 1-.496-.207L7.242 4.977a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.305H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask1)" />
<path
d="M13.305 22.824a3.95 3.95 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.586a6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.253-3.46-7.718-7.715-7.718M16.934 33.023a.7.7 0 0 1-.352-.097.7.7 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.499 6a.7.7 0 0 1-.605.347M21.832 33.023a.7.7 0 0 1-.602-1.055l3.5-6a.7.7 0 0 1 1.207.707l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask2)" />
<path
d="M11.031 34a.7.7 0 0 1-.344-.094.7.7 0 0 1-.261-.953l3.238-5.664-3.492.695a.7.7 0 0 1-.727-1.062l5.5-8.504a.7.7 0 0 1 1.176.762l-4.598 7.11 3.372-.677a.701.701 0 0 1 .746 1.035l-4 7a.7.7 0 0 1-.61.352"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/12.svg +19 -0
diff --git a/src/App/Assets/smhi/12.svg b/src/App/Assets/smhi/12.svg
new file mode 100644
index 0000000..bf5be7c
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.664a6.32 6.32 0 0 0-6.238 5.316 3.94 3.94 0 0 0-2.074-.582 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.722h11.21a6.3 6.3 0 0 0 4.829-6.129 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718M18.152 30.805l-1.71-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.949-.258l-1.71.993v-1.985a.7.7 0 0 0-.696-.703.7.7 0 0 0-.696.703v1.985l-1.71-.993a.695.695 0 0 0-.954.258.7.7 0 0 0 .258.953l1.707.997-1.707.992a.702.702 0 0 0 .348 1.308.7.7 0 0 0 .348-.093l1.71-.997v1.989a.695.695 0 1 0 1.391 0v-1.989l1.711.997q.166.093.348.093a.7.7 0 0 0 .601-.351.705.705 0 0 0-.254-.957M20.598 33.71a.73.73 0 0 1-.352-.093.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 13.895a6.08 6.08 0 0 1 6.073-6.075 6.077 6.077 0 0 1 6.07 6.075c0 3.347-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.351-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.727a.705.705 0 0 1-.703-.704V.988a.702.702 0 0 1 1.402 0v3.035a.7.7 0 0 1-.699.704M23.84 7.617a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.41a.7.7 0 0 1-.496.207M9.883 7.617a.7.7 0 0 1-.496-.207L7.242 5.266a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.594H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718M18.152 30.805l-1.71-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.949-.258l-1.71.993v-1.985a.7.7 0 0 0-.696-.703.7.7 0 0 0-.696.703v1.985l-1.71-.993a.695.695 0 0 0-.954.258.7.7 0 0 0 .258.953l1.707.997-1.707.992a.702.702 0 0 0 .348 1.308.7.7 0 0 0 .348-.093l1.71-.997v1.989a.695.695 0 1 0 1.391 0v-1.989l1.711.997q.166.093.348.093a.7.7 0 0 0 .601-.351.705.705 0 0 0-.254-.957M20.598 33.71a.73.73 0 0 1-.352-.093.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/13.svg +19 -0
diff --git a/src/App/Assets/smhi/13.svg b/src/App/Assets/smhi/13.svg
new file mode 100644
index 0000000..2f7b5fd
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.664a6.32 6.32 0 0 0-6.238 5.316 3.94 3.94 0 0 0-2.074-.582 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.722h11.21a6.3 6.3 0 0 0 4.829-6.129 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718M14.5 30.805l-1.707-.992 1.707-.997a.7.7 0 0 0 .258-.953.694.694 0 0 0-.953-.258l-1.707.993v-1.985a.7.7 0 0 0-.7-.703.7.7 0 0 0-.695.703v1.985l-1.71-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .254.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .602.351.7.7 0 0 0 .347-.093l1.711-.997v1.989a.698.698 0 1 0 1.395 0v-1.989l1.707.997a.702.702 0 0 0 .695-1.215M16.95 33.71a.699.699 0 0 1-.605-1.05l3.499-6a.706.706 0 0 1 .96-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.348M21.848 33.71a.73.73 0 0 1-.352-.093.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 13.895a6.08 6.08 0 0 1 6.073-6.075 6.077 6.077 0 0 1 6.07 6.075c0 3.347-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.351-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.727a.705.705 0 0 1-.703-.704V.988a.702.702 0 0 1 1.402 0v3.035a.7.7 0 0 1-.699.704M23.84 7.617a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.41a.7.7 0 0 1-.496.207M9.883 7.617a.7.7 0 0 1-.496-.207L7.242 5.266a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.594H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718M14.5 30.805l-1.707-.992 1.707-.997a.7.7 0 0 0 .258-.953.694.694 0 0 0-.953-.258l-1.707.993v-1.985a.7.7 0 0 0-.7-.703.7.7 0 0 0-.695.703v1.985l-1.71-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .254.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .602.351.7.7 0 0 0 .347-.093l1.711-.997v1.989a.698.698 0 1 0 1.395 0v-1.989l1.707.997a.702.702 0 0 0 .695-1.215M16.95 33.71a.699.699 0 0 1-.605-1.05l3.499-6a.706.706 0 0 1 .96-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.348M21.848 33.71a.73.73 0 0 1-.352-.093.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/14.svg +19 -0
diff --git a/src/App/Assets/smhi/14.svg b/src/App/Assets/smhi/14.svg
new file mode 100644
index 0000000..5875702
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.664a6.32 6.32 0 0 0-6.238 5.316 3.94 3.94 0 0 0-2.074-.582 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.722h11.21a6.3 6.3 0 0 0 4.829-6.129 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718M22.102 30.805l-1.711-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.949-.258l-1.71.993v-1.985A.7.7 0 0 0 19 25.91a.7.7 0 0 0-.695.703v1.985l-1.711-.993a.69.69 0 0 0-.95.258.697.697 0 0 0 .254.953l1.711.997-1.71.992a.701.701 0 0 0 .695 1.215l1.71-.997v1.989a.695.695 0 1 0 1.391 0v-1.989l1.711.997c.11.062.23.093.348.093a.7.7 0 0 0 .601-.351.705.705 0 0 0-.253-.957M13.8 30.805l-1.706-.992 1.707-.997a.705.705 0 0 0 .258-.953.695.695 0 0 0-.954-.258l-1.71.993v-1.985a.7.7 0 0 0-.696-.703.7.7 0 0 0-.695.703v1.985l-1.711-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .255.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .601.351.7.7 0 0 0 .348-.093l1.71-.997v1.989a.695.695 0 1 0 1.39 0l.002-1.989 1.71.997a.702.702 0 0 0 .953-.258.71.71 0 0 0-.257-.957M24.55 33.71a.73.73 0 0 1-.355-.093.7.7 0 0 1-.25-.957l3.5-6a.697.697 0 1 1 1.207.703l-3.5 6a.7.7 0 0 1-.601.348"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 13.895a6.08 6.08 0 0 1 6.073-6.075 6.077 6.077 0 0 1 6.07 6.075c0 3.347-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.351-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.727a.705.705 0 0 1-.703-.704V.988a.702.702 0 0 1 1.402 0v3.035a.7.7 0 0 1-.699.704M23.84 7.617a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.41a.7.7 0 0 1-.496.207M9.883 7.617a.7.7 0 0 1-.496-.207L7.242 5.266a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.594H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718M22.102 30.805l-1.711-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.949-.258l-1.71.993v-1.985A.7.7 0 0 0 19 25.91a.7.7 0 0 0-.695.703v1.985l-1.711-.993a.69.69 0 0 0-.95.258.697.697 0 0 0 .254.953l1.711.997-1.71.992a.701.701 0 0 0 .695 1.215l1.71-.997v1.989a.695.695 0 1 0 1.391 0v-1.989l1.711.997c.11.062.23.093.348.093a.7.7 0 0 0 .601-.351.705.705 0 0 0-.253-.957M13.8 30.805l-1.706-.992 1.707-.997a.705.705 0 0 0 .258-.953.695.695 0 0 0-.954-.258l-1.71.993v-1.985a.7.7 0 0 0-.696-.703.7.7 0 0 0-.695.703v1.985l-1.711-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .255.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .601.351.7.7 0 0 0 .348-.093l1.71-.997v1.989a.695.695 0 1 0 1.39 0l.002-1.989 1.71.997a.702.702 0 0 0 .953-.258.71.71 0 0 0-.257-.957M24.55 33.71a.73.73 0 0 1-.355-.093.7.7 0 0 1-.25-.957l3.5-6a.697.697 0 1 1 1.207.703l-3.5 6a.7.7 0 0 1-.601.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/15.svg +22 -0
diff --git a/src/App/Assets/smhi/15.svg b/src/App/Assets/smhi/15.svg
new file mode 100644
index 0000000..c381f2c
@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.664a6.32 6.32 0 0 0-6.238 5.316 3.94 3.94 0 0 0-2.074-.582 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.722h11.21a6.3 6.3 0 0 0 4.829-6.129 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="m22.004 30.805-1.711-.992 1.71-.997a.7.7 0 0 0-.698-1.21l-1.707.992v-1.985a.7.7 0 0 0-.7-.703.7.7 0 0 0-.695.703v1.985l-1.71-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .254.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .602.351.7.7 0 0 0 .347-.093l1.711-.997v1.989a.698.698 0 1 0 1.395 0v-1.989l1.707.997q.17.093.347.093a.702.702 0 0 0 .352-1.308"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.79 13.895a6.08 6.08 0 0 1 6.073-6.075 6.077 6.077 0 0 1 6.07 6.075c0 3.347-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.351-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.727a.705.705 0 0 1-.703-.704V.988a.702.702 0 0 1 1.402 0v3.035a.7.7 0 0 1-.699.704M23.84 7.617a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.41a.7.7 0 0 1-.496.207M9.883 7.617a.7.7 0 0 1-.496-.207L7.242 5.266a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.594H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/16.svg +22 -0
diff --git a/src/App/Assets/smhi/16.svg b/src/App/Assets/smhi/16.svg
new file mode 100644
index 0000000..7e508c4
@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.664a6.32 6.32 0 0 0-6.238 5.316 3.94 3.94 0 0 0-2.074-.582 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.722h11.21a6.3 6.3 0 0 0 4.829-6.129 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="m26.254 30.805-1.711-.992 1.71-.997a.7.7 0 0 0-.698-1.21l-1.707.992v-1.985a.7.7 0 0 0-.7-.703.7.7 0 0 0-.695.703v1.985l-1.71-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .254.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .602.351.7.7 0 0 0 .347-.093l1.711-.997v1.989a.698.698 0 1 0 1.395 0v-1.989l1.707.997q.17.093.347.093a.702.702 0 0 0 .352-1.308M17.953 30.805l-1.71-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.95-.258l-1.71.993v-1.985a.7.7 0 0 0-.695-.703c-.387 0-.7.317-.7.703v1.985l-1.71-.993a.698.698 0 0 0-.691 1.21l1.706.998-1.707.992a.702.702 0 0 0 .348 1.308.7.7 0 0 0 .343-.093l1.711-.997v1.989a.699.699 0 1 0 1.395 0v-1.989l1.71.997q.166.093.348.093a.7.7 0 0 0 .602-.351.705.705 0 0 0-.254-.957"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.79 13.895a6.08 6.08 0 0 1 6.073-6.075 6.077 6.077 0 0 1 6.07 6.075c0 3.347-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.351-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.727a.705.705 0 0 1-.703-.704V.988a.702.702 0 0 1 1.402 0v3.035a.7.7 0 0 1-.699.704M23.84 7.617a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.41a.7.7 0 0 1-.496.207M9.883 7.617a.7.7 0 0 1-.496-.207L7.242 5.266a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.594H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/17.svg +22 -0
diff --git a/src/App/Assets/smhi/17.svg b/src/App/Assets/smhi/17.svg
new file mode 100644
index 0000000..4fe73e6
@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.664a6.32 6.32 0 0 0-6.238 5.316 3.94 3.94 0 0 0-2.074-.582 3.984 3.984 0 0 0-3.992 3.989 3.95 3.95 0 0 0 2.582 3.722h11.21a6.3 6.3 0 0 0 4.829-6.129 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="m21.953 30.805-1.71-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.95-.258l-1.71.993v-1.985a.7.7 0 0 0-.695-.703c-.387 0-.7.317-.7.703v1.985l-1.71-.993a.698.698 0 0 0-.691 1.21l1.706.998-1.707.992a.702.702 0 0 0 .348 1.308.7.7 0 0 0 .343-.093l1.711-.997v1.989a.699.699 0 1 0 1.395 0v-1.989l1.71.997q.166.093.348.093a.7.7 0 0 0 .602-.351.705.705 0 0 0-.254-.957M30.254 30.805l-1.711-.992 1.71-.997a.7.7 0 0 0-.698-1.21l-1.707.992v-1.985a.7.7 0 0 0-.7-.703.7.7 0 0 0-.695.703v1.985l-1.71-.993a.69.69 0 0 0-.95.258.7.7 0 0 0 .254.953l1.71.997-1.71.992a.705.705 0 0 0-.254.957.7.7 0 0 0 .602.351.7.7 0 0 0 .347-.093l1.711-.997v1.989a.698.698 0 1 0 1.395 0v-1.989l1.707.997q.17.093.347.093a.702.702 0 0 0 .352-1.308M13.652 30.805l-1.71-.992 1.71-.997a.7.7 0 0 0 .254-.953.69.69 0 0 0-.949-.258l-1.71.993v-1.985a.7.7 0 0 0-.696-.703.7.7 0 0 0-.696.703v1.985l-1.71-.993a.695.695 0 0 0-.954.258.7.7 0 0 0 .258.953l1.707.997-1.707.992a.702.702 0 0 0 .348 1.308.7.7 0 0 0 .348-.093l1.71-.997v1.989a.695.695 0 1 0 1.391 0v-1.989l1.711.997q.166.093.348.093a.7.7 0 0 0 .601-.351.705.705 0 0 0-.254-.957"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.79 13.895a6.08 6.08 0 0 1 6.073-6.075 6.077 6.077 0 0 1 6.07 6.075c0 3.347-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.351-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.727a.705.705 0 0 1-.703-.704V.988a.702.702 0 0 1 1.402 0v3.035a.7.7 0 0 1-.699.704M23.84 7.617a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .993L24.336 7.41a.7.7 0 0 1-.496.207M9.883 7.617a.7.7 0 0 1-.496-.207L7.242 5.266a.703.703 0 0 1 0-.993.7.7 0 0 1 .988 0l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 14.594H3.957a.699.699 0 1 1 0-1.399h3.035a.699.699 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.113a3.96 3.96 0 0 1-2.582-3.726 3.986 3.986 0 0 1 3.992-3.989c.758 0 1.476.211 2.074.582a6.32 6.32 0 0 1 6.238-5.316 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.851a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.406 4.27 3.496 5.039l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.492c0-4.257-3.46-7.718-7.715-7.718"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/18.svg +8 -0
diff --git a/src/App/Assets/smhi/18.svg b/src/App/Assets/smhi/18.svg
new file mode 100644
index 0000000..b4a1579
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="M14.25 29.023a.699.699 0 0 1-.605-1.05l3.5-6a.7.7 0 0 1 .957-.254c.335.195.449.625.253.957l-3.5 6a.7.7 0 0 1-.605.347"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.27 18.824a3.95 3.95 0 0 1-2.579-3.722 3.986 3.986 0 0 1 6.063-3.407c.48-3.004 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.32 6.3 6.3 0 0 1-4.829 6.13Zm9.722-13.847a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27 5.39 5.39 0 0 0 3.496 5.039l.235.086h11.628l.16-.04a7.68 7.68 0 0 0 5.903-7.492c0-4.257-3.461-7.718-7.719-7.718"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/19.svg +8 -0
diff --git a/src/App/Assets/smhi/19.svg b/src/App/Assets/smhi/19.svg
new file mode 100644
index 0000000..19355b4
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="M11.797 29.023a.73.73 0 0 1-.352-.093.7.7 0 0 1-.25-.957l3.5-6a.697.697 0 1 1 1.207.703l-3.5 6a.7.7 0 0 1-.605.347M16.7 29.023a.699.699 0 0 1-.605-1.05l3.499-6a.706.706 0 0 1 .96-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.347"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.27 18.824a3.95 3.95 0 0 1-2.579-3.722 3.986 3.986 0 0 1 6.063-3.407c.48-3.004 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.32 6.3 6.3 0 0 1-4.829 6.13Zm9.722-13.847a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27 5.39 5.39 0 0 0 3.496 5.039l.235.086h11.628l.16-.04a7.68 7.68 0 0 0 5.903-7.492c0-4.257-3.461-7.718-7.719-7.718"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/2.svg +20 -0
diff --git a/src/App/Assets/smhi/2.svg b/src/App/Assets/smhi/2.svg
new file mode 100644
index 0000000..fafca43
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.277 21.5a3.89 3.89 0 0 0-3.84 3.273 2.454 2.454 0 0 0-3.734 2.098c0 1.055.656 1.945 1.59 2.29h6.898a3.876 3.876 0 0 0 2.973-3.77 3.893 3.893 0 0 0-3.887-3.891"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M17.293 29.16a2.43 2.43 0 0 1-1.59-2.289 2.454 2.454 0 0 1 3.735-2.098 3.89 3.89 0 0 1 3.84-3.273 3.893 3.893 0 0 1 3.886 3.89 3.876 3.876 0 0 1-2.973 3.77Zm5.984-9.058a5.27 5.27 0 0 0-4.742 2.93 3.858 3.858 0 0 0-4.23 3.84 3.85 3.85 0 0 0 2.504 3.605l.234.085h7.316l.16-.039a5.26 5.26 0 0 0 4.044-5.132 5.29 5.29 0 0 0-5.286-5.29"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M17 25.348c-3.742 0-6.79-3.043-6.79-6.785s3.048-6.79 6.79-6.79 6.79 3.047 6.79 6.79-3.048 6.785-6.79 6.785m0-14.973c-4.516 0-8.187 3.672-8.187 8.188 0 4.515 3.671 8.187 8.187 8.187s8.188-3.672 8.188-8.187c0-4.516-3.672-8.188-8.188-8.188M17 8.23a.7.7 0 0 1-.7-.699V4.137a.699.699 0 1 1 1.4 0V7.53c0 .387-.313.7-.7.7M24.8 11.465a.701.701 0 0 1-.495-1.195l2.398-2.403a.703.703 0 0 1 .992.992l-2.402 2.399a.7.7 0 0 1-.492.207M6.8 29.46a.7.7 0 0 1-.495-.202.703.703 0 0 1 0-.992l2.402-2.399a.698.698 0 1 1 .988.988l-2.398 2.403a.7.7 0 0 1-.496.203M9.2 11.465a.7.7 0 0 1-.493-.207L6.305 8.859a.703.703 0 0 1 .992-.992l2.398 2.403a.701.701 0 0 1-.496 1.195M5.969 19.262h-3.39a.7.7 0 1 1 0-1.399h3.39c.386 0 .703.313.703.7s-.317.699-.703.699M31.422 19.262h-3.39a.7.7 0 0 1-.704-.7c0-.386.317-.699.703-.699h3.39a.7.7 0 1 1 0 1.399"
style="stroke:none;fill-rule:nonzero;fill:currentColor;"
mask="url(#mask)" />
<path
d="M17.293 29.16a2.43 2.43 0 0 1-1.59-2.289 2.454 2.454 0 0 1 3.735-2.098 3.89 3.89 0 0 1 3.84-3.273 3.893 3.893 0 0 1 3.886 3.89 3.876 3.876 0 0 1-2.973 3.77Zm5.984-9.058a5.27 5.27 0 0 0-4.742 2.93 3.858 3.858 0 0 0-4.23 3.84 3.85 3.85 0 0 0 2.504 3.605l.234.085h7.316l.16-.039a5.26 5.26 0 0 0 4.044-5.132 5.29 5.29 0 0 0-5.286-5.29"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/20.svg +8 -0
diff --git a/src/App/Assets/smhi/20.svg b/src/App/Assets/smhi/20.svg
new file mode 100644
index 0000000..c395cec
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="M7.7 29.023a.699.699 0 0 1-.605-1.05l3.499-6a.7.7 0 0 1 .957-.254c.336.195.449.625.254.957l-3.5 6a.7.7 0 0 1-.606.347M12.598 29.023a.7.7 0 0 1-.352-.093.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.605.347M17.5 29.023a.699.699 0 0 1-.605-1.05l3.5-6a.7.7 0 0 1 .957-.254c.335.195.449.625.253.957l-3.5 6a.7.7 0 0 1-.605.347"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.27 18.824a3.95 3.95 0 0 1-2.579-3.722 3.986 3.986 0 0 1 6.063-3.407c.48-3.004 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.32 6.3 6.3 0 0 1-4.829 6.13Zm9.722-13.847a7.68 7.68 0 0 0-7.172 4.855 5.396 5.396 0 0 0-6.531 5.27 5.39 5.39 0 0 0 3.496 5.039l.235.086h11.628l.16-.04a7.68 7.68 0 0 0 5.903-7.492c0-4.257-3.461-7.718-7.719-7.718"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/21.svg +16 -0
diff --git a/src/App/Assets/smhi/21.svg b/src/App/Assets/smhi/21.svg
new file mode 100644
index 0000000..5ffe0ec
@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M8 29.512a.7.7 0 0 1-.348-.09.703.703 0 0 1-.261-.957l3.238-5.664-3.492.699a.69.69 0 0 1-.715-.293.69.69 0 0 1-.008-.773l5.5-8.5a.696.696 0 0 1 .965-.207c.328.207.418.64.207.964l-4.598 7.11 3.375-.676a.702.702 0 0 1 .746 1.035l-4 7a.7.7 0 0 1-.609.352"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.27 18.336a3.95 3.95 0 0 1-2.579-3.723 3.984 3.984 0 0 1 6.063-3.406c.48-3.008 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.316 6.3 6.3 0 0 1-4.829 6.133Zm9.722-13.848a7.675 7.675 0 0 0-7.172 4.856 5.396 5.396 0 0 0-6.531 5.27 5.38 5.38 0 0 0 3.496 5.034l.235.086h11.628l.16-.039a7.675 7.675 0 0 0 5.903-7.492c0-4.254-3.461-7.715-7.719-7.715M13.898 28.535a.73.73 0 0 1-.351-.094.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.7.7 0 0 1-.606.348M18.8 28.535a.699.699 0 0 1-.605-1.05l3.5-6a.7.7 0 0 1 .957-.255c.336.196.45.622.254.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M8 29.512a.7.7 0 0 1-.348-.09.703.703 0 0 1-.261-.957l3.238-5.664-3.492.699a.69.69 0 0 1-.715-.293.69.69 0 0 1-.008-.773l5.5-8.5a.696.696 0 0 1 .965-.207c.328.207.418.64.207.964l-4.598 7.11 3.375-.676a.702.702 0 0 1 .746 1.035l-4 7a.7.7 0 0 1-.609.352"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/22.svg +8 -0
diff --git a/src/App/Assets/smhi/22.svg b/src/App/Assets/smhi/22.svg
new file mode 100644
index 0000000..8de5600
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="m15.152 26.316-1.71-.992 1.71-.992a.705.705 0 0 0 .254-.957.693.693 0 0 0-.949-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.002 1.984-1.71-.992a.699.699 0 1 0-.696 1.215l1.707.992-1.707.992a.703.703 0 0 0-.258.957.694.694 0 0 0 .954.258l1.71-.992v1.984a.695.695 0 1 0 1.391 0V26.54l1.711.992a.694.694 0 0 0 .95-.258.705.705 0 0 0-.255-.957M17.598 29.223a.7.7 0 0 1-.352-.094.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.69.69 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.27 18.625a3.95 3.95 0 0 1-2.579-3.723 3.984 3.984 0 0 1 6.063-3.406c.48-3.008 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.316 6.3 6.3 0 0 1-4.829 6.133Zm9.722-13.848a7.675 7.675 0 0 0-7.172 4.856 5.396 5.396 0 0 0-6.531 5.27 5.38 5.38 0 0 0 3.496 5.034l.235.086h11.628l.16-.039a7.675 7.675 0 0 0 5.903-7.492c0-4.254-3.461-7.715-7.719-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/23.svg +8 -0
diff --git a/src/App/Assets/smhi/23.svg b/src/App/Assets/smhi/23.svg
new file mode 100644
index 0000000..754da75
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="m12.172 26.316-1.711-.992 1.71-.992a.705.705 0 0 0 .255-.957.693.693 0 0 0-.95-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.001 1.984-1.71-.992a.701.701 0 0 0-.695 1.215l1.71.992-1.711.992a.7.7 0 0 0-.254.957.687.687 0 0 0 .95.258l1.71-.992v1.984a.695.695 0 1 0 1.39 0V26.54l1.712.992a.694.694 0 0 0 .949-.258.705.705 0 0 0-.254-.957M14.617 29.223a.7.7 0 0 1-.351-.094.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .957-.254.7.7 0 0 1 .25.957l-3.5 6a.69.69 0 0 1-.606.348M19.52 29.223a.699.699 0 0 1-.605-1.05l3.5-6.001a.706.706 0 0 1 .96-.254.7.7 0 0 1 .25.957l-3.5 6a.69.69 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.941 18.625a3.95 3.95 0 0 1-2.582-3.723 3.984 3.984 0 0 1 3.993-3.992c.757 0 1.476.215 2.074.586a6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.316 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.723-13.848a7.67 7.67 0 0 0-7.172 4.856 5.396 5.396 0 0 0-6.531 5.27 5.38 5.38 0 0 0 3.496 5.034l.234.086h11.63l.16-.039a7.676 7.676 0 0 0 5.898-7.492c0-4.254-3.461-7.715-7.715-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/24.svg +8 -0
diff --git a/src/App/Assets/smhi/24.svg b/src/App/Assets/smhi/24.svg
new file mode 100644
index 0000000..9bcb024
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="m20.105 26.316-1.71-.992 1.71-.992a.705.705 0 0 0 .254-.957.693.693 0 0 0-.949-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.001 1.984-1.711-.992a.699.699 0 1 0-.696 1.215l1.707.992-1.707.992a.703.703 0 0 0-.257.957.694.694 0 0 0 .953.258l1.71-.992v1.984a.695.695 0 1 0 1.391 0V26.54l1.711.992a.694.694 0 0 0 .95-.258.705.705 0 0 0-.255-.957M11.805 26.316l-1.711-.992 1.71-.992a.705.705 0 0 0 .255-.957.693.693 0 0 0-.95-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.001 1.984-1.711-.992a.701.701 0 0 0-.695 1.215l1.71.992-1.71.992a.702.702 0 0 0 .347 1.309.7.7 0 0 0 .348-.094l1.71-.992v1.984a.695.695 0 1 0 1.391 0V26.54l1.711.992a.692.692 0 0 0 .95-.258.705.705 0 0 0-.254-.957M22.55 29.223a.7.7 0 0 1-.35-.094.7.7 0 0 1-.25-.957l3.5-6a.7.7 0 0 1 .956-.254.7.7 0 0 1 .25.957l-3.5 6a.69.69 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M11.309 18.625a3.95 3.95 0 0 1-2.582-3.723 3.984 3.984 0 0 1 6.066-3.406 6.32 6.32 0 0 1 6.234-5.32 6.32 6.32 0 0 1 6.32 6.316 6.31 6.31 0 0 1-4.827 6.133Zm9.718-13.848a7.67 7.67 0 0 0-7.168 4.856 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.402 4.265 3.496 5.034l.235.086h11.625l.164-.039a7.676 7.676 0 0 0 5.898-7.492c0-4.254-3.46-7.715-7.719-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/25.svg +8 -0
diff --git a/src/App/Assets/smhi/25.svg b/src/App/Assets/smhi/25.svg
new file mode 100644
index 0000000..0983440
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="m18.969 26.316-1.711-.992 1.71-.992a.705.705 0 0 0 .255-.957.693.693 0 0 0-.95-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.001 1.984-1.711-.992a.699.699 0 1 0-.695 1.215l1.707.992-1.707.992a.703.703 0 0 0-.258.957.694.694 0 0 0 .953.258l1.71-.992v1.984a.695.695 0 1 0 1.392 0V26.54l1.71.992a.694.694 0 0 0 .95-.258.705.705 0 0 0-.254-.957"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.27 18.625a3.95 3.95 0 0 1-2.579-3.723 3.984 3.984 0 0 1 6.063-3.406c.48-3.008 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.316 6.3 6.3 0 0 1-4.829 6.133Zm9.722-13.848a7.675 7.675 0 0 0-7.172 4.856 5.396 5.396 0 0 0-6.531 5.27 5.38 5.38 0 0 0 3.496 5.034l.235.086h11.628l.16-.039a7.675 7.675 0 0 0 5.903-7.492c0-4.254-3.461-7.715-7.719-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/26.svg +8 -0
diff --git a/src/App/Assets/smhi/26.svg b/src/App/Assets/smhi/26.svg
new file mode 100644
index 0000000..91ad0b9
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="m23.219 26.316-1.711-.992 1.71-.992a.705.705 0 0 0 .255-.957.693.693 0 0 0-.95-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.001 1.984-1.711-.992a.699.699 0 1 0-.695 1.215l1.707.992-1.707.992a.703.703 0 0 0-.258.957.694.694 0 0 0 .953.258l1.71-.992v1.984a.695.695 0 1 0 1.392 0V26.54l1.71.992a.694.694 0 0 0 .95-.258.705.705 0 0 0-.254-.957M14.918 26.316l-1.711-.992 1.711-.992a.705.705 0 0 0 .254-.957.693.693 0 0 0-.95-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0v1.984l-1.712-.992a.701.701 0 0 0-.695 1.215l1.71.992-1.71.992a.702.702 0 0 0 .348 1.309.7.7 0 0 0 .347-.094l1.711-.992v1.984a.695.695 0 1 0 1.39 0V26.54l1.712.992a.692.692 0 0 0 .95-.258.705.705 0 0 0-.255-.957"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M10.27 18.625a3.95 3.95 0 0 1-2.579-3.723 3.984 3.984 0 0 1 6.063-3.406c.48-3.008 3.086-5.32 6.238-5.32a6.32 6.32 0 0 1 6.317 6.316 6.3 6.3 0 0 1-4.829 6.133Zm9.722-13.848a7.675 7.675 0 0 0-7.172 4.856 5.396 5.396 0 0 0-6.531 5.27 5.38 5.38 0 0 0 3.496 5.034l.235.086h11.628l.16-.039a7.675 7.675 0 0 0 5.903-7.492c0-4.254-3.461-7.715-7.719-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/27.svg +8 -0
diff --git a/src/App/Assets/smhi/27.svg b/src/App/Assets/smhi/27.svg
new file mode 100644
index 0000000..5df34b5
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="m20.031 26.316-1.71-.992 1.71-.992a.705.705 0 0 0 .254-.957.693.693 0 0 0-.95-.258l-1.71.992v-1.984a.698.698 0 1 0-1.395 0v1.984l-1.71-.992a.694.694 0 0 0-.95.258.7.7 0 0 0 .258.957l1.707.992-1.707.992a.703.703 0 0 0-.258.957.694.694 0 0 0 .95.258l1.71-.992v1.984a.699.699 0 1 0 1.395 0V26.54l1.71.992a.694.694 0 0 0 .95-.258.705.705 0 0 0-.254-.957M28.332 26.316l-1.71-.992 1.71-.992a.705.705 0 0 0 .254-.957.7.7 0 0 0-.953-.258l-1.707.992v-1.984a.699.699 0 1 0-1.395 0v1.984l-1.71-.992a.694.694 0 0 0-.95.258.705.705 0 0 0 .254.957l1.71.992-1.71.992a.705.705 0 0 0-.254.957.69.69 0 0 0 .95.258l1.71-.992v1.984a.698.698 0 1 0 1.395 0V26.54l1.707.992q.17.094.347.094a.7.7 0 0 0 .606-.352.705.705 0 0 0-.254-.957M11.73 26.316l-1.71-.992 1.71-.992a.705.705 0 0 0 .254-.957.693.693 0 0 0-.949-.258l-1.71.992v-1.984a.695.695 0 1 0-1.39 0l-.001 1.984-1.711-.992a.699.699 0 1 0-.696 1.215l1.707.992-1.707.992a.703.703 0 0 0-.257.957.694.694 0 0 0 .953.258l1.71-.992v1.984a.695.695 0 1 0 1.391 0V26.54l1.711.992a.694.694 0 0 0 .95-.258.705.705 0 0 0-.255-.957"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M11.383 18.625A3.95 3.95 0 0 1 8.8 14.902a3.987 3.987 0 0 1 6.066-3.406 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.848a7.67 7.67 0 0 0-7.171 4.856 5.396 5.396 0 0 0-6.531 5.27 5.38 5.38 0 0 0 3.495 5.034l.235.086h11.629l.16-.039a7.676 7.676 0 0 0 5.898-7.492c0-4.254-3.46-7.715-7.715-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/3.svg +20 -0
diff --git a/src/App/Assets/smhi/3.svg b/src/App/Assets/smhi/3.svg
new file mode 100644
index 0000000..dce020d
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 15.266a6.32 6.32 0 0 0-6.238 5.32A3.9 3.9 0 0 0 14.715 20a3.984 3.984 0 0 0-3.992 3.988 3.95 3.95 0 0 0 2.582 3.727h11.21a6.31 6.31 0 0 0 4.829-6.133 6.32 6.32 0 0 0-6.317-6.316"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 27.715a3.95 3.95 0 0 1-2.582-3.727A3.986 3.986 0 0 1 14.715 20c.758 0 1.476.21 2.074.586a6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.852a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.269 3.496 5.038l.235.086h11.629l.16-.039a7.68 7.68 0 0 0 5.898-7.492c0-4.254-3.46-7.719-7.715-7.719"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 18.492a6.08 6.08 0 0 1 6.073-6.074 6.077 6.077 0 0 1 6.07 6.074 6.077 6.077 0 0 1-6.07 6.07 6.077 6.077 0 0 1-6.074-6.07m6.074-7.472c-4.12 0-7.472 3.351-7.472 7.472s3.351 7.473 7.472 7.473 7.473-3.352 7.473-7.473c0-4.12-3.352-7.472-7.473-7.472M16.863 9.324a.705.705 0 0 1-.703-.703V5.586a.702.702 0 0 1 1.402 0V8.62a.7.7 0 0 1-.699.703M23.84 12.215a.701.701 0 0 1-.496-1.195l2.148-2.149a.703.703 0 0 1 .992 0c.27.274.27.719 0 .988l-2.148 2.149a.7.7 0 0 1-.496.207M9.883 12.215a.7.7 0 0 1-.496-.207L7.242 9.859a.698.698 0 1 1 .988-.988l2.149 2.149a.701.701 0 0 1-.496 1.195M6.992 19.191H3.957a.699.699 0 1 1 0-1.398h3.035a.699.699 0 1 1 0 1.398"
style="stroke:none;fill-rule:nonzero;fill:currentColor;"
mask="url(#mask)" />
<path
d="M13.305 27.715a3.95 3.95 0 0 1-2.582-3.727A3.986 3.986 0 0 1 14.715 20c.758 0 1.476.21 2.074.586a6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133Zm9.722-13.852a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.269 3.496 5.038l.235.086h11.629l.16-.039a7.68 7.68 0 0 0 5.898-7.492c0-4.254-3.46-7.719-7.715-7.719"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/4.svg +31 -0
diff --git a/src/App/Assets/smhi/4.svg b/src/App/Assets/smhi/4.svg
new file mode 100644
index 0000000..2164bef
@@ -0,0 +1,31 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask1">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M21.352 13.816c-3.149 0-5.758 2.313-6.239 5.32a3.984 3.984 0 0 0-6.062 3.406 3.94 3.94 0 0 0 2.582 3.724h11.21a6.31 6.31 0 0 0 4.829-6.133 6.32 6.32 0 0 0-6.32-6.317"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M11.629 26.266a3.95 3.95 0 0 1-2.578-3.723 3.984 3.984 0 0 1 6.066-3.406 6.32 6.32 0 0 1 6.235-5.32c3.484 0 6.32 2.831 6.32 6.316a6.31 6.31 0 0 1-4.828 6.133Zm9.723-13.848a7.67 7.67 0 0 0-7.168 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.402 4.266 3.495 5.035l.23.086h11.63l.16-.039a7.675 7.675 0 0 0 5.902-7.492c0-4.254-3.46-7.715-7.718-7.715"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
<mask id="mask2">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M26.426 21.5a3.89 3.89 0 0 0-3.836 3.273 2.456 2.456 0 0 0-3.735 2.098c0 1.055.657 1.945 1.59 2.29h6.899a3.876 3.876 0 0 0 2.972-3.77 3.894 3.894 0 0 0-3.89-3.891"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M20.445 29.16a2.43 2.43 0 0 1-1.59-2.289 2.454 2.454 0 0 1 3.73-2.098 3.9 3.9 0 0 1 3.84-3.273 3.894 3.894 0 0 1 3.891 3.89 3.876 3.876 0 0 1-2.972 3.77Zm5.98-9.058a5.27 5.27 0 0 0-4.738 2.93 3.858 3.858 0 0 0-4.23 3.84 3.85 3.85 0 0 0 2.504 3.605l.234.085h7.317l.16-.039a5.266 5.266 0 0 0 4.043-5.132 5.293 5.293 0 0 0-5.29-5.29"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M9.816 17.043a6.083 6.083 0 0 1 6.075-6.074 6.083 6.083 0 0 1 6.074 6.074 6.083 6.083 0 0 1-6.074 6.074 6.083 6.083 0 0 1-6.075-6.074m6.075-7.473c-4.121 0-7.473 3.352-7.473 7.473s3.352 7.473 7.473 7.473c4.12 0 7.472-3.352 7.472-7.473S20.012 9.57 15.891 9.57M15.89 7.875a.7.7 0 0 1-.699-.7V4.138a.699.699 0 1 1 1.399 0v3.039c0 .386-.313.699-.7.699M22.867 10.766a.7.7 0 0 1-.492-.207.7.7 0 0 1 0-.989l2.145-2.148a.703.703 0 0 1 .992.992l-2.149 2.145a.7.7 0 0 1-.496.207M8.914 10.766c-.18 0-.36-.07-.496-.207L6.27 8.414a.703.703 0 0 1 .992-.992L9.406 9.57a.69.69 0 0 1 0 .989.7.7 0 0 1-.492.207M6.023 17.742H2.984a.699.699 0 1 1 0-1.398h3.04a.699.699 0 1 1 0 1.398"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask1)" />
<path
d="M11.629 26.266a3.95 3.95 0 0 1-2.578-3.723 3.984 3.984 0 0 1 6.066-3.406 6.32 6.32 0 0 1 6.235-5.32c3.484 0 6.32 2.831 6.32 6.316a6.31 6.31 0 0 1-4.828 6.133Zm9.723-13.848a7.67 7.67 0 0 0-7.168 4.855 5.396 5.396 0 0 0-6.531 5.27c0 2.242 1.402 4.266 3.495 5.035l.23.086h11.63l.16-.039a7.675 7.675 0 0 0 5.902-7.492c0-4.254-3.46-7.715-7.718-7.715"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask2)" />
<path
d="M20.445 29.16a2.43 2.43 0 0 1-1.59-2.289 2.454 2.454 0 0 1 3.73-2.098 3.9 3.9 0 0 1 3.84-3.273 3.894 3.894 0 0 1 3.891 3.89 3.876 3.876 0 0 1-2.972 3.77Zm5.98-9.058a5.27 5.27 0 0 0-4.738 2.93 3.858 3.858 0 0 0-4.23 3.84 3.85 3.85 0 0 0 2.504 3.605l.234.085h7.317l.16-.039a5.266 5.266 0 0 0 4.043-5.132 5.293 5.293 0 0 0-5.29-5.29"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/5.svg +5 -0
diff --git a/src/App/Assets/smhi/5.svg b/src/App/Assets/smhi/5.svg
new file mode 100644
index 0000000..334aea0
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="M8.719 24.66a4.86 4.86 0 0 1-3.18-4.582 4.905 4.905 0 0 1 4.914-4.91c.934 0 1.817.262 2.555.719.586-3.7 3.797-6.547 7.676-6.547 4.289 0 7.777 3.484 7.777 7.773 0 3.668-2.54 6.73-5.945 7.547ZM20.684 7.938a9.125 9.125 0 0 0-8.625 6.035 6.32 6.32 0 0 0-7.918 6.105c0 2.625 1.644 4.996 4.093 5.899l.235.085h14.215l.16-.039a9.14 9.14 0 0 0 7.015-8.91c0-5.058-4.117-9.175-9.175-9.175"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/6.svg +19 -0
diff --git a/src/App/Assets/smhi/6.svg b/src/App/Assets/smhi/6.svg
new file mode 100644
index 0000000..d2e1cc5
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.746 17.012a3.89 3.89 0 0 0-3.84 3.273 2.453 2.453 0 0 0-3.734 2.094 2.43 2.43 0 0 0 1.59 2.293h6.898a3.88 3.88 0 0 0 2.973-3.774 3.89 3.89 0 0 0-3.887-3.886"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M17.762 24.672a2.43 2.43 0 0 1-1.59-2.293 2.453 2.453 0 0 1 3.734-2.094 3.89 3.89 0 0 1 3.84-3.273 3.89 3.89 0 0 1 3.887 3.886 3.88 3.88 0 0 1-2.973 3.774Zm5.984-9.059a5.27 5.27 0 0 0-4.742 2.93 3.858 3.858 0 0 0-4.23 3.836 3.86 3.86 0 0 0 2.503 3.61l.235.085h7.316l.16-.039a5.26 5.26 0 0 0 4.043-5.137 5.29 5.29 0 0 0-5.285-5.285"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M8.95 21.777a3.95 3.95 0 0 1-2.583-3.726 3.984 3.984 0 0 1 3.992-3.988c.758 0 1.477.214 2.075.585a6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.316 6.317 6.31 6.31 0 0 1-4.828 6.132Zm9.722-13.851a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.245 1.406 4.268 3.496 5.038l.234.086h11.63l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.461-7.72-7.715-7.72"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M17.762 24.672a2.43 2.43 0 0 1-1.59-2.293 2.453 2.453 0 0 1 3.734-2.094 3.89 3.89 0 0 1 3.84-3.273 3.89 3.89 0 0 1 3.887 3.886 3.88 3.88 0 0 1-2.973 3.774Zm5.984-9.059a5.27 5.27 0 0 0-4.742 2.93 3.858 3.858 0 0 0-4.23 3.836 3.86 3.86 0 0 0 2.503 3.61l.235.085h7.316l.16-.039a5.26 5.26 0 0 0 4.043-5.137 5.29 5.29 0 0 0-5.285-5.285"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/7.svg +8 -0
diff --git a/src/App/Assets/smhi/7.svg b/src/App/Assets/smhi/7.svg
new file mode 100644
index 0000000..d9a0f4f
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<path
d="M5.902 24.59H26.2c-.926.683-2.031 1.2-3.34 1.488l-.164.031H8.832l-.184-.047c-1.093-.273-2.02-.773-2.746-1.472M4.156 21.25h24.809c-.258.531-.547 1.05-.91 1.52H4.594c-.18-.395-.301-.805-.39-1.247ZM25.914 9.41h-10.25a9.1 9.1 0 0 1 5.055-1.52h.031c.105 0 .2 0 .29.016.651.032 1.304.121 2.019.274a8.6 8.6 0 0 1 2.855 1.23M28.86 12.75H12.565c.29-.547.637-1.05 1.032-1.52h14.304c.38.47.7.989.957 1.52M29.828 16.09H5.508c.347-.488.773-.91 1.258-1.277.12-.09.242-.165.367-.243h22.422c.136.5.23 1.02.273 1.52M29.86 17.91c-.047.5-.122 1.02-.243 1.52H4.141a6.4 6.4 0 0 1 .379-1.52Zm0 0"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
<path
d="M25.914 9.41h-10.25a9.1 9.1 0 0 1 5.055-1.52h.031c.105 0 .2 0 .29.016.651.032 1.304.121 2.019.274a8.6 8.6 0 0 1 2.855 1.23M28.86 12.75H12.565c.29-.547.637-1.05 1.032-1.52h14.304c.38.47.7.989.957 1.52M29.828 16.09H5.508c.347-.488.773-.91 1.258-1.277.12-.09.242-.165.367-.243h22.422c.136.5.23 1.02.273 1.52M29.86 17.91c-.047.5-.122 1.02-.243 1.52H4.141a6.4 6.4 0 0 1 .379-1.52ZM28.965 21.25c-.258.531-.547 1.05-.91 1.52H4.598a5.7 5.7 0 0 1-.399-1.247l-.043-.273ZM26.2 24.59c-.927.683-2.036 1.2-3.34 1.488l-.165.031H8.832l-.184-.047c-1.09-.273-2.02-.773-2.746-1.472Zm0 0"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/8.svg +19 -0
diff --git a/src/App/Assets/smhi/8.svg b/src/App/Assets/smhi/8.svg
new file mode 100644
index 0000000..a7ec480
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.863a6.32 6.32 0 0 0-6.238 5.32 3.9 3.9 0 0 0-2.074-.585 3.984 3.984 0 0 0-3.992 3.988 3.95 3.95 0 0 0 2.582 3.727h11.21a6.31 6.31 0 0 0 4.829-6.133 6.32 6.32 0 0 0-6.317-6.317"
style="stroke:none;fill-rule:nonzero;fill:black;" />
<path
d="M13.305 23.313a3.95 3.95 0 0 1-2.582-3.727 3.986 3.986 0 0 1 6.066-3.402 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133ZM23.027 9.46a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.268 3.496 5.038l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.46-7.72-7.715-7.72M16.7 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:black;" />
</mask>
</defs>
<path
d="M10.79 14.094a6.08 6.08 0 0 1 6.073-6.074c3.348 0 6.07 2.726 6.07 6.074s-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.352-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.926a.7.7 0 0 1-.703-.7V1.189a.702.702 0 0 1 1.402 0v3.039c0 .386-.312.699-.699.699M23.84 7.816a.701.701 0 0 1-.496-1.195l2.148-2.148a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .992l-2.148 2.144a.7.7 0 0 1-.496.207M9.883 7.816a.7.7 0 0 1-.496-.207L7.242 5.465a.703.703 0 0 1 0-.992.7.7 0 0 1 .988 0L10.38 6.62a.701.701 0 0 1-.496 1.195M6.992 14.793H3.957a.699.699 0 1 1 0-1.398h3.035a.699.699 0 1 1 0 1.398"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.313a3.95 3.95 0 0 1-2.582-3.727 3.986 3.986 0 0 1 6.066-3.402 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133ZM23.027 9.46a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.268 3.496 5.038l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.46-7.72-7.715-7.72M16.7 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/Assets/smhi/9.svg +19 -0
diff --git a/src/App/Assets/smhi/9.svg b/src/App/Assets/smhi/9.svg
new file mode 100644
index 0000000..2bc9add
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34pt" height="34pt" viewBox="0 0 34 34">
<defs>
<mask id="mask">
<rect x="0" y="0" width="34" height="34" fill="white" />
<path
d="M23.027 10.863a6.32 6.32 0 0 0-6.238 5.32 3.9 3.9 0 0 0-2.074-.585 3.984 3.984 0 0 0-3.992 3.988 3.95 3.95 0 0 0 2.582 3.727h11.21a6.31 6.31 0 0 0 4.829-6.133 6.32 6.32 0 0 0-6.317-6.317"
style="stroke:none;fill-rule:nonzero;fill:black" />
<path
d="M13.305 23.313a3.95 3.95 0 0 1-2.582-3.727 3.986 3.986 0 0 1 6.066-3.402 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133ZM23.027 9.46a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.268 3.496 5.038l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.46-7.72-7.715-7.72M15.7 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348M20.598 33.512a.699.699 0 0 1-.602-1.055l3.5-6a.7.7 0 0 1 .957-.25c.332.195.45.621.25.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:black" />
</mask>
</defs>
<path
d="M10.79 14.094a6.08 6.08 0 0 1 6.073-6.074c3.348 0 6.07 2.726 6.07 6.074s-2.722 6.074-6.07 6.074a6.08 6.08 0 0 1-6.074-6.074m6.074-7.473c-4.12 0-7.472 3.352-7.472 7.473 0 4.12 3.351 7.472 7.472 7.472s7.473-3.351 7.473-7.472-3.352-7.473-7.473-7.473M16.863 4.926a.7.7 0 0 1-.703-.7V1.189a.702.702 0 0 1 1.402 0v3.039c0 .386-.312.699-.699.699M23.84 7.816a.701.701 0 0 1-.496-1.195l2.148-2.148a.703.703 0 0 1 .992 0 .71.71 0 0 1 0 .992l-2.148 2.144a.7.7 0 0 1-.496.207M9.883 7.816a.7.7 0 0 1-.496-.207L7.242 5.465a.703.703 0 0 1 0-.992.7.7 0 0 1 .988 0L10.38 6.62a.701.701 0 0 1-.496 1.195M6.992 14.793H3.957a.699.699 0 1 1 0-1.398h3.035a.699.699 0 1 1 0 1.398"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" mask="url(#mask)" />
<path
d="M13.305 23.313a3.95 3.95 0 0 1-2.582-3.727 3.986 3.986 0 0 1 6.066-3.402 6.32 6.32 0 0 1 6.238-5.32 6.32 6.32 0 0 1 6.317 6.316 6.31 6.31 0 0 1-4.828 6.133ZM23.027 9.46a7.675 7.675 0 0 0-7.172 4.86 5.396 5.396 0 0 0-6.531 5.266c0 2.241 1.406 4.268 3.496 5.038l.235.086h11.629l.16-.04a7.68 7.68 0 0 0 5.898-7.491c0-4.254-3.46-7.72-7.715-7.72M15.7 33.512a.7.7 0 0 1-.352-.098.697.697 0 0 1-.254-.957l3.5-6a.7.7 0 1 1 1.21.707l-3.5 6a.7.7 0 0 1-.605.348M20.598 33.512a.699.699 0 0 1-.602-1.055l3.5-6a.7.7 0 0 1 .957-.25c.332.195.45.621.25.957l-3.5 6a.7.7 0 0 1-.605.348"
style="stroke:none;fill-rule:nonzero;fill:currentColor;" />
</svg>
src/App/ViewLocator.cs +1 -0
diff --git a/src/App/ViewLocator.cs b/src/App/ViewLocator.cs
index dcc8716..0ce0899 100644
@@ -20,6 +20,7 @@ public class ViewLocator(IServiceProvider services) : IDataTemplate
MainViewModel => services.GetControlOrDefault<MainView>(),
DateTimePanelViewModel => services.GetControlOrDefault<DateTimePanel>(),
VasttrafikPanelViewModel => services.GetControlOrDefault<VasttrafikPanel>(),
SmhiPanelViewModel => services.GetControlOrDefault<SmhiPanel>(),
_ => new TextBlock { Text = $"No view for {data?.GetType().Name}" },
};
src/App/ViewModels/MainViewModel.cs +7 -0
diff --git a/src/App/ViewModels/MainViewModel.cs b/src/App/ViewModels/MainViewModel.cs
index 40acc5a..f090bf7 100644
@@ -16,12 +16,14 @@ public partial class MainViewModel : ViewModelBase
public ViewModelBase Olskrokstorget { get; }
public ViewModelBase Svingeln { get; }
public ViewModelBase Weather { get; }
public ViewModelBase UpperRight { get; }
public MainViewModel(
FaceDetectionService faceDetectionService,
VasttrafikPanelViewModel olskrokstorget,
VasttrafikPanelViewModel svingeln,
SmhiPanelViewModel smhi,
DateTimePanelViewModel dateTimePanelViewModel
)
{
@@ -36,6 +38,11 @@ public partial class MainViewModel : ViewModelBase
svingeln.Platforms = ["C", "D", "E", "F", "G"];
Svingeln = svingeln;
smhi.LocationName = "Göteborg";
smhi.Latitude = 57.714263;
smhi.Longitude = 12.000887;
Weather = smhi;
UpperRight = dateTimePanelViewModel;
}
src/App/ViewModels/Panels/ServiceCollectionExtensions.cs +1 -1
diff --git a/src/App/ViewModels/Panels/ServiceCollectionExtensions.cs b/src/App/ViewModels/Panels/ServiceCollectionExtensions.cs
index 8d896ad..036b2a6 100644
@@ -7,6 +7,6 @@ internal static class ServiceCollectionExtensions
extension(IServiceCollection services)
{
public IServiceCollection AddPanelViewModels() =>
services.AddDateTimePanelViewModel().AddVasttrafikPanelViewModel();
services.AddDateTimePanelViewModel().AddSmhiPanelViewModel().AddVasttrafikPanelViewModel();
}
}
src/App/ViewModels/Panels/SmhiPanelViewModel.cs +58 -0
diff --git a/src/App/ViewModels/Panels/SmhiPanelViewModel.cs b/src/App/ViewModels/Panels/SmhiPanelViewModel.cs
new file mode 100644
index 0000000..50af7ca
@@ -0,0 +1,58 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using MMirror.Integrations.Smhi;
namespace MMirror.App.ViewModels.Panels;
public partial class SmhiPanelViewModel(TimeProvider timeProvider, SmhiClient smhiClient) : ViewModelBase
{
private readonly TimeProvider timeProvider = timeProvider;
private readonly SmhiClient smhiClient = smhiClient;
private CancellationTokenSource cts = new();
[ObservableProperty]
public partial PointForecast? Forecast { get; private set; }
[ObservableProperty]
public required partial string LocationName { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public void SubscribeToUpdates()
{
Task.Run(() => FetchLoop(cts.Token));
}
private async Task FetchLoop(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Forecast = await smhiClient.GetPointForecast(Longitude, Latitude, cancellationToken);
await Task.Delay(TimeSpan.FromMinutes(15), timeProvider, cancellationToken);
}
}
public void UnsubscribeFromUpdates()
{
cts.Cancel();
cts = new();
}
}
internal static class SmhiPanelViewModelServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddSmhiPanelViewModel()
{
services.AddTransient<SmhiPanelViewModel>();
return services;
}
}
}
src/App/Views/MainView.axaml +2 -1
diff --git a/src/App/Views/MainView.axaml b/src/App/Views/MainView.axaml
index 876ec85..400da15 100644
@@ -11,7 +11,8 @@
</Design.DataContext>
<Grid Classes.active="{Binding FaceNear}" RowDefinitions="*,*,*" ColumnDefinitions="*,*,*" Margin="64">
<StackPanel Classes="fade" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Grid.IsSharedSizeScope="True" Spacing="8">
<ContentControl Classes="fade" Grid.Row="0" Grid.Column="0" Content="{Binding Weather}" />
<StackPanel Classes="fade" Grid.Row="1" Grid.Column="0" Grid.RowSpan="2" Grid.IsSharedSizeScope="True" Spacing="8">
<ContentControl Content="{Binding Olskrokstorget}" />
<ContentControl Content="{Binding Svingeln}" />
</StackPanel>
src/App/Views/Panels/ServiceCollectionExtensions.cs +2 -1
diff --git a/src/App/Views/Panels/ServiceCollectionExtensions.cs b/src/App/Views/Panels/ServiceCollectionExtensions.cs
index 55b87b0..b1cddd1 100644
@@ -6,6 +6,7 @@ internal static class ServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddPanels() => services.AddTransient<DateTimePanel>().AddTransient<VasttrafikPanel>();
public IServiceCollection AddPanels() =>
services.AddTransient<DateTimePanel>().AddTransient<SmhiPanel>().AddTransient<VasttrafikPanel>();
}
}
src/App/Views/Panels/SmhiPanel.axaml +76 -0
diff --git a/src/App/Views/Panels/SmhiPanel.axaml b/src/App/Views/Panels/SmhiPanel.axaml
new file mode 100644
index 0000000..352fb56
@@ -0,0 +1,76 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:MMirror.App.ViewModels.Panels"
xmlns:v="using:MMirror.App.Views.Panels"
mc:Ignorable="d"
d:DesignWidth="720"
d:DesignHeight="1280"
x:Class="MMirror.App.Views.Panels.SmhiPanel"
x:DataType="vm:SmhiPanelViewModel">
<Design.DataContext>
<vm:SmhiPanelViewModel/>
</Design.DataContext>
<UserControl.Resources>
<x:Double x:Key="spacing">4</x:Double>
<v:WeatherSymbolIconConverter x:Key="weatherSymbolIconConverter" />
</UserControl.Resources>
<UserControl.Styles>
<Style Selector="Grid.period">
<Setter Property="RowSpacing" Value="{StaticResource spacing}" />
<Setter Property="ColumnSpacing" Value="{StaticResource spacing}" />
</Style>
<Style Selector="TextBlock.number">
<Setter Property="FontFeatures" Value="+tnum" />
</Style>
<Style Selector="Svg">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="CurrentColor" Value="rgba(255, 255, 255, 0.5)" />
</Style>
<Style Selector=".active Svg">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="CurrentColor" Value="rgba(255, 255, 255, 1)" />
</Style>
</UserControl.Styles>
<StackPanel Spacing="16">
<TextBlock Classes="h1 label" Text="{Binding LocationName}" />
<Grid RowDefinitions="Auto,Auto" ColumnDefinitions="*,*"
HorizontalAlignment="Center"
RowSpacing="{StaticResource spacing}" ColumnSpacing="{StaticResource spacing}"
IsVisible="{Binding Forecast, Converter={x:Static ObjectConverters.IsNotNull}}">
<Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Classes="period" ColumnDefinitions="Auto,*"
HorizontalAlignment="Center">
<Svg Path="{Binding Forecast.Now.Forecast.Symbol, Converter={StaticResource weatherSymbolIconConverter}}"
Width="128" Height="128" Grid.Column="0" />
<StackPanel Grid.Column="1" Spacing="{StaticResource spacing}" VerticalAlignment="Center">
<TextBlock Classes="h1 number" Text="{Binding Forecast.Now.Forecast.TemperatureCelsius, StringFormat={}{0:0} °C}" />
<TextBlock Classes="h2 number" Text="{Binding Forecast.Now.Forecast.PrecipitationMillimeters, StringFormat={}{0:0.0} mm}" />
<TextBlock Classes="label" Text="Nu" />
</StackPanel>
</Grid>
<Grid Grid.Row="1" Grid.Column="0" Classes="period" ColumnDefinitions="Auto,*">
<Svg Path="{Binding Forecast.Next.Forecast.Symbol, Converter={StaticResource weatherSymbolIconConverter}}"
Width="64" Height="64" Grid.Column="0" />
<StackPanel Grid.Column="1" Spacing="{StaticResource spacing}" VerticalAlignment="Bottom">
<TextBlock Classes="h3 number" Text="{Binding Forecast.Next.Forecast.TemperatureCelsius, StringFormat={}{0:0} °C}" />
<TextBlock Classes="number" Text="{Binding Forecast.Next.Forecast.PrecipitationMillimeters, StringFormat={}{0:0.0} mm}" />
<TextBlock Classes="label" Text="{Binding Forecast.Next.PeriodName}" />
</StackPanel>
</Grid>
<Grid Grid.Row="1" Grid.Column="1" Classes="period" ColumnDefinitions="Auto,*">
<Svg Path="{Binding Forecast.Following.Forecast.Symbol, Converter={StaticResource weatherSymbolIconConverter}}"
Width="64" Height="64" Grid.Column="0" />
<StackPanel Grid.Column="1" Spacing="{StaticResource spacing}" VerticalAlignment="Bottom">
<TextBlock Classes="h3 number" Text="{Binding Forecast.Following.Forecast.TemperatureCelsius, StringFormat={}{0:0} °C}" />
<TextBlock Classes="number" Text="{Binding Forecast.Following.Forecast.PrecipitationMillimeters, StringFormat={}{0:0.0} mm}" />
<TextBlock Classes="label" Text="{Binding Forecast.Following.PeriodName}" />
</StackPanel>
</Grid>
</Grid>
</StackPanel>
</UserControl>
src/App/Views/Panels/SmhiPanel.axaml.cs +46 -0
diff --git a/src/App/Views/Panels/SmhiPanel.axaml.cs b/src/App/Views/Panels/SmhiPanel.axaml.cs
new file mode 100644
index 0000000..8b8ccf0
@@ -0,0 +1,46 @@
using System;
using System.Globalization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Data.Converters;
using MMirror.App.ViewModels.Panels;
using MMirror.Integrations.Smhi;
namespace MMirror.App.Views.Panels;
public partial class SmhiPanel : UserControl
{
public SmhiPanel()
{
InitializeComponent();
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
if (DataContext is SmhiPanelViewModel vm)
{
vm.SubscribeToUpdates();
}
}
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
if (DataContext is SmhiPanelViewModel vm)
{
vm.UnsubscribeFromUpdates();
}
base.OnDetachedFromVisualTree(e);
}
}
public sealed class WeatherSymbolIconConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) =>
value is WeatherSymbol symbol ? $"avares://MMirror.App/Assets/smhi/{(int)symbol}.svg" : null;
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) =>
throw new NotSupportedException();
}
src/App/packages.lock.json +82 -0
diff --git a/src/App/packages.lock.json b/src/App/packages.lock.json
index 89f1b8d..8f455df 100644
@@ -109,6 +109,16 @@
"Microsoft.ML.OnnxRuntime.Managed": "1.26.0"
}
},
"Svg.Controls.Skia.Avalonia": {
"type": "Direct",
"requested": "[12.0.0.11, )",
"resolved": "12.0.0.11",
"contentHash": "5KX6xir74WzlNo2G+oun/0j5F6LOWZF0YDkA5uXCXxUmX+lHYmtYWc03JaYLrwazQmkPTjWaLKIzGkv3OXsgVg==",
"dependencies": {
"Avalonia.Skia": "12.0.0",
"Svg.Skia": "5.0.0"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -194,6 +204,11 @@
"Avalonia.Skia": "12.0.4"
}
},
"ExCSS": {
"type": "Transitive",
"resolved": "4.3.1",
"contentHash": "A8UtcghHQlWxPJhJF5bsfEYO7068JHGTuJ7tzyyMjd5fE/N/xY1cVOUhzuLLFwMOCJVnM4mqSQc93W9fGfZ1kA=="
},
"FlashCap.Core": {
"type": "Transitive",
"resolved": "1.11.0",
@@ -502,6 +517,11 @@
"System.Threading.RateLimiting": "8.0.0"
}
},
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "JLNnt0QME9zcqJMdxdNRLkXVwUSgJdzVykHO+GsXc8OQj8dBpziLp+Pwezye0z4MiduXgsJHlMWl1ci6+79JDA=="
},
"SkiaSharp": {
"type": "Transitive",
"resolved": "3.119.4",
@@ -531,6 +551,60 @@
"resolved": "3.119.4",
"contentHash": "XOpbx/4CReO2wYsq2s6rbvdauc6dntG4Zv499sHGTJ87bwZaFXszFkwql3+FIZMc8kUPeaj3Mx2ezIJmo8a1Kg=="
},
"Svg.Animation": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "17UFfTLEoLDuam4lyyCAz9ta6BFBoJzFoBkv1sWVtFO8MTNom3qleyMGDDhGJ8nTNoQDj9hElUpQUJXHNsDAfw==",
"dependencies": {
"ShimSkiaSharp": "5.0.0",
"SkiaSharp": "3.119.2",
"Svg.Custom": "5.0.0",
"Svg.Model": "5.0.0"
}
},
"Svg.Custom": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "LQ79IO0dEp1e5KIkcKi87DDB2lm9g+wzHIYI0ARM+yXOpW7/9bnEXBUNAGNSnxhUpUIAxxUe5K+XU/sb9Nes/A==",
"dependencies": {
"ExCSS": "4.3.1"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "uNih9t+4XOw0ssLm7S8rSuSXFzhhOgYimRXD9bYG50+s1rnrRwHU0IybKbA/xO2pl+/Z/NddJHIdYpZfd23kWw==",
"dependencies": {
"ShimSkiaSharp": "5.0.0",
"Svg.Custom": "5.0.0"
}
},
"Svg.SceneGraph": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "/erVvnLb27MRunTzm7trAbMj5Z8InhbHM5k5K+sraFMVeMq9e0pNOomKhzoCgsjnAzVBYq6G8v3AkcL7eM5Gpg==",
"dependencies": {
"ShimSkiaSharp": "5.0.0",
"Svg.Custom": "5.0.0",
"Svg.Model": "5.0.0"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "O5UGxW7Ci5a0GhJ2rDo8RF4BY/pMG5k3/cSimJmZFcAAgRf7xhTnGSuDyA9EqfFEwIaVHJTJg6knIk0AaMJ1FQ==",
"dependencies": {
"HarfBuzzSharp": "8.3.1.3",
"HarfBuzzSharp.NativeAssets.Linux": "8.3.1.3",
"HarfBuzzSharp.NativeAssets.Win32": "8.3.1.3",
"HarfBuzzSharp.NativeAssets.macOS": "8.3.1.3",
"SkiaSharp": "3.119.2",
"Svg.Animation": "5.0.0",
"Svg.Custom": "5.0.0",
"Svg.Model": "5.0.0",
"Svg.SceneGraph": "5.0.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
@@ -565,6 +639,14 @@
"SixLabors.ImageSharp": "[4.0.0, )"
}
},
"MMirror.Integrations.Smhi": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Http": "[11.0.0-preview.4.26230.115, )",
"Microsoft.Extensions.Http.Resilience": "[10.6.0, )",
"Microsoft.Extensions.Options.ConfigurationExtensions": "[11.0.0-preview.4.26230.115, )"
}
},
"MMirror.Integrations.Vasttrafik": {
"type": "Project",
"dependencies": {
src/Integrations/FaceCamera/ServiceCollectionExtensions.cs +5 -1
diff --git a/src/Integrations/FaceCamera/ServiceCollectionExtensions.cs b/src/Integrations/FaceCamera/ServiceCollectionExtensions.cs
index fc27fad..3f35df5 100644
@@ -1,4 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace MMirror.Integrations.FaceCamera;
@@ -9,6 +11,8 @@ public static class ServiceCollectionExtensions
{
public IServiceCollection AddFaceCameraServices()
{
services.TryAddSingleton(TimeProvider.System);
services.AddOptions<CameraOptions>().BindConfiguration("Camera").ValidateOnStart();
services.AddTransient<IValidateOptions<CameraOptions>, CameraOptionsValidator>();
src/Integrations/Smhi/ClientOptions.cs +8 -0
diff --git a/src/Integrations/Smhi/ClientOptions.cs b/src/Integrations/Smhi/ClientOptions.cs
new file mode 100644
index 0000000..f038235
@@ -0,0 +1,8 @@
using System;
namespace MMirror.Integrations.Smhi;
internal sealed class ClientOptions
{
public Uri BaseAddress { get; set; } = new("https://opendata-download-metfcst.smhi.se/");
}
src/Integrations/Smhi/Dtos.cs +20 -0
diff --git a/src/Integrations/Smhi/Dtos.cs b/src/Integrations/Smhi/Dtos.cs
new file mode 100644
index 0000000..31556a7
@@ -0,0 +1,20 @@
using System;
using System.Text.Json.Serialization;
namespace MMirror.Integrations.Smhi;
[JsonSerializable(typeof(ForecastResponse))]
internal sealed partial class SmhiJsonSerializerContext : JsonSerializerContext;
internal sealed record ForecastResponse([property: JsonPropertyName("timeSeries")] TimeSeriesEntry[] TimeSeries);
internal sealed record TimeSeriesEntry(
[property: JsonPropertyName("time")] DateTimeOffset Time,
[property: JsonPropertyName("data")] TimeSeriesData Data
);
internal sealed record TimeSeriesData(
[property: JsonPropertyName("air_temperature")] double? AirTemperature,
[property: JsonPropertyName("symbol_code")] int? SymbolCode,
[property: JsonPropertyName("precipitation_amount_mean")] double? PrecipitationAmountMean
);
src/Integrations/Smhi/ServiceCollectionExtensions.cs +29 -0
diff --git a/src/Integrations/Smhi/ServiceCollectionExtensions.cs b/src/Integrations/Smhi/ServiceCollectionExtensions.cs
new file mode 100644
index 0000000..ca3781f
@@ -0,0 +1,29 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace MMirror.Integrations.Smhi;
public static class ServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddSmhiServices()
{
services.TryAddSingleton(TimeProvider.System);
services.AddOptions<ClientOptions>().BindConfiguration("Smhi");
services
.AddHttpClient<SmhiClient>()
.ConfigureHttpClient(
(sp, client) =>
client.BaseAddress = sp.GetRequiredService<IOptions<ClientOptions>>().Value.BaseAddress
)
.AddStandardResilienceHandler();
return services;
}
}
}
src/Integrations/Smhi/Smhi.csproj +11 -0
diff --git a/src/Integrations/Smhi/Smhi.csproj b/src/Integrations/Smhi/Smhi.csproj
new file mode 100644
index 0000000..eea2eda
@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>MMirror.Integrations.Smhi</RootNamespace>
<AssemblyName>MMirror.Integrations.Smhi</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
</ItemGroup>
</Project>
src/Integrations/Smhi/SmhiClient.cs +206 -0
diff --git a/src/Integrations/Smhi/SmhiClient.cs b/src/Integrations/Smhi/SmhiClient.cs
new file mode 100644
index 0000000..9b20829
@@ -0,0 +1,206 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading;
using System.Threading.Tasks;
namespace MMirror.Integrations.Smhi;
public sealed class SmhiClient(HttpClient httpClient, TimeProvider timeProvider)
{
private const double MissingValue = 9999;
private static readonly DayPeriod[] PeriodOrder =
[
DayPeriod.Morgon,
DayPeriod.Middag,
DayPeriod.Eftermiddag,
DayPeriod.Natt,
];
public async Task<PointForecast> GetPointForecast(
double longitude,
double latitude,
CancellationToken cancellationToken
)
{
var response =
await httpClient.GetFromJsonAsync(
$"/api/category/snow1g/version/1/geotype/point/lon/{longitude.ToString("F6", CultureInfo.InvariantCulture)}/lat/{latitude.ToString("F6", CultureInfo.InvariantCulture)}/data.json?parameters=air_temperature,symbol_code,precipitation_amount_mean",
SmhiJsonSerializerContext.Default.ForecastResponse,
cancellationToken
) ?? throw new Exception("Received literal null from SMHI point forecast endpoint.");
var periods = response.TimeSeries.Select(TryMapPeriod).OfType<ForecastPeriod>().ToArray();
if (periods.Length < 3)
{
throw new Exception("SMHI point forecast returned fewer than 3 usable time series entries.");
}
var localNow = timeProvider.GetLocalNow();
var currentPeriod = GetCurrentPeriod(localNow);
var currentAnchor = localNow;
var nextPeriod = PeriodAtOffset(currentPeriod, 1);
var nextAnchor = GetFollowingPeriodAnchor(nextPeriod, currentAnchor);
var followingPeriod = PeriodAtOffset(currentPeriod, 2);
var followingAnchor = GetFollowingPeriodAnchor(followingPeriod, nextAnchor);
return new PointForecast(
CreateLabeledPeriod(currentPeriod, currentAnchor, periods, preferFuture: true),
CreateLabeledPeriod(nextPeriod, nextAnchor, periods),
CreateLabeledPeriod(followingPeriod, followingAnchor, periods)
);
}
private static LabeledForecastPeriod CreateLabeledPeriod(
DayPeriod period,
DateTimeOffset anchor,
ForecastPeriod[] periods,
bool preferFuture = false
) => new(period, GetPeriodName(period), FindClosestPeriod(periods, anchor.ToUniversalTime(), preferFuture));
private static DayPeriod GetCurrentPeriod(DateTimeOffset localNow) =>
localNow.Hour switch
{
>= 3 and < 9 => DayPeriod.Morgon,
>= 9 and < 15 => DayPeriod.Middag,
>= 15 and < 21 => DayPeriod.Eftermiddag,
_ => DayPeriod.Natt,
};
private static DateTimeOffset GetFollowingPeriodAnchor(DayPeriod period, DateTimeOffset previousAnchor)
{
var day = DateOnly.FromDateTime(previousAnchor.LocalDateTime);
for (var dayOffset = 0; dayOffset <= 2; dayOffset++)
{
var candidate = MakeAnchor(day.AddDays(dayOffset), period, previousAnchor.Offset);
if (candidate > previousAnchor)
{
return candidate;
}
}
throw new Exception($"No upcoming anchor found for {period} after {previousAnchor}.");
}
private static DateTimeOffset MakeAnchor(DateOnly day, DayPeriod period, TimeSpan offset) =>
new(
day.ToDateTime(
new TimeOnly(
period switch
{
DayPeriod.Morgon => 6,
DayPeriod.Middag => 12,
DayPeriod.Eftermiddag => 18,
DayPeriod.Natt => 0,
_ => throw new ArgumentOutOfRangeException(nameof(period)),
},
0
)
),
offset
);
private static DayPeriod PeriodAtOffset(DayPeriod current, int offset) =>
PeriodOrder[(Array.IndexOf(PeriodOrder, current) + offset) % PeriodOrder.Length];
private static string GetPeriodName(DayPeriod period) =>
period switch
{
DayPeriod.Morgon => "Morgon",
DayPeriod.Middag => "Middag",
DayPeriod.Eftermiddag => "Eftermiddag",
DayPeriod.Natt => "Natt",
_ => throw new ArgumentOutOfRangeException(nameof(period)),
};
private static ForecastPeriod? TryMapPeriod(TimeSeriesEntry entry)
{
if (
entry.Data.AirTemperature is not double temperature
|| IsMissing(temperature)
|| entry.Data.SymbolCode is not int symbolCode
|| symbolCode is < 1 or > 27
|| entry.Data.PrecipitationAmountMean is not double precipitation
|| IsMissing(precipitation)
)
{
return null;
}
return new ForecastPeriod(entry.Time, temperature, precipitation, (WeatherSymbol)symbolCode);
}
private static bool IsMissing(double value) => double.Abs(value - MissingValue) < 0.001;
private static ForecastPeriod FindClosestPeriod(ForecastPeriod[] periods, DateTimeOffset target, bool preferFuture)
{
IEnumerable<ForecastPeriod> filteredPeriods = periods;
if (preferFuture)
{
filteredPeriods = filteredPeriods.Where(period => period.ValidTime >= target);
}
return filteredPeriods.MinBy(period => double.Abs((period.ValidTime - target).TotalMinutes))
?? throw new Exception($"No forecast found for {target}.");
}
}
public sealed record PointForecast(
LabeledForecastPeriod Now,
LabeledForecastPeriod Next,
LabeledForecastPeriod Following
);
public sealed record LabeledForecastPeriod(DayPeriod Period, string PeriodName, ForecastPeriod Forecast);
public enum DayPeriod
{
Morgon,
Middag,
Eftermiddag,
Natt,
}
public sealed record ForecastPeriod(
DateTimeOffset ValidTime,
double TemperatureCelsius,
double PrecipitationMillimeters,
WeatherSymbol Symbol
);
public enum WeatherSymbol
{
ClearSky = 1,
NearlyClearSky = 2,
VariableCloudiness = 3,
HalfclearSky = 4,
CloudySky = 5,
Overcast = 6,
Fog = 7,
LightRainShowers = 8,
ModerateRainShowers = 9,
HeavyRainShowers = 10,
Thunderstorm = 11,
LightSleetShowers = 12,
ModerateSleetShowers = 13,
HeavySleetShowers = 14,
LightSnowShowers = 15,
ModerateSnowShowers = 16,
HeavySnowShowers = 17,
LightRain = 18,
ModerateRain = 19,
HeavyRain = 20,
Thunder = 21,
LightSleet = 22,
ModerateSleet = 23,
HeavySleet = 24,
LightSnowfall = 25,
ModerateSnowfall = 26,
HeavySnowfall = 27,
}
src/Integrations/Smhi/packages.lock.json +198 -0
diff --git a/src/Integrations/Smhi/packages.lock.json b/src/Integrations/Smhi/packages.lock.json
new file mode 100644
index 0000000..31f9406
@@ -0,0 +1,198 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Microsoft.Extensions.Http": {
"type": "Direct",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "HTY8+4kSEcmghrSTifim/cwZ4hQkniUr1+c1OMLHS1DJ2d7R9FFQ/t7Wf/MYTRHlB85ng9hMQNMY/PWTIfEmKQ==",
"dependencies": {
"Microsoft.Extensions.Diagnostics": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Http.Resilience": {
"type": "Direct",
"requested": "[10.6.0, )",
"resolved": "10.6.0",
"contentHash": "Diw9HdFABHx0EQTjfanXKuV6zSEyHEEH11ZGdsNxNf/3gsLEiBPXUximDG0EwYt1iIalH0JFlI1DXqpE4VjDpQ==",
"dependencies": {
"Microsoft.Extensions.Http.Diagnostics": "10.6.0",
"Microsoft.Extensions.ObjectPool": "10.0.8",
"Microsoft.Extensions.Resilience": "10.6.0"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Direct",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.AmbientMetadata.Application": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "MPAI1c5QqkDgEyEvsSj7KPPWHlTCqvXxtfp7JISul4P54GfDkSs+S7Vyq7tmS7MzpEjuH/6xrsFlUqAPlLyTUA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.8",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8"
}
},
"Microsoft.Extensions.Compliance.Abstractions": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "L8zTKn8e2LCQbsDFLWFm6fZQ54F/1FisLx43nkEof4HmmsO2HaZHshV85+qF8HXO48MlGJdrWUg+uVBj/WDmmw==",
"dependencies": {
"Microsoft.Extensions.ObjectPool": "10.0.8"
}
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "CPb3DPC6kcgx+kuSTJ55H/A6Z+IZeW++VM+UiFpiwq6eQC2Mk3gHcFpqdQoK2MjWovWYN4Sz6n1RXhLWHVB35w=="
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "IOkgB4CnLUlKH+l0slH5Q+6m9pWfcCBocFPHc7czATwIx5jnVPgUMRj2gGhZtvGs1PKpeoZv7PCGK5cYIwlZzw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.DependencyInjection.AutoActivation": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "FoX/prFoqjogPV1DleOnakFM9yzu8m4dK8Z0d9f8pPTf00PkEvd2Vulncijd/rykUX3aXERMMxsX6c/9QSAOaA=="
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "L1+sxK5JT7X5jvZ0RInbDnyJZG9rkp4cbgzoL0aGRUOOMp3PkgCcUjAUhAprxBu9LgGdeqZg7JratDMHS1YN/Q==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "dpkWVFSg8JT1BBL33+lF3pY52En3y8qoHvtc5esMx8TVrxRXuzqIjca6MqyODpGfg5/NK4bpOYZDYBOAr8PSrA=="
},
"Microsoft.Extensions.Http.Diagnostics": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "p7nJYUYk5M0k1bWeRYQr/6k5KO2XpmUIIHgmlFZGirZJxXEShSz66Q5OX2Y8Yfaz9bIhSNqAbnn5B3zhNR2Sxg==",
"dependencies": {
"Microsoft.Extensions.Http": "10.0.8",
"Microsoft.Extensions.Telemetry": "10.6.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "EpZS5qqhsNXwgeSCl2m1VkysA+pTh3qlhyjkjiu0peZt/V7IyANJXQQUuv3y2kp/jzd9XdfzuUJU0Fgp7rcDGg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
"resolved": "10.0.8",
"contentHash": "rxSLTO7xTbcC3DuEJHNEijBr8g14Jj62zQ+DeFu68bsoTYoU8jLcMhc1735PV21bESXsATlL5LsfaWH71FOWAg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.8",
"Microsoft.Extensions.Configuration.Binder": "10.0.8",
"Microsoft.Extensions.Logging": "10.0.8",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8"
}
},
"Microsoft.Extensions.ObjectPool": {
"type": "Transitive",
"resolved": "10.0.8",
"contentHash": "aQBFbY8i/dacE0fP+ZJ8Lhx/unYRnGHhtM+tHb46GLkeNjBdOzgFk88sX6BVZBhoa6JrYIOBGYTc5K4WItBsag=="
},
"Microsoft.Extensions.Resilience": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "n3ARODKBYCZAJEaDiWqXQnrjh9FXBs1yTwmWUUNgvLdJmLo/MTtz60M2t1By1jIt+I3u82/W4L5xJy8abzPUyw==",
"dependencies": {
"Microsoft.Extensions.Diagnostics": "10.0.8",
"Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.6.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8",
"Microsoft.Extensions.Telemetry.Abstractions": "10.6.0",
"Polly.Extensions": "8.4.2",
"Polly.RateLimiting": "8.4.2"
}
},
"Microsoft.Extensions.Telemetry": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "wbcC4zPaEGG53znXd4VDw3ZGITX352q80oW1iyK8rOGaJNof1zimVfZjn6E/Glw0ttZoiyHN0wf8b4KRk/rMAw==",
"dependencies": {
"Microsoft.Extensions.AmbientMetadata.Application": "10.6.0",
"Microsoft.Extensions.DependencyInjection.AutoActivation": "10.6.0",
"Microsoft.Extensions.Logging.Configuration": "10.0.8",
"Microsoft.Extensions.ObjectPool": "10.0.8",
"Microsoft.Extensions.Telemetry.Abstractions": "10.6.0"
}
},
"Microsoft.Extensions.Telemetry.Abstractions": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "aNQEJu5DD2YVQEWWmC/ALEiV1Qt400BaDO+SExtfAaGqYaNu/r2sW9xGLuc71fcjbrmzqX8LzNgK5mzjjMW9RQ==",
"dependencies": {
"Microsoft.Extensions.Compliance.Abstractions": "10.6.0",
"Microsoft.Extensions.ObjectPool": "10.0.8"
}
},
"Polly.Core": {
"type": "Transitive",
"resolved": "8.4.2",
"contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
},
"Polly.Extensions": {
"type": "Transitive",
"resolved": "8.4.2",
"contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
"dependencies": {
"Polly.Core": "8.4.2"
}
},
"Polly.RateLimiting": {
"type": "Transitive",
"resolved": "8.4.2",
"contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
"dependencies": {
"Polly.Core": "8.4.2",
"System.Threading.RateLimiting": "8.0.0"
}
},
"System.Threading.RateLimiting": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
},
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "v+F34r5W5XgR95xG0Te2KyYmCDnkc4kljLMGEZ30WKQjAzuXz/pLTEvsRNYxNJUzfKPI0H4oqLglyHZkCe1lYw=="
}
},
"net11.0/linux-arm64": {},
"net11.0/linux-x64": {},
"net11.0/osx-arm64": {},
"net11.0/osx-x64": {},
"net11.0/win-arm64": {},
"net11.0/win-x64": {}
}
}
\ No newline at end of file
src/Integrations/Vasttrafik/ServiceCollectionExtensions.cs +4 -1
diff --git a/src/Integrations/Vasttrafik/ServiceCollectionExtensions.cs b/src/Integrations/Vasttrafik/ServiceCollectionExtensions.cs
index aab1bea..30f66ec 100644
@@ -1,4 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace MMirror.Integrations.Vasttrafik;
@@ -9,6 +11,7 @@ public static class ServiceCollectionExtensions
{
public IServiceCollection AddVasttrafikServices()
{
services.TryAddSingleton(TimeProvider.System);
services.AddMemoryCache();
services.AddOptions<ClientOptions>().BindConfiguration("Vasttrafik").ValidateOnStart();
tests/Integrations/Smhi/MSTestSettings.cs +3 -0
diff --git a/tests/Integrations/Smhi/MSTestSettings.cs b/tests/Integrations/Smhi/MSTestSettings.cs
new file mode 100644
index 0000000..ae411c7
@@ -0,0 +1,3 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)]
tests/Integrations/Smhi/README.md +3 -0
diff --git a/tests/Integrations/Smhi/README.md b/tests/Integrations/Smhi/README.md
new file mode 100644
index 0000000..05ca3a5
@@ -0,0 +1,3 @@
# SMHI tests
These are integration tests for the SMHI integration.
tests/Integrations/Smhi/Smhi.csproj +18 -0
diff --git a/tests/Integrations/Smhi/Smhi.csproj b/tests/Integrations/Smhi/Smhi.csproj
new file mode 100644
index 0000000..7baa6e8
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>MMirror.Integrations.Smhi.Tests</RootNamespace>
<AssemblyName>MMirror.Integrations.Smhi.Tests</AssemblyName>
<EnableMSTestRunner>true</EnableMSTestRunner>
<OutputType>Exe</OutputType>
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
<TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\src\Integrations\Smhi\Smhi.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="MSTest" />
<PackageReference Include="Shouldly" />
</ItemGroup>
</Project>
tests/Integrations/Smhi/SmhiClientTests/IntegrationTests.cs +29 -0
diff --git a/tests/Integrations/Smhi/SmhiClientTests/IntegrationTests.cs b/tests/Integrations/Smhi/SmhiClientTests/IntegrationTests.cs
new file mode 100644
index 0000000..0fb54a1
@@ -0,0 +1,29 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Shouldly;
namespace MMirror.Integrations.Smhi.Tests.SmhiClientTests;
[TestClass]
public sealed class IntegrationTests
{
[TestMethod]
public async Task IntegrationTest()
{
var host = Host.CreateApplicationBuilder();
host.Services.AddSmhiServices();
var app = host.Build();
var client = app.Services.GetRequiredService<SmhiClient>();
var forecast = await client.GetPointForecast(12.0, 57.7, CancellationToken.None);
forecast.Now.Forecast.TemperatureCelsius.ShouldBeInRange(-50, 50);
forecast.Now.PeriodName.ShouldNotBeNullOrWhiteSpace();
forecast.Next.PeriodName.ShouldNotBeNullOrWhiteSpace();
forecast.Following.PeriodName.ShouldNotBeNullOrWhiteSpace();
forecast.Next.Forecast.ValidTime.ShouldBeGreaterThan(forecast.Now.Forecast.ValidTime);
forecast.Following.Forecast.ValidTime.ShouldBeGreaterThan(forecast.Next.Forecast.ValidTime);
}
}
tests/Integrations/Smhi/packages.lock.json +651 -0
diff --git a/tests/Integrations/Smhi/packages.lock.json b/tests/Integrations/Smhi/packages.lock.json
new file mode 100644
index 0000000..6b6ba5e
@@ -0,0 +1,651 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Microsoft.Extensions.Hosting": {
"type": "Direct",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "JabRZnPjt57VHxcOm7G7runakIkv3PunM2GTJF32KF5hJChgpUh2gnuL4VQ0GsVtHXGsbefj9tddYs2K0YJmpA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.CommandLine": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.FileExtensions": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.Json": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.UserSecrets": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Diagnostics": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Console": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Debug": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.EventLog": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.EventSource": "11.0.0-preview.4.26230.115"
}
},
"MSTest": {
"type": "Direct",
"requested": "[4.2.3, )",
"resolved": "4.2.3",
"contentHash": "fUaw2rGyhaSMRuAibJo+1PQkI4PHS1FZx/tASq1Lr3eZk5NlshQRyBBdUkhnvfvOG+tCKKy3T/BnMiI47qeZrw==",
"dependencies": {
"MSTest.TestAdapter": "4.2.3",
"MSTest.TestFramework": "4.2.3",
"Microsoft.NET.Test.Sdk": "18.3.0",
"Microsoft.Testing.Extensions.CodeCoverage": "18.5.2",
"Microsoft.Testing.Extensions.TrxReport": "2.2.3"
}
},
"Shouldly": {
"type": "Direct",
"requested": "[4.3.0, )",
"resolved": "4.3.0",
"contentHash": "sDetrWXrl6YXZ4HeLsdBoNk3uIa7K+V4uvIJ+cqdRa5DrFxeTED7VkjoxCuU1kJWpUuBDZz2QXFzSxBtVXLwRQ==",
"dependencies": {
"DiffEngine": "11.3.0",
"EmptyFiles": "4.4.0"
}
},
"DiffEngine": {
"type": "Transitive",
"resolved": "11.3.0",
"contentHash": "k0ZgZqd09jLZQjR8FyQbSQE86Q7QZnjEzq1LPHtj1R2AoWO8sjV5x+jlSisL7NZAbUOI4y+7Bog8gkr9WIRBGw==",
"dependencies": {
"EmptyFiles": "4.4.0",
"System.Management": "6.0.1"
}
},
"EmptyFiles": {
"type": "Transitive",
"resolved": "4.4.0",
"contentHash": "gwJEfIGS7FhykvtZoscwXj/XwW+mJY6UbAZk+qtLKFUGWC95kfKXnj8VkxsZQnWBxJemM/q664rGLN5nf+OHZw=="
},
"Microsoft.ApplicationInsights": {
"type": "Transitive",
"resolved": "2.23.0",
"contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw=="
},
"Microsoft.CodeCoverage": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "23BNy/vziREC20Wwhb50K7+kZe0m07KlLWDQv4qjJ9tt3QjpDpDIqJFrhYHmMEo9xDkuSp55U/8h4bMF7MiB+g=="
},
"Microsoft.DiaSymReader": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "bhwzJfzyiJM0nXJyNB7Y9OfsEXyxLdDBHG99soIp5JjnPydwkOaBdRCtRtWgQh3noSLi2cSIZ/wpbHNNE9knxQ=="
},
"Microsoft.Extensions.AmbientMetadata.Application": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "MPAI1c5QqkDgEyEvsSj7KPPWHlTCqvXxtfp7JISul4P54GfDkSs+S7Vyq7tmS7MzpEjuH/6xrsFlUqAPlLyTUA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.8",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8"
}
},
"Microsoft.Extensions.Compliance.Abstractions": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "L8zTKn8e2LCQbsDFLWFm6fZQ54F/1FisLx43nkEof4HmmsO2HaZHshV85+qF8HXO48MlGJdrWUg+uVBj/WDmmw==",
"dependencies": {
"Microsoft.Extensions.ObjectPool": "10.0.8"
}
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "CPb3DPC6kcgx+kuSTJ55H/A6Z+IZeW++VM+UiFpiwq6eQC2Mk3gHcFpqdQoK2MjWovWYN4Sz6n1RXhLWHVB35w=="
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "IOkgB4CnLUlKH+l0slH5Q+6m9pWfcCBocFPHc7czATwIx5jnVPgUMRj2gGhZtvGs1PKpeoZv7PCGK5cYIwlZzw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "AWgDyrMol+ywzG0MAAk+TkLIy4fMEsOCG1E/zb1kHE3Lp81GNNEMU+jOJTF1gEsLkDajY5AouNAWx3cvi+pxzg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "7vBrAODuFr5u548MNTaUybxQ+Hw/x9boZ2rWQynOS/KJkZhrriUFtgbQTeRamQFVna1eh78WjVAqEKm8GpQXBg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "//7zz5cgmkd/cfgKanPna9CHJ4o9Wp9JPpr+3rmSa7vd/+Wwxjb9Z9sUKvH0LsJl72LnUYWKJ7Ah02nr2yLsYA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "cXhGyFCd2LnPAMu5pVxf3CeIqYJ+wy866tNKjaAvLFQsJ1QDB4Xfmiy+6q0Zm8DvjektmB/IoDBl5F/0AKEBOA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.FileExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "GnJpXFEumu46mGMU++s54qgRwlkGhCP05xHOSgaAK/lLTUOt2mAMaIwFqrLFKfUFtkByjxSe/1FtzXx2zrIv9w==",
"dependencies": {
"Microsoft.Extensions.Configuration.Json": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.DependencyInjection.AutoActivation": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "FoX/prFoqjogPV1DleOnakFM9yzu8m4dK8Z0d9f8pPTf00PkEvd2Vulncijd/rykUX3aXERMMxsX6c/9QSAOaA=="
},
"Microsoft.Extensions.DependencyModel": {
"type": "Transitive",
"resolved": "8.0.2",
"contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "L1+sxK5JT7X5jvZ0RInbDnyJZG9rkp4cbgzoL0aGRUOOMp3PkgCcUjAUhAprxBu9LgGdeqZg7JratDMHS1YN/Q==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "dpkWVFSg8JT1BBL33+lF3pY52En3y8qoHvtc5esMx8TVrxRXuzqIjca6MqyODpGfg5/NK4bpOYZDYBOAr8PSrA=="
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "L/+w2lo0fV2hcQuAe3YIBwXl4YP16c/xFUCHXjhzidByFbyECb2H8hJ5EEeszihGcT69nd+gJqrZyzyp1bObig==",
"dependencies": {
"Microsoft.Extensions.FileSystemGlobbing": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "y8hEW4rVMESwL9iMfc0PICy0ScXzj4MMXclEjf5AXZKOFrJe6nu8iU7K9VVZenNweXdLYvlcs2ZSnhVz7h8oYg=="
},
"Microsoft.Extensions.Http.Diagnostics": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "p7nJYUYk5M0k1bWeRYQr/6k5KO2XpmUIIHgmlFZGirZJxXEShSz66Q5OX2Y8Yfaz9bIhSNqAbnn5B3zhNR2Sxg==",
"dependencies": {
"Microsoft.Extensions.Http": "10.0.8",
"Microsoft.Extensions.Telemetry": "10.6.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "EpZS5qqhsNXwgeSCl2m1VkysA+pTh3qlhyjkjiu0peZt/V7IyANJXQQUuv3y2kp/jzd9XdfzuUJU0Fgp7rcDGg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "YkVeVCrOfKdYghClaYH/jcC2Irx6gtrWPAOjNkOeITQVQ41vvhPVp7EcXYD8IcfYH58YIS5WiX1ZJu6uLEVrAQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "1ATxqXTZnR5M4tOeCtZjA+fw1b+jWPsmUAp3PUCCvndV5ghIcSvnwZ5RiQFoTtYFSdNP+pMoxCtviI71/xyRCw==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "kD1p/UZ/NqHTLt1iLjtkJpPtPWWziLkV6kG3TxLi67gWasixyvH1grMfkd14XR24RIooTkavxGZJV+xjeSSsiA==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "DOtIsmOENF8xmQi0uw0sx4/1aDHDgj1PuGmlom2zobrqbJp2b5fkZPCIOTmPZsXbk78nxVnPH7/NTbR1cYRnsA==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.4.26230.115",
"System.Diagnostics.EventLog": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "koDYnhbSTo+di3NMq13c0jhYFTIc7XUgnevONLwDpzR2GbbXfUR+dN5GuMeAVR4EQljUw5OYllrYflPNb0zoZA==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.ObjectPool": {
"type": "Transitive",
"resolved": "10.0.8",
"contentHash": "aQBFbY8i/dacE0fP+ZJ8Lhx/unYRnGHhtM+tHb46GLkeNjBdOzgFk88sX6BVZBhoa6JrYIOBGYTc5K4WItBsag=="
},
"Microsoft.Extensions.Resilience": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "n3ARODKBYCZAJEaDiWqXQnrjh9FXBs1yTwmWUUNgvLdJmLo/MTtz60M2t1By1jIt+I3u82/W4L5xJy8abzPUyw==",
"dependencies": {
"Microsoft.Extensions.Diagnostics": "10.0.8",
"Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.6.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.8",
"Microsoft.Extensions.Telemetry.Abstractions": "10.6.0",
"Polly.Extensions": "8.4.2",
"Polly.RateLimiting": "8.4.2"
}
},
"Microsoft.Extensions.Telemetry": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "wbcC4zPaEGG53znXd4VDw3ZGITX352q80oW1iyK8rOGaJNof1zimVfZjn6E/Glw0ttZoiyHN0wf8b4KRk/rMAw==",
"dependencies": {
"Microsoft.Extensions.AmbientMetadata.Application": "10.6.0",
"Microsoft.Extensions.DependencyInjection.AutoActivation": "10.6.0",
"Microsoft.Extensions.Logging.Configuration": "10.0.8",
"Microsoft.Extensions.ObjectPool": "10.0.8",
"Microsoft.Extensions.Telemetry.Abstractions": "10.6.0"
}
},
"Microsoft.Extensions.Telemetry.Abstractions": {
"type": "Transitive",
"resolved": "10.6.0",
"contentHash": "aNQEJu5DD2YVQEWWmC/ALEiV1Qt400BaDO+SExtfAaGqYaNu/r2sW9xGLuc71fcjbrmzqX8LzNgK5mzjjMW9RQ==",
"dependencies": {
"Microsoft.Extensions.Compliance.Abstractions": "10.6.0",
"Microsoft.Extensions.ObjectPool": "10.0.8"
}
},
"Microsoft.NET.Test.Sdk": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "xW3kXuWRQtgoxJp4J+gdhHSQyK+6Wb/AZDSd7lMvuMRYlZ1tnpkojyfZlWilB5G4dmZ0Y0ZxU/M23TlubndNkw==",
"dependencies": {
"Microsoft.CodeCoverage": "18.3.0",
"Microsoft.TestPlatform.TestHost": "18.3.0"
}
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"Microsoft.Testing.Extensions.Telemetry": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "mLdW+JOR3kXYGTdgR/qc/UZBA0r+eCR2k6bUxTcuDj5w9WdIQ7Lol5MBUU7YOSGd9bs9bvhSYWAptgz0YtQqCA==",
"dependencies": {
"Microsoft.ApplicationInsights": "2.23.0",
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Extensions.TrxReport": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "9Hot3ty5ZVWHrW40k2NPfD0dCaPwIxj7j7VjujNYwpYkYw9AdbejPHjGNkL/gvUWorauJf5IkeDoUeIbS7LuUg==",
"dependencies": {
"Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3",
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Extensions.TrxReport.Abstractions": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "hntvxJEkmUAx6C2xXc/PO38DqEQl4rimzOgSvTR1hAMruMid7R4RcXOrzzF33J66gKaN7jRaQ0TMW/nNfaV9jw==",
"dependencies": {
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Extensions.VSTestBridge": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "7WlJISO8QKUK+d+WhgnANwy4ACwUrvICnviY/mthPwjZ2gVeDaSUAeBnMy2cxfzZgm8VATtGUDbYzUxsgV2CyQ==",
"dependencies": {
"Microsoft.TestPlatform.ObjectModel": "18.3.0",
"Microsoft.Testing.Extensions.Telemetry": "2.2.3",
"Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3",
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Platform": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "LhM1/Qoi8Ams5QcD4r3f09CSOono9iQr3NEJQItFtyzWB55nWTgEOsVqXqMWWWIwk3nkPqc+XfnlJmp8xUI5fg=="
},
"Microsoft.Testing.Platform.MSBuild": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "Q22jJYJLx4srTinsAuoCskqmzjrBJC8YeGJMHHIcrf1dQeHoEZ7wsqDzTlENkMoke2qfufF7U+9u58nlZunH/Q==",
"dependencies": {
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.TestPlatform.ObjectModel": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "AEIEX2aWdPO9XbtR96eBaJxmXRD9vaI9uQ1T/JbPEKlTAZwYx0ZrMzKyULMdh/HH9Sg03kXCoN7LszQ90o6nPQ=="
},
"Microsoft.TestPlatform.TestHost": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "twmsoelXnp1uWMU3VGip9f0Jr1mZ0PZqgJdF35CIrdYgYrkHIJMV1m8uKyhcdjLdsQDESHAgkR7KhS9i1qpJag==",
"dependencies": {
"Microsoft.TestPlatform.ObjectModel": "18.3.0",
"Newtonsoft.Json": "13.0.3"
}
},
"MSTest.Analyzers": {
"type": "Transitive",
"resolved": "4.2.3",
"contentHash": "dxOZt8/LWuiox7rugInJoIa5Mmu3pBmXdfaoZOx/mxx8+sUFFpjBXPlWXQXGeWzpkVPNC3x1Jf7rt2h2Zjyvvg=="
},
"MSTest.TestAdapter": {
"type": "Transitive",
"resolved": "4.2.3",
"contentHash": "oVV/luk0bBghnVvLaw8MwFlD7It0Cx9P2nKobeqIafmTQqFFWY69Wo801dxjeNaLzO/o9WQ84WSK84gXJuubhg==",
"dependencies": {
"MSTest.TestFramework": "4.2.3",
"Microsoft.Testing.Extensions.VSTestBridge": "2.2.3",
"Microsoft.Testing.Platform.MSBuild": "2.2.3"
}
},
"MSTest.TestFramework": {
"type": "Transitive",
"resolved": "4.2.3",
"contentHash": "9zzij59YLh+tf+FRLNqhzHjmdspR91bol+jdQxLlxxTGMAML6LDbvuyXKMGdcrE84+QpKkk6KjTVBC5PBGrDeA==",
"dependencies": {
"MSTest.Analyzers": "4.2.3"
}
},
"Newtonsoft.Json": {
"type": "Transitive",
"resolved": "13.0.3",
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"Polly.Core": {
"type": "Transitive",
"resolved": "8.4.2",
"contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
},
"Polly.Extensions": {
"type": "Transitive",
"resolved": "8.4.2",
"contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
"dependencies": {
"Polly.Core": "8.4.2"
}
},
"Polly.RateLimiting": {
"type": "Transitive",
"resolved": "8.4.2",
"contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
"dependencies": {
"Polly.Core": "8.4.2",
"System.Threading.RateLimiting": "8.0.0"
}
},
"System.CodeDom": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
},
"System.Threading.RateLimiting": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
},
"MMirror.Integrations.Smhi": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Http": "[11.0.0-preview.4.26230.115, )",
"Microsoft.Extensions.Http.Resilience": "[10.6.0, )",
"Microsoft.Extensions.Options.ConfigurationExtensions": "[11.0.0-preview.4.26230.115, )"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "v+F34r5W5XgR95xG0Te2KyYmCDnkc4kljLMGEZ30WKQjAzuXz/pLTEvsRNYxNJUzfKPI0H4oqLglyHZkCe1lYw=="
},
"Microsoft.Extensions.Http": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "HTY8+4kSEcmghrSTifim/cwZ4hQkniUr1+c1OMLHS1DJ2d7R9FFQ/t7Wf/MYTRHlB85ng9hMQNMY/PWTIfEmKQ==",
"dependencies": {
"Microsoft.Extensions.Diagnostics": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Http.Resilience": {
"type": "CentralTransitive",
"requested": "[10.6.0, )",
"resolved": "10.6.0",
"contentHash": "Diw9HdFABHx0EQTjfanXKuV6zSEyHEEH11ZGdsNxNf/3gsLEiBPXUximDG0EwYt1iIalH0JFlI1DXqpE4VjDpQ==",
"dependencies": {
"Microsoft.Extensions.Http.Diagnostics": "10.6.0",
"Microsoft.Extensions.ObjectPool": "10.0.8",
"Microsoft.Extensions.Resilience": "10.6.0"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
}
},
"net11.0/linux-arm64": {
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/linux-x64": {
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/osx-arm64": {
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/osx-x64": {
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/win-arm64": {
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/win-x64": {
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
}
}
}
\ No newline at end of file