about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixRoomUtils.Web')
-rw-r--r--MatrixRoomUtils.Web/MatrixRoomUtils.Web.csproj45
-rw-r--r--MatrixRoomUtils.Web/Pages/Index.razor16
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/Index.razor88
-rw-r--r--MatrixRoomUtils.Web/Program.cs8
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListItem.razor2
-rw-r--r--MatrixRoomUtils.Web/appsettings.Development.json9
-rw-r--r--MatrixRoomUtils.Web/appsettings.json9
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/jetbrains-mono.css15
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Bold.ttfbin277828 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-BoldItalic.ttfbin279832 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBold.ttfbin279404 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBoldItalic.ttfbin281616 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLight.ttfbin274144 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLightItalic.ttfbin274240 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Italic.ttfbin276840 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Light.ttfbin276452 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-LightItalic.ttfbin277104 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Medium.ttfbin273860 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-MediumItalic.ttfbin276804 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Regular.ttfbin273900 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBold.ttfbin277092 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBoldItalic.ttfbin279828 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Thin.ttfbin270112 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ThinItalic.ttfbin272984 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Bold.ttfbin210988 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-BoldItalic.ttfbin214132 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBold.ttfbin213372 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBoldItalic.ttfbin215456 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLight.ttfbin209072 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLightItalic.ttfbin209884 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Italic.ttfbin211624 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Light.ttfbin210840 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-LightItalic.ttfbin212320 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Medium.ttfbin208276 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-MediumItalic.ttfbin211604 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Regular.ttfbin208576 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBold.ttfbin209864 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBoldItalic.ttfbin214032 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Thin.ttfbin206004 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ThinItalic.ttfbin209124 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono-Italic[wght].ttfbin308888 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono[wght].ttfbin303144 -> 0 bytes
-rw-r--r--MatrixRoomUtils.Web/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css949
-rw-r--r--MatrixRoomUtils.Web/wwwroot/index.html2
44 files changed, 1078 insertions, 65 deletions
diff --git a/MatrixRoomUtils.Web/MatrixRoomUtils.Web.csproj b/MatrixRoomUtils.Web/MatrixRoomUtils.Web.csproj
index 68fb9c7..c6678ce 100644
--- a/MatrixRoomUtils.Web/MatrixRoomUtils.Web.csproj
+++ b/MatrixRoomUtils.Web/MatrixRoomUtils.Web.csproj
@@ -9,6 +9,7 @@
         <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
 
         <UseBlazorWebAssembly>true</UseBlazorWebAssembly>
+<!--        <RunAOTCompilation>true</RunAOTCompilation>-->
     </PropertyGroup>
 
     <ItemGroup>
@@ -25,4 +26,48 @@
         <ProjectReference Include="..\MatrixRoomUtils.LibDMSpace\MatrixRoomUtils.LibDMSpace.csproj" />
     </ItemGroup>
 
+    <ItemGroup>
+      <Content Update="appsettings.Development.json">
+        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+      </Content>
+      <Content Update="appsettings.json">
+        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+      </Content>
+    </ItemGroup>
+
+    <ItemGroup>
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-Bold.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-BoldItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-ExtraBold.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-ExtraBoldItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-ExtraLight.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-ExtraLightItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-Italic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-Light.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-LightItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-Medium.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-MediumItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-Regular.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-SemiBold.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-SemiBoldItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-Thin.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMono-ThinItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-Bold.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-BoldItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-ExtraBold.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-ExtraBoldItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-ExtraLight.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-ExtraLightItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-Italic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-Light.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-LightItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-Medium.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-MediumItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-Regular.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-SemiBold.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-SemiBoldItalic.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-Thin.ttf" />
+      <_ContentIncludedByDefault Remove="wwwroot\css\jetbrains-mono\ttf\JetBrainsMonoNL-ThinItalic.ttf" />
+    </ItemGroup>
+
 </Project>
diff --git a/MatrixRoomUtils.Web/Pages/Index.razor b/MatrixRoomUtils.Web/Pages/Index.razor
index 804fde3..68a4f26 100644
--- a/MatrixRoomUtils.Web/Pages/Index.razor
+++ b/MatrixRoomUtils.Web/Pages/Index.razor
@@ -1,4 +1,5 @@
 @page "/"
+@inject ILogger<Index> logger
 @using LibMatrix.Responses
 @using LibMatrix
 @using LibMatrix.Homeservers
@@ -26,7 +27,6 @@ Small collection of tools to do not-so-everyday things.
                     <p>
                         <input type="radio" name="csa" checked="@(_currentSession.AccessToken == _auth.AccessToken)" @onclick="@(() => SwitchSession(_auth))" style="text-decoration-line: unset;"/>
                         <b>@__auth.UserInfo.DisplayName</b> on <b>@_auth.Homeserver</b><br/>
-
                     </p>
                     <span style="display: inline-block; width: 128px;">@__auth.UserInfo.RoomCount rooms</span>
                     <a style="color: #888888" href="@("/ServerInfo/"+__auth.Homeserver.ServerName+"/")">@__auth.ServerVersion.Server.Name @__auth.ServerVersion.Server.Version</a>
@@ -91,20 +91,24 @@ Small collection of tools to do not-so-everyday things.
                 }
                 throw;
             }
+            catch (HttpRequestException e) {
+                logger.LogError(e, $"Failed to instantiate AuthenticatedHomeserver for {_auth}, homeserver may be offline?", token.UserId);
+                return;
+            }
             var roomCountTask = hs.GetJoinedRooms();
             var profile = await hs.GetProfileAsync(hs.WhoAmI.UserId);
             userInfo.DisplayName = profile.DisplayName ?? hs.WhoAmI.UserId;
             Console.WriteLine(profile.ToJson());
-            userInfo.AvatarUrl = string.IsNullOrWhiteSpace(profile.AvatarUrl) ? "https://api.dicebear.com/6.x/identicon/svg?seed=" + hs.WhoAmI.UserId : hs.ResolveMediaUri(profile.AvatarUrl);
-            userInfo.RoomCount = (await roomCountTask).Count;
-    // _users.Add(token, userInfo);
             _auth.Add(new() {
-                UserInfo = userInfo,
+                UserInfo = new() {
+                    AvatarUrl = string.IsNullOrWhiteSpace(profile.AvatarUrl) ? "https://api.dicebear.com/6.x/identicon/svg?seed=" + hs.WhoAmI.UserId : hs.ResolveMediaUri(profile.AvatarUrl),
+                    RoomCount = (await roomCountTask).Count,
+                    DisplayName = profile.DisplayName ?? hs.WhoAmI.UserId
+                },
                 UserAuth = token,
                 ServerVersion = await hs.GetServerVersionAsync(),
                 Homeserver = hs
             });
-    // StateHasChanged();
         });
         await Task.WhenAll(profileTasks);
         await base.OnInitializedAsync();
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor
index 60f4f62..e137b6c 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor
@@ -8,6 +8,7 @@
 @using LibMatrix.Extensions
 @using LibMatrix.Responses
 @using System.Collections.ObjectModel
+@using System.Diagnostics
 @inject ILogger<Index> logger
 <h3>Room list</h3>
 
@@ -60,36 +61,36 @@
         }
     };
 
-    private static SyncFilter profileUpdateFilter = new() {
-        AccountData = new SyncFilter.EventFilter {
-            NotTypes = new List<string> { "*" },
-            Limit = 1
-        },
-        Presence = new SyncFilter.EventFilter {
-            NotTypes = new List<string> { "*" },
-            Limit = 1
-        },
-        Room = new SyncFilter.RoomFilter {
-            AccountData = new SyncFilter.RoomFilter.StateFilter {
-                NotTypes = new List<string> { "*" },
-                Limit = 1
-            },
-            Ephemeral = new SyncFilter.RoomFilter.StateFilter {
-                NotTypes = new List<string> { "*" },
-                Limit = 1
-            },
-            State = new SyncFilter.RoomFilter.StateFilter {
-                Types = new List<string> {
-                    "m.room.member"
-                },
-                Senders = new()
-            },
-            Timeline = new SyncFilter.RoomFilter.StateFilter {
-                NotTypes = new List<string> { "*" },
-                Limit = 1
-            }
-        }
-    };
+    // private static SyncFilter profileUpdateFilter = new() {
+    //     AccountData = new SyncFilter.EventFilter {
+    //         NotTypes = new List<string> { "*" },
+    //         Limit = 1
+    //     },
+    //     Presence = new SyncFilter.EventFilter {
+    //         NotTypes = new List<string> { "*" },
+    //         Limit = 1
+    //     },
+    //     Room = new SyncFilter.RoomFilter {
+    //         AccountData = new SyncFilter.RoomFilter.StateFilter {
+    //             NotTypes = new List<string> { "*" },
+    //             Limit = 1
+    //         },
+    //         Ephemeral = new SyncFilter.RoomFilter.StateFilter {
+    //             NotTypes = new List<string> { "*" },
+    //             Limit = 1
+    //         },
+    //         State = new SyncFilter.RoomFilter.StateFilter {
+    //             Types = new List<string> {
+    //                 "m.room.member"
+    //             },
+    //             Senders = new()
+    //         },
+    //         Timeline = new SyncFilter.RoomFilter.StateFilter {
+    //             NotTypes = new List<string> { "*" },
+    //             Limit = 1
+    //         }
+    //     }
+    // };
 
     protected override async Task OnInitializedAsync() {
         Homeserver = await MRUStorage.GetCurrentSessionOrNavigate();
@@ -103,20 +104,23 @@
 
         var syncHelper = new SyncHelper(Homeserver, logger) {
             Timeout = 10000,
-            Filter = filter
-        };
-        profileUpdateFilter.Room.State.Senders.Add(Homeserver.WhoAmI.UserId);
-        var profileSyncHelper = new SyncHelper(Homeserver, logger) {
-            Timeout = 10000,
-            Filter = profileUpdateFilter
+            Filter = filter,
+            MinimumDelay = TimeSpan.FromMilliseconds(5000)
         };
+        // profileUpdateFilter.Room.State.Senders.Add(Homeserver.WhoAmI.UserId);
+        // var profileSyncHelper = new SyncHelper(Homeserver, logger) {
+        //     Timeout = 10000,
+        //     Filter = profileUpdateFilter,
+        //     MinimumDelay = TimeSpan.FromMilliseconds(5000)
+        // };
         RunSyncLoop(syncHelper);
-        RunSyncLoop(profileSyncHelper);
+        // RunSyncLoop(profileSyncHelper);
         RunQueueProcessor();
         await base.OnInitializedAsync();
     }
-
+    
     private async Task RunQueueProcessor() {
+        var renderTimeSw = Stopwatch.StartNew();
         while (true) {
             try {
                 if (queue.Count == 0) {
@@ -126,7 +130,7 @@
                     }
                     Console.WriteLine("Queue no longer empty!");
                 }
-                if (queue.TryDequeue(out var queueEntry)) {
+                while (queue.TryDequeue(out var queueEntry)) {
                     var (roomId, roomData) = queueEntry;
                     Console.WriteLine($"Dequeued room {roomId}");
                     RoomInfo room;
@@ -159,9 +163,9 @@
                     if (queue.Count > 10) RenderContents = false;
                     await Task.Delay(RenderContents ? 25 : 25);
                 }
-                else {
-                    Console.WriteLine("Failed to dequeue item");
-                }
+                // else {
+                    // Console.WriteLine("Failed to dequeue item");
+                // }
             }
             catch (Exception e) {
                 Console.WriteLine("QueueWorker exception: " + e);
diff --git a/MatrixRoomUtils.Web/Program.cs b/MatrixRoomUtils.Web/Program.cs
index a670378..a7a0105 100644
--- a/MatrixRoomUtils.Web/Program.cs
+++ b/MatrixRoomUtils.Web/Program.cs
@@ -12,7 +12,15 @@ var builder = WebAssemblyHostBuilder.CreateDefault(args);
 builder.RootComponents.Add<App>("#app");
 builder.RootComponents.Add<HeadOutlet>("head::after");
 
+// builder.Logging.SetMinimumLevel(LogLevel.Trace);
+
 builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
+
+builder.Configuration.AddJsonStream(await new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }.GetStreamAsync("/appsettings.json"));
+#if DEBUG
+builder.Configuration.AddJsonStream(await new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }.GetStreamAsync("/appsettings.Development.json"));
+#endif
+
 builder.Services.AddBlazoredLocalStorage(config => {
     config.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
     config.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
diff --git a/MatrixRoomUtils.Web/Shared/RoomListItem.razor b/MatrixRoomUtils.Web/Shared/RoomListItem.razor
index 970526d..c5c3cfe 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListItem.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListItem.razor
@@ -16,7 +16,7 @@
             </span>
             <span class="centerVertical noLeftPadding">-></span>
         }
-        <MxcImage Class="avatar32" MxcUri="RoomInfo.RoomIcon" Style="@(ChildContent is not null ? "vertical-align: middle;" : "")"/>
+        <MxcImage Class="avatar32" MxcUri="@RoomInfo.RoomIcon" Style="@(ChildContent is not null ? "vertical-align: middle;" : "")"/>
         <div class="inlineBlock">
             <span class="centerVertical">@RoomInfo.RoomName</span>
             @if (ChildContent is not null) {
diff --git a/MatrixRoomUtils.Web/appsettings.Development.json b/MatrixRoomUtils.Web/appsettings.Development.json
new file mode 100644
index 0000000..e203e94
--- /dev/null
+++ b/MatrixRoomUtils.Web/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Debug",
+      "System": "Information",
+      "Microsoft": "Information"
+    }
+  }
+}
diff --git a/MatrixRoomUtils.Web/appsettings.json b/MatrixRoomUtils.Web/appsettings.json
new file mode 100644
index 0000000..e203e94
--- /dev/null
+++ b/MatrixRoomUtils.Web/appsettings.json
@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Debug",
+      "System": "Information",
+      "Microsoft": "Information"
+    }
+  }
+}
diff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/jetbrains-mono.css b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/jetbrains-mono.css
index aa98602..78aedd2 100644
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/jetbrains-mono.css
+++ b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/jetbrains-mono.css
@@ -14,7 +14,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 200;
-    src: url("./ttf/JetBrainsMono-ExtraLight.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-ExtraLight.woff2") format("woff2");
 }
 
@@ -22,7 +21,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 300;
-    src: url("./ttf/JetBrainsMono-Light.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-Light.woff2") format("woff2");
 }
 
@@ -30,7 +28,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 400;
-    src: url("./ttf/JetBrainsMono-Regular.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-Regular.woff2") format("woff2");
 }
 
@@ -38,7 +35,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 500;
-    src: url("./ttf/JetBrainsMono-Medium.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-Medium.woff2") format("woff2");
 }
 
@@ -46,7 +42,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 600;
-    src: url("./ttf/JetBrainsMono-SemiBold.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-SemiBold.woff2") format("woff2");
 }
 
@@ -54,7 +49,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 700;
-    src: url("./ttf/JetBrainsMono-Bold.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-Bold.woff2") format("woff2");
 }
 
@@ -62,7 +56,6 @@
     font-family: JetBrainsMono;
     font-style: normal;
     font-weight: 800;
-    src: url("./ttf/JetBrainsMono-ExtraBold.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-ExtraBold.woff2") format("woff2");
 }
 
@@ -72,7 +65,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 100;
-    src: url("./ttf/JetBrainsMono-ThinItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-ThinItalic.woff2") format("woff2");
 }
 
@@ -80,7 +72,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 200;
-    src: url("./ttf/JetBrainsMono-ExtraLightItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-ExtraLightItalic.woff2") format("woff2");
 }
 
@@ -88,7 +79,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 300;
-    src: url("./ttf/JetBrainsMono-LightItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-LightItalic.woff2") format("woff2");
 }
 
@@ -96,7 +86,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 400;
-    src: url("./ttf/JetBrainsMono-Italic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-Italic.woff2") format("woff2");
 }
 
@@ -104,7 +93,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 500;
-    src: url("./ttf/JetBrainsMono-MediumItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-MediumItalic.woff2") format("woff2");
 }
 
@@ -112,7 +100,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 600;
-    src: url("./ttf/JetBrainsMono-SemiBoldItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-SemiBoldItalic.woff2") format("woff2");
 }
 
@@ -120,7 +107,6 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 700;
-    src: url("./ttf/JetBrainsMono-BoldItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-BoldItalic.woff2") format("woff2");
 }
 
@@ -128,6 +114,5 @@
     font-family: JetBrainsMono;
     font-style: italic;
     font-weight: 800;
-    src: url("./ttf/JetBrainsMono-ExtraBoldItalic.ttf") format("truetype");
     src: url("./webfonts/JetBrainsMono-ExtraBoldItalic.woff2") format("woff2");
 }
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Bold.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Bold.ttf
deleted file mode 100644
index 8c93043..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Bold.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-BoldItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-BoldItalic.ttf
deleted file mode 100644
index 1ddf216..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-BoldItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBold.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBold.ttf
deleted file mode 100644
index 435d7a7..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBold.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBoldItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBoldItalic.ttf
deleted file mode 100644
index 79e616e..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraBoldItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLight.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLight.ttf
deleted file mode 100644
index c131cbf..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLight.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLightItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLightItalic.ttf
deleted file mode 100644
index a768985..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ExtraLightItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Italic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Italic.ttf
deleted file mode 100644
index ccc9d6a..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Italic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Light.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Light.ttf
deleted file mode 100644
index 15f15a2..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Light.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-LightItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-LightItalic.ttf
deleted file mode 100644
index 506208f..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-LightItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Medium.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Medium.ttf
deleted file mode 100644
index 9767115..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Medium.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-MediumItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-MediumItalic.ttf
deleted file mode 100644
index 415a9e3..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-MediumItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Regular.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Regular.ttf
deleted file mode 100644
index dff66cc..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Regular.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBold.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBold.ttf
deleted file mode 100644
index a70e69b..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBold.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBoldItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBoldItalic.ttf
deleted file mode 100644
index 968602e..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-SemiBoldItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Thin.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Thin.ttf
deleted file mode 100644
index 7dbe2ac..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-Thin.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ThinItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ThinItalic.ttf
deleted file mode 100644
index c6ad6c2..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMono-ThinItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Bold.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Bold.ttf
deleted file mode 100644
index f78f84f..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Bold.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-BoldItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-BoldItalic.ttf
deleted file mode 100644
index 9fb8c83..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-BoldItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBold.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBold.ttf
deleted file mode 100644
index fe5be6a..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBold.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBoldItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBoldItalic.ttf
deleted file mode 100644
index 59fc980..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraBoldItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLight.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLight.ttf
deleted file mode 100644
index 6da7b75..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLight.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLightItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLightItalic.ttf
deleted file mode 100644
index 5733efc..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ExtraLightItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Italic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Italic.ttf
deleted file mode 100644
index 4e9c380..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Italic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Light.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Light.ttf
deleted file mode 100644
index 0b79b0c..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Light.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-LightItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-LightItalic.ttf
deleted file mode 100644
index b5e0842..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-LightItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Medium.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Medium.ttf
deleted file mode 100644
index 1454372..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Medium.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-MediumItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-MediumItalic.ttf
deleted file mode 100644
index 8d63c6c..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-MediumItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Regular.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Regular.ttf
deleted file mode 100644
index 70d2ec9..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Regular.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBold.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBold.ttf
deleted file mode 100644
index ce60a88..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBold.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBoldItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBoldItalic.ttf
deleted file mode 100644
index 3b3f8f6..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-SemiBoldItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Thin.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Thin.ttf
deleted file mode 100644
index bea837e..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-Thin.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ThinItalic.ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ThinItalic.ttf
deleted file mode 100644
index f0bfed7..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/ttf/JetBrainsMonoNL-ThinItalic.ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono-Italic[wght].ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono-Italic[wght].ttf
deleted file mode 100644
index 5414835..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono-Italic[wght].ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono[wght].ttf b/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono[wght].ttf
deleted file mode 100644
index b60e77f..0000000
--- a/MatrixRoomUtils.Web/wwwroot/css/jetbrains-mono/variable/JetBrainsMono[wght].ttf
+++ /dev/null
Binary files differdiff --git a/MatrixRoomUtils.Web/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/MatrixRoomUtils.Web/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css
index 4664f2e..24fae0c 100644
--- a/MatrixRoomUtils.Web/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css
+++ b/MatrixRoomUtils.Web/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css
@@ -1 +1,948 @@
-@font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'}
\ No newline at end of file
+@font-face {
+    font-family: Icons;
+    src: url(../fonts/open-iconic.eot);
+    src: url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'), url(../fonts/open-iconic.woff) format('woff'), url(../fonts/open-iconic.ttf) format('truetype'), url(../fonts/open-iconic.otf) format('opentype'), url(../fonts/open-iconic.svg#iconic-sm) format('svg');
+    font-weight: 400;
+    font-style: normal
+}
+
+.oi {
+    position: relative;
+    top: 1px;
+    display: inline-block;
+    speak: none;
+    font-family: Icons;
+    font-style: normal;
+    font-weight: 400;
+    line-height: 1;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale
+}
+
+.oi:empty:before {
+    width: 1em;
+    text-align: center;
+    box-sizing: content-box
+}
+
+.oi.oi-align-center:before {
+    text-align: center
+}
+
+.oi.oi-align-left:before {
+    text-align: left
+}
+
+.oi.oi-align-right:before {
+    text-align: right
+}
+
+.oi.oi-flip-horizontal:before {
+    -webkit-transform: scale(-1, 1);
+    -ms-transform: scale(-1, 1);
+    transform: scale(-1, 1)
+}
+
+.oi.oi-flip-vertical:before {
+    -webkit-transform: scale(1, -1);
+    -ms-transform: scale(-1, 1);
+    transform: scale(1, -1)
+}
+
+.oi.oi-flip-horizontal-vertical:before {
+    -webkit-transform: scale(-1, -1);
+    -ms-transform: scale(-1, 1);
+    transform: scale(-1, -1)
+}
+
+.oi-account-login:before {
+    content: '\e000'
+}
+
+.oi-account-logout:before {
+    content: '\e001'
+}
+
+.oi-action-redo:before {
+    content: '\e002'
+}
+
+.oi-action-undo:before {
+    content: '\e003'
+}
+
+.oi-align-center:before {
+    content: '\e004'
+}
+
+.oi-align-left:before {
+    content: '\e005'
+}
+
+.oi-align-right:before {
+    content: '\e006'
+}
+
+.oi-aperture:before {
+    content: '\e007'
+}
+
+.oi-arrow-bottom:before {
+    content: '\e008'
+}
+
+.oi-arrow-circle-bottom:before {
+    content: '\e009'
+}
+
+.oi-arrow-circle-left:before {
+    content: '\e00a'
+}
+
+.oi-arrow-circle-right:before {
+    content: '\e00b'
+}
+
+.oi-arrow-circle-top:before {
+    content: '\e00c'
+}
+
+.oi-arrow-left:before {
+    content: '\e00d'
+}
+
+.oi-arrow-right:before {
+    content: '\e00e'
+}
+
+.oi-arrow-thick-bottom:before {
+    content: '\e00f'
+}
+
+.oi-arrow-thick-left:before {
+    content: '\e010'
+}
+
+.oi-arrow-thick-right:before {
+    content: '\e011'
+}
+
+.oi-arrow-thick-top:before {
+    content: '\e012'
+}
+
+.oi-arrow-top:before {
+    content: '\e013'
+}
+
+.oi-audio-spectrum:before {
+    content: '\e014'
+}
+
+.oi-audio:before {
+    content: '\e015'
+}
+
+.oi-badge:before {
+    content: '\e016'
+}
+
+.oi-ban:before {
+    content: '\e017'
+}
+
+.oi-bar-chart:before {
+    content: '\e018'
+}
+
+.oi-basket:before {
+    content: '\e019'
+}
+
+.oi-battery-empty:before {
+    content: '\e01a'
+}
+
+.oi-battery-full:before {
+    content: '\e01b'
+}
+
+.oi-beaker:before {
+    content: '\e01c'
+}
+
+.oi-bell:before {
+    content: '\e01d'
+}
+
+.oi-bluetooth:before {
+    content: '\e01e'
+}
+
+.oi-bold:before {
+    content: '\e01f'
+}
+
+.oi-bolt:before {
+    content: '\e020'
+}
+
+.oi-book:before {
+    content: '\e021'
+}
+
+.oi-bookmark:before {
+    content: '\e022'
+}
+
+.oi-box:before {
+    content: '\e023'
+}
+
+.oi-briefcase:before {
+    content: '\e024'
+}
+
+.oi-british-pound:before {
+    content: '\e025'
+}
+
+.oi-browser:before {
+    content: '\e026'
+}
+
+.oi-brush:before {
+    content: '\e027'
+}
+
+.oi-bug:before {
+    content: '\e028'
+}
+
+.oi-bullhorn:before {
+    content: '\e029'
+}
+
+.oi-calculator:before {
+    content: '\e02a'
+}
+
+.oi-calendar:before {
+    content: '\e02b'
+}
+
+.oi-camera-slr:before {
+    content: '\e02c'
+}
+
+.oi-caret-bottom:before {
+    content: '\e02d'
+}
+
+.oi-caret-left:before {
+    content: '\e02e'
+}
+
+.oi-caret-right:before {
+    content: '\e02f'
+}
+
+.oi-caret-top:before {
+    content: '\e030'
+}
+
+.oi-cart:before {
+    content: '\e031'
+}
+
+.oi-chat:before {
+    content: '\e032'
+}
+
+.oi-check:before {
+    content: '\e033'
+}
+
+.oi-chevron-bottom:before {
+    content: '\e034'
+}
+
+.oi-chevron-left:before {
+    content: '\e035'
+}
+
+.oi-chevron-right:before {
+    content: '\e036'
+}
+
+.oi-chevron-top:before {
+    content: '\e037'
+}
+
+.oi-circle-check:before {
+    content: '\e038'
+}
+
+.oi-circle-x:before {
+    content: '\e039'
+}
+
+.oi-clipboard:before {
+    content: '\e03a'
+}
+
+.oi-clock:before {
+    content: '\e03b'
+}
+
+.oi-cloud-download:before {
+    content: '\e03c'
+}
+
+.oi-cloud-upload:before {
+    content: '\e03d'
+}
+
+.oi-cloud:before {
+    content: '\e03e'
+}
+
+.oi-cloudy:before {
+    content: '\e03f'
+}
+
+.oi-code:before {
+    content: '\e040'
+}
+
+.oi-cog:before {
+    content: '\e041'
+}
+
+.oi-collapse-down:before {
+    content: '\e042'
+}
+
+.oi-collapse-left:before {
+    content: '\e043'
+}
+
+.oi-collapse-right:before {
+    content: '\e044'
+}
+
+.oi-collapse-up:before {
+    content: '\e045'
+}
+
+.oi-command:before {
+    content: '\e046'
+}
+
+.oi-comment-square:before {
+    content: '\e047'
+}
+
+.oi-compass:before {
+    content: '\e048'
+}
+
+.oi-contrast:before {
+    content: '\e049'
+}
+
+.oi-copywriting:before {
+    content: '\e04a'
+}
+
+.oi-credit-card:before {
+    content: '\e04b'
+}
+
+.oi-crop:before {
+    content: '\e04c'
+}
+
+.oi-dashboard:before {
+    content: '\e04d'
+}
+
+.oi-data-transfer-download:before {
+    content: '\e04e'
+}
+
+.oi-data-transfer-upload:before {
+    content: '\e04f'
+}
+
+.oi-delete:before {
+    content: '\e050'
+}
+
+.oi-dial:before {
+    content: '\e051'
+}
+
+.oi-document:before {
+    content: '\e052'
+}
+
+.oi-dollar:before {
+    content: '\e053'
+}
+
+.oi-double-quote-sans-left:before {
+    content: '\e054'
+}
+
+.oi-double-quote-sans-right:before {
+    content: '\e055'
+}
+
+.oi-double-quote-serif-left:before {
+    content: '\e056'
+}
+
+.oi-double-quote-serif-right:before {
+    content: '\e057'
+}
+
+.oi-droplet:before {
+    content: '\e058'
+}
+
+.oi-eject:before {
+    content: '\e059'
+}
+
+.oi-elevator:before {
+    content: '\e05a'
+}
+
+.oi-ellipses:before {
+    content: '\e05b'
+}
+
+.oi-envelope-closed:before {
+    content: '\e05c'
+}
+
+.oi-envelope-open:before {
+    content: '\e05d'
+}
+
+.oi-euro:before {
+    content: '\e05e'
+}
+
+.oi-excerpt:before {
+    content: '\e05f'
+}
+
+.oi-expand-down:before {
+    content: '\e060'
+}
+
+.oi-expand-left:before {
+    content: '\e061'
+}
+
+.oi-expand-right:before {
+    content: '\e062'
+}
+
+.oi-expand-up:before {
+    content: '\e063'
+}
+
+.oi-external-link:before {
+    content: '\e064'
+}
+
+.oi-eye:before {
+    content: '\e065'
+}
+
+.oi-eyedropper:before {
+    content: '\e066'
+}
+
+.oi-file:before {
+    content: '\e067'
+}
+
+.oi-fire:before {
+    content: '\e068'
+}
+
+.oi-flag:before {
+    content: '\e069'
+}
+
+.oi-flash:before {
+    content: '\e06a'
+}
+
+.oi-folder:before {
+    content: '\e06b'
+}
+
+.oi-fork:before {
+    content: '\e06c'
+}
+
+.oi-fullscreen-enter:before {
+    content: '\e06d'
+}
+
+.oi-fullscreen-exit:before {
+    content: '\e06e'
+}
+
+.oi-globe:before {
+    content: '\e06f'
+}
+
+.oi-graph:before {
+    content: '\e070'
+}
+
+.oi-grid-four-up:before {
+    content: '\e071'
+}
+
+.oi-grid-three-up:before {
+    content: '\e072'
+}
+
+.oi-grid-two-up:before {
+    content: '\e073'
+}
+
+.oi-hard-drive:before {
+    content: '\e074'
+}
+
+.oi-header:before {
+    content: '\e075'
+}
+
+.oi-headphones:before {
+    content: '\e076'
+}
+
+.oi-heart:before {
+    content: '\e077'
+}
+
+.oi-home:before {
+    content: '\e078'
+}
+
+.oi-image:before {
+    content: '\e079'
+}
+
+.oi-inbox:before {
+    content: '\e07a'
+}
+
+.oi-infinity:before {
+    content: '\e07b'
+}
+
+.oi-info:before {
+    content: '\e07c'
+}
+
+.oi-italic:before {
+    content: '\e07d'
+}
+
+.oi-justify-center:before {
+    content: '\e07e'
+}
+
+.oi-justify-left:before {
+    content: '\e07f'
+}
+
+.oi-justify-right:before {
+    content: '\e080'
+}
+
+.oi-key:before {
+    content: '\e081'
+}
+
+.oi-laptop:before {
+    content: '\e082'
+}
+
+.oi-layers:before {
+    content: '\e083'
+}
+
+.oi-lightbulb:before {
+    content: '\e084'
+}
+
+.oi-link-broken:before {
+    content: '\e085'
+}
+
+.oi-link-intact:before {
+    content: '\e086'
+}
+
+.oi-list-rich:before {
+    content: '\e087'
+}
+
+.oi-list:before {
+    content: '\e088'
+}
+
+.oi-location:before {
+    content: '\e089'
+}
+
+.oi-lock-locked:before {
+    content: '\e08a'
+}
+
+.oi-lock-unlocked:before {
+    content: '\e08b'
+}
+
+.oi-loop-circular:before {
+    content: '\e08c'
+}
+
+.oi-loop-square:before {
+    content: '\e08d'
+}
+
+.oi-loop:before {
+    content: '\e08e'
+}
+
+.oi-magnifying-glass:before {
+    content: '\e08f'
+}
+
+.oi-map-marker:before {
+    content: '\e090'
+}
+
+.oi-map:before {
+    content: '\e091'
+}
+
+.oi-media-pause:before {
+    content: '\e092'
+}
+
+.oi-media-play:before {
+    content: '\e093'
+}
+
+.oi-media-record:before {
+    content: '\e094'
+}
+
+.oi-media-skip-backward:before {
+    content: '\e095'
+}
+
+.oi-media-skip-forward:before {
+    content: '\e096'
+}
+
+.oi-media-step-backward:before {
+    content: '\e097'
+}
+
+.oi-media-step-forward:before {
+    content: '\e098'
+}
+
+.oi-media-stop:before {
+    content: '\e099'
+}
+
+.oi-medical-cross:before {
+    content: '\e09a'
+}
+
+.oi-menu:before {
+    content: '\e09b'
+}
+
+.oi-microphone:before {
+    content: '\e09c'
+}
+
+.oi-minus:before {
+    content: '\e09d'
+}
+
+.oi-monitor:before {
+    content: '\e09e'
+}
+
+.oi-moon:before {
+    content: '\e09f'
+}
+
+.oi-move:before {
+    content: '\e0a0'
+}
+
+.oi-musical-note:before {
+    content: '\e0a1'
+}
+
+.oi-paperclip:before {
+    content: '\e0a2'
+}
+
+.oi-pencil:before {
+    content: '\e0a3'
+}
+
+.oi-people:before {
+    content: '\e0a4'
+}
+
+.oi-person:before {
+    content: '\e0a5'
+}
+
+.oi-phone:before {
+    content: '\e0a6'
+}
+
+.oi-pie-chart:before {
+    content: '\e0a7'
+}
+
+.oi-pin:before {
+    content: '\e0a8'
+}
+
+.oi-play-circle:before {
+    content: '\e0a9'
+}
+
+.oi-plus:before {
+    content: '\e0aa'
+}
+
+.oi-power-standby:before {
+    content: '\e0ab'
+}
+
+.oi-print:before {
+    content: '\e0ac'
+}
+
+.oi-project:before {
+    content: '\e0ad'
+}
+
+.oi-pulse:before {
+    content: '\e0ae'
+}
+
+.oi-puzzle-piece:before {
+    content: '\e0af'
+}
+
+.oi-question-mark:before {
+    content: '\e0b0'
+}
+
+.oi-rain:before {
+    content: '\e0b1'
+}
+
+.oi-random:before {
+    content: '\e0b2'
+}
+
+.oi-reload:before {
+    content: '\e0b3'
+}
+
+.oi-resize-both:before {
+    content: '\e0b4'
+}
+
+.oi-resize-height:before {
+    content: '\e0b5'
+}
+
+.oi-resize-width:before {
+    content: '\e0b6'
+}
+
+.oi-rss-alt:before {
+    content: '\e0b7'
+}
+
+.oi-rss:before {
+    content: '\e0b8'
+}
+
+.oi-script:before {
+    content: '\e0b9'
+}
+
+.oi-share-boxed:before {
+    content: '\e0ba'
+}
+
+.oi-share:before {
+    content: '\e0bb'
+}
+
+.oi-shield:before {
+    content: '\e0bc'
+}
+
+.oi-signal:before {
+    content: '\e0bd'
+}
+
+.oi-signpost:before {
+    content: '\e0be'
+}
+
+.oi-sort-ascending:before {
+    content: '\e0bf'
+}
+
+.oi-sort-descending:before {
+    content: '\e0c0'
+}
+
+.oi-spreadsheet:before {
+    content: '\e0c1'
+}
+
+.oi-star:before {
+    content: '\e0c2'
+}
+
+.oi-sun:before {
+    content: '\e0c3'
+}
+
+.oi-tablet:before {
+    content: '\e0c4'
+}
+
+.oi-tag:before {
+    content: '\e0c5'
+}
+
+.oi-tags:before {
+    content: '\e0c6'
+}
+
+.oi-target:before {
+    content: '\e0c7'
+}
+
+.oi-task:before {
+    content: '\e0c8'
+}
+
+.oi-terminal:before {
+    content: '\e0c9'
+}
+
+.oi-text:before {
+    content: '\e0ca'
+}
+
+.oi-thumb-down:before {
+    content: '\e0cb'
+}
+
+.oi-thumb-up:before {
+    content: '\e0cc'
+}
+
+.oi-timer:before {
+    content: '\e0cd'
+}
+
+.oi-transfer:before {
+    content: '\e0ce'
+}
+
+.oi-trash:before {
+    content: '\e0cf'
+}
+
+.oi-underline:before {
+    content: '\e0d0'
+}
+
+.oi-vertical-align-bottom:before {
+    content: '\e0d1'
+}
+
+.oi-vertical-align-center:before {
+    content: '\e0d2'
+}
+
+.oi-vertical-align-top:before {
+    content: '\e0d3'
+}
+
+.oi-video:before {
+    content: '\e0d4'
+}
+
+.oi-volume-high:before {
+    content: '\e0d5'
+}
+
+.oi-volume-low:before {
+    content: '\e0d6'
+}
+
+.oi-volume-off:before {
+    content: '\e0d7'
+}
+
+.oi-warning:before {
+    content: '\e0d8'
+}
+
+.oi-wifi:before {
+    content: '\e0d9'
+}
+
+.oi-wrench:before {
+    content: '\e0da'
+}
+
+.oi-x:before {
+    content: '\e0db'
+}
+
+.oi-yen:before {
+    content: '\e0dc'
+}
+
+.oi-zoom-in:before {
+    content: '\e0dd'
+}
+
+.oi-zoom-out:before {
+    content: '\e0de'
+}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/wwwroot/index.html b/MatrixRoomUtils.Web/wwwroot/index.html
index 0439e62..3fc740a 100644
--- a/MatrixRoomUtils.Web/wwwroot/index.html
+++ b/MatrixRoomUtils.Web/wwwroot/index.html
@@ -36,6 +36,7 @@
             console.log("Element is not an HTMLElement", element);
         }
     }
+
     function getWidth(element) {
         console.log("getWidth", element);
         if (element == null) return 0;
@@ -47,6 +48,7 @@
         }
         return 0;
     }
+
     function getWindowDimensions() {
         return {
             width: window.innerWidth,