diff --git a/Wino.Authentication/Office365Authenticator.cs b/Wino.Authentication/Office365Authenticator.cs deleted file mode 100644 index 7bb1017a..00000000 --- a/Wino.Authentication/Office365Authenticator.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Wino.Core.Domain.Enums; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Authentication -{ - public class Office365Authenticator : OutlookAuthenticator - { - public Office365Authenticator(INativeAppService nativeAppService, - IApplicationConfiguration applicationConfiguration, - IAuthenticatorConfig authenticatorConfig) : base(nativeAppService, applicationConfiguration, authenticatorConfig) - { - } - - public override MailProviderType ProviderType => MailProviderType.Office365; - } -} diff --git a/Wino.Calendar.Packaging/Wino.Calendar.Packaging.wapproj b/Wino.Calendar.Packaging/Wino.Calendar.Packaging.wapproj index 47f8014e..ea857bd1 100644 --- a/Wino.Calendar.Packaging/Wino.Calendar.Packaging.wapproj +++ b/Wino.Calendar.Packaging/Wino.Calendar.Packaging.wapproj @@ -20,14 +20,6 @@ Release x64 - - Debug - ARM - - - Release - ARM - Debug ARM64 @@ -76,7 +68,6 @@ - diff --git a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs index 70b6108d..83219511 100644 --- a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs +++ b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs @@ -81,7 +81,7 @@ namespace Wino.Calendar.ViewModels if (accountCreationDialogResult == null) return; var accountCreationCancellationTokenSource = new CancellationTokenSource(); - var accountCreationDialog = CalendarDialogService.GetAccountCreationDialog(accountCreationDialogResult.ProviderType); + var accountCreationDialog = CalendarDialogService.GetAccountCreationDialog(accountCreationDialogResult); accountCreationDialog.ShowDialog(accountCreationCancellationTokenSource); accountCreationDialog.State = AccountCreationDialogState.SigningIn; @@ -92,7 +92,6 @@ namespace Wino.Calendar.ViewModels { ProviderType = accountCreationDialogResult.ProviderType, Name = accountCreationDialogResult.AccountName, - AccountColorHex = accountCreationDialogResult.AccountColorHex, Id = Guid.NewGuid() }; @@ -104,13 +103,8 @@ namespace Wino.Calendar.ViewModels if (accountCreationDialog.State == AccountCreationDialogState.Canceled) throw new AccountSetupCanceledException(); - tokenInformationResponse.ThrowIfFailed(); - //var tokenInformation = tokenInformationResponse.Data; - //createdAccount.Address = tokenInformation.Address; - //tokenInformation.AccountId = createdAccount.Id; - await AccountService.CreateAccountAsync(createdAccount, null); // Sync profile information if supported. diff --git a/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj b/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj index 4b029e10..53d3ba10 100644 --- a/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj +++ b/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj @@ -9,7 +9,6 @@ - diff --git a/Wino.Calendar/Services/ProviderService.cs b/Wino.Calendar/Services/ProviderService.cs index 23df7a52..648ea3a0 100644 --- a/Wino.Calendar/Services/ProviderService.cs +++ b/Wino.Calendar/Services/ProviderService.cs @@ -27,7 +27,7 @@ namespace Wino.Calendar.Services foreach (var type in providers) { - providerList.Add(new ProviderDetail(type)); + providerList.Add(new ProviderDetail(type, SpecialImapProvider.None)); } return providerList; diff --git a/Wino.Calendar/Wino.Calendar.csproj b/Wino.Calendar/Wino.Calendar.csproj index 22555e01..93fdcd1c 100644 --- a/Wino.Calendar/Wino.Calendar.csproj +++ b/Wino.Calendar/Wino.Calendar.csproj @@ -60,29 +60,6 @@ true true - - true - bin\ARM\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - ARM - false - prompt - true - - - bin\ARM\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - ARM - false - prompt - true - true - true bin\ARM64\Debug\ @@ -334,7 +311,7 @@ 6.2.14 - 1.28.0 + 1.28.1 diff --git a/Wino.Core.Domain/Entities/Shared/MailAccount.cs b/Wino.Core.Domain/Entities/Shared/MailAccount.cs index 3f65e2c7..20c2a304 100644 --- a/Wino.Core.Domain/Entities/Shared/MailAccount.cs +++ b/Wino.Core.Domain/Entities/Shared/MailAccount.cs @@ -72,6 +72,12 @@ namespace Wino.Core.Domain.Entities.Shared /// public Guid? MergedInboxId { get; set; } + /// + /// Gets or sets the additional IMAP provider assignment for the account. + /// Providers that use IMAP as a synchronizer but have special requirements. + /// + public SpecialImapProvider SpecialImapProvider { get; set; } + /// /// Contains the merged inbox this account belongs to. /// Ignored for all SQLite operations. @@ -95,7 +101,7 @@ namespace Wino.Core.Domain.Entities.Shared /// /// Gets whether the account can perform ProfileInformation sync type. /// - public bool IsProfileInfoSyncSupported => ProviderType == MailProviderType.Outlook || ProviderType == MailProviderType.Office365 || ProviderType == MailProviderType.Gmail; + public bool IsProfileInfoSyncSupported => ProviderType == MailProviderType.Outlook || ProviderType == MailProviderType.Gmail; /// /// Gets whether the account can perform AliasInformation sync type. diff --git a/Wino.Core.Domain/Enums/MailProviderType.cs b/Wino.Core.Domain/Enums/MailProviderType.cs index a9156f68..1ff81b96 100644 --- a/Wino.Core.Domain/Enums/MailProviderType.cs +++ b/Wino.Core.Domain/Enums/MailProviderType.cs @@ -4,8 +4,6 @@ { Outlook, Gmail, - Office365, - Yahoo, - IMAP4 + IMAP4 = 4 // 2-3 were removed after release. Don't change for backward compatibility. } } diff --git a/Wino.Core.Domain/Enums/MailSynchronizationType.cs b/Wino.Core.Domain/Enums/MailSynchronizationType.cs index 5fd16667..e7dfe826 100644 --- a/Wino.Core.Domain/Enums/MailSynchronizationType.cs +++ b/Wino.Core.Domain/Enums/MailSynchronizationType.cs @@ -2,13 +2,13 @@ { public enum MailSynchronizationType { - // Shared UpdateProfile, // Only update profile information ExecuteRequests, // Run the queued requests, and then synchronize if needed. FoldersOnly, // Only synchronize folder metadata. - InboxOnly, // Only Inbox, Sent and Draft folders. + InboxOnly, // Only Inbox, Sent, Draft and Deleted folders. CustomFolders, // Only sync folders that are specified in the options. FullFolders, // Synchronize all folders. This won't update profile or alias information. Alias, // Only update alias information + IMAPIdle // Idle client triggered synchronization. } } diff --git a/Wino.Core.Domain/Enums/SpecialImapProvider.cs b/Wino.Core.Domain/Enums/SpecialImapProvider.cs new file mode 100644 index 00000000..27254a86 --- /dev/null +++ b/Wino.Core.Domain/Enums/SpecialImapProvider.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum SpecialImapProvider + { + None, + iCloud, + Yahoo + } +} diff --git a/Wino.Core.Domain/Exceptions/ImapSynchronizerStrategyException.cs b/Wino.Core.Domain/Exceptions/ImapSynchronizerStrategyException.cs new file mode 100644 index 00000000..e59927ab --- /dev/null +++ b/Wino.Core.Domain/Exceptions/ImapSynchronizerStrategyException.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Exceptions +{ + public class ImapSynchronizerStrategyException : System.Exception + { + public ImapSynchronizerStrategyException(string message) : base(message) + { + + } + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs b/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs index e534a042..8454a4ed 100644 --- a/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs +++ b/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs @@ -1,11 +1,12 @@ using System.Threading; +using System.Threading.Tasks; using Wino.Core.Domain.Enums; namespace Wino.Core.Domain.Interfaces { public interface IAccountCreationDialog { - void ShowDialog(CancellationTokenSource cancellationTokenSource); + Task ShowDialogAsync(CancellationTokenSource cancellationTokenSource); void Complete(bool cancel); AccountCreationDialogState State { get; set; } } diff --git a/Wino.Core.Domain/Interfaces/IBaseSynchronizer.cs b/Wino.Core.Domain/Interfaces/IBaseSynchronizer.cs index 086f1e2a..09e2b402 100644 --- a/Wino.Core.Domain/Interfaces/IBaseSynchronizer.cs +++ b/Wino.Core.Domain/Interfaces/IBaseSynchronizer.cs @@ -23,12 +23,6 @@ namespace Wino.Core.Domain.Interfaces /// Request to queue. void QueueRequest(IRequestBase request); - /// - /// TODO - /// - /// Whether active synchronization is stopped or not. - bool CancelActiveSynchronization(); - /// /// Synchronizes profile information with the server. /// Sender name and Profile picture are updated. diff --git a/Wino.Core.Domain/Interfaces/ICustomFolderSynchronizationRequest.cs b/Wino.Core.Domain/Interfaces/ICustomFolderSynchronizationRequest.cs index b1784d08..36c90040 100644 --- a/Wino.Core.Domain/Interfaces/ICustomFolderSynchronizationRequest.cs +++ b/Wino.Core.Domain/Interfaces/ICustomFolderSynchronizationRequest.cs @@ -13,5 +13,10 @@ namespace Wino.Core.Domain.Interfaces /// Which folders to sync after this operation? /// List SynchronizationFolderIds { get; } + + /// + /// If true, additional folders like Sent, Drafts and Deleted will not be synchronized + /// + bool ExcludeMustHaveFolders { get; } } } diff --git a/Wino.Core.Domain/Interfaces/IDialogServiceBase.cs b/Wino.Core.Domain/Interfaces/IDialogServiceBase.cs index cb86603e..42789f42 100644 --- a/Wino.Core.Domain/Interfaces/IDialogServiceBase.cs +++ b/Wino.Core.Domain/Interfaces/IDialogServiceBase.cs @@ -27,7 +27,7 @@ namespace Wino.Core.Domain.Interfaces string dontAskAgainConfigurationKey = ""); Task ShowCustomThemeBuilderDialogAsync(); Task ShowAccountProviderSelectionDialogAsync(List availableProviders); - IAccountCreationDialog GetAccountCreationDialog(MailProviderType type); + IAccountCreationDialog GetAccountCreationDialog(AccountCreationDialogResult accountCreationDialogResult); Task> PickFilesAsync(params object[] typeFilters); Task PickFilePathAsync(string saveFileName); } diff --git a/Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs b/Wino.Core.Domain/Interfaces/IImapAccountCreationDialog.cs similarity index 90% rename from Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs rename to Wino.Core.Domain/Interfaces/IImapAccountCreationDialog.cs index 2bc7f19f..9230aec0 100644 --- a/Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs +++ b/Wino.Core.Domain/Interfaces/IImapAccountCreationDialog.cs @@ -3,7 +3,7 @@ using Wino.Core.Domain.Entities.Shared; namespace Wino.Core.Domain.Interfaces { - public interface ICustomServerAccountCreationDialog : IAccountCreationDialog + public interface IImapAccountCreationDialog : IAccountCreationDialog { /// /// Returns the custom server information from the dialog.. diff --git a/Wino.Core.Domain/Interfaces/IImapSynchronizationStrategyProvider.cs b/Wino.Core.Domain/Interfaces/IImapSynchronizationStrategyProvider.cs new file mode 100644 index 00000000..6292285f --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IImapSynchronizationStrategyProvider.cs @@ -0,0 +1,12 @@ +using MailKit.Net.Imap; + +namespace Wino.Core.Domain.Interfaces +{ + /// + /// Provides a synchronization strategy for synchronizing IMAP folders based on the server capabilities. + /// + public interface IImapSynchronizationStrategyProvider + { + IImapSynchronizerStrategy GetSynchronizationStrategy(IImapClient client); + } +} diff --git a/Wino.Core.Domain/Interfaces/IImapSynchronizer.cs b/Wino.Core.Domain/Interfaces/IImapSynchronizer.cs new file mode 100644 index 00000000..6d3fca5d --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IImapSynchronizer.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IImapSynchronizer + { + uint InitialMessageDownloadCountPerFolder { get; } + + Task> CreateNewMailPackagesAsync(ImapMessageCreationPackage message, MailItemFolder assignedFolder, CancellationToken cancellationToken = default); + Task StartIdleClientAsync(); + Task StopIdleClientAsync(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IImapSynchronizerStrategy.cs b/Wino.Core.Domain/Interfaces/IImapSynchronizerStrategy.cs new file mode 100644 index 00000000..0b1f7aff --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IImapSynchronizerStrategy.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MailKit.Net.Imap; +using Wino.Core.Domain.Entities.Mail; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IImapSynchronizerStrategy + { + /// + /// Synchronizes given folder with the ImapClient client from the client pool. + /// + /// Client to perform sync with. I love Mira and Jasminka + /// Folder to synchronize. + /// Imap synchronizer that downloads messages. + /// Cancellation token. + /// List of new downloaded message ids that don't exist locally. + Task> HandleSynchronizationAsync(IImapClient client, MailItemFolder folder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default); + } +} + diff --git a/Wino.Core.Domain/Interfaces/IMailService.cs b/Wino.Core.Domain/Interfaces/IMailService.cs index 1867ff5c..3474d8ea 100644 --- a/Wino.Core.Domain/Interfaces/IMailService.cs +++ b/Wino.Core.Domain/Interfaces/IMailService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MailKit; using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Models.MailItem; @@ -108,5 +109,13 @@ namespace Wino.Core.Domain.Interfaces /// Options like new email/forward/draft. /// Draft MailCopy and Draft MimeMessage as base64. Task<(MailCopy draftMailCopy, string draftBase64MimeMessage)> CreateDraftAsync(Guid accountId, DraftCreationOptions draftCreationOptions); + + /// + /// Returns ids + /// + /// + /// + /// + Task> GetExistingMailsAsync(Guid folderId, IEnumerable uniqueIds); } } diff --git a/Wino.Core.Domain/Interfaces/IProviderDetail.cs b/Wino.Core.Domain/Interfaces/IProviderDetail.cs index e43c6044..9f4e3602 100644 --- a/Wino.Core.Domain/Interfaces/IProviderDetail.cs +++ b/Wino.Core.Domain/Interfaces/IProviderDetail.cs @@ -5,6 +5,7 @@ namespace Wino.Core.Domain.Interfaces public interface IProviderDetail { MailProviderType Type { get; } + SpecialImapProvider SpecialImapProvider { get; } string Name { get; } string Description { get; } string ProviderImage { get; } diff --git a/Wino.Core.Domain/Interfaces/ISpecialImapProviderConfigResolver.cs b/Wino.Core.Domain/Interfaces/ISpecialImapProviderConfigResolver.cs new file mode 100644 index 00000000..34c35dbe --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ISpecialImapProviderConfigResolver.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Models.Accounts; + +namespace Wino.Core.Domain.Interfaces +{ + public interface ISpecialImapProviderConfigResolver + { + CustomServerInformation GetServerInformation(MailAccount account, AccountCreationDialogResult dialogResult); + } +} diff --git a/Wino.Core.Domain/Interfaces/ISynchronizerFactory.cs b/Wino.Core.Domain/Interfaces/ISynchronizerFactory.cs index d86fff66..553eb95c 100644 --- a/Wino.Core.Domain/Interfaces/ISynchronizerFactory.cs +++ b/Wino.Core.Domain/Interfaces/ISynchronizerFactory.cs @@ -7,5 +7,6 @@ namespace Wino.Core.Domain.Interfaces { Task GetAccountSynchronizerAsync(Guid accountId); Task InitializeAsync(); + Task DeleteSynchronizerAsync(Guid accountId); } } diff --git a/Wino.Core.Domain/Interfaces/IWinoSynchronizerBase.cs b/Wino.Core.Domain/Interfaces/IWinoSynchronizerBase.cs index 7864414a..ec4648bf 100644 --- a/Wino.Core.Domain/Interfaces/IWinoSynchronizerBase.cs +++ b/Wino.Core.Domain/Interfaces/IWinoSynchronizerBase.cs @@ -28,5 +28,12 @@ namespace Wino.Core.Domain.Interfaces /// Optional progress reporting for download operation. /// Cancellation token. Task DownloadMissingMimeMessageAsync(IMailItem mailItem, ITransferProgress transferProgress, CancellationToken cancellationToken = default); + + /// + /// 1. Cancel active synchronization. + /// 2. Stop all running tasks. + /// 3. Dispose all resources. + /// + Task KillSynchronizerAsync(); } } diff --git a/Wino.Core.Domain/Models/Accounts/AccountCreationDialogResult.cs b/Wino.Core.Domain/Models/Accounts/AccountCreationDialogResult.cs index 428d1307..961a0d1a 100644 --- a/Wino.Core.Domain/Models/Accounts/AccountCreationDialogResult.cs +++ b/Wino.Core.Domain/Models/Accounts/AccountCreationDialogResult.cs @@ -2,5 +2,5 @@ namespace Wino.Core.Domain.Models.Accounts { - public record AccountCreationDialogResult(MailProviderType ProviderType, string AccountName, string AccountColorHex = ""); + public record AccountCreationDialogResult(MailProviderType ProviderType, string AccountName, SpecialImapProviderDetails SpecialImapProviderDetails); } diff --git a/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs b/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs index c6719694..31b2f90d 100644 --- a/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs +++ b/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs @@ -6,18 +6,32 @@ namespace Wino.Core.Domain.Models.Accounts public class ProviderDetail : IProviderDetail { public MailProviderType Type { get; } - + public SpecialImapProvider SpecialImapProvider { get; } public string Name { get; } public string Description { get; } - public string ProviderImage => $"/Wino.Core.UWP/Assets/Providers/{Type}.png"; + public string ProviderImage + { + get + { + if (SpecialImapProvider == SpecialImapProvider.None) + { + return $"/Wino.Core.UWP/Assets/Providers/{Type}.png"; + } + else + { + return $"/Wino.Core.UWP/Assets/Providers/{SpecialImapProvider}.png"; + } + } + } public bool IsSupported => Type == MailProviderType.Outlook || Type == MailProviderType.Gmail || Type == MailProviderType.IMAP4; - public ProviderDetail(MailProviderType type) + public ProviderDetail(MailProviderType type, SpecialImapProvider specialImapProvider) { Type = type; + SpecialImapProvider = specialImapProvider; switch (Type) { @@ -25,21 +39,29 @@ namespace Wino.Core.Domain.Models.Accounts Name = "Outlook"; Description = "Outlook.com, Live.com, Hotmail, MSN"; break; - case MailProviderType.Office365: - Name = "Office 365"; - Description = "Office 365, Exchange"; - break; case MailProviderType.Gmail: Name = "Gmail"; Description = Translator.ProviderDetail_Gmail_Description; break; - case MailProviderType.Yahoo: - Name = "Yahoo"; - Description = "Yahoo Mail"; - break; case MailProviderType.IMAP4: - Name = Translator.ProviderDetail_IMAP_Title; - Description = Translator.ProviderDetail_IMAP_Description; + switch (specialImapProvider) + { + case SpecialImapProvider.None: + Name = Translator.ProviderDetail_IMAP_Title; + Description = Translator.ProviderDetail_IMAP_Description; + break; + case SpecialImapProvider.iCloud: + Name = Translator.ProviderDetail_iCloud_Title; + Description = Translator.ProviderDetail_iCloud_Description; + break; + case SpecialImapProvider.Yahoo: + Name = Translator.ProviderDetail_Yahoo_Title; + Description = Translator.ProviderDetail_Yahoo_Description; + break; + default: + break; + } + break; } } diff --git a/Wino.Core.Domain/Models/Accounts/SpecialImapProviderDetails.cs b/Wino.Core.Domain/Models/Accounts/SpecialImapProviderDetails.cs new file mode 100644 index 00000000..5f3b489c --- /dev/null +++ b/Wino.Core.Domain/Models/Accounts/SpecialImapProviderDetails.cs @@ -0,0 +1,6 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Accounts +{ + public record SpecialImapProviderDetails(string Address, string Password, string SenderName, SpecialImapProvider SpecialImapProvider); +} diff --git a/Wino.Core.Domain/Models/MailItem/ImapMessageCreationPackage.cs b/Wino.Core.Domain/Models/MailItem/ImapMessageCreationPackage.cs new file mode 100644 index 00000000..1fb23688 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/ImapMessageCreationPackage.cs @@ -0,0 +1,20 @@ +using MailKit; +using MimeKit; + +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Encapsulates all required information to create a MimeMessage for IMAP synchronizer. + /// + public class ImapMessageCreationPackage + { + public IMessageSummary MessageSummary { get; } + public MimeMessage MimeMessage { get; } + + public ImapMessageCreationPackage(IMessageSummary messageSummary, MimeMessage mimeMessage) + { + MessageSummary = messageSummary; + MimeMessage = mimeMessage; + } + } +} diff --git a/Wino.Core.Domain/Models/Synchronization/MailSynchronizationOptions.cs b/Wino.Core.Domain/Models/Synchronization/MailSynchronizationOptions.cs index acbf611a..17115213 100644 --- a/Wino.Core.Domain/Models/Synchronization/MailSynchronizationOptions.cs +++ b/Wino.Core.Domain/Models/Synchronization/MailSynchronizationOptions.cs @@ -9,7 +9,7 @@ namespace Wino.Core.Domain.Models.Synchronization /// /// Unique id of synchronization. /// - public Guid Id { get; } = Guid.NewGuid(); + public Guid Id { get; set; } = Guid.NewGuid(); /// /// Account to execute synchronization for. @@ -26,6 +26,12 @@ namespace Wino.Core.Domain.Models.Synchronization /// public List SynchronizationFolderIds { get; set; } + /// + /// If true, additional folders like Sent,Drafts and Deleted will not be synchronized + /// with InboxOnly and CustomFolders sync type. + /// + public bool ExcludeMustHaveFolders { get; set; } + /// /// When doing a linked inbox synchronization, we must ignore reporting completion to the caller for each folder. /// This Id will help tracking that. Id is unique, but this one can be the same for all sync requests @@ -33,6 +39,6 @@ namespace Wino.Core.Domain.Models.Synchronization /// public Guid? GroupedSynchronizationTrackingId { get; set; } - public override string ToString() => $"Type: {Type}, Folders: {(SynchronizationFolderIds == null ? "All" : string.Join(",", SynchronizationFolderIds))}"; + public override string ToString() => $"Type: {Type}"; } } diff --git a/Wino.Core.Domain/Translations/en_US/resources.json b/Wino.Core.Domain/Translations/en_US/resources.json index 88755f06..5a70fd4d 100644 --- a/Wino.Core.Domain/Translations/en_US/resources.json +++ b/Wino.Core.Domain/Translations/en_US/resources.json @@ -403,6 +403,10 @@ "ProviderDetail_Gmail_Description": "Google Account", "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", "ProviderDetail_IMAP_Title": "IMAP Server", + "ProviderDetail_Yahoo_Title": "Yahoo Mail", + "ProviderDetail_Yahoo_Description": "Yahoo Account", + "ProviderDetail_iCloud_Title": "iCloud", + "ProviderDetail_iCloud_Description": "Apple iCloud Account", "ProtocolLogAvailable_Message": "Protocol logs are available for diagnostics.", "Results": "Results", "Right": "Right", diff --git a/Wino.Core.UWP/Assets/Providers/Yahoo.png b/Wino.Core.UWP/Assets/Providers/Yahoo.png index 7823af45..a9881f75 100644 Binary files a/Wino.Core.UWP/Assets/Providers/Yahoo.png and b/Wino.Core.UWP/Assets/Providers/Yahoo.png differ diff --git a/Wino.Core.UWP/Assets/Providers/iCloud.png b/Wino.Core.UWP/Assets/Providers/iCloud.png new file mode 100644 index 00000000..c19c75d4 Binary files /dev/null and b/Wino.Core.UWP/Assets/Providers/iCloud.png differ diff --git a/Wino.Core.UWP/Assets/WinoIcons.ttf b/Wino.Core.UWP/Assets/WinoIcons.ttf index aedc293b..ef8acbf8 100644 Binary files a/Wino.Core.UWP/Assets/WinoIcons.ttf and b/Wino.Core.UWP/Assets/WinoIcons.ttf differ diff --git a/Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml b/Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml new file mode 100644 index 00000000..ae38dd73 --- /dev/null +++ b/Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + diff --git a/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs b/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs index bfc9fae9..9ba9efca 100644 --- a/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs +++ b/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using Windows.System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Accounts; @@ -8,6 +11,17 @@ namespace Wino.Core.UWP.Dialogs { public sealed partial class NewAccountDialog : ContentDialog { + private Dictionary helpingLinks = new Dictionary() + { + { SpecialImapProvider.iCloud, "https://support.apple.com/en-us/102654" }, + { SpecialImapProvider.Yahoo, "http://help.yahoo.com/kb/SLN15241.html" }, + }; + + public static readonly DependencyProperty IsProviderSelectionVisibleProperty = DependencyProperty.Register(nameof(IsProviderSelectionVisible), typeof(bool), typeof(NewAccountDialog), new PropertyMetadata(true)); + public static readonly DependencyProperty IsSpecialImapServerPartVisibleProperty = DependencyProperty.Register(nameof(IsSpecialImapServerPartVisible), typeof(bool), typeof(NewAccountDialog), new PropertyMetadata(false)); + public static readonly DependencyProperty SelectedMailProviderProperty = DependencyProperty.Register(nameof(SelectedMailProvider), typeof(ProviderDetail), typeof(NewAccountDialog), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedProviderChanged))); + + /// /// Gets or sets current selected mail provider in the dialog. /// @@ -17,7 +31,18 @@ namespace Wino.Core.UWP.Dialogs set { SetValue(SelectedMailProviderProperty, value); } } - public static readonly DependencyProperty SelectedMailProviderProperty = DependencyProperty.Register(nameof(SelectedMailProvider), typeof(ProviderDetail), typeof(NewAccountDialog), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedProviderChanged))); + + public bool IsProviderSelectionVisible + { + get { return (bool)GetValue(IsProviderSelectionVisibleProperty); } + set { SetValue(IsProviderSelectionVisibleProperty, value); } + } + + public bool IsSpecialImapServerPartVisible + { + get { return (bool)GetValue(IsSpecialImapServerPartVisibleProperty); } + set { SetValue(IsSpecialImapServerPartVisibleProperty, value); } + } // List of available mail providers for now. @@ -45,16 +70,40 @@ namespace Wino.Core.UWP.Dialogs private void CreateClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) { + if (IsSpecialImapServerPartVisible) + { + // Special imap detail input. + + var details = new SpecialImapProviderDetails(SpecialImapAddress.Text.Trim(), AppSpecificPassword.Password.Trim(), DisplayNameTextBox.Text.Trim(), SelectedMailProvider.SpecialImapProvider); + Result = new AccountCreationDialogResult(SelectedMailProvider.Type, AccountNameTextbox.Text.Trim(), details); + Hide(); + + return; + } + Validate(); if (IsSecondaryButtonEnabled) { - Result = new AccountCreationDialogResult(SelectedMailProvider.Type, AccountNameTextbox.Text.Trim()); - Hide(); + if (SelectedMailProvider.SpecialImapProvider != SpecialImapProvider.None) + { + // This step requires app-sepcific password login for some providers. + args.Cancel = true; + + IsProviderSelectionVisible = false; + IsSpecialImapServerPartVisible = true; + + Validate(); + } + else + { + Result = new AccountCreationDialogResult(SelectedMailProvider.Type, AccountNameTextbox.Text.Trim(), null); + Hide(); + } } } - private void AccountNameChanged(object sender, TextChangedEventArgs e) => Validate(); + private void InputChanged(object sender, TextChangedEventArgs e) => Validate(); private void SenderNameChanged(object sender, TextChangedEventArgs e) => Validate(); private void Validate() @@ -68,7 +117,10 @@ namespace Wino.Core.UWP.Dialogs { bool shouldEnable = SelectedMailProvider != null && SelectedMailProvider.IsSupported - && !string.IsNullOrEmpty(AccountNameTextbox.Text); + && !string.IsNullOrEmpty(AccountNameTextbox.Text) + && (IsSpecialImapServerPartVisible ? (!string.IsNullOrEmpty(AppSpecificPassword.Password) + && !string.IsNullOrEmpty(DisplayNameTextBox.Text) + && EmailValidation.EmailValidator.Validate(SpecialImapAddress.Text)) : true); IsPrimaryButtonEnabled = shouldEnable; } @@ -79,5 +131,22 @@ namespace Wino.Core.UWP.Dialogs } private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) => Validate(); + + private void BackClicked(object sender, RoutedEventArgs e) + { + IsSpecialImapServerPartVisible = false; + IsProviderSelectionVisible = true; + + Validate(); + } + + private void ImapPasswordChanged(object sender, RoutedEventArgs e) => Validate(); + + private async void AppSpecificHelpButtonClicked(object sender, RoutedEventArgs e) + { + var helpUrl = helpingLinks[SelectedMailProvider.SpecialImapProvider]; + + await Launcher.LaunchUriAsync(new Uri(helpUrl)); + } } } diff --git a/Wino.Core.UWP/Helpers/XamlHelpers.cs b/Wino.Core.UWP/Helpers/XamlHelpers.cs index 8e28631a..45205fdf 100644 --- a/Wino.Core.UWP/Helpers/XamlHelpers.cs +++ b/Wino.Core.UWP/Helpers/XamlHelpers.cs @@ -11,6 +11,7 @@ using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Markup; using Windows.UI.Xaml.Media; using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Models.MailItem; using Wino.Core.UWP.Controls; @@ -262,17 +263,31 @@ namespace Wino.Helpers }; } - public static WinoIconGlyph GetProviderIcon(MailProviderType providerType) + + public static WinoIconGlyph GetProviderIcon(MailProviderType providerType, SpecialImapProvider specialImapProvider) { - return providerType switch + if (specialImapProvider == SpecialImapProvider.None) { - MailProviderType.Outlook => WinoIconGlyph.Microsoft, - MailProviderType.Gmail => WinoIconGlyph.Google, - MailProviderType.Office365 => WinoIconGlyph.Microsoft, - MailProviderType.IMAP4 => WinoIconGlyph.IMAP, - _ => WinoIconGlyph.None, - }; + return providerType switch + { + MailProviderType.Outlook => WinoIconGlyph.Microsoft, + MailProviderType.Gmail => WinoIconGlyph.Google, + MailProviderType.IMAP4 => WinoIconGlyph.IMAP, + _ => WinoIconGlyph.None, + }; + } + else + { + return specialImapProvider switch + { + SpecialImapProvider.iCloud => WinoIconGlyph.Apple, + SpecialImapProvider.Yahoo => WinoIconGlyph.Yahoo, + _ => WinoIconGlyph.None, + }; + } } + public static WinoIconGlyph GetProviderIcon(MailAccount account) + => GetProviderIcon(account.ProviderType, account.SpecialImapProvider); public static Geometry GetPathGeometry(string pathMarkup) { diff --git a/Wino.Core.UWP/Services/DialogServiceBase.cs b/Wino.Core.UWP/Services/DialogServiceBase.cs index 214ce1fd..2f8f3e92 100644 --- a/Wino.Core.UWP/Services/DialogServiceBase.cs +++ b/Wino.Core.UWP/Services/DialogServiceBase.cs @@ -131,7 +131,7 @@ namespace Wino.Core.UWP.Services return file; } - public virtual IAccountCreationDialog GetAccountCreationDialog(MailProviderType type) + public virtual IAccountCreationDialog GetAccountCreationDialog(AccountCreationDialogResult accountCreationDialogResult) { return new AccountCreationDialog { diff --git a/Wino.Core.UWP/Services/WinoServerConnectionManager.cs b/Wino.Core.UWP/Services/WinoServerConnectionManager.cs index 206a1dc6..50ad570f 100644 --- a/Wino.Core.UWP/Services/WinoServerConnectionManager.cs +++ b/Wino.Core.UWP/Services/WinoServerConnectionManager.cs @@ -18,6 +18,7 @@ using Wino.Core.Integration.Json; using Wino.Messaging; using Wino.Messaging.Client.Connection; using Wino.Messaging.Enums; +using Wino.Messaging.Server; using Wino.Messaging.UI; namespace Wino.Core.UWP.Services @@ -256,6 +257,9 @@ namespace Wino.Core.UWP.Services case nameof(CopyAuthURLRequested): WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.CopyAuthURLRequested)); break; + case nameof(NewMailSynchronizationRequested): + WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson)); + break; default: throw new Exception("Invalid data type name passed to client."); } diff --git a/Wino.Core.UWP/Styles/DataTemplates.xaml b/Wino.Core.UWP/Styles/DataTemplates.xaml index d429016f..0f9044c4 100644 --- a/Wino.Core.UWP/Styles/DataTemplates.xaml +++ b/Wino.Core.UWP/Styles/DataTemplates.xaml @@ -29,7 +29,7 @@ Header="{x:Bind Account.Name}" IsClickEnabled="True"> - + diff --git a/Wino.Core.UWP/Wino.Core.UWP.csproj b/Wino.Core.UWP/Wino.Core.UWP.csproj index 3165686d..88bd8c3e 100644 --- a/Wino.Core.UWP/Wino.Core.UWP.csproj +++ b/Wino.Core.UWP/Wino.Core.UWP.csproj @@ -24,6 +24,7 @@ + @@ -69,6 +70,7 @@ + @@ -99,6 +101,7 @@ + diff --git a/Wino.Core/CoreContainerSetup.cs b/Wino.Core/CoreContainerSetup.cs index 4db0a3f0..4015d057 100644 --- a/Wino.Core/CoreContainerSetup.cs +++ b/Wino.Core/CoreContainerSetup.cs @@ -4,6 +4,7 @@ using Wino.Authentication; using Wino.Core.Domain.Interfaces; using Wino.Core.Integration.Processors; using Wino.Core.Services; +using Wino.Core.Synchronizers.ImapSync; namespace Wino.Core { @@ -28,6 +29,11 @@ namespace Wino.Core services.AddTransient(); services.AddTransient(); services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } diff --git a/Wino.Core/Integration/ImapClientPool.cs b/Wino.Core/Integration/ImapClientPool.cs index b31ff6d2..3737b343 100644 --- a/Wino.Core/Integration/ImapClientPool.cs +++ b/Wino.Core/Integration/ImapClientPool.cs @@ -25,8 +25,6 @@ namespace Wino.Core.Integration /// Provides a pooling mechanism for ImapClient. /// Makes sure that we don't have too many connections to the server. /// Rents a connected & authenticated client from the pool all the time. - /// TODO: Keeps the clients alive by sending NOOP command periodically. - /// TODO: Listens to the Inbox folder for new messages. /// /// Connection/Authentication info to be used to configure ImapClient. public class ImapClientPool : IDisposable @@ -48,14 +46,16 @@ namespace Wino.Core.Integration public bool ThrowOnSSLHandshakeCallback { get; set; } public ImapClientPoolOptions ImapClientPoolOptions { get; } + internal WinoImapClient IdleClient { get; set; } private readonly int MinimumPoolSize = 5; - private readonly ConcurrentStack _clients = []; + private readonly ConcurrentStack _clients = []; private readonly SemaphoreSlim _semaphore; private readonly CustomServerInformation _customServerInformation; private readonly Stream _protocolLogStream; private readonly ILogger _logger = Log.ForContext(); + private bool _disposedValue; public ImapClientPool(ImapClientPoolOptions imapClientPoolOptions) { @@ -74,7 +74,7 @@ namespace Wino.Core.Integration /// Reconnects and reauthenticates if necessary. /// /// Whether the client has been newly created. - private async Task EnsureCapabilitiesAsync(ImapClient client, bool isCreatedNew) + private async Task EnsureCapabilitiesAsync(IImapClient client, bool isCreatedNew) { try { @@ -84,6 +84,9 @@ namespace Wino.Core.Integration if ((isCreatedNew || isReconnected) && client.IsConnected) { + if (client.Capabilities.HasFlag(ImapCapabilities.Compress)) + await client.CompressAsync(); + // Identify if the server supports ID extension. // Some servers require it pre-authentication, some post-authentication. // We'll observe the response here and do it after authentication if needed. @@ -113,10 +116,11 @@ namespace Wino.Core.Integration // Activate post-auth capabilities. if (client.Capabilities.HasFlag(ImapCapabilities.QuickResync)) - await client.EnableQuickResyncAsync(); + { + await client.EnableQuickResyncAsync().ConfigureAwait(false); - if (client.Capabilities.HasFlag(ImapCapabilities.Compress)) - await client.CompressAsync(); + if (client is WinoImapClient winoImapClient) winoImapClient.IsQResyncEnabled = true; + } } } catch (Exception ex) @@ -145,11 +149,11 @@ namespace Wino.Core.Integration return reader.ReadToEnd(); } - public async Task GetClientAsync() + public async Task GetClientAsync() { await _semaphore.WaitAsync(); - if (_clients.TryPop(out ImapClient item)) + if (_clients.TryPop(out IImapClient item)) { await EnsureCapabilitiesAsync(item, false); @@ -163,20 +167,24 @@ namespace Wino.Core.Integration return client; } - public void Release(ImapClient item, bool destroyClient = false) + public void Release(IImapClient item, bool destroyClient = false) { if (item != null) { if (destroyClient) { - lock (item.SyncRoot) + if (item.IsConnected) { - item.Disconnect(true); + lock (item.SyncRoot) + { + item.Disconnect(quit: true); + } } + _clients.TryPop(out _); item.Dispose(); } - else + else if (!_disposedValue) { _clients.Push(item); } @@ -185,23 +193,15 @@ namespace Wino.Core.Integration } } - public void DestroyClient(ImapClient client) + private IImapClient CreateNewClient() { - if (client == null) return; - - client.Disconnect(true); - client.Dispose(); - } - - private ImapClient CreateNewClient() - { - ImapClient client = null; + WinoImapClient client = null; // Make sure to create a ImapClient with a protocol logger if enabled. client = _protocolLogStream != null - ? new ImapClient(new ProtocolLogger(_protocolLogStream)) - : new ImapClient(); + ? new WinoImapClient(new ProtocolLogger(_protocolLogStream)) + : new WinoImapClient(); HttpProxyClient proxyClient = null; @@ -213,7 +213,7 @@ namespace Wino.Core.Integration client.ProxyClient = proxyClient; - _logger.Debug("Created new ImapClient. Current clients: {Count}", _clients.Count); + _logger.Debug("Creating new ImapClient. Current clients: {Count}", _clients.Count); return client; } @@ -229,7 +229,7 @@ namespace Wino.Core.Integration }; /// True if the connection is newly established. - public async Task EnsureConnectedAsync(ImapClient client) + public async Task EnsureConnectedAsync(IImapClient client) { if (client.IsConnected) return false; @@ -263,8 +263,20 @@ namespace Wino.Core.Integration { if (_protocolLogStream == null) return; - var messageBytes = Encoding.UTF8.GetBytes($"W: {message}\n"); - _protocolLogStream.Write(messageBytes, 0, messageBytes.Length); + try + { + var messageBytes = Encoding.UTF8.GetBytes($"W: {message}\n"); + _protocolLogStream.Write(messageBytes, 0, messageBytes.Length); + } + catch (ObjectDisposedException) + { + Log.Warning($"Protocol log stream is disposed. Cannot write to it."); + } + catch (Exception) + { + + throw; + } } bool MyServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) @@ -281,7 +293,7 @@ namespace Wino.Core.Integration return true; } - public async Task EnsureAuthenticatedAsync(ImapClient client) + public async Task EnsureAuthenticatedAsync(IImapClient client) { if (client.IsAuthenticated) return; @@ -319,27 +331,38 @@ namespace Wino.Core.Integration }; } + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _clients.ForEach(client => + { + lock (client.SyncRoot) + { + client.Disconnect(true); + } + }); + + _clients.ForEach(client => + { + client.Dispose(); + }); + + _clients.Clear(); + + _protocolLogStream?.Dispose(); + } + + _disposedValue = true; + } + } + public void Dispose() { - _clients.ForEach(client => - { - lock (client.SyncRoot) - { - client.Disconnect(true); - } - }); - - _clients.ForEach(client => - { - client.Dispose(); - }); - - _clients.Clear(); - - if (_protocolLogStream != null) - { - _protocolLogStream.Dispose(); - } + Dispose(disposing: true); + GC.SuppressFinalize(this); } } } diff --git a/Wino.Core/Integration/WinoImapClient.cs b/Wino.Core/Integration/WinoImapClient.cs new file mode 100644 index 00000000..2d471d90 --- /dev/null +++ b/Wino.Core/Integration/WinoImapClient.cs @@ -0,0 +1,60 @@ +using MailKit; +using MailKit.Net.Imap; +using Serilog; + +namespace Wino.Core.Integration +{ + /// + /// Extended class for ImapClient that is used in Wino. + /// + internal class WinoImapClient : ImapClient + { + /// + /// Gets or internally sets whether the QRESYNC extension is enabled. + /// It is set by ImapClientPool immidiately after the authentication. + /// + public bool IsQResyncEnabled { get; internal set; } + + public WinoImapClient() + { + HookEvents(); + } + + public WinoImapClient(IProtocolLogger protocolLogger) : base(protocolLogger) + { + HookEvents(); + } + + private void HookEvents() + { + Disconnected += ClientDisconnected; + } + + private void UnhookEvents() + { + Disconnected -= ClientDisconnected; + } + + private void ClientDisconnected(object sender, DisconnectedEventArgs e) + { + if (e.IsRequested) + { + Log.Debug("Imap client is disconnected on request."); + } + else + { + Log.Debug("Imap client connection is dropped by server."); + } + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + { + UnhookEvents(); + } + } + } +} diff --git a/Wino.Core/Mime/ImapMessageCreationPackage.cs b/Wino.Core/Mime/ImapMessageCreationPackage.cs deleted file mode 100644 index ae482d98..00000000 --- a/Wino.Core/Mime/ImapMessageCreationPackage.cs +++ /dev/null @@ -1,9 +0,0 @@ -using MailKit; - -namespace Wino.Core.Mime -{ - /// - /// Encapsulates all required information to create a MimeMessage for IMAP synchronizer. - /// - public record ImapMessageCreationPackage(IMessageSummary MessageSummary, IMailFolder MailFolder); -} diff --git a/Wino.Core/Requests/Bundles/TaskRequestBundle.cs b/Wino.Core/Requests/Bundles/TaskRequestBundle.cs index 96e0bb69..0aa8c903 100644 --- a/Wino.Core/Requests/Bundles/TaskRequestBundle.cs +++ b/Wino.Core/Requests/Bundles/TaskRequestBundle.cs @@ -7,10 +7,10 @@ namespace Wino.Core.Requests.Bundles { public class ImapRequest { - public Func IntegratorTask { get; } + public Func IntegratorTask { get; } public IRequestBase Request { get; } - public ImapRequest(Func integratorTask, IRequestBase request) + public ImapRequest(Func integratorTask, IRequestBase request) { IntegratorTask = integratorTask; Request = request; @@ -19,7 +19,7 @@ namespace Wino.Core.Requests.Bundles public class ImapRequest : ImapRequest where TRequestBaseType : IRequestBase { - public ImapRequest(Func integratorTask, TRequestBaseType request) + public ImapRequest(Func integratorTask, TRequestBaseType request) : base((client, request) => integratorTask(client, (TRequestBaseType)request), request) { } diff --git a/Wino.Core/Requests/Folder/EmptyFolderRequest.cs b/Wino.Core/Requests/Folder/EmptyFolderRequest.cs index 8ae559c2..f4d434c7 100644 --- a/Wino.Core/Requests/Folder/EmptyFolderRequest.cs +++ b/Wino.Core/Requests/Folder/EmptyFolderRequest.cs @@ -11,6 +11,7 @@ namespace Wino.Core.Requests.Folder { public record EmptyFolderRequest(MailItemFolder Folder, List MailsToDelete) : FolderRequestBase(Folder, FolderSynchronizerOperation.EmptyFolder), ICustomFolderSynchronizationRequest { + public bool ExcludeMustHaveFolders => false; public override void ApplyUIChanges() { foreach (var item in MailsToDelete) diff --git a/Wino.Core/Requests/Folder/MarkFolderAsReadRequest.cs b/Wino.Core/Requests/Folder/MarkFolderAsReadRequest.cs index 17e989b2..4aee879d 100644 --- a/Wino.Core/Requests/Folder/MarkFolderAsReadRequest.cs +++ b/Wino.Core/Requests/Folder/MarkFolderAsReadRequest.cs @@ -32,5 +32,7 @@ namespace Wino.Core.Requests.Folder } public List SynchronizationFolderIds => [Folder.Id]; + + public bool ExcludeMustHaveFolders => true; } } diff --git a/Wino.Core/Requests/Mail/ArchiveRequest.cs b/Wino.Core/Requests/Mail/ArchiveRequest.cs index bc37bff3..94d6275c 100644 --- a/Wino.Core/Requests/Mail/ArchiveRequest.cs +++ b/Wino.Core/Requests/Mail/ArchiveRequest.cs @@ -21,6 +21,7 @@ namespace Wino.Core.Requests.Mail public record ArchiveRequest(bool IsArchiving, MailCopy Item, MailItemFolder FromFolder, MailItemFolder ToFolder = null) : MailRequestBase(Item), ICustomFolderSynchronizationRequest { + public bool ExcludeMustHaveFolders => false; public List SynchronizationFolderIds { get diff --git a/Wino.Core/Requests/Mail/ChangeFlagRequest.cs b/Wino.Core/Requests/Mail/ChangeFlagRequest.cs index 56789c31..53a25602 100644 --- a/Wino.Core/Requests/Mail/ChangeFlagRequest.cs +++ b/Wino.Core/Requests/Mail/ChangeFlagRequest.cs @@ -14,6 +14,8 @@ namespace Wino.Core.Requests.Mail { public List SynchronizationFolderIds => [Item.FolderId]; + public bool ExcludeMustHaveFolders => true; + public override MailSynchronizerOperation Operation => MailSynchronizerOperation.ChangeFlag; public override void ApplyUIChanges() diff --git a/Wino.Core/Requests/Mail/CreateDraftRequest.cs b/Wino.Core/Requests/Mail/CreateDraftRequest.cs index beb09fa6..2c77f802 100644 --- a/Wino.Core/Requests/Mail/CreateDraftRequest.cs +++ b/Wino.Core/Requests/Mail/CreateDraftRequest.cs @@ -13,6 +13,8 @@ namespace Wino.Core.Requests.Mail : MailRequestBase(DraftPreperationRequest.CreatedLocalDraftCopy), ICustomFolderSynchronizationRequest { + public bool ExcludeMustHaveFolders => false; + public List SynchronizationFolderIds => [ DraftPreperationRequest.CreatedLocalDraftCopy.AssignedFolder.Id diff --git a/Wino.Core/Requests/Mail/DeleteRequest.cs b/Wino.Core/Requests/Mail/DeleteRequest.cs index de6e9ffb..ce7295db 100644 --- a/Wino.Core/Requests/Mail/DeleteRequest.cs +++ b/Wino.Core/Requests/Mail/DeleteRequest.cs @@ -17,7 +17,7 @@ namespace Wino.Core.Requests.Mail ICustomFolderSynchronizationRequest { public List SynchronizationFolderIds => [Item.FolderId]; - + public bool ExcludeMustHaveFolders => false; public override MailSynchronizerOperation Operation => MailSynchronizerOperation.Delete; public override void ApplyUIChanges() diff --git a/Wino.Core/Requests/Mail/MarkReadRequest.cs b/Wino.Core/Requests/Mail/MarkReadRequest.cs index e5b80e44..c3f18a8d 100644 --- a/Wino.Core/Requests/Mail/MarkReadRequest.cs +++ b/Wino.Core/Requests/Mail/MarkReadRequest.cs @@ -15,6 +15,8 @@ namespace Wino.Core.Requests.Mail public override MailSynchronizerOperation Operation => MailSynchronizerOperation.MarkRead; + public bool ExcludeMustHaveFolders => true; + public override void ApplyUIChanges() { Item.IsRead = IsRead; diff --git a/Wino.Core/Requests/Mail/MoveRequest.cs b/Wino.Core/Requests/Mail/MoveRequest.cs index 8fc198ef..489e0d02 100644 --- a/Wino.Core/Requests/Mail/MoveRequest.cs +++ b/Wino.Core/Requests/Mail/MoveRequest.cs @@ -13,7 +13,7 @@ namespace Wino.Core.Requests.Mail : MailRequestBase(Item), ICustomFolderSynchronizationRequest { public List SynchronizationFolderIds => new() { FromFolder.Id, ToFolder.Id }; - + public bool ExcludeMustHaveFolders => false; public override MailSynchronizerOperation Operation => MailSynchronizerOperation.Move; public override void ApplyUIChanges() diff --git a/Wino.Core/Requests/Mail/SendDraftRequest.cs b/Wino.Core/Requests/Mail/SendDraftRequest.cs index 0dfc56fe..621f269a 100644 --- a/Wino.Core/Requests/Mail/SendDraftRequest.cs +++ b/Wino.Core/Requests/Mail/SendDraftRequest.cs @@ -28,6 +28,8 @@ namespace Wino.Core.Requests.Mail } } + public bool ExcludeMustHaveFolders => false; + public override MailSynchronizerOperation Operation => MailSynchronizerOperation.Send; public override void ApplyUIChanges() diff --git a/Wino.Core/Services/AuthenticationProvider.cs b/Wino.Core/Services/AuthenticationProvider.cs index 42a7d8b8..ea50954d 100644 --- a/Wino.Core/Services/AuthenticationProvider.cs +++ b/Wino.Core/Services/AuthenticationProvider.cs @@ -28,7 +28,6 @@ namespace Wino.Core.Services return providerType switch { MailProviderType.Outlook => new OutlookAuthenticator(_nativeAppService, _applicationConfiguration, _authenticatorConfig), - MailProviderType.Office365 => new Office365Authenticator(_nativeAppService, _applicationConfiguration, _authenticatorConfig), MailProviderType.Gmail => new GmailAuthenticator(_authenticatorConfig), _ => throw new ArgumentException(Translator.Exception_UnsupportedProvider), }; diff --git a/Wino.Core/Services/SynchronizerFactory.cs b/Wino.Core/Services/SynchronizerFactory.cs index 62814e5d..952f163b 100644 --- a/Wino.Core/Services/SynchronizerFactory.cs +++ b/Wino.Core/Services/SynchronizerFactory.cs @@ -13,6 +13,7 @@ namespace Wino.Core.Services private bool isInitialized = false; private readonly IAccountService _accountService; + private readonly IImapSynchronizationStrategyProvider _imapSynchronizationStrategyProvider; private readonly IApplicationConfiguration _applicationConfiguration; private readonly IOutlookChangeProcessor _outlookChangeProcessor; private readonly IGmailChangeProcessor _gmailChangeProcessor; @@ -28,6 +29,7 @@ namespace Wino.Core.Services IOutlookAuthenticator outlookAuthenticator, IGmailAuthenticator gmailAuthenticator, IAccountService accountService, + IImapSynchronizationStrategyProvider imapSynchronizationStrategyProvider, IApplicationConfiguration applicationConfiguration) { _outlookChangeProcessor = outlookChangeProcessor; @@ -36,6 +38,7 @@ namespace Wino.Core.Services _outlookAuthenticator = outlookAuthenticator; _gmailAuthenticator = gmailAuthenticator; _accountService = accountService; + _imapSynchronizationStrategyProvider = imapSynchronizationStrategyProvider; _applicationConfiguration = applicationConfiguration; } @@ -51,6 +54,7 @@ namespace Wino.Core.Services { synchronizer = CreateNewSynchronizer(account); + return await GetAccountSynchronizerAsync(accountId); } } @@ -65,12 +69,11 @@ namespace Wino.Core.Services switch (providerType) { case Domain.Enums.MailProviderType.Outlook: - case Domain.Enums.MailProviderType.Office365: return new OutlookSynchronizer(mailAccount, _outlookAuthenticator, _outlookChangeProcessor); case Domain.Enums.MailProviderType.Gmail: return new GmailSynchronizer(mailAccount, _gmailAuthenticator, _gmailChangeProcessor); case Domain.Enums.MailProviderType.IMAP4: - return new ImapSynchronizer(mailAccount, _imapChangeProcessor, _applicationConfiguration); + return new ImapSynchronizer(mailAccount, _imapChangeProcessor, _imapSynchronizationStrategyProvider, _applicationConfiguration); default: break; } @@ -82,6 +85,12 @@ namespace Wino.Core.Services { var synchronizer = CreateIntegratorWithDefaultProcessor(account); + if (synchronizer is IImapSynchronizer imapSynchronizer) + { + // Start the idle client for IMAP synchronizer. + _ = imapSynchronizer.StartIdleClientAsync(); + } + synchronizerCache.Add(synchronizer); return synchronizer; @@ -100,5 +109,18 @@ namespace Wino.Core.Services isInitialized = true; } + + public async Task DeleteSynchronizerAsync(Guid accountId) + { + var synchronizer = synchronizerCache.Find(a => a.Account.Id == accountId); + + if (synchronizer != null) + { + // Stop the current synchronization. + await synchronizer.KillSynchronizerAsync(); + + synchronizerCache.Remove(synchronizer); + } + } } } diff --git a/Wino.Core/Services/ThreadingStrategyProvider.cs b/Wino.Core/Services/ThreadingStrategyProvider.cs index 87b64823..d9a803be 100644 --- a/Wino.Core/Services/ThreadingStrategyProvider.cs +++ b/Wino.Core/Services/ThreadingStrategyProvider.cs @@ -23,7 +23,7 @@ namespace Wino.Core.Services { return mailProviderType switch { - MailProviderType.Outlook or MailProviderType.Office365 => _outlookThreadingStrategy, + MailProviderType.Outlook => _outlookThreadingStrategy, MailProviderType.Gmail => _gmailThreadingStrategy, _ => _imapThreadStrategy, }; diff --git a/Wino.Core/Services/WinoRequestProcessor.cs b/Wino.Core/Services/WinoRequestProcessor.cs index ba958b2a..3d4aec32 100644 --- a/Wino.Core/Services/WinoRequestProcessor.cs +++ b/Wino.Core/Services/WinoRequestProcessor.cs @@ -163,8 +163,7 @@ namespace Wino.Core.Services MailItemFolder archiveFolder = null; bool shouldRequireArchiveFolder = mailItem.AssignedAccount.ProviderType == MailProviderType.Outlook - || mailItem.AssignedAccount.ProviderType == MailProviderType.IMAP4 - || mailItem.AssignedAccount.ProviderType == MailProviderType.Office365; + || mailItem.AssignedAccount.ProviderType == MailProviderType.IMAP4; if (shouldRequireArchiveFolder) { diff --git a/Wino.Core/Synchronizers/BaseSynchronizer.cs b/Wino.Core/Synchronizers/BaseSynchronizer.cs index 7c11e83d..d2269afc 100644 --- a/Wino.Core/Synchronizers/BaseSynchronizer.cs +++ b/Wino.Core/Synchronizers/BaseSynchronizer.cs @@ -51,9 +51,6 @@ namespace Wino.Core.Synchronizers /// Cancellation token public abstract Task ExecuteNativeRequestsAsync(List> batchedRequests, CancellationToken cancellationToken = default); - // TODO: What if account is deleted during synchronization? - public bool CancelActiveSynchronization() => true; - /// /// Refreshes remote mail account profile if possible. /// Profile picture, sender name and mailbox settings (todo) will be handled in this step. diff --git a/Wino.Core/Synchronizers/GmailSynchronizer.cs b/Wino.Core/Synchronizers/GmailSynchronizer.cs index 91d33478..66a89292 100644 --- a/Wino.Core/Synchronizers/GmailSynchronizer.cs +++ b/Wino.Core/Synchronizers/GmailSynchronizer.cs @@ -1193,5 +1193,15 @@ namespace Wino.Core.Synchronizers.Mail } #endregion + + public override async Task KillSynchronizerAsync() + { + await base.KillSynchronizerAsync(); + + _gmailService.Dispose(); + _peopleService.Dispose(); + _calendarService.Dispose(); + _googleHttpClient.Dispose(); + } } } diff --git a/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs b/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs new file mode 100644 index 00000000..01f16abe --- /dev/null +++ b/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MailKit; +using MailKit.Net.Imap; +using MailKit.Search; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration; +using IMailService = Wino.Core.Domain.Interfaces.IMailService; + +namespace Wino.Core.Synchronizers.ImapSync +{ + /// + /// RFC 4551 CONDSTORE IMAP Synchronization strategy. + /// + internal class CondstoreSynchronizer : ImapSynchronizationStrategyBase + { + public CondstoreSynchronizer(IFolderService folderService, IMailService mailService) : base(folderService, mailService) + { + } + + public async override Task> HandleSynchronizationAsync(IImapClient client, + MailItemFolder folder, + IImapSynchronizer synchronizer, + CancellationToken cancellationToken = default) + { + if (client is not WinoImapClient winoClient) + throw new ArgumentException("Client must be of type WinoImapClient.", nameof(client)); + + if (!client.Capabilities.HasFlag(ImapCapabilities.CondStore)) + throw new ImapSynchronizerStrategyException("Server does not support CONDSTORE."); + + IMailFolder remoteFolder = null; + + var downloadedMessageIds = new List(); + + try + { + remoteFolder = await winoClient.GetFolderAsync(folder.RemoteFolderId, cancellationToken).ConfigureAwait(false); + + await remoteFolder.OpenAsync(FolderAccess.ReadOnly, cancellationToken).ConfigureAwait(false); + + var localHighestModSeq = (ulong)folder.HighestModeSeq; + + bool isInitialSynchronization = localHighestModSeq == 0; + + // There are some changes on new messages or flag changes. + // Deletions are tracked separately because some servers do not increase + // the MODSEQ value for deleted messages. + if (remoteFolder.HighestModSeq > localHighestModSeq) + { + var changedUids = await GetChangedUidsAsync(client, remoteFolder, synchronizer, cancellationToken).ConfigureAwait(false); + + // Get locally exists mails for the returned UIDs. + downloadedMessageIds = await HandleChangedUIdsAsync(synchronizer, remoteFolder, changedUids, cancellationToken).ConfigureAwait(false); + + folder.HighestModeSeq = unchecked((long)remoteFolder.HighestModSeq); + + await FolderService.UpdateFolderAsync(folder).ConfigureAwait(false); + } + + await ManageUUIdBasedDeletedMessagesAsync(folder, remoteFolder, cancellationToken).ConfigureAwait(false); + + return downloadedMessageIds; + } + catch (FolderNotFoundException) + { + await FolderService.DeleteFolderAsync(folder.MailAccountId, folder.RemoteFolderId).ConfigureAwait(false); + + return default; + } + catch (Exception) + { + throw; + } + finally + { + if (!cancellationToken.IsCancellationRequested) + { + if (remoteFolder != null) + { + if (remoteFolder.IsOpen) + { + await remoteFolder.CloseAsync(cancellationToken: cancellationToken).ConfigureAwait(false); + } + } + } + } + } + + internal override async Task> GetChangedUidsAsync(IImapClient winoClient, IMailFolder remoteFolder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default) + { + var localHighestModSeq = (ulong)Folder.HighestModeSeq; + var remoteHighestModSeq = remoteFolder.HighestModSeq; + + // Search for emails with a MODSEQ greater than the last known value. + // Use SORT extension if server supports. + + IList changedUids = null; + + if (winoClient.Capabilities.HasFlag(ImapCapabilities.Sort)) + { + // Highest mod seq must be greater than 0 for SORT. + changedUids = await remoteFolder.SortAsync(SearchQuery.ChangedSince(Math.Max(localHighestModSeq, 1)), [OrderBy.ReverseDate], cancellationToken).ConfigureAwait(false); + } + else + { + changedUids = await remoteFolder.SearchAsync(SearchQuery.ChangedSince(localHighestModSeq), cancellationToken).ConfigureAwait(false); + } + + changedUids = await remoteFolder.SearchAsync(SearchQuery.ChangedSince(localHighestModSeq), cancellationToken).ConfigureAwait(false); + + // For initial synchronizations, take the first allowed number of items. + // For consequtive synchronizations, take all the items. We don't want to miss any changes. + // Smaller uid means newer message. For initial sync, we need start taking items from the top. + + bool isInitialSynchronization = localHighestModSeq == 0; + + if (isInitialSynchronization) + { + changedUids = changedUids.OrderByDescending(a => a.Id).Take((int)synchronizer.InitialMessageDownloadCountPerFolder).ToList(); + } + + return changedUids; + } + } +} diff --git a/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyBase.cs b/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyBase.cs new file mode 100644 index 00000000..8242f39f --- /dev/null +++ b/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyBase.cs @@ -0,0 +1,185 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MailKit; +using MailKit.Net.Imap; +using MailKit.Search; +using MoreLinq; +using Serilog; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Services.Extensions; +using IMailService = Wino.Core.Domain.Interfaces.IMailService; + +namespace Wino.Core.Synchronizers.ImapSync +{ + public abstract class ImapSynchronizationStrategyBase : IImapSynchronizerStrategy + { + // Minimum summary items to Fetch for mail synchronization from IMAP. + protected readonly MessageSummaryItems MailSynchronizationFlags = + MessageSummaryItems.Flags | + MessageSummaryItems.UniqueId | + MessageSummaryItems.ThreadId | + MessageSummaryItems.EmailId | + MessageSummaryItems.Headers | + MessageSummaryItems.PreviewText | + MessageSummaryItems.GMailThreadId | + MessageSummaryItems.References | + MessageSummaryItems.ModSeq; + + protected IFolderService FolderService { get; } + protected IMailService MailService { get; } + protected MailItemFolder Folder { get; set; } + + protected ImapSynchronizationStrategyBase(IFolderService folderService, IMailService mailService) + { + FolderService = folderService; + MailService = mailService; + } + + public abstract Task> HandleSynchronizationAsync(IImapClient client, MailItemFolder folder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default); + internal abstract Task> GetChangedUidsAsync(IImapClient client, IMailFolder remoteFolder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default); + + protected async Task> HandleChangedUIdsAsync(IImapSynchronizer synchronizer, IMailFolder remoteFolder, IList changedUids, CancellationToken cancellationToken) + { + List downloadedMessageIds = new(); + + var existingMails = await MailService.GetExistingMailsAsync(Folder.Id, changedUids).ConfigureAwait(false); + var existingMailUids = existingMails.Select(m => MailkitClientExtensions.ResolveUidStruct(m.Id)).ToArray(); + + // These are the non-existing mails. They will be downloaded + processed. + var newMessageIds = changedUids.Except(existingMailUids).ToList(); + var deletedMessageIds = existingMailUids.Except(changedUids).ToList(); + + // Fetch minimum data for the existing mails in one query. + var existingFlagData = await remoteFolder.FetchAsync(existingMailUids, MessageSummaryItems.Flags | MessageSummaryItems.UniqueId).ConfigureAwait(false); + + foreach (var update in existingFlagData) + { + if (update.UniqueId == null) + { + Log.Warning($"Couldn't fetch UniqueId for the mail. FetchAsync failed."); + continue; + } + + if (update.Flags == null) + { + Log.Warning($"Couldn't fetch flags for the mail with UID {update.UniqueId.Id}. FetchAsync failed."); + continue; + } + + var existingMail = existingMails.FirstOrDefault(m => MailkitClientExtensions.ResolveUidStruct(m.Id).Id == update.UniqueId.Id); + + if (existingMail == null) + { + Log.Warning($"Couldn't find the mail with UID {update.UniqueId.Id} in the local database. Flag update is ignored."); + continue; + } + + await HandleMessageFlagsChangeAsync(existingMail, update.Flags.Value).ConfigureAwait(false); + } + + // Fetch the new mails in batch. + + var batchedMessageIds = newMessageIds.Batch(50); + + foreach (var group in batchedMessageIds) + { + var summaries = await remoteFolder.FetchAsync(group, MailSynchronizationFlags, cancellationToken).ConfigureAwait(false); + + foreach (var summary in summaries) + { + var mimeMessage = await remoteFolder.GetMessageAsync(summary.UniqueId, cancellationToken).ConfigureAwait(false); + + var creationPackage = new ImapMessageCreationPackage(summary, mimeMessage); + + var mailPackages = await synchronizer.CreateNewMailPackagesAsync(creationPackage, Folder, cancellationToken).ConfigureAwait(false); + + if (mailPackages != null) + { + foreach (var package in mailPackages) + { + // Local draft is mapped. We don't need to create a new mail copy. + if (package == null) continue; + + bool isCreatedNew = await MailService.CreateMailAsync(Folder.MailAccountId, package).ConfigureAwait(false); + + // This is upsert. We are not interested in updated mails. + if (isCreatedNew) downloadedMessageIds.Add(package.Copy.Id); + } + } + } + } + + + return downloadedMessageIds; + } + + protected async Task HandleMessageFlagsChangeAsync(UniqueId? uniqueId, MessageFlags flags) + { + if (Folder == null) return; + if (uniqueId == null) return; + + var localMailCopyId = MailkitClientExtensions.CreateUid(Folder.Id, uniqueId.Value.Id); + + var isFlagged = MailkitClientExtensions.GetIsFlagged(flags); + var isRead = MailkitClientExtensions.GetIsRead(flags); + + await MailService.ChangeReadStatusAsync(localMailCopyId, isRead).ConfigureAwait(false); + await MailService.ChangeFlagStatusAsync(localMailCopyId, isFlagged).ConfigureAwait(false); + } + + protected async Task HandleMessageFlagsChangeAsync(MailCopy mailCopy, MessageFlags flags) + { + if (mailCopy == null) return; + + var isFlagged = MailkitClientExtensions.GetIsFlagged(flags); + var isRead = MailkitClientExtensions.GetIsRead(flags); + + if (isFlagged != mailCopy.IsFlagged) + { + await MailService.ChangeFlagStatusAsync(mailCopy.Id, isFlagged).ConfigureAwait(false); + } + + if (isRead != mailCopy.IsRead) + { + await MailService.ChangeReadStatusAsync(mailCopy.Id, isRead).ConfigureAwait(false); + } + } + + protected async Task HandleMessageDeletedAsync(IList uniqueIds) + { + if (Folder == null) return; + if (uniqueIds == null || uniqueIds.Count == 0) return; + + foreach (var uniqueId in uniqueIds) + { + if (uniqueId == null) continue; + var localMailCopyId = MailkitClientExtensions.CreateUid(Folder.Id, uniqueId.Id); + + await MailService.DeleteMailAsync(Folder.MailAccountId, localMailCopyId).ConfigureAwait(false); + } + } + + protected void OnMessagesVanished(object sender, MessagesVanishedEventArgs args) + => HandleMessageDeletedAsync(args.UniqueIds).ConfigureAwait(false); + + protected void OnMessageFlagsChanged(object sender, MessageFlagsChangedEventArgs args) + => HandleMessageFlagsChangeAsync(args.UniqueId, args.Flags).ConfigureAwait(false); + + protected async Task ManageUUIdBasedDeletedMessagesAsync(MailItemFolder localFolder, IMailFolder remoteFolder, CancellationToken cancellationToken = default) + { + var allUids = (await FolderService.GetKnownUidsForFolderAsync(localFolder.Id)).Select(a => new UniqueId(a)).ToList(); + + if (allUids.Count > 0) + { + var remoteAllUids = await remoteFolder.SearchAsync(SearchQuery.All, cancellationToken); + var deletedUids = allUids.Except(remoteAllUids).ToList(); + + await HandleMessageDeletedAsync(deletedUids).ConfigureAwait(false); + } + } + } +} diff --git a/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs b/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs new file mode 100644 index 00000000..5959b749 --- /dev/null +++ b/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs @@ -0,0 +1,31 @@ +using MailKit.Net.Imap; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration; + +namespace Wino.Core.Synchronizers.ImapSync +{ + internal class ImapSynchronizationStrategyProvider : IImapSynchronizationStrategyProvider + { + private readonly QResyncSynchronizer _qResyncSynchronizer; + private readonly CondstoreSynchronizer _condstoreSynchronizer; + private readonly UidBasedSynchronizer _uidBasedSynchronizer; + + public ImapSynchronizationStrategyProvider(QResyncSynchronizer qResyncSynchronizer, CondstoreSynchronizer condstoreSynchronizer, UidBasedSynchronizer uidBasedSynchronizer) + { + _qResyncSynchronizer = qResyncSynchronizer; + _condstoreSynchronizer = condstoreSynchronizer; + _uidBasedSynchronizer = uidBasedSynchronizer; + } + + public IImapSynchronizerStrategy GetSynchronizationStrategy(IImapClient client) + { + if (client is not WinoImapClient winoImapClient) + throw new System.ArgumentException("Client must be of type WinoImapClient.", nameof(client)); + + if (client.Capabilities.HasFlag(ImapCapabilities.QuickResync) && winoImapClient.IsQResyncEnabled) return _qResyncSynchronizer; + if (client.Capabilities.HasFlag(ImapCapabilities.CondStore)) return _condstoreSynchronizer; + + return _uidBasedSynchronizer; + } + } +} diff --git a/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs b/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs new file mode 100644 index 00000000..2ab22974 --- /dev/null +++ b/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MailKit; +using MailKit.Net.Imap; +using MailKit.Search; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration; +using IMailService = Wino.Core.Domain.Interfaces.IMailService; + +namespace Wino.Core.Synchronizers.ImapSync +{ + /// + /// RFC 5162 QRESYNC IMAP Synchronization strategy. + /// + internal class QResyncSynchronizer : ImapSynchronizationStrategyBase + { + public QResyncSynchronizer(IFolderService folderService, IMailService mailService) : base(folderService, mailService) + { + } + + public override async Task> HandleSynchronizationAsync(IImapClient client, + MailItemFolder folder, + IImapSynchronizer synchronizer, + CancellationToken cancellationToken = default) + { + var downloadedMessageIds = new List(); + + if (client is not WinoImapClient winoClient) + throw new ImapSynchronizerStrategyException("Client must be of type WinoImapClient."); + + if (!client.Capabilities.HasFlag(ImapCapabilities.QuickResync)) + throw new ImapSynchronizerStrategyException("Server does not support QRESYNC."); + + if (!winoClient.IsQResyncEnabled) + throw new ImapSynchronizerStrategyException("QRESYNC is not enabled for WinoImapClient."); + + // Ready to implement QRESYNC synchronization. + + IMailFolder remoteFolder = null; + + Folder = folder; + + try + { + remoteFolder = await client.GetFolderAsync(folder.RemoteFolderId, cancellationToken).ConfigureAwait(false); + + // Check the Uid validity first. + // If they don't match, clear all the local data and perform full-resync. + + bool isCacheValid = remoteFolder.UidValidity == folder.UidValidity; + + if (!isCacheValid) + { + // TODO: Remove all local data. + } + + // Perform QRESYNC synchronization. + var localHighestModSeq = (ulong)folder.HighestModeSeq; + + remoteFolder.MessagesVanished += OnMessagesVanished; + remoteFolder.MessageFlagsChanged += OnMessageFlagsChanged; + + var allUids = await FolderService.GetKnownUidsForFolderAsync(folder.Id); + var allUniqueIds = allUids.Select(a => new UniqueId(a)).ToList(); + + await remoteFolder.OpenAsync(FolderAccess.ReadOnly, folder.UidValidity, localHighestModSeq, allUniqueIds).ConfigureAwait(false); + + var changedUids = await GetChangedUidsAsync(client, remoteFolder, synchronizer, cancellationToken).ConfigureAwait(false); + + downloadedMessageIds = await HandleChangedUIdsAsync(synchronizer, remoteFolder, changedUids, cancellationToken).ConfigureAwait(false); + + // Update the local folder with the new highest mod-seq and validity. + folder.HighestModeSeq = unchecked((long)remoteFolder.HighestModSeq); + folder.UidValidity = remoteFolder.UidValidity; + + await ManageUUIdBasedDeletedMessagesAsync(folder, remoteFolder, cancellationToken).ConfigureAwait(false); + + await FolderService.UpdateFolderAsync(folder).ConfigureAwait(false); + } + catch (FolderNotFoundException) + { + await FolderService.DeleteFolderAsync(folder.MailAccountId, folder.RemoteFolderId).ConfigureAwait(false); + + return default; + } + catch (Exception) + { + throw; + } + finally + { + if (!cancellationToken.IsCancellationRequested) + { + if (remoteFolder != null) + { + remoteFolder.MessagesVanished -= OnMessagesVanished; + remoteFolder.MessageFlagsChanged -= OnMessageFlagsChanged; + + if (remoteFolder.IsOpen) + { + await remoteFolder.CloseAsync(); + } + } + } + } + + return downloadedMessageIds; + } + + internal override async Task> GetChangedUidsAsync(IImapClient client, IMailFolder remoteFolder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default) + { + var localHighestModSeq = (ulong)Folder.HighestModeSeq; + return await remoteFolder.SearchAsync(SearchQuery.ChangedSince(localHighestModSeq), cancellationToken).ConfigureAwait(false); + } + } +} diff --git a/Wino.Core/Synchronizers/ImapSync/UidBasedSynchronizer.cs b/Wino.Core/Synchronizers/ImapSync/UidBasedSynchronizer.cs new file mode 100644 index 00000000..ca7f3c7b --- /dev/null +++ b/Wino.Core/Synchronizers/ImapSync/UidBasedSynchronizer.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MailKit; +using MailKit.Net.Imap; +using MailKit.Search; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration; + +namespace Wino.Core.Synchronizers.ImapSync +{ + /// + /// Uid based IMAP Synchronization strategy. + /// + internal class UidBasedSynchronizer : ImapSynchronizationStrategyBase + { + public UidBasedSynchronizer(IFolderService folderService, Domain.Interfaces.IMailService mailService) : base(folderService, mailService) + { + } + + public override async Task> HandleSynchronizationAsync(IImapClient client, MailItemFolder folder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default) + { + if (client is not WinoImapClient winoClient) + throw new ArgumentException("Client must be of type WinoImapClient.", nameof(client)); + + Folder = folder; + + var downloadedMessageIds = new List(); + IMailFolder remoteFolder = null; + + try + { + remoteFolder = await winoClient.GetFolderAsync(folder.RemoteFolderId, cancellationToken).ConfigureAwait(false); + + await remoteFolder.OpenAsync(FolderAccess.ReadOnly, cancellationToken).ConfigureAwait(false); + + // Fetch UIDs from the remote folder + var remoteUids = await remoteFolder.SearchAsync(SearchQuery.All, cancellationToken).ConfigureAwait(false); + + remoteUids = remoteUids.OrderByDescending(a => a.Id).Take((int)synchronizer.InitialMessageDownloadCountPerFolder).ToList(); + + await HandleChangedUIdsAsync(synchronizer, remoteFolder, remoteUids, cancellationToken).ConfigureAwait(false); + await ManageUUIdBasedDeletedMessagesAsync(folder, remoteFolder, cancellationToken).ConfigureAwait(false); + } + catch (FolderNotFoundException) + { + await FolderService.DeleteFolderAsync(folder.MailAccountId, folder.RemoteFolderId).ConfigureAwait(false); + + return default; + } + catch (Exception) + { + + throw; + } + finally + { + if (!cancellationToken.IsCancellationRequested) + { + if (remoteFolder != null) + { + if (remoteFolder.IsOpen) + { + await remoteFolder.CloseAsync(cancellationToken: cancellationToken).ConfigureAwait(false); + } + } + } + } + + return downloadedMessageIds; + } + + internal override Task> GetChangedUidsAsync(IImapClient client, IMailFolder remoteFolder, IImapSynchronizer synchronizer, CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wino.Core/Synchronizers/ImapSynchronizer.cs b/Wino.Core/Synchronizers/ImapSynchronizer.cs index eed08707..1423bba5 100644 --- a/Wino.Core/Synchronizers/ImapSynchronizer.cs +++ b/Wino.Core/Synchronizers/ImapSynchronizer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; @@ -7,8 +8,6 @@ using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using MailKit; using MailKit.Net.Imap; -using MailKit.Search; -using MimeKit; using MoreLinq; using Serilog; using Wino.Core.Domain.Entities.Mail; @@ -22,72 +21,55 @@ using Wino.Core.Domain.Models.Synchronization; using Wino.Core.Extensions; using Wino.Core.Integration; using Wino.Core.Integration.Processors; -using Wino.Core.Mime; using Wino.Core.Requests.Bundles; using Wino.Core.Requests.Folder; using Wino.Core.Requests.Mail; +using Wino.Messaging.Server; using Wino.Messaging.UI; using Wino.Services.Extensions; namespace Wino.Core.Synchronizers.Mail { - public class ImapSynchronizer : WinoSynchronizer + public class ImapSynchronizer : WinoSynchronizer, IImapSynchronizer { - private CancellationTokenSource idleDoneToken; - private CancellationTokenSource cancelInboxListeningToken = new CancellationTokenSource(); + [Obsolete("N/A")] + public override uint BatchModificationSize => 1000; + public override uint InitialMessageDownloadCountPerFolder => 500; - private IMailFolder inboxFolder; + #region Idle Implementation + + private CancellationTokenSource idleCancellationTokenSource; + private CancellationTokenSource idleDoneTokenSource; + + #endregion private readonly ILogger _logger = Log.ForContext(); private readonly ImapClientPool _clientPool; private readonly IImapChangeProcessor _imapChangeProcessor; + private readonly IImapSynchronizationStrategyProvider _imapSynchronizationStrategyProvider; private readonly IApplicationConfiguration _applicationConfiguration; - // Minimum summary items to Fetch for mail synchronization from IMAP. - private readonly MessageSummaryItems mailSynchronizationFlags = - MessageSummaryItems.Flags | - MessageSummaryItems.UniqueId | - MessageSummaryItems.ThreadId | - MessageSummaryItems.EmailId | - MessageSummaryItems.Headers | - MessageSummaryItems.PreviewText | - MessageSummaryItems.GMailThreadId | - MessageSummaryItems.References | - MessageSummaryItems.ModSeq; - - /// - /// Timer that keeps the alive for the lifetime of the pool. - /// Sends NOOP command to the server periodically. - /// - private Timer _noOpTimer; - - /// - /// ImapClient that keeps the Inbox folder opened all the time for listening notifications. - /// - private ImapClient _inboxIdleClient; - - public override uint BatchModificationSize => 1000; - public override uint InitialMessageDownloadCountPerFolder => 250; - public ImapSynchronizer(MailAccount account, IImapChangeProcessor imapChangeProcessor, + IImapSynchronizationStrategyProvider imapSynchronizationStrategyProvider, IApplicationConfiguration applicationConfiguration) : base(account) { // Create client pool with account protocol log. _imapChangeProcessor = imapChangeProcessor; + _imapSynchronizationStrategyProvider = imapSynchronizationStrategyProvider; _applicationConfiguration = applicationConfiguration; - var poolOptions = ImapClientPoolOptions.CreateDefault(Account.ServerInformation, CreateAccountProtocolLogFileStream()); + var protocolLogStream = CreateAccountProtocolLogFileStream(); + var poolOptions = ImapClientPoolOptions.CreateDefault(Account.ServerInformation, protocolLogStream); _clientPool = new ImapClientPool(poolOptions); - idleDoneToken = new CancellationTokenSource(); } private Stream CreateAccountProtocolLogFileStream() { if (Account == null) throw new ArgumentNullException(nameof(Account)); - var logFile = Path.Combine(_applicationConfiguration.ApplicationDataFolderPath, $"Protocol_{Account.Address}.log"); + var logFile = Path.Combine(_applicationConfiguration.ApplicationDataFolderPath, $"Protocol_{Account.Address}_{Account.Id}.log"); // Each session should start a new log. if (File.Exists(logFile)) File.Delete(logFile); @@ -95,136 +77,10 @@ namespace Wino.Core.Synchronizers.Mail return new FileStream(logFile, FileMode.CreateNew); } - // TODO - // private async void NoOpTimerTriggered(object state) => await AwaitInboxIdleAsync(); - - private async Task AwaitInboxIdleAsync() - { - if (_inboxIdleClient == null) - { - _logger.Warning("InboxClient is null. Cannot send NOOP command."); - return; - } - - await _clientPool.EnsureConnectedAsync(_inboxIdleClient); - await _clientPool.EnsureAuthenticatedAsync(_inboxIdleClient); - - try - { - if (inboxFolder == null) - { - inboxFolder = _inboxIdleClient.Inbox; - await inboxFolder.OpenAsync(FolderAccess.ReadOnly, cancelInboxListeningToken.Token); - } - - idleDoneToken = new CancellationTokenSource(); - - await _inboxIdleClient.IdleAsync(idleDoneToken.Token, cancelInboxListeningToken.Token); - } - finally - { - idleDoneToken.Dispose(); - idleDoneToken = null; - } - } - - private async Task StopInboxListeningAsync() - { - if (inboxFolder != null) - { - inboxFolder.CountChanged -= InboxFolderCountChanged; - inboxFolder.MessageExpunged -= InboxFolderMessageExpunged; - inboxFolder.MessageFlagsChanged -= InboxFolderMessageFlagsChanged; - } - - if (_noOpTimer != null) - { - _noOpTimer.Dispose(); - _noOpTimer = null; - } - - if (idleDoneToken != null) - { - idleDoneToken.Cancel(); - idleDoneToken.Dispose(); - idleDoneToken = null; - } - - if (_inboxIdleClient != null) - { - await _inboxIdleClient.DisconnectAsync(true); - _inboxIdleClient.Dispose(); - _inboxIdleClient = null; - } - } - - /// - /// Tries to connect & authenticate with the given credentials. - /// Prepares synchronizer for active listening of Inbox folder. - /// - public async Task StartInboxListeningAsync() - { - _inboxIdleClient = await _clientPool.GetClientAsync(); - - // Run it every 8 minutes after 1 minute delay. - // _noOpTimer = new Timer(NoOpTimerTriggered, null, 60000, 8 * 60 * 1000); - - await _clientPool.EnsureConnectedAsync(_inboxIdleClient); - await _clientPool.EnsureAuthenticatedAsync(_inboxIdleClient); - - if (!_inboxIdleClient.Capabilities.HasFlag(ImapCapabilities.Idle)) - { - _logger.Information("Imap server does not support IDLE command. Listening live changes is not supported for {Name}", Account.Name); - return; - } - - inboxFolder = _inboxIdleClient.Inbox; - - if (inboxFolder == null) - { - _logger.Information("Inbox folder is null. Cannot listen for changes."); - return; - } - - inboxFolder.CountChanged += InboxFolderCountChanged; - inboxFolder.MessageExpunged += InboxFolderMessageExpunged; - inboxFolder.MessageFlagsChanged += InboxFolderMessageFlagsChanged; - - while (!cancelInboxListeningToken.IsCancellationRequested) - { - await AwaitInboxIdleAsync(); - } - - await StopInboxListeningAsync(); - } - - private void InboxFolderMessageFlagsChanged(object sender, MessageFlagsChangedEventArgs e) - { - Console.WriteLine("Flags have changed for message #{0} ({1}).", e.Index, e.Flags); - } - - private void InboxFolderMessageExpunged(object sender, MessageEventArgs e) - { - _logger.Information("Inbox folder message expunged"); - } - - private void InboxFolderCountChanged(object sender, EventArgs e) - { - _logger.Information("Inbox folder count changed."); - } - - /// - /// Parses List of string of mail copy ids and return valid uIds. - /// Follow the rules for creating arbitrary unique id for mail copies. - /// - private UniqueIdSet GetUniqueIds(IEnumerable mailCopyIds) - => new(mailCopyIds.Select(a => new UniqueId(MailkitClientExtensions.ResolveUid(a)))); - /// /// Returns UniqueId for the given mail copy id. /// - private UniqueId GetUniqueId(string mailCopyId) - => new(MailkitClientExtensions.ResolveUid(mailCopyId)); + private UniqueId GetUniqueId(string mailCopyId) => new(MailkitClientExtensions.ResolveUid(mailCopyId)); #region Mail Integrations @@ -319,8 +175,6 @@ namespace Wino.Core.Synchronizers.Mail var singleRequest = request.Request; - singleRequest.Mime.Prepare(EncodingConstraint.None); - using var smtpClient = new MailKit.Net.Smtp.SmtpClient(); if (smtpClient.IsConnected && client.IsAuthenticated) return; @@ -400,22 +254,19 @@ namespace Wino.Core.Synchronizers.Mail public override async Task> CreateNewMailPackagesAsync(ImapMessageCreationPackage message, MailItemFolder assignedFolder, CancellationToken cancellationToken = default) { - var imapFolder = message.MailFolder; - var summary = message.MessageSummary; - - var mimeMessage = await imapFolder.GetMessageAsync(summary.UniqueId, cancellationToken).ConfigureAwait(false); - var mailCopy = summary.GetMailDetails(assignedFolder, mimeMessage); + var mailCopy = message.MessageSummary.GetMailDetails(assignedFolder, message.MimeMessage); // Draft folder message updates must be updated as IsDraft. - // I couldn't find it in MimeMessage... + // I couldn't find it in MimeMesssage... mailCopy.IsDraft = assignedFolder.SpecialFolderType == SpecialFolderType.Draft; // Check draft mapping. // This is the same implementation as in the OutlookSynchronizer. - if (mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader) - && Guid.TryParse(mimeMessage.Headers[Domain.Constants.WinoLocalDraftHeader], out Guid localDraftCopyUniqueId)) + if (message.MimeMessage != null && + message.MimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader) && + Guid.TryParse(message.MimeMessage.Headers[Domain.Constants.WinoLocalDraftHeader], out Guid localDraftCopyUniqueId)) { // This message belongs to existing local draft copy. // We don't need to create a new mail copy for this message, just update the existing one. @@ -427,7 +278,7 @@ namespace Wino.Core.Synchronizers.Mail // Local copy doesn't exists. Continue execution to insert mail copy. } - var package = new NewMailItemPackage(mailCopy, mimeMessage, assignedFolder.RemoteFolderId); + var package = new NewMailItemPackage(mailCopy, message.MimeMessage, assignedFolder.RemoteFolderId); return [ @@ -463,7 +314,13 @@ namespace Wino.Core.Synchronizers.Mail PublishSynchronizationProgress(progress); var folderDownloadedMessageIds = await SynchronizeFolderInternalAsync(folder, cancellationToken).ConfigureAwait(false); - downloadedMessageIds.AddRange(folderDownloadedMessageIds); + + if (cancellationToken.IsCancellationRequested) return MailSynchronizationResult.Canceled; + + if (folderDownloadedMessageIds != null) + { + downloadedMessageIds.AddRange(folderDownloadedMessageIds); + } } } @@ -497,7 +354,7 @@ namespace Wino.Core.Synchronizers.Mail // At this point this client is ready to execute async commands. // Each task bundle will await and execution will continue in case of error. - ImapClient executorClient = null; + IImapClient executorClient = null; bool isCrashed = false; @@ -550,7 +407,7 @@ namespace Wino.Core.Synchronizers.Mail /// ImapClient from the pool /// Assigning remote folder. /// Assigning local folder. - private void AssignSpecialFolderType(ImapClient executorClient, IMailFolder remoteFolder, MailItemFolder localFolder) + private void AssignSpecialFolderType(IImapClient executorClient, IMailFolder remoteFolder, MailItemFolder localFolder) { // Inbox is awlawys available. Don't miss it for assignment even though XList or SpecialUser is not supported. if (executorClient.Inbox == remoteFolder) @@ -592,7 +449,7 @@ namespace Wino.Core.Synchronizers.Mail var localFolders = await _imapChangeProcessor.GetLocalFoldersAsync(Account.Id).ConfigureAwait(false); - ImapClient executorClient = null; + IImapClient executorClient = null; try { @@ -674,6 +531,11 @@ namespace Wino.Core.Synchronizers.Mail if (remoteFolder.IsNamespace && !remoteFolder.Attributes.HasFlag(FolderAttributes.Inbox) || !remoteFolder.Exists) continue; + // Check for NoSelect folders. These are not selectable folders. + // TODO: With new MailKit version 'CanOpen' will be implemented for ease of use. Use that one. + if (remoteFolder.Attributes.HasFlag(FolderAttributes.NoSelect)) + continue; + var existingLocalFolder = localFolders.FirstOrDefault(a => a.RemoteFolderId == remoteFolder.FullName); if (existingLocalFolder == null) @@ -768,264 +630,42 @@ namespace Wino.Core.Synchronizers.Mail } } - - private async Task> SynchronizeFolderInternalAsync(MailItemFolder folder, CancellationToken cancellationToken = default) { if (!folder.IsSynchronizationEnabled) return default; - var downloadedMessageIds = new List(); - - // STEP1: Ask for flag changes for older mails. - // STEP2: Get new mail changes. - // https://www.rfc-editor.org/rfc/rfc4549 - Section 4.3 - - var _synchronizationClient = await _clientPool.GetClientAsync(); - - IMailFolder imapFolder = null; - - var knownMailIds = new UniqueIdSet(); - var locallyKnownMailUids = await _imapChangeProcessor.GetKnownUidsForFolderAsync(folder.Id); - knownMailIds.AddRange(locallyKnownMailUids.Select(a => new UniqueId(a))); - - var highestUniqueId = Math.Max(0, locallyKnownMailUids.Count == 0 ? 0 : locallyKnownMailUids.Max()); - - var missingMailIds = new UniqueIdSet(); - - var uidValidity = folder.UidValidity; - var highestModeSeq = folder.HighestModeSeq; - - var logger = Log.ForContext("FolderName", folder.FolderName); - - logger.Verbose("HighestModeSeq: {HighestModeSeq}, HighestUniqueId: {HighestUniqueId}, UIDValidity: {UIDValidity}", highestModeSeq, highestUniqueId, uidValidity); - - // Event handlers are placed here to handle existing MailItemFolder and IIMailFolder from MailKit. - // MailKit doesn't expose folder data when these events are emitted. - - // Use local folder's UidValidty because cache might've been expired for remote IMAP folder. - // That will make our mail copy id invalid. - - EventHandler MessageVanishedHandler = async (s, e) => - { - if (imapFolder == null) return; - - foreach (var uniqueId in e.UniqueIds) - { - var localMailCopyId = MailkitClientExtensions.CreateUid(folder.Id, uniqueId.Id); - - await _imapChangeProcessor.DeleteMailAsync(Account.Id, localMailCopyId); - } - }; - - EventHandler MessageFlagsChangedHandler = async (s, e) => - { - if (imapFolder == null) return; - if (e.UniqueId == null) return; - - var localMailCopyId = MailkitClientExtensions.CreateUid(folder.Id, e.UniqueId.Value.Id); - - var isFlagged = MailkitClientExtensions.GetIsFlagged(e.Flags); - var isRead = MailkitClientExtensions.GetIsRead(e.Flags); - - await _imapChangeProcessor.ChangeMailReadStatusAsync(localMailCopyId, isRead); - await _imapChangeProcessor.ChangeFlagStatusAsync(localMailCopyId, isFlagged); - }; - - EventHandler MessageExpungedHandler = async (s, e) => - { - if (imapFolder == null) return; - if (e.UniqueId == null) return; - - var localMailCopyId = MailkitClientExtensions.CreateUid(folder.Id, e.UniqueId.Value.Id); - await _imapChangeProcessor.DeleteMailAsync(Account.Id, localMailCopyId); - }; + IImapClient availableClient = null; + retry: try { - imapFolder = await _synchronizationClient.GetFolderAsync(folder.RemoteFolderId, cancellationToken); - imapFolder.MessageFlagsChanged += MessageFlagsChangedHandler; + availableClient = await _clientPool.GetClientAsync().ConfigureAwait(false); - // TODO: Bug: Enabling quick re-sync actually doesn't enable it. - - var qsyncEnabled = false; // _synchronizationClient.Capabilities.HasFlag(ImapCapabilities.QuickResync); - var condStoreEnabled = _synchronizationClient.Capabilities.HasFlag(ImapCapabilities.CondStore); - - if (qsyncEnabled) - { - - imapFolder.MessagesVanished += MessageVanishedHandler; - - await imapFolder.OpenAsync(FolderAccess.ReadWrite, uidValidity, (ulong)highestModeSeq, knownMailIds, cancellationToken); - - // Check the folder validity. - // We'll delete our existing cache if it's not. - - // Get all messages after the last successful synchronization date. - // This is fine for Wino synchronization because we're not really looking to - // synchronize all folder. - - var allMessageIds = await imapFolder.SearchAsync(SearchQuery.All, cancellationToken); - - if (uidValidity != imapFolder.UidValidity) - { - // TODO: Cache is invalid. Delete all local cache. - //await ChangeProcessor.FolderService.ClearImapFolderCacheAsync(folder.Id); - - folder.UidValidity = imapFolder.UidValidity; - missingMailIds.AddRange(allMessageIds); - } - else - { - // Cache is valid. - // Add missing mails only. - - missingMailIds.AddRange(allMessageIds.Except(knownMailIds).Where(a => a.Id > highestUniqueId)); - } - } - else - { - // QSYNC extension is not enabled for the server. - // We rely on ConditionalStore. - - imapFolder.MessageExpunged += MessageExpungedHandler; - await imapFolder.OpenAsync(FolderAccess.ReadWrite, cancellationToken); - - // Get all messages after the last succesful synchronization date. - // This is fine for Wino synchronization because we're not really looking to - // synchronize all folder. - - var allMessageIds = await imapFolder.SearchAsync(SearchQuery.All, cancellationToken); - - if (uidValidity != imapFolder.UidValidity) - { - // TODO: Cache is invalid. Delete all local cache. - // await ChangeProcessor.FolderService.ClearImapFolderCacheAsync(folder.Id); - - folder.UidValidity = imapFolder.UidValidity; - missingMailIds.AddRange(allMessageIds); - } - else - { - // Cache is valid. - - var purgedMessages = knownMailIds.Except(allMessageIds); - - foreach (var purgedMessage in purgedMessages) - { - var mailId = MailkitClientExtensions.CreateUid(folder.Id, purgedMessage.Id); - - await _imapChangeProcessor.DeleteMailAsync(Account.Id, mailId); - } - - IList changed; - - if (knownMailIds.Count > 0) - { - // CONDSTORE enabled. Fetch items with highest mode seq for known items - // to track flag changes. Otherwise just get changes without the mode seq. - - if (condStoreEnabled) - changed = await imapFolder.FetchAsync(knownMailIds, (ulong)highestModeSeq, MessageSummaryItems.Flags | MessageSummaryItems.ModSeq | MessageSummaryItems.UniqueId); - else - changed = await imapFolder.FetchAsync(knownMailIds, MessageSummaryItems.Flags | MessageSummaryItems.UniqueId); - - foreach (var changedItem in changed) - { - var localMailCopyId = MailkitClientExtensions.CreateUid(folder.Id, changedItem.UniqueId.Id); - - var isFlagged = changedItem.Flags.GetIsFlagged(); - var isRead = changedItem.Flags.GetIsRead(); - - await _imapChangeProcessor.ChangeMailReadStatusAsync(localMailCopyId, isRead); - await _imapChangeProcessor.ChangeFlagStatusAsync(localMailCopyId, isFlagged); - } - } - - // We're only interested in items that has highier known uid than we fetched before. - // Others are just older messages. - - missingMailIds.AddRange(allMessageIds.Except(knownMailIds).Where(a => a.Id > highestUniqueId)); - } - } - - // Fetch completely missing new items in the end. - - // Limit check. - if (missingMailIds.Count > InitialMessageDownloadCountPerFolder) - { - missingMailIds = new UniqueIdSet(missingMailIds.TakeLast((int)InitialMessageDownloadCountPerFolder)); - } - - // In case of the high input, we'll batch them by 50 to reflect changes quickly. - var batchedMissingMailIds = missingMailIds.Batch(50).Select(a => new UniqueIdSet(a, SortOrder.Ascending)); - - foreach (var batchMissingMailIds in batchedMissingMailIds) - { - var summaries = await imapFolder.FetchAsync(batchMissingMailIds, mailSynchronizationFlags, cancellationToken).ConfigureAwait(false); - - foreach (var summary in summaries) - { - // We pass the opened folder and summary to retrieve raw MimeMessage. - - var creationPackage = new ImapMessageCreationPackage(summary, imapFolder); - var createdMailPackages = await CreateNewMailPackagesAsync(creationPackage, folder, cancellationToken).ConfigureAwait(false); - - // Local draft is mapped. We don't need to create a new mail copy. - if (createdMailPackages == null) - continue; - - foreach (var mailPackage in createdMailPackages) - { - bool isCreated = await _imapChangeProcessor.CreateMailAsync(Account.Id, mailPackage).ConfigureAwait(false); - - if (isCreated) - { - downloadedMessageIds.Add(mailPackage.Copy.Id); - } - } - } - } - - if (folder.HighestModeSeq != (long)imapFolder.HighestModSeq) - { - folder.HighestModeSeq = (long)imapFolder.HighestModSeq; - - await _imapChangeProcessor.UpdateFolderAsync(folder).ConfigureAwait(false); - } - - // Update last synchronization date for the folder.. - - await _imapChangeProcessor.UpdateFolderLastSyncDateAsync(folder.Id).ConfigureAwait(false); - - return downloadedMessageIds; + var strategy = _imapSynchronizationStrategyProvider.GetSynchronizationStrategy(availableClient); + return await strategy.HandleSynchronizationAsync(availableClient, folder, this, cancellationToken).ConfigureAwait(false); } - catch (FolderNotFoundException) + catch (IOException) { - await _imapChangeProcessor.DeleteFolderAsync(Account.Id, folder.RemoteFolderId).ConfigureAwait(false); + _clientPool.Release(availableClient, false); - return default; + goto retry; + } + catch (OperationCanceledException) + { + // Ignore cancellations. } catch (Exception) { - throw; + } finally { - if (imapFolder != null) - { - imapFolder.MessageFlagsChanged -= MessageFlagsChangedHandler; - imapFolder.MessageExpunged -= MessageExpungedHandler; - imapFolder.MessagesVanished -= MessageVanishedHandler; - - if (imapFolder.IsOpen) - await imapFolder.CloseAsync(); - } - - _clientPool.Release(_synchronizationClient); + _clientPool.Release(availableClient, false); } - } + return new List(); + } /// /// Whether the local folder should be updated with the remote folder. @@ -1037,8 +677,141 @@ namespace Wino.Core.Synchronizers.Mail => !localFolder.FolderName.Equals(remoteFolder.Name, StringComparison.OrdinalIgnoreCase); protected override Task SynchronizeCalendarEventsInternalAsync(CalendarSynchronizationOptions options, CancellationToken cancellationToken = default) + => throw new NotImplementedException(); + + public async Task StartIdleClientAsync() { - throw new NotImplementedException(); + IImapClient idleClient = null; + IMailFolder inboxFolder = null; + + bool? reconnect = null; + + try + { + var client = await _clientPool.GetClientAsync().ConfigureAwait(false); + + if (!client.Capabilities.HasFlag(ImapCapabilities.Idle)) + { + Log.Debug($"{Account.Name} does not support Idle command. Ignored."); + return; + } + + if (client.Inbox == null) + { + Log.Warning($"{Account.Name} does not have an Inbox folder for idle client to track. Ignored."); + return; + } + + // Setup idle client. + idleClient = client; + + idleDoneTokenSource ??= new CancellationTokenSource(); + idleCancellationTokenSource ??= new CancellationTokenSource(); + + inboxFolder = client.Inbox; + + await inboxFolder.OpenAsync(FolderAccess.ReadOnly, idleCancellationTokenSource.Token); + + inboxFolder.CountChanged += IdleNotificationTriggered; + inboxFolder.MessageFlagsChanged += IdleNotificationTriggered; + inboxFolder.MessageExpunged += IdleNotificationTriggered; + inboxFolder.MessagesVanished += IdleNotificationTriggered; + + Log.Debug("Starting an idle client for {Name}", Account.Name); + + await client.IdleAsync(idleDoneTokenSource.Token, idleCancellationTokenSource.Token); + } + catch (ImapProtocolException protocolException) + { + Log.Warning(protocolException, "Idle client received protocol exception."); + reconnect = true; + } + catch (IOException ioException) + { + Log.Warning(ioException, "Idle client received IO exception."); + reconnect = true; + } + catch (OperationCanceledException) + { + reconnect = !IsDisposing; + } + catch (Exception ex) + { + Log.Warning(ex, "Idle client failed to start."); + reconnect = false; + } + finally + { + if (inboxFolder != null) + { + inboxFolder.CountChanged -= IdleNotificationTriggered; + inboxFolder.MessageFlagsChanged -= IdleNotificationTriggered; + inboxFolder.MessageExpunged -= IdleNotificationTriggered; + inboxFolder.MessagesVanished -= IdleNotificationTriggered; + } + + if (idleDoneTokenSource != null) + { + idleDoneTokenSource.Dispose(); + idleDoneTokenSource = null; + } + + if (idleClient != null) + { + // Killing the client is not necessary. We can re-use it later. + _clientPool.Release(idleClient, destroyClient: false); + + idleClient = null; + } + + if (reconnect == true) + { + Log.Information("Idle client is reconnecting."); + + _ = StartIdleClientAsync(); + } + else if (reconnect == false) + { + Log.Information("Finalized idle client."); + } + } + } + + private void RequestIdleChangeSynchronization() + { + Debug.WriteLine("Detected idle change."); + + // We don't really need to act on the count change in detail. + // Our synchronization should be enough to handle the changes with on-demand sync. + // We can just trigger a sync here IMAPIdle type. + + var options = new MailSynchronizationOptions() + { + AccountId = Account.Id, + Type = MailSynchronizationType.IMAPIdle + }; + + WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + } + + private void IdleNotificationTriggered(object sender, EventArgs e) + => RequestIdleChangeSynchronization(); + + public Task StopIdleClientAsync() + { + idleDoneTokenSource?.Cancel(); + idleCancellationTokenSource?.Cancel(); + + return Task.CompletedTask; + } + + public override async Task KillSynchronizerAsync() + { + await base.KillSynchronizerAsync(); + await StopIdleClientAsync(); + + // Make sure the client pool safely disconnects all ImapClients. + _clientPool.Dispose(); } } } diff --git a/Wino.Core/Synchronizers/OutlookSynchronizer.cs b/Wino.Core/Synchronizers/OutlookSynchronizer.cs index 555559f8..3d509b47 100644 --- a/Wino.Core/Synchronizers/OutlookSynchronizer.cs +++ b/Wino.Core/Synchronizers/OutlookSynchronizer.cs @@ -1165,5 +1165,12 @@ namespace Wino.Core.Synchronizers.Mail return !localCalendarName.Equals(remoteCalendarName, StringComparison.OrdinalIgnoreCase); } + + public override async Task KillSynchronizerAsync() + { + await base.KillSynchronizerAsync(); + + _graphClient.Dispose(); + } } } diff --git a/Wino.Core/Synchronizers/WinoSynchronizer.cs b/Wino.Core/Synchronizers/WinoSynchronizer.cs index e9ee1848..67b4f754 100644 --- a/Wino.Core/Synchronizers/WinoSynchronizer.cs +++ b/Wino.Core/Synchronizers/WinoSynchronizer.cs @@ -25,11 +25,13 @@ namespace Wino.Core.Synchronizers { public abstract class WinoSynchronizer : BaseSynchronizer, IWinoSynchronizerBase { + protected bool IsDisposing { get; private set; } + + protected Dictionary PendingSynchronizationRequest = new(); + protected ILogger Logger = Log.ForContext>(); - protected WinoSynchronizer(MailAccount account) : base(account) - { - } + protected WinoSynchronizer(MailAccount account) : base(account) { } /// /// How many items per single HTTP call can be modified. @@ -83,94 +85,129 @@ namespace Wino.Core.Synchronizers { try { - activeSynchronizationCancellationToken = cancellationToken; - - State = AccountSynchronizerState.ExecutingRequests; - - List> nativeRequests = new(); - - List requestCopies = new(changeRequestQueue); - - var keys = changeRequestQueue.GroupBy(a => a.GroupingKey()); - - foreach (var group in keys) + if (!ShouldQueueMailSynchronization(options)) { - var key = group.Key; - - if (key is MailSynchronizerOperation mailSynchronizerOperation) - { - switch (mailSynchronizerOperation) - { - case MailSynchronizerOperation.MarkRead: - nativeRequests.AddRange(MarkRead(new BatchMarkReadRequest(group.Cast()))); - break; - case MailSynchronizerOperation.Move: - nativeRequests.AddRange(Move(new BatchMoveRequest(group.Cast()))); - break; - case MailSynchronizerOperation.Delete: - nativeRequests.AddRange(Delete(new BatchDeleteRequest(group.Cast()))); - break; - case MailSynchronizerOperation.CreateDraft: - nativeRequests.AddRange(CreateDraft(group.ElementAt(0) as CreateDraftRequest)); - break; - case MailSynchronizerOperation.Send: - nativeRequests.AddRange(SendDraft(group.ElementAt(0) as SendDraftRequest)); - break; - case MailSynchronizerOperation.ChangeFlag: - nativeRequests.AddRange(ChangeFlag(new BatchChangeFlagRequest(group.Cast()))); - break; - case MailSynchronizerOperation.AlwaysMoveTo: - nativeRequests.AddRange(AlwaysMoveTo(new BatchAlwaysMoveToRequest(group.Cast()))); - break; - case MailSynchronizerOperation.MoveToFocused: - nativeRequests.AddRange(MoveToFocused(new BatchMoveToFocusedRequest(group.Cast()))); - break; - case MailSynchronizerOperation.Archive: - nativeRequests.AddRange(Archive(new BatchArchiveRequest(group.Cast()))); - break; - default: - break; - } - } - else if (key is FolderSynchronizerOperation folderSynchronizerOperation) - { - switch (folderSynchronizerOperation) - { - case FolderSynchronizerOperation.RenameFolder: - nativeRequests.AddRange(RenameFolder(group.ElementAt(0) as RenameFolderRequest)); - break; - case FolderSynchronizerOperation.EmptyFolder: - nativeRequests.AddRange(EmptyFolder(group.ElementAt(0) as EmptyFolderRequest)); - break; - case FolderSynchronizerOperation.MarkFolderRead: - nativeRequests.AddRange(MarkFolderAsRead(group.ElementAt(0) as MarkFolderAsReadRequest)); - break; - default: - break; - } - } + Log.Debug($"{options.Type} synchronization is ignored."); + return MailSynchronizationResult.Canceled; } - changeRequestQueue.Clear(); + var newCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); - Console.WriteLine($"Prepared {nativeRequests.Count()} native requests"); + PendingSynchronizationRequest.Add(options, newCancellationTokenSource); + activeSynchronizationCancellationToken = newCancellationTokenSource.Token; + + await synchronizationSemaphore.WaitAsync(activeSynchronizationCancellationToken); PublishSynchronizationProgress(1); - await ExecuteNativeRequestsAsync(nativeRequests, activeSynchronizationCancellationToken); + // ImapSynchronizer will send this type when an Idle client receives a notification of changes. + // We should not execute requests in this case. + bool shouldExecuteRequests = options.Type != MailSynchronizationType.IMAPIdle; - PublishUnreadItemChanges(); + bool shouldDelayExecution = false; + int maxExecutionDelay = 0; - // Execute request sync options should be re-calculated after execution. - // This is the part we decide which individual folders must be synchronized - // after the batch request execution. - if (options.Type == MailSynchronizationType.ExecuteRequests) - options = GetSynchronizationOptionsAfterRequestExecution(requestCopies); + if (shouldExecuteRequests && changeRequestQueue.Any()) + { + State = AccountSynchronizerState.ExecutingRequests; + + List> nativeRequests = new(); + + List requestCopies = new(changeRequestQueue); + + var keys = changeRequestQueue.GroupBy(a => a.GroupingKey()); + + foreach (var group in keys) + { + var key = group.Key; + + if (key is MailSynchronizerOperation mailSynchronizerOperation) + { + switch (mailSynchronizerOperation) + { + case MailSynchronizerOperation.MarkRead: + nativeRequests.AddRange(MarkRead(new BatchMarkReadRequest(group.Cast()))); + break; + case MailSynchronizerOperation.Move: + nativeRequests.AddRange(Move(new BatchMoveRequest(group.Cast()))); + break; + case MailSynchronizerOperation.Delete: + nativeRequests.AddRange(Delete(new BatchDeleteRequest(group.Cast()))); + break; + case MailSynchronizerOperation.CreateDraft: + nativeRequests.AddRange(CreateDraft(group.ElementAt(0) as CreateDraftRequest)); + break; + case MailSynchronizerOperation.Send: + nativeRequests.AddRange(SendDraft(group.ElementAt(0) as SendDraftRequest)); + break; + case MailSynchronizerOperation.ChangeFlag: + nativeRequests.AddRange(ChangeFlag(new BatchChangeFlagRequest(group.Cast()))); + break; + case MailSynchronizerOperation.AlwaysMoveTo: + nativeRequests.AddRange(AlwaysMoveTo(new BatchAlwaysMoveToRequest(group.Cast()))); + break; + case MailSynchronizerOperation.MoveToFocused: + nativeRequests.AddRange(MoveToFocused(new BatchMoveToFocusedRequest(group.Cast()))); + break; + case MailSynchronizerOperation.Archive: + nativeRequests.AddRange(Archive(new BatchArchiveRequest(group.Cast()))); + break; + default: + break; + } + } + else if (key is FolderSynchronizerOperation folderSynchronizerOperation) + { + switch (folderSynchronizerOperation) + { + case FolderSynchronizerOperation.RenameFolder: + nativeRequests.AddRange(RenameFolder(group.ElementAt(0) as RenameFolderRequest)); + break; + case FolderSynchronizerOperation.EmptyFolder: + nativeRequests.AddRange(EmptyFolder(group.ElementAt(0) as EmptyFolderRequest)); + break; + case FolderSynchronizerOperation.MarkFolderRead: + nativeRequests.AddRange(MarkFolderAsRead(group.ElementAt(0) as MarkFolderAsReadRequest)); + break; + default: + break; + } + } + } + + changeRequestQueue.Clear(); + + Console.WriteLine($"Prepared {nativeRequests.Count()} native requests"); + + await ExecuteNativeRequestsAsync(nativeRequests, activeSynchronizationCancellationToken).ConfigureAwait(false); + + PublishUnreadItemChanges(); + + // Execute request sync options should be re-calculated after execution. + // This is the part we decide which individual folders must be synchronized + // after the batch request execution. + if (options.Type == MailSynchronizationType.ExecuteRequests) + options = GetSynchronizationOptionsAfterRequestExecution(requestCopies, options.Id); + + // Let servers to finish their job. Sometimes the servers doesn't respond immediately. + // Bug: if Outlook can't create the message in Sent Items folder before this delay, + // message will not appear in user's inbox since it's not in the Sent Items folder. + + shouldDelayExecution = + (Account.ProviderType == MailProviderType.Outlook) + && requestCopies.Any(a => a.ResynchronizationDelay > 0); + + if (shouldDelayExecution) + { + maxExecutionDelay = requestCopies.Aggregate(0, (max, next) => Math.Max(max, next.ResynchronizationDelay)); + } + + // In terms of flag/read changes, there is no point of synchronizing must have folders. + options.ExcludeMustHaveFolders = requestCopies.All(a => a is ICustomFolderSynchronizationRequest request && request.ExcludeMustHaveFolders); + } State = AccountSynchronizerState.Synchronizing; - await synchronizationSemaphore.WaitAsync(activeSynchronizationCancellationToken); - // Handle special synchronization types. // Profile information sync. @@ -213,19 +250,9 @@ namespace Wino.Core.Synchronizers } } - // Let servers to finish their job. Sometimes the servers doesn't respond immediately. - // Bug: if Outlook can't create the message in Sent Items folder before this delay, - // message will not appear in user's inbox since it's not in the Sent Items folder. - - bool shouldDelayExecution = - (Account.ProviderType == MailProviderType.Outlook || Account.ProviderType == MailProviderType.Office365) - && requestCopies.Any(a => a.ResynchronizationDelay > 0); - if (shouldDelayExecution) { - var maxDelay = requestCopies.Aggregate(0, (max, next) => Math.Max(max, next.ResynchronizationDelay)); - - await Task.Delay(maxDelay); + await Task.Delay(maxExecutionDelay); } // Start the internal synchronization. @@ -249,6 +276,15 @@ namespace Wino.Core.Synchronizers } finally { + // Find the request and remove it from the pending list. + + var pendingRequest = PendingSynchronizationRequest.FirstOrDefault(a => a.Key.Id == options.Id); + + if (pendingRequest.Key != null) + { + PendingSynchronizationRequest.Remove(pendingRequest.Key); + } + // Reset account progress to hide the progress. PublishSynchronizationProgress(0); @@ -288,7 +324,7 @@ namespace Wino.Core.Synchronizers /// /// Batch requests to run in synchronization. /// New synchronization options with minimal HTTP effort. - private MailSynchronizationOptions GetSynchronizationOptionsAfterRequestExecution(List requests) + private MailSynchronizationOptions GetSynchronizationOptionsAfterRequestExecution(List requests, Guid existingSynchronizationId) { List synchronizationFolderIds = requests .Where(a => a is ICustomFolderSynchronizationRequest) @@ -301,6 +337,8 @@ namespace Wino.Core.Synchronizers AccountId = Account.Id, }; + options.Id = existingSynchronizationId; + if (synchronizationFolderIds.Count > 0) { // Gather FolderIds to synchronize. @@ -317,6 +355,35 @@ namespace Wino.Core.Synchronizers return options; } + /// + /// Checks if the mail synchronization should be queued or not. + /// + /// New mail sync request. + /// Whether sync should be queued or not. + private bool ShouldQueueMailSynchronization(MailSynchronizationOptions options) + { + // Multiple IMAPIdle requests are ignored. + if (options.Type == MailSynchronizationType.IMAPIdle && + PendingSynchronizationRequest.Any(a => a.Key.Type == MailSynchronizationType.IMAPIdle)) + { + return false; + } + + // Executing requests may trigger idle sync. + // If there are pending execute requests cancel idle change. + + // TODO: Ideally this check should only work for Inbox execute requests. + // Check if request folders contains Inbox. + + if (options.Type == MailSynchronizationType.IMAPIdle && + PendingSynchronizationRequest.Any(a => a.Key.Type == MailSynchronizationType.ExecuteRequests)) + { + return false; + } + + return true; + } + #region Mail/Folder Operations public virtual bool DelaySendOperationSynchronization() => false; @@ -349,12 +416,12 @@ namespace Wino.Core.Synchronizers /// Cancellation token. public virtual Task DownloadMissingMimeMessageAsync(IMailItem mailItem, ITransferProgress transferProgress = null, CancellationToken cancellationToken = default) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); - public List> CreateSingleTaskBundle(Func action, IRequestBase request, IUIChangeRequest uIChangeRequest) + public List> CreateSingleTaskBundle(Func action, IRequestBase request, IUIChangeRequest uIChangeRequest) { return [new ImapRequestBundle(new ImapRequest(action, request), request, uIChangeRequest)]; } - public List> CreateTaskBundle(Func value, + public List> CreateTaskBundle(Func value, List requests) where TSingeRequestType : IRequestBase, IUIChangeRequest { @@ -368,6 +435,21 @@ namespace Wino.Core.Synchronizers return ret; } + public virtual Task KillSynchronizerAsync() + { + IsDisposing = true; + CancelAllSynchronizations(); + return Task.CompletedTask; + } + + protected void CancelAllSynchronizations() + { + foreach (var request in PendingSynchronizationRequest) + { + request.Value.Cancel(); + request.Value.Dispose(); + } + } } } diff --git a/Wino.Core/Wino.Core.csproj b/Wino.Core/Wino.Core.csproj index 3e3fc0eb..cc67afcd 100644 --- a/Wino.Core/Wino.Core.csproj +++ b/Wino.Core/Wino.Core.csproj @@ -7,32 +7,34 @@ true true + - - - - + + + + - - - - + + + + - + - - - + + + - - - - - + + + + + - - + + + diff --git a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs index 713949a5..d160ac44 100644 --- a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs +++ b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs @@ -12,6 +12,7 @@ using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.Navigation; using Wino.Messaging.Client.Navigation; +using Wino.Messaging.Server; using Wino.Messaging.UI; namespace Wino.Mail.ViewModels @@ -20,6 +21,7 @@ namespace Wino.Mail.ViewModels { private readonly IMailDialogService _dialogService; private readonly IAccountService _accountService; + private readonly IWinoServerConnectionManager _serverConnectionManager; private readonly IFolderService _folderService; public MailAccount Account { get; set; } @@ -48,10 +50,12 @@ namespace Wino.Mail.ViewModels public AccountDetailsPageViewModel(IMailDialogService dialogService, IAccountService accountService, + IWinoServerConnectionManager serverConnectionManager, IFolderService folderService) { _dialogService = dialogService; _accountService = accountService; + _serverConnectionManager = serverConnectionManager; _folderService = folderService; } @@ -102,13 +106,17 @@ namespace Wino.Mail.ViewModels if (!confirmation) return; - await _accountService.DeleteAccountAsync(Account); - // TODO: Server: Cancel ongoing calls from server for this account. + var isSynchronizerKilledResponse = await _serverConnectionManager.GetResponseAsync(new KillAccountSynchronizerRequested(Account.Id)); - _dialogService.InfoBarMessage(Translator.Info_AccountDeletedTitle, string.Format(Translator.Info_AccountDeletedMessage, Account.Name), InfoBarMessageType.Success); + if (isSynchronizerKilledResponse.IsSuccess) + { + await _accountService.DeleteAccountAsync(Account); - Messenger.Send(new BackBreadcrumNavigationRequested()); + _dialogService.InfoBarMessage(Translator.Info_AccountDeletedTitle, string.Format(Translator.Info_AccountDeletedMessage, Account.Name), InfoBarMessageType.Success); + + Messenger.Send(new BackBreadcrumNavigationRequested()); + } } public override async void OnNavigatedTo(NavigationMode mode, object parameters) diff --git a/Wino.Mail.ViewModels/AccountManagementViewModel.cs b/Wino.Mail.ViewModels/AccountManagementViewModel.cs index e5769bd2..4495cd37 100644 --- a/Wino.Mail.ViewModels/AccountManagementViewModel.cs +++ b/Wino.Mail.ViewModels/AccountManagementViewModel.cs @@ -28,18 +28,25 @@ namespace Wino.Mail.ViewModels { public partial class AccountManagementViewModel : AccountManagementPageViewModelBase { + private readonly ISpecialImapProviderConfigResolver _specialImapProviderConfigResolver; + private readonly IImapTestService _imapTestService; + public IMailDialogService MailDialogService { get; } public AccountManagementViewModel(IMailDialogService dialogService, IWinoServerConnectionManager winoServerConnectionManager, INavigationService navigationService, IAccountService accountService, + ISpecialImapProviderConfigResolver specialImapProviderConfigResolver, IProviderService providerService, + IImapTestService imapTestService, IStoreManagementService storeManagementService, IAuthenticationProvider authenticationProvider, IPreferencesService preferencesService) : base(dialogService, winoServerConnectionManager, navigationService, accountService, providerService, storeManagementService, authenticationProvider, preferencesService) { MailDialogService = dialogService; + _specialImapProviderConfigResolver = specialImapProviderConfigResolver; + _imapTestService = imapTestService; } [RelayCommand] @@ -93,7 +100,7 @@ namespace Wino.Mail.ViewModels if (accountCreationDialogResult != null) { - creationDialog = MailDialogService.GetAccountCreationDialog(accountCreationDialogResult.ProviderType); + creationDialog = MailDialogService.GetAccountCreationDialog(accountCreationDialogResult); CustomServerInformation customServerInformation = null; @@ -101,17 +108,17 @@ namespace Wino.Mail.ViewModels { ProviderType = accountCreationDialogResult.ProviderType, Name = accountCreationDialogResult.AccountName, - AccountColorHex = accountCreationDialogResult.AccountColorHex, + SpecialImapProvider = accountCreationDialogResult.SpecialImapProviderDetails?.SpecialImapProvider ?? SpecialImapProvider.None, Id = Guid.NewGuid() }; - creationDialog.ShowDialog(accountCreationCancellationTokenSource); + await creationDialog.ShowDialogAsync(accountCreationCancellationTokenSource); creationDialog.State = AccountCreationDialogState.SigningIn; string tokenInformation = string.Empty; // Custom server implementation requires more async waiting. - if (creationDialog is ICustomServerAccountCreationDialog customServerDialog) + if (creationDialog is IImapAccountCreationDialog customServerDialog) { // Pass along the account properties and perform initial navigation on the imap frame. customServerDialog.StartImapConnectionSetup(createdAccount); @@ -130,20 +137,39 @@ namespace Wino.Mail.ViewModels } else { - // OAuth authentication is handled here. - // Server authenticates, returns the token info here. + // Hanle special imap providers like iCloud and Yahoo. + if (accountCreationDialogResult.SpecialImapProviderDetails != null) + { + // Special imap provider testing dialog. This is only available for iCloud and Yahoo. + customServerInformation = _specialImapProviderConfigResolver.GetServerInformation(createdAccount, accountCreationDialogResult); + customServerInformation.Id = Guid.NewGuid(); + customServerInformation.AccountId = createdAccount.Id; - var tokenInformationResponse = await WinoServerConnectionManager - .GetResponseAsync(new AuthorizationRequested(accountCreationDialogResult.ProviderType, - createdAccount, - createdAccount.ProviderType == MailProviderType.Gmail), accountCreationCancellationTokenSource.Token); + createdAccount.SenderName = accountCreationDialogResult.SpecialImapProviderDetails.SenderName; + createdAccount.Address = customServerInformation.Address; - if (creationDialog.State == AccountCreationDialogState.Canceled) - throw new AccountSetupCanceledException(); + await _imapTestService.TestImapConnectionAsync(customServerInformation, true); + } + else + { + // OAuth authentication is handled here. + // Server authenticates, returns the token info here. - createdAccount.Address = tokenInformationResponse.Data.AccountAddress; + var tokenInformationResponse = await WinoServerConnectionManager + .GetResponseAsync(new AuthorizationRequested(accountCreationDialogResult.ProviderType, + createdAccount, + createdAccount.ProviderType == MailProviderType.Gmail), accountCreationCancellationTokenSource.Token); - tokenInformationResponse.ThrowIfFailed(); + if (creationDialog.State == AccountCreationDialogState.Canceled) + throw new AccountSetupCanceledException(); + + if (!tokenInformationResponse.IsSuccess) + throw new Exception(tokenInformationResponse.Message); + + createdAccount.Address = tokenInformationResponse.Data.AccountAddress; + + tokenInformationResponse.ThrowIfFailed(); + } } // Address is still doesn't have a value for API synchronizers. @@ -183,7 +209,7 @@ namespace Wino.Mail.ViewModels await AccountService.UpdateProfileInformationAsync(createdAccount.Id, profileSynchronizationResult.ProfileInformation); } - if (creationDialog is ICustomServerAccountCreationDialog customServerAccountCreationDialog) + if (creationDialog is IImapAccountCreationDialog customServerAccountCreationDialog) customServerAccountCreationDialog.ShowPreparingFolders(); else creationDialog.State = AccountCreationDialogState.PreparingFolders; @@ -227,14 +253,6 @@ namespace Wino.Mail.ViewModels await AccountService.CreateRootAliasAsync(createdAccount.Id, createdAccount.Address); } - // TODO: Temporary disabled. Is this even needed? Users can configure special folders manually later on if discovery fails. - // Check if Inbox folder is available for the account after synchronization. - - //var isInboxAvailable = await _folderService.IsInboxAvailableForAccountAsync(createdAccount.Id); - - //if (!isInboxAvailable) - // throw new Exception(Translator.Exception_InboxNotAvailable); - // Send changes to listeners. ReportUIChange(new AccountCreatedMessage(createdAccount)); @@ -250,6 +268,10 @@ namespace Wino.Mail.ViewModels { // Ignore } + catch (ImapClientPoolException clientPoolException) + { + DialogService.InfoBarMessage(Translator.Info_AccountCreationFailedTitle, clientPoolException.InnerException.Message, InfoBarMessageType.Error); + } catch (Exception ex) { Log.Error(ex, WinoErrors.AccountCreation); diff --git a/Wino.Mail.ViewModels/AppShellViewModel.cs b/Wino.Mail.ViewModels/AppShellViewModel.cs index 9b7fc454..6cfd027b 100644 --- a/Wino.Mail.ViewModels/AppShellViewModel.cs +++ b/Wino.Mail.ViewModels/AppShellViewModel.cs @@ -243,7 +243,9 @@ namespace Wino.Mail.ViewModels await RecreateMenuItemsAsync(); await ProcessLaunchOptionsAsync(); +#if !DEBUG await ForceAllAccountSynchronizationsAsync(); +#endif await MakeSureEnableStartupLaunchAsync(); await ConfigureBackgroundTasksAsync(); } @@ -878,6 +880,8 @@ namespace Wino.Mail.ViewModels protected override async void OnAccountCreated(MailAccount createdAccount) { + latestSelectedAccountMenuItem = null; + await RecreateMenuItemsAsync(); if (!MenuItems.TryGetAccountMenuItem(createdAccount.Id, out IAccountMenuItem createdMenuItem)) return; diff --git a/Wino.Mail/App.xaml.cs b/Wino.Mail/App.xaml.cs index 4154323a..ec72397d 100644 --- a/Wino.Mail/App.xaml.cs +++ b/Wino.Mail/App.xaml.cs @@ -233,6 +233,7 @@ namespace Wino } catch (WinoServerException serverException) { + // TODO: Exception context is lost. var dialogService = Services.GetService(); dialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error); @@ -241,6 +242,8 @@ namespace Wino protected override async void OnApplicationCloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) { + Log.Information("App close requested."); + var deferral = e.GetDeferral(); // Wino should notify user on app close if: diff --git a/Wino.Mail/AppShell.xaml b/Wino.Mail/AppShell.xaml index 56fd82fd..76ded974 100644 --- a/Wino.Mail/AppShell.xaml +++ b/Wino.Mail/AppShell.xaml @@ -41,7 +41,7 @@ - + + Icon="{x:Bind helpers:XamlHelpers.GetProviderIcon(ProviderDetail.Type, ProviderDetail.SpecialImapProvider)}" /> , IRecipient, IRecipient, - ICustomServerAccountCreationDialog + IImapAccountCreationDialog { private TaskCompletionSource _getServerInfoTaskCompletionSource = new TaskCompletionSource(); - + private TaskCompletionSource dialogOpened = new TaskCompletionSource(); private bool isDismissRequested = false; public NewImapSetupDialog() @@ -77,8 +78,21 @@ namespace Wino.Dialogs public void Receive(ImapSetupDismissRequested message) => _getServerInfoTaskCompletionSource.TrySetResult(message.CompletedServerInformation); - public void ShowDialog(CancellationTokenSource cancellationTokenSource) - => _ = ShowAsync(); + public async Task ShowDialogAsync(CancellationTokenSource cancellationTokenSource) + { + Opened += DialogOpened; + + _ = ShowAsync(); + + await dialogOpened.Task; + } + + private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) + { + Opened -= DialogOpened; + + dialogOpened?.SetResult(true); + } public void ShowPreparingFolders() { @@ -86,7 +100,7 @@ namespace Wino.Dialogs } public void StartImapConnectionSetup(MailAccount account) => ImapFrame.Navigate(typeof(WelcomeImapSetupPage), account, new DrillInNavigationTransitionInfo()); - + public void StartImapConnectionSetup(AccountCreationDialogResult accountCreationDialogResult) => ImapFrame.Navigate(typeof(WelcomeImapSetupPage), accountCreationDialogResult, new DrillInNavigationTransitionInfo()); private void ImapSetupDialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) => WeakReferenceMessenger.Default.UnregisterAll(this); diff --git a/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs b/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs index 66db2597..35ac54f1 100644 --- a/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs +++ b/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; -using Wino.Controls; using Wino.Core.Domain.Entities.Shared; using Wino.Core.UWP.Controls; using Wino.Helpers; @@ -22,7 +21,7 @@ namespace Wino.MenuFlyouts foreach (var account in _accounts) { - var pathData = new WinoFontIcon() { Icon = XamlHelpers.GetProviderIcon(account.ProviderType) }; + var pathData = new WinoFontIcon() { Icon = XamlHelpers.GetProviderIcon(account) }; var menuItem = new MenuFlyoutItem() { Tag = account.Address, Icon = pathData, Text = $"{account.Name} ({account.Address})", MinHeight = 55 }; menuItem.Click += AccountClicked; diff --git a/Wino.Mail/Services/DialogService.cs b/Wino.Mail/Services/DialogService.cs index af08d5ba..e04979e6 100644 --- a/Wino.Mail/Services/DialogService.cs +++ b/Wino.Mail/Services/DialogService.cs @@ -10,6 +10,7 @@ using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.Synchronization; using Wino.Core.UWP.Extensions; @@ -30,18 +31,27 @@ namespace Wino.Services } - public override IAccountCreationDialog GetAccountCreationDialog(MailProviderType type) + public override IAccountCreationDialog GetAccountCreationDialog(AccountCreationDialogResult accountCreationDialogResult) { - if (type == MailProviderType.IMAP4) + if (accountCreationDialogResult.SpecialImapProviderDetails == null) { - return new NewImapSetupDialog + if (accountCreationDialogResult.ProviderType == MailProviderType.IMAP4) { - RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() - }; + return new NewImapSetupDialog + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + } + else + { + return base.GetAccountCreationDialog(accountCreationDialogResult); + } } else { - return base.GetAccountCreationDialog(type); + // Special IMAP provider like iCloud or Yahoo. + + return base.GetAccountCreationDialog(accountCreationDialogResult); } } diff --git a/Wino.Mail/Services/ProviderService.cs b/Wino.Mail/Services/ProviderService.cs index e8f2249a..701ea9eb 100644 --- a/Wino.Mail/Services/ProviderService.cs +++ b/Wino.Mail/Services/ProviderService.cs @@ -20,20 +20,15 @@ namespace Wino.Mail.Services public List GetAvailableProviders() { - var providerList = new List(); - - var providers = new MailProviderType[] + var providerList = new List { - MailProviderType.Outlook, - MailProviderType.Gmail, - MailProviderType.IMAP4 + new ProviderDetail(MailProviderType.Outlook, SpecialImapProvider.None), + new ProviderDetail(MailProviderType.Gmail, SpecialImapProvider.None), + new ProviderDetail(MailProviderType.IMAP4, SpecialImapProvider.iCloud), + new ProviderDetail(MailProviderType.IMAP4, SpecialImapProvider.Yahoo), + new ProviderDetail(MailProviderType.IMAP4, SpecialImapProvider.None) }; - foreach (var type in providers) - { - providerList.Add(new ProviderDetail(type)); - } - return providerList; } } diff --git a/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml b/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml index e44ba2e4..5c8b9813 100644 --- a/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml +++ b/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml @@ -24,7 +24,7 @@ Header="{x:Bind Account.Name}" IsClickEnabled="True"> - + - + diff --git a/Wino.Mail/Views/ImapSetup/WelcomeImapSetupPage.xaml.cs b/Wino.Mail/Views/ImapSetup/WelcomeImapSetupPage.xaml.cs index 922d91eb..a4491da5 100644 --- a/Wino.Mail/Views/ImapSetup/WelcomeImapSetupPage.xaml.cs +++ b/Wino.Mail/Views/ImapSetup/WelcomeImapSetupPage.xaml.cs @@ -9,6 +9,7 @@ using Wino.Core.Domain; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; using Wino.Core.Domain.Models.AutoDiscovery; using Wino.Messaging.Client.Mails; @@ -35,6 +36,10 @@ namespace Wino.Views.ImapSetup { DisplayNameBox.Text = accountProperties.Name; } + else if (e.Parameter is AccountCreationDialogResult creationDialogResult) + { + WeakReferenceMessenger.Default.Send(new ImapSetupNavigationRequested(typeof(TestingImapConnectionPage), creationDialogResult)); + } } private async void SignInClicked(object sender, RoutedEventArgs e) diff --git a/Wino.Mail/Views/MailListPage.xaml b/Wino.Mail/Views/MailListPage.xaml index 5c6ce501..1cb58a74 100644 --- a/Wino.Mail/Views/MailListPage.xaml +++ b/Wino.Mail/Views/MailListPage.xaml @@ -422,6 +422,7 @@ @@ -444,7 +445,7 @@ - + @@ -466,13 +467,13 @@ - + + /// Client message that requests to kill the account synchronizer. + /// + /// Account id to kill synchronizer for. + public record KillAccountSynchronizerRequested(Guid AccountId) : IClientMessage; +} diff --git a/Wino.Messages/Server/NewSynchronizationRequested.cs b/Wino.Messages/Server/NewSynchronizationRequested.cs index 64261cd5..c8ed646c 100644 --- a/Wino.Messages/Server/NewSynchronizationRequested.cs +++ b/Wino.Messages/Server/NewSynchronizationRequested.cs @@ -8,7 +8,7 @@ namespace Wino.Messaging.Server /// Triggers a new mail synchronization if possible. /// /// Options for synchronization. - public record NewMailSynchronizationRequested(MailSynchronizationOptions Options, SynchronizationSource Source) : IClientMessage; + public record NewMailSynchronizationRequested(MailSynchronizationOptions Options, SynchronizationSource Source) : IClientMessage, IUIMessage; /// /// Triggers a new calendar synchronization if possible. diff --git a/Wino.Packaging/Package.appxmanifest b/Wino.Packaging/Package.appxmanifest index 51501cc0..28ba3f1a 100644 --- a/Wino.Packaging/Package.appxmanifest +++ b/Wino.Packaging/Package.appxmanifest @@ -11,7 +11,7 @@ + Version="1.9.50.0" /> diff --git a/Wino.Packaging/Wino.Packaging.wapproj b/Wino.Packaging/Wino.Packaging.wapproj index 0de3e109..6dec0781 100644 --- a/Wino.Packaging/Wino.Packaging.wapproj +++ b/Wino.Packaging/Wino.Packaging.wapproj @@ -48,12 +48,13 @@ ..\Wino.Mail\Wino.Mail.csproj False SHA256 - False + True $(USERPROFILE)\Desktop\Packages\ True - x86|x64|arm64 + x64 True 0 + True Always diff --git a/Wino.Server/App.xaml.cs b/Wino.Server/App.xaml.cs index 066e462f..08c8affe 100644 --- a/Wino.Server/App.xaml.cs +++ b/Wino.Server/App.xaml.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using System.Windows; using H.NotifyIcon; using Microsoft.Extensions.DependencyInjection; +using Serilog; using Windows.Storage; using Wino.Calendar.Services; using Wino.Core; @@ -188,6 +189,9 @@ namespace Wino.Server if (isCreatedNew) { + AppDomain.CurrentDomain.UnhandledException += ServerCrashed; + Application.Current.DispatcherUnhandledException += UIThreadCrash; + TaskScheduler.UnobservedTaskException += TaskCrashed; // Ensure proper encodings are available for MimeKit System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); @@ -237,6 +241,12 @@ namespace Wino.Server } } + private void TaskCrashed(object sender, UnobservedTaskExceptionEventArgs e) => Log.Error(e.Exception, "Task crashed."); + + private void UIThreadCrash(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) => Log.Error(e.Exception, "UI thread crashed."); + + private void ServerCrashed(object sender, UnhandledExceptionEventArgs e) => Log.Error((Exception)e.ExceptionObject, "Server crashed."); + protected override void OnExit(ExitEventArgs e) { notifyIcon?.Dispose(); diff --git a/Wino.Server/Core/ServerMessageHandlerFactory.cs b/Wino.Server/Core/ServerMessageHandlerFactory.cs index 5792cfc3..cf1f4700 100644 --- a/Wino.Server/Core/ServerMessageHandlerFactory.cs +++ b/Wino.Server/Core/ServerMessageHandlerFactory.cs @@ -22,6 +22,7 @@ namespace Wino.Server.Core nameof(ServerTerminationModeChanged) => App.Current.Services.GetService(), nameof(TerminateServerRequested) => App.Current.Services.GetService(), nameof(ImapConnectivityTestRequested) => App.Current.Services.GetService(), + nameof(KillAccountSynchronizerRequested) => App.Current.Services.GetService(), _ => throw new Exception($"Server handler for {typeName} is not registered."), }; } @@ -39,6 +40,7 @@ namespace Wino.Server.Core serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); + serviceCollection.AddTransient(); } } } diff --git a/Wino.Server/MessageHandlers/KillAccountSynchronizerHandler.cs b/Wino.Server/MessageHandlers/KillAccountSynchronizerHandler.cs new file mode 100644 index 00000000..0f389fa7 --- /dev/null +++ b/Wino.Server/MessageHandlers/KillAccountSynchronizerHandler.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Server; +using Wino.Messaging.Server; +using Wino.Server.Core; + +namespace Wino.Server.MessageHandlers +{ + public class KillAccountSynchronizerHandler : ServerMessageHandler + { + private readonly ISynchronizerFactory _synchronizerFactory; + + public override WinoServerResponse FailureDefaultResponse(Exception ex) + => WinoServerResponse.CreateErrorResponse(ex.Message); + + public KillAccountSynchronizerHandler(ISynchronizerFactory synchronizerFactory) + { + _synchronizerFactory = synchronizerFactory; + } + + protected override async Task> HandleAsync(KillAccountSynchronizerRequested message, CancellationToken cancellationToken = default) + { + await _synchronizerFactory.DeleteSynchronizerAsync(message.AccountId); + + return WinoServerResponse.CreateSuccessResponse(true); + } + } +} diff --git a/Wino.Server/MessageHandlers/MailSynchronizationRequestHandler.cs b/Wino.Server/MessageHandlers/MailSynchronizationRequestHandler.cs index 3311e605..3705c247 100644 --- a/Wino.Server/MessageHandlers/MailSynchronizationRequestHandler.cs +++ b/Wino.Server/MessageHandlers/MailSynchronizationRequestHandler.cs @@ -46,6 +46,7 @@ namespace Wino.Server.MessageHandlers bool shouldReportSynchronizationResult = message.Options.Type != MailSynchronizationType.ExecuteRequests && + message.Options.Type != MailSynchronizationType.IMAPIdle && message.Source == SynchronizationSource.Client; try @@ -64,6 +65,12 @@ namespace Wino.Server.MessageHandlers var isSynchronizationSucceeded = synchronizationResult.CompletedState == SynchronizationCompletedState.Success; + // IDLE requests might be canceled successfully. + if (message.Options.Type == MailSynchronizationType.IMAPIdle && synchronizationResult.CompletedState == SynchronizationCompletedState.Canceled) + { + isSynchronizationSucceeded = true; + } + // Update badge count of the notification task. if (isSynchronizationSucceeded) { diff --git a/Wino.Server/ServerContext.cs b/Wino.Server/ServerContext.cs index 0f30a26d..4ae5a202 100644 --- a/Wino.Server/ServerContext.cs +++ b/Wino.Server/ServerContext.cs @@ -42,7 +42,8 @@ namespace Wino.Server IRecipient, IRecipient, IRecipient, - IRecipient + IRecipient, + IRecipient { private readonly System.Timers.Timer _timer; private static object connectionLock = new object(); @@ -140,6 +141,7 @@ namespace Wino.Server public async void Receive(AccountFolderConfigurationUpdated message) => await SendMessageAsync(MessageType.UIMessage, message); public async void Receive(CopyAuthURLRequested message) => await SendMessageAsync(MessageType.UIMessage, message); + public async void Receive(NewMailSynchronizationRequested message) => await SendMessageAsync(MessageType.UIMessage, message); #endregion @@ -321,6 +323,9 @@ namespace Wino.Server KillServer(); break; + case nameof(KillAccountSynchronizerRequested): + await ExecuteServerMessageSafeAsync(args, JsonSerializer.Deserialize(messageJson, _jsonSerializerOptions)); + break; default: Debug.WriteLine($"Missing handler for {typeName} in the server. Check ServerContext.cs - HandleServerMessageAsync."); break; diff --git a/Wino.Services/AccountService.cs b/Wino.Services/AccountService.cs index a9417661..726674fb 100644 --- a/Wino.Services/AccountService.cs +++ b/Wino.Services/AccountService.cs @@ -319,6 +319,8 @@ namespace Wino.Services } } + + ReportUIChange(new AccountRemovedMessage(account)); } @@ -502,7 +504,7 @@ namespace Wino.Services account.Preferences = preferences; // Outlook & Office 365 supports Focused inbox. Enabled by default. - bool isMicrosoftProvider = account.ProviderType == MailProviderType.Outlook || account.ProviderType == MailProviderType.Office365; + bool isMicrosoftProvider = account.ProviderType == MailProviderType.Outlook; // TODO: This should come from account settings API. // Wino doesn't have MailboxSettings yet. diff --git a/Wino.Services/Extensions/MailkitClientExtensions.cs b/Wino.Services/Extensions/MailkitClientExtensions.cs index e4c31750..93e1ab8d 100644 --- a/Wino.Services/Extensions/MailkitClientExtensions.cs +++ b/Wino.Services/Extensions/MailkitClientExtensions.cs @@ -5,7 +5,6 @@ using MimeKit; using Wino.Core.Domain; using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Enums; -using Wino.Services.Extensions; namespace Wino.Services.Extensions { @@ -22,6 +21,9 @@ namespace Wino.Services.Extensions throw new ArgumentOutOfRangeException(nameof(mailCopyId), mailCopyId, "Invalid mailCopyId format."); } + public static UniqueId ResolveUidStruct(string mailCopyId) + => new UniqueId(ResolveUid(mailCopyId)); + public static string CreateUid(Guid folderId, uint messageUid) => $"{folderId}{MailCopyUidSeparator}{messageUid}"; diff --git a/Wino.Services/FolderService.cs b/Wino.Services/FolderService.cs index 109ddecc..bc670e16 100644 --- a/Wino.Services/FolderService.cs +++ b/Wino.Services/FolderService.cs @@ -143,7 +143,7 @@ namespace Wino.Services if (!string.IsNullOrEmpty(unstickyItem.ParentRemoteFolderId)) continue; } - else if (account.ProviderType == MailProviderType.Outlook || account.ProviderType == MailProviderType.Office365) + else if (account.ProviderType == MailProviderType.Outlook) { bool belongsToExistingParent = await Connection .Table() @@ -367,16 +367,14 @@ namespace Wino.Services public async Task> GetKnownUidsForFolderAsync(Guid folderId) { - var folder = await GetFolderAsync(folderId); - - if (folder == null) return default; - var mailCopyIds = await GetMailCopyIdsByFolderIdAsync(folderId); // Make sure we don't include Ids that doesn't have uid separator. // Local drafts might not have it for example. - return new List(mailCopyIds.Where(a => a.Contains(MailkitClientExtensions.MailCopyUidSeparator)).Select(a => MailkitClientExtensions.ResolveUid(a))); + return new List(mailCopyIds + .Where(a => a.Contains(MailkitClientExtensions.MailCopyUidSeparator)) + .Select(a => MailkitClientExtensions.ResolveUid(a))); } public async Task UpdateSystemFolderConfigurationAsync(Guid accountId, SystemFolderConfiguration configuration) @@ -546,7 +544,19 @@ namespace Wino.Services { var folders = new List(); - if (options.Type == MailSynchronizationType.FullFolders) + if (options.Type == MailSynchronizationType.IMAPIdle) + { + // Type Inbox will include Sent, Drafts and Deleted folders as well. + // For IMAP idle sync, we must include only Inbox folder. + + var inboxFolder = await GetSpecialFolderByAccountIdAsync(options.AccountId, SpecialFolderType.Inbox); + + if (inboxFolder != null) + { + folders.Add(inboxFolder); + } + } + else if (options.Type == MailSynchronizationType.FullFolders) { // Only get sync enabled folders. @@ -570,12 +580,19 @@ namespace Wino.Services } else if (options.Type == MailSynchronizationType.CustomFolders) { - // Only get the specified and enabled folders. + // Only get the specified folders. var synchronizationFolders = await Connection.Table() - .Where(a => a.MailAccountId == options.AccountId && options.SynchronizationFolderIds.Contains(a.Id)) + .Where(a => + a.MailAccountId == options.AccountId && + options.SynchronizationFolderIds.Contains(a.Id)) .ToListAsync(); + if (options.ExcludeMustHaveFolders) + { + return synchronizationFolders; + } + // Order is important for moving. // By implementation, removing mail folders must be synchronized first. Requests are made in that order for custom sync. // eg. Moving item from Folder A to Folder B. If we start syncing Folder B first, we might miss adding assignment for Folder A. diff --git a/Wino.Services/MailService.cs b/Wino.Services/MailService.cs index e5f02cec..b01f3313 100644 --- a/Wino.Services/MailService.cs +++ b/Wino.Services/MailService.cs @@ -984,6 +984,17 @@ namespace Wino.Services public Task IsMailExistsAsync(string mailCopyId) => Connection.ExecuteScalarAsync("SELECT EXISTS(SELECT 1 FROM MailCopy WHERE Id = ?)", mailCopyId); + public async Task> GetExistingMailsAsync(Guid folderId, IEnumerable uniqueIds) + { + var localMailIds = uniqueIds.Where(a => a != null).Select(a => MailkitClientExtensions.CreateUid(folderId, a.Id)).ToArray(); + + var query = new Query(nameof(MailCopy)) + .WhereIn("Id", localMailIds) + .GetRawQuery(); + + return await Connection.QueryAsync(query); + } + public Task IsMailExistsAsync(string mailCopyId, Guid folderId) => Connection.ExecuteScalarAsync("SELECT EXISTS(SELECT 1 FROM MailCopy WHERE Id = ? AND FolderId = ?)", mailCopyId, folderId); } diff --git a/Wino.Services/ServicesContainerSetup.cs b/Wino.Services/ServicesContainerSetup.cs index 245a8a4f..89bf8b33 100644 --- a/Wino.Services/ServicesContainerSetup.cs +++ b/Wino.Services/ServicesContainerSetup.cs @@ -23,6 +23,7 @@ namespace Wino.Services services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddSingleton(); services.AddTransient(); diff --git a/Wino.Services/SpecialImapProviderConfigResolver.cs b/Wino.Services/SpecialImapProviderConfigResolver.cs new file mode 100644 index 00000000..e3de0587 --- /dev/null +++ b/Wino.Services/SpecialImapProviderConfigResolver.cs @@ -0,0 +1,68 @@ +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; + +namespace Wino.Services +{ + public class SpecialImapProviderConfigResolver : ISpecialImapProviderConfigResolver + { + private readonly CustomServerInformation iCloudServerConfig = new CustomServerInformation() + { + IncomingServer = "imap.mail.me.com", + IncomingServerPort = "993", + IncomingServerType = CustomIncomingServerType.IMAP4, + IncomingServerSocketOption = ImapConnectionSecurity.Auto, + IncomingAuthenticationMethod = ImapAuthenticationMethod.Auto, + OutgoingServer = "smtp.mail.me.com", + OutgoingServerPort = "587", + OutgoingServerSocketOption = ImapConnectionSecurity.Auto, + OutgoingAuthenticationMethod = ImapAuthenticationMethod.Auto, + MaxConcurrentClients = 5, + }; + + private readonly CustomServerInformation yahooServerConfig = new CustomServerInformation() + { + IncomingServer = "imap.mail.yahoo.com", + IncomingServerPort = "993", + IncomingServerType = CustomIncomingServerType.IMAP4, + IncomingServerSocketOption = ImapConnectionSecurity.Auto, + IncomingAuthenticationMethod = ImapAuthenticationMethod.Auto, + OutgoingServer = "smtp.mail.yahoo.com", + OutgoingServerPort = "587", + OutgoingServerSocketOption = ImapConnectionSecurity.Auto, + OutgoingAuthenticationMethod = ImapAuthenticationMethod.Auto, + MaxConcurrentClients = 5, + }; + + + public CustomServerInformation GetServerInformation(MailAccount account, AccountCreationDialogResult dialogResult) + { + CustomServerInformation resolvedConfig = null; + + if (dialogResult.SpecialImapProviderDetails.SpecialImapProvider == SpecialImapProvider.iCloud) + { + resolvedConfig = iCloudServerConfig; + + // iCloud takes username before the @icloud part for incoming, but full address as outgoing. + resolvedConfig.IncomingServerUsername = dialogResult.SpecialImapProviderDetails.Address.Split('@')[0]; + resolvedConfig.OutgoingServerUsername = dialogResult.SpecialImapProviderDetails.Address; + } + else if (dialogResult.SpecialImapProviderDetails.SpecialImapProvider == SpecialImapProvider.Yahoo) + { + resolvedConfig = yahooServerConfig; + + // Yahoo uses full address for both incoming and outgoing. + resolvedConfig.IncomingServerUsername = dialogResult.SpecialImapProviderDetails.Address; + resolvedConfig.OutgoingServerUsername = dialogResult.SpecialImapProviderDetails.Address; + } + + // Fill in account details. + resolvedConfig.Address = dialogResult.SpecialImapProviderDetails.Address; + resolvedConfig.IncomingServerPassword = dialogResult.SpecialImapProviderDetails.Password; + resolvedConfig.OutgoingServerPassword = dialogResult.SpecialImapProviderDetails.Password; + resolvedConfig.DisplayName = dialogResult.SpecialImapProviderDetails.SenderName; + return resolvedConfig; + } + } +} diff --git a/Wino.Services/ThreadingStrategyProvider.cs b/Wino.Services/ThreadingStrategyProvider.cs index ee4f2070..05fd60af 100644 --- a/Wino.Services/ThreadingStrategyProvider.cs +++ b/Wino.Services/ThreadingStrategyProvider.cs @@ -22,7 +22,7 @@ namespace Wino.Services { return mailProviderType switch { - MailProviderType.Outlook or MailProviderType.Office365 => _outlookThreadingStrategy, + MailProviderType.Outlook => _outlookThreadingStrategy, MailProviderType.Gmail => _gmailThreadingStrategy, _ => _imapThreadStrategy, }; diff --git a/Wino.sln b/Wino.sln index 93f7f32d..978f2f89 100644 --- a/Wino.sln +++ b/Wino.sln @@ -42,24 +42,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Services", "Wino.Servi EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM = Debug|ARM Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|ARM.ActiveCfg = Debug|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|ARM.Build.0 = Debug|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|ARM.Deploy.0 = Debug|Any CPU {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|ARM64.Build.0 = Debug|ARM64 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|ARM64.Deploy.0 = Debug|ARM64 @@ -69,12 +59,6 @@ Global {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|x86.ActiveCfg = Debug|x86 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|x86.Build.0 = Debug|x86 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|x86.Deploy.0 = Debug|x86 - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|Any CPU.Build.0 = Release|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|Any CPU.Deploy.0 = Release|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|ARM.ActiveCfg = Release|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|ARM.Build.0 = Release|Any CPU - {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|ARM.Deploy.0 = Release|Any CPU {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|ARM64.ActiveCfg = Release|ARM64 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|ARM64.Build.0 = Release|ARM64 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|ARM64.Deploy.0 = Release|ARM64 @@ -84,132 +68,78 @@ Global {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|x86.ActiveCfg = Release|x86 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|x86.Build.0 = Release|x86 {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|x86.Deploy.0 = Release|x86 - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|ARM.ActiveCfg = Debug|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|ARM.Build.0 = Debug|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|ARM64.ActiveCfg = Debug|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|ARM64.Build.0 = Debug|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|x64.ActiveCfg = Debug|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|x64.Build.0 = Debug|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|x86.ActiveCfg = Debug|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug|x86.Build.0 = Debug|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|Any CPU.Build.0 = Release|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|ARM.ActiveCfg = Release|Any CPU - {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|ARM.Build.0 = Release|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|ARM64.ActiveCfg = Release|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|ARM64.Build.0 = Release|Any CPU {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x64.ActiveCfg = Release|x64 {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x64.Build.0 = Release|x64 {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x86.ActiveCfg = Release|x86 {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x86.Build.0 = Release|x86 - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|Any CPU.ActiveCfg = Debug|x64 - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|Any CPU.Build.0 = Debug|x64 - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|ARM.ActiveCfg = Debug|Any CPU - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|ARM.Build.0 = Debug|Any CPU {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|ARM64.ActiveCfg = Debug|ARM64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|ARM64.Build.0 = Debug|ARM64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|x64.ActiveCfg = Debug|x64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|x64.Build.0 = Debug|x64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|x86.ActiveCfg = Debug|x86 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|x86.Build.0 = Debug|x86 - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|Any CPU.ActiveCfg = Release|x64 - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|Any CPU.Build.0 = Release|x64 - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|ARM.ActiveCfg = Release|Any CPU - {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|ARM.Build.0 = Release|Any CPU {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|ARM64.ActiveCfg = Release|ARM64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|ARM64.Build.0 = Release|ARM64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|x64.ActiveCfg = Release|x64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|x64.Build.0 = Release|x64 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|x86.ActiveCfg = Release|x86 {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|x86.Build.0 = Release|x86 - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|ARM.ActiveCfg = Debug|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|ARM.Build.0 = Debug|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|ARM64.ActiveCfg = Debug|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|ARM64.Build.0 = Debug|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|x64.ActiveCfg = Debug|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|x64.Build.0 = Debug|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|x86.ActiveCfg = Debug|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug|x86.Build.0 = Debug|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|Any CPU.Build.0 = Release|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|ARM.ActiveCfg = Release|Any CPU - {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|ARM.Build.0 = Release|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|ARM64.ActiveCfg = Release|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|ARM64.Build.0 = Release|Any CPU {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x64.ActiveCfg = Release|x64 {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x64.Build.0 = Release|x64 {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x86.ActiveCfg = Release|x86 {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x86.Build.0 = Release|x86 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|Any CPU.Build.0 = Debug|x64 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|ARM.ActiveCfg = Debug|x64 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|ARM.Build.0 = Debug|x64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|ARM64.Build.0 = Debug|ARM64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|x64.ActiveCfg = Debug|x64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|x64.Build.0 = Debug|x64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|x86.ActiveCfg = Debug|x86 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|x86.Build.0 = Debug|x86 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|Any CPU.ActiveCfg = Release|x64 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|Any CPU.Build.0 = Release|x64 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|ARM.ActiveCfg = Release|x64 - {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|ARM.Build.0 = Release|x64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|ARM64.ActiveCfg = Release|ARM64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|ARM64.Build.0 = Release|ARM64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|x64.ActiveCfg = Release|x64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|x64.Build.0 = Release|x64 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|x86.ActiveCfg = Release|x86 {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|x86.Build.0 = Release|x86 - {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|ARM.ActiveCfg = Debug|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|ARM.Build.0 = Debug|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|ARM64.ActiveCfg = Debug|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|ARM64.Build.0 = Debug|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|x64.ActiveCfg = Debug|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|x64.Build.0 = Debug|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|x86.ActiveCfg = Debug|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug|x86.Build.0 = Debug|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|Any CPU.Build.0 = Release|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|ARM.ActiveCfg = Release|Any CPU - {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|ARM.Build.0 = Release|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|ARM64.ActiveCfg = Release|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|ARM64.Build.0 = Release|Any CPU {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x64.ActiveCfg = Release|x64 {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x64.Build.0 = Release|x64 {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x86.ActiveCfg = Release|x86 {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x86.Build.0 = Release|x86 - {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|ARM.ActiveCfg = Debug|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|ARM.Build.0 = Debug|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|ARM64.ActiveCfg = Debug|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|ARM64.Build.0 = Debug|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|x64.ActiveCfg = Debug|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|x64.Build.0 = Debug|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|x86.ActiveCfg = Debug|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Debug|x86.Build.0 = Debug|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|Any CPU.Build.0 = Release|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|ARM.ActiveCfg = Release|Any CPU - {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|ARM.Build.0 = Release|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|ARM64.ActiveCfg = Release|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|ARM64.Build.0 = Release|Any CPU {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|x64.ActiveCfg = Release|x64 {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|x64.Build.0 = Release|x64 {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|x86.ActiveCfg = Release|x86 {0C307D7E-256F-448C-8265-5622A812FBCC}.Release|x86.Build.0 = Release|x86 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|Any CPU.ActiveCfg = Debug|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|Any CPU.Build.0 = Debug|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|Any CPU.Deploy.0 = Debug|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|ARM.ActiveCfg = Debug|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|ARM.Build.0 = Debug|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|ARM.Deploy.0 = Debug|x64 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|ARM64.ActiveCfg = Debug|ARM64 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|ARM64.Build.0 = Debug|ARM64 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|ARM64.Deploy.0 = Debug|ARM64 @@ -219,12 +149,6 @@ Global {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|x86.ActiveCfg = Debug|x86 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|x86.Build.0 = Debug|x86 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Debug|x86.Deploy.0 = Debug|x86 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|Any CPU.ActiveCfg = Release|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|Any CPU.Build.0 = Release|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|Any CPU.Deploy.0 = Release|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|ARM.ActiveCfg = Release|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|ARM.Build.0 = Release|x64 - {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|ARM.Deploy.0 = Release|x64 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|ARM64.ActiveCfg = Release|ARM64 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|ARM64.Build.0 = Release|ARM64 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|ARM64.Deploy.0 = Release|ARM64 @@ -234,112 +158,66 @@ Global {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|x86.ActiveCfg = Release|x86 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|x86.Build.0 = Release|x86 {760F5F31-8EE3-4B83-80F3-0E4FFBCC737C}.Release|x86.Deploy.0 = Release|x86 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|Any CPU.ActiveCfg = Debug|x64 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|Any CPU.Build.0 = Debug|x64 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|ARM.ActiveCfg = Debug|x64 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|ARM.Build.0 = Debug|x64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|ARM64.Build.0 = Debug|ARM64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|x64.ActiveCfg = Debug|x64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|x64.Build.0 = Debug|x64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|x86.ActiveCfg = Debug|x86 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Debug|x86.Build.0 = Debug|x86 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|Any CPU.ActiveCfg = Release|x64 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|Any CPU.Build.0 = Release|x64 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|ARM.ActiveCfg = Release|x64 - {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|ARM.Build.0 = Release|x64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|ARM64.ActiveCfg = Release|ARM64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|ARM64.Build.0 = Release|ARM64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|x64.ActiveCfg = Release|x64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|x64.Build.0 = Release|x64 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|x86.ActiveCfg = Release|x86 {3D1942E5-1A3B-4062-B4BB-156A40DA47FE}.Release|x86.Build.0 = Release|x86 - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|ARM.ActiveCfg = Debug|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|ARM.Build.0 = Debug|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|ARM64.ActiveCfg = Debug|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|ARM64.Build.0 = Debug|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|x64.ActiveCfg = Debug|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|x64.Build.0 = Debug|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|x86.ActiveCfg = Debug|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Debug|x86.Build.0 = Debug|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|Any CPU.Build.0 = Release|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|ARM.ActiveCfg = Release|Any CPU - {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|ARM.Build.0 = Release|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|ARM64.ActiveCfg = Release|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|ARM64.Build.0 = Release|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|x64.ActiveCfg = Release|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|x64.Build.0 = Release|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|x86.ActiveCfg = Release|Any CPU {D4919A19-E70F-4916-83D2-5D5F87BEB949}.Release|x86.Build.0 = Release|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|ARM.ActiveCfg = Debug|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|ARM.Build.0 = Debug|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|ARM64.ActiveCfg = Debug|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|ARM64.Build.0 = Debug|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|x64.ActiveCfg = Debug|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|x64.Build.0 = Debug|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|x86.ActiveCfg = Debug|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Debug|x86.Build.0 = Debug|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|Any CPU.Build.0 = Release|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|ARM.ActiveCfg = Release|Any CPU - {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|ARM.Build.0 = Release|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|ARM64.ActiveCfg = Release|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|ARM64.Build.0 = Release|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|x64.ActiveCfg = Release|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|x64.Build.0 = Release|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|x86.ActiveCfg = Release|Any CPU {53723AE8-7E7E-4D54-ADAB-0A6033255CC8}.Release|x86.Build.0 = Release|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|Any CPU.Build.0 = Debug|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|ARM.ActiveCfg = Debug|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|ARM.Build.0 = Debug|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|ARM64.ActiveCfg = Debug|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|ARM64.Build.0 = Debug|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|x64.ActiveCfg = Debug|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|x64.Build.0 = Debug|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|x86.ActiveCfg = Debug|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Debug|x86.Build.0 = Debug|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|Any CPU.ActiveCfg = Release|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|Any CPU.Build.0 = Release|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|ARM.ActiveCfg = Release|Any CPU - {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|ARM.Build.0 = Release|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|ARM64.ActiveCfg = Release|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|ARM64.Build.0 = Release|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|x64.ActiveCfg = Release|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|x64.Build.0 = Release|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|x86.ActiveCfg = Release|Any CPU {039AFFA8-C1CC-4E3B-8A31-6814D7557F74}.Release|x86.Build.0 = Release|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|ARM.ActiveCfg = Debug|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|ARM.Build.0 = Debug|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|ARM64.ActiveCfg = Debug|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|ARM64.Build.0 = Debug|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|x64.ActiveCfg = Debug|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|x64.Build.0 = Debug|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|x86.ActiveCfg = Debug|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Debug|x86.Build.0 = Debug|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|Any CPU.Build.0 = Release|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|ARM.ActiveCfg = Release|Any CPU - {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|ARM.Build.0 = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|ARM64.ActiveCfg = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|ARM64.Build.0 = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x64.ActiveCfg = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x64.Build.0 = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x86.ActiveCfg = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x86.Build.0 = Release|Any CPU - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|Any CPU.ActiveCfg = Debug|x64 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|Any CPU.Build.0 = Debug|x64 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|Any CPU.Deploy.0 = Debug|x64 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM.ActiveCfg = Debug|ARM - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM.Build.0 = Debug|ARM - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM.Deploy.0 = Debug|ARM {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM64.ActiveCfg = Debug|ARM64 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM64.Build.0 = Debug|ARM64 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM64.Deploy.0 = Debug|ARM64 @@ -349,12 +227,6 @@ Global {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x86.ActiveCfg = Debug|x86 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x86.Build.0 = Debug|x86 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x86.Deploy.0 = Debug|x86 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|Any CPU.ActiveCfg = Release|x64 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|Any CPU.Build.0 = Release|x64 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|Any CPU.Deploy.0 = Release|x64 - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM.ActiveCfg = Release|ARM - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM.Build.0 = Release|ARM - {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM.Deploy.0 = Release|ARM {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM64.ActiveCfg = Release|ARM64 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM64.Build.0 = Release|ARM64 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM64.Deploy.0 = Release|ARM64 @@ -364,12 +236,6 @@ Global {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x86.ActiveCfg = Release|x86 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x86.Build.0 = Release|x86 {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x86.Deploy.0 = Release|x86 - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM.ActiveCfg = Debug|ARM - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM.Build.0 = Debug|ARM - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM.Deploy.0 = Debug|ARM {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM64.Build.0 = Debug|ARM64 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM64.Deploy.0 = Debug|ARM64 @@ -379,12 +245,6 @@ Global {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x86.ActiveCfg = Debug|x86 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x86.Build.0 = Debug|x86 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x86.Deploy.0 = Debug|x86 - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|Any CPU.Build.0 = Release|Any CPU - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|Any CPU.Deploy.0 = Release|Any CPU - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM.ActiveCfg = Release|ARM - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM.Build.0 = Release|ARM - {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM.Deploy.0 = Release|ARM {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM64.ActiveCfg = Release|ARM64 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM64.Build.0 = Release|ARM64 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM64.Deploy.0 = Release|ARM64 @@ -394,20 +254,12 @@ Global {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x86.ActiveCfg = Release|x86 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x86.Build.0 = Release|x86 {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x86.Deploy.0 = Release|x86 - {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|ARM.ActiveCfg = Debug|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|ARM.Build.0 = Debug|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|ARM64.ActiveCfg = Debug|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|ARM64.Build.0 = Debug|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|x64.ActiveCfg = Debug|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|x64.Build.0 = Debug|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|x86.ActiveCfg = Debug|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Debug|x86.Build.0 = Debug|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|Any CPU.Build.0 = Release|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|ARM.ActiveCfg = Release|Any CPU - {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|ARM.Build.0 = Release|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|ARM64.ActiveCfg = Release|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|ARM64.Build.0 = Release|Any CPU {4000A374-59FE-4400-ACF6-D40473BECD73}.Release|x64.ActiveCfg = Release|Any CPU diff --git a/WinoFontIcomoon.json b/WinoFontIcomoon.json index 04f704e7..1aa1a648 100644 --- a/WinoFontIcomoon.json +++ b/WinoFontIcomoon.json @@ -1 +1 @@ -{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M383.104 817.159h257.792c-10.809 62.218-64.398 108.929-128.896 108.929s-118.087-46.709-128.784-108.147l-0.112-0.781zM512 76.377c180.495 0 326.815 146.32 326.815 326.815v0 174.302l61.79 137.698c2.268 4.959 3.591 10.757 3.591 16.864 0 22.838-18.494 41.356-41.323 41.396h-701.567c-22.86-0.004-41.39-18.537-41.39-41.396 0-6.124 1.33-11.937 3.715-17.166l-0.106 0.259 61.659-137.698v-174.825l0.218-10.894c6.374-175.471 150.154-315.303 326.597-315.311h0.001zM991.329 348.592c18.045 0.006 32.671 14.635 32.671 32.682 0 16.479-12.195 30.108-28.053 32.357l-0.174 0.020-4.445 0.305h-87.15c-18.045-0.006-32.671-14.635-32.671-32.682 0-16.479 12.195-30.108 28.053-32.357l0.174-0.020 4.445-0.305h87.15zM119.822 348.592c18.045 0.006 32.671 14.635 32.671 32.682 0 16.479-12.195 30.108-28.053 32.357l-0.174 0.020-4.445 0.305h-87.15c-18.045-0.006-32.671-14.635-32.671-32.682 0-16.479 12.195-30.108 28.053-32.357l0.174-0.020 4.445-0.305h87.15zM973.899 100.213c4.085 5.396 6.543 12.22 6.543 19.618 0 8.949-3.596 17.057-9.422 22.959l0.003-0.003-3.66 3.181-87.15 65.363c-5.406 4.109-12.249 6.582-19.67 6.582-18.049 0-32.682-14.632-32.682-32.682 0-8.975 3.618-17.106 9.476-23.013l-0.002 0.002 3.66-3.181 87.15-65.363c5.393-4.081 12.215-6.536 19.609-6.536 10.655 0 20.12 5.099 26.086 12.991l0.059 0.082zM95.855 93.676l87.15 65.363c7.973 6.026 13.073 15.49 13.073 26.145 0 18.049-14.632 32.682-32.682 32.682-7.394 0-14.215-2.455-19.691-6.596l0.082 0.059-87.15-65.363c-7.973-6.026-13.073-15.49-13.073-26.145 0-18.049 14.632-32.682 32.682-32.682 7.394 0 14.215 2.455 19.691 6.596l-0.082-0.059z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["AlertOn"],"grid":64},"attrs":[{}],"properties":{"order":295,"id":0,"name":"AlertOn","prevSize":64,"code":59683},"setIdx":0,"setId":2,"iconIdx":0},{"icon":{"paths":["M381.385 756.278c10.288 10.296 16.652 24.514 16.652 40.219 0 31.425-25.474 56.899-56.899 56.899-15.72 0-29.95-6.375-40.247-16.68l-284.271-284.668c-10.275-10.292-16.628-24.5-16.628-40.191s6.353-29.9 16.628-40.193l284.325-284.325c10.299-10.305 24.529-16.68 40.249-16.68 31.425 0 56.899 25.474 56.899 56.899 0 15.705-6.363 29.925-16.652 40.221v0l-187.447 187.332h374.892c246.345 0.003 446.972 195.732 454.859 440.159l0.019 0.723 0.228 14.222c0 31.418-25.47 56.889-56.889 56.889s-56.889-25.47-56.889-56.889v0c0-0.004 0-0.008 0-0.012 0-184.009-145.607-334.010-327.887-341.068l-0.641-0.020-12.8-0.228h-374.665l187.161 187.389z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["ArrowReply"],"grid":64},"attrs":[{}],"properties":{"order":294,"id":1,"name":"ArrowReply","prevSize":64,"code":59684},"setIdx":0,"setId":2,"iconIdx":1},{"icon":{"paths":["M306.912 780.724l-222.258-222.258c-10.527-10.177-24.885-16.449-40.708-16.449-32.362 0-58.597 26.235-58.597 58.597 0 15.822 6.272 30.181 16.465 40.724l263.669 263.669c10.604 10.6 25.251 17.156 41.427 17.156s30.825-6.556 41.427-17.156l644.563-644.563c10.177-10.527 16.449-24.885 16.449-40.708 0-32.362-26.235-58.597-58.597-58.597-15.822 0-30.181 6.272-40.724 16.465l-603.119 603.119z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Checkmark"],"grid":64},"attrs":[{}],"properties":{"order":293,"id":2,"name":"Checkmark","prevSize":64,"code":59685},"setIdx":0,"setId":2,"iconIdx":2},{"icon":{"paths":["M662.947 731.4c-3.51 18.673-7.46 36.567-11.798 53.729-25.576 22.407-41.637 55.132-41.637 91.608 0 0.053 0 0.105 0 0.157v-0.008c0 8.483 0.439 16.772 1.316 24.865-29.107 61.481-64.065 97.803-98.827 97.803-58.36 0-117.013-102.094-148.119-253.723l-2.828-14.334h301.894zM671.235 943.681c-8.206-19.281-12.975-41.709-12.975-65.251 0-0.543 0.002-1.086 0.008-1.627l-0.001 0.083c0-40.39 32.743-73.133 73.133-73.133v0h243.777c40.39 0 73.133 32.743 73.133 73.133v0c0 54.411-22.379 97.999-59.092 127.447-36.128 29.010-84.591 43.198-135.931 43.198s-99.803-14.139-135.931-43.198c-12.774-10.256-23.68-22.139-32.6-35.463l-0.358-0.568c-4.723-7.052-9.128-15.142-12.785-23.631l-0.379-0.99zM999.652 512c0 32.325-3.169 63.968-9.166 94.585-21.277-56.194-74.647-95.421-137.178-95.421-37.718 0-72.102 14.272-98.048 37.71l0.128-0.113c0.298-10.824 0.467-23.565 0.467-36.345 0-23.195-0.559-46.258-1.665-69.178l0.125 3.234-1.852-31.983h237.44c6.339 31.496 9.751 64.114 9.751 97.511zM755.777 658.266v-0.828c0-53.853 43.657-97.511 97.511-97.511s97.511 43.657 97.511 97.511v0 0.828c-0.331 53.467-43.752 96.682-97.265 96.682-0.087 0-0.173 0-0.259 0h0.014c-24.28 0-46.464-8.873-63.529-23.549-20.677-17.79-33.756-43.912-33.982-73.093v-0.040zM744.271 754.949c-2.966-3.306-5.892-6.895-8.642-10.621l-0.28-0.398-1.414 7.557-0.682 3.413h11.019zM76.419 731.4h209.941c17.747 101.509 47.926 187.903 87.37 248.311-125.917-38.179-228.001-122.208-288.918-232.201l-1.274-2.508-7.118-13.603zM34.148 414.489h237.44c-2.204 29.179-3.461 63.199-3.461 97.513 0 41.535 1.841 82.641 5.446 123.239l-0.376-5.252 2.779 28.279h-229.297c-14.188-43.749-22.368-94.087-22.368-146.335 0-34.49 3.564-68.149 10.346-100.626l-0.555 3.184zM678.987 414.489c2.401 29.154 3.77 63.106 3.77 97.377 0 41.679-2.024 82.884-5.979 123.524l0.406-5.158-3.022 28.034h-324.322c-5.44-44.095-8.545-95.136-8.545-146.903 0-25.71 0.766-51.24 2.275-76.57l-0.166 3.489 1.658-23.792h333.926zM655.584 52.528l-5.315-8.288c147.859 44.866 263.922 153.857 317.538 293.766l1.128 3.349h-223.788c-15.407-117.794-46.659-219.010-89.612-288.779zM367.781 46.044l5.948-1.804c-42.953 65.869-74.888 162.356-91.855 275.663l-3.022 21.452h-223.69c54.001-141.32 167.597-249.225 309.207-294.359l3.461-0.953zM512 24.543c64.308 0 129.007 123.937 156.7 301.455l2.291 15.358h-317.983c26.377-185.709 92.879-316.813 158.992-316.813z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["GlobePerson"],"grid":64},"attrs":[{}],"properties":{"order":291,"id":3,"name":"JoinOnline","prevSize":64,"code":59686},"setIdx":0,"setId":2,"iconIdx":3},{"icon":{"paths":["M224.171 597.333h468.821c4.437 7.339 9.856 14.165 16.213 20.224l30.72 29.099c-4.388 16.237-10.53 30.451-18.388 43.515l0.425-0.763c-8.432 14.527-18.147 27.055-29.302 38.134l-0.010 0.010-33.877-11.307c-8.718-2.968-18.761-4.681-29.204-4.681-32.297 0-60.767 16.386-77.55 41.297l-0.211 0.333-30.805 45.227c-10.828 15.816-17.291 35.363-17.291 56.42 0 27.465 10.996 52.362 28.826 70.529l-0.015-0.016 9.685 9.728c-23.083 2.432-47.36 3.627-72.875 3.627-123.307 0-218.795-28.032-285.483-85.333-34.179-29.513-55.68-72.903-55.68-121.315 0-0.010 0-0.020 0-0.031l-0 0.002v-38.699c0-53.019 42.981-96 96-96h0zM725.803 522.453l21.461-50.645c10.069-23.765 34.176-36.693 57.856-31.744l5.035 1.323 26.88 8.619c26.709 8.533 47.104 31.36 53.717 60.032 15.659 68.181-3.157 151.168-56.405 248.96-53.205 97.707-111.531 156.416-174.933 176.213-6.636 2.127-14.27 3.353-22.19 3.353-18.661 0-35.732-6.807-48.866-18.073l0.101 0.084-5.291-4.821-20.395-20.48c-10.137-10.436-16.386-24.694-16.386-40.412 0-10.061 2.561-19.524 7.066-27.773l-0.152 0.303 2.987-4.949 30.805-45.227c12.117-17.792 32.853-26.24 52.779-21.973l5.419 1.493 56.832 18.944c22.956-17.637 41.925-39.192 56.19-63.812l0.557-1.041c11.81-19.519 20.664-42.288 25.231-66.569l0.199-1.271 1.621-11.477-47.317-44.928c-10.773-10.504-17.456-25.161-17.456-41.378 0-6.126 0.954-12.029 2.72-17.57l-0.113 0.409 2.048-5.589v0zM469.333 85.547c117.821-0 213.333 95.513 213.333 213.333s-95.513 213.333-213.333 213.333v0c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["PersonCall"],"grid":64},"attrs":[{}],"properties":{"order":288,"id":4,"name":"PersonCall","prevSize":64,"code":59687},"setIdx":0,"setId":2,"iconIdx":4},{"icon":{"paths":["M512 37.103c-163.958 0-296.811 132.853-296.811 296.811 0 32.785 26.578 59.363 59.363 59.363s59.363-26.578 59.363-59.363v0c0-98.422 79.665-178.087 178.087-178.087s178.087 79.665 178.087 178.087c0 48.44-11.814 76.815-26.001 96.701-15.553 21.667-37.102 37.873-66.961 58.472l-6.886 4.63c-26.535 18.165-60.728 41.494-87.203 74.024-31.283 38.467-50.399 87.084-50.399 152.026v29.681c0 32.785 26.578 59.363 59.363 59.363s59.363-26.578 59.363-59.363v0-29.681c0-38.941 10.567-60.787 23.745-77.112 15.256-18.639 35.795-32.768 66.13-53.604l3.146-2.197c29.444-20.184 67.257-46.659 96.167-87.144 30.453-42.266 48.262-95.573 48.262-165.799 0-163.958-132.853-296.811-296.811-296.811zM512 1061.101c40.981 0 74.202-33.222 74.202-74.202s-33.222-74.202-74.202-74.202v0c-40.981 0-74.202 33.222-74.202 74.202s33.222 74.202 74.202 74.202v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Question"],"grid":64},"attrs":[{}],"properties":{"order":287,"id":5,"name":"Question","prevSize":64,"code":59688},"setIdx":0,"setId":2,"iconIdx":5},{"icon":{"paths":["M652.765 665.562c49.447 0 89.578 40.131 89.578 89.578l-0.052 49.242c5.989 112.1-77.344 168.765-226.863 168.765-148.955 0-233.773-55.795-233.773-166.82v-51.188c0-49.447 40.131-89.578 89.578-89.578h281.531zM89.704 409.626h223.996c-4.099 15.32-6.454 32.909-6.454 51.049 0 57.132 23.359 108.81 61.049 146.001l0.023 0.022 8.292 7.73-5.375-0.052c-0.016 0-0.034 0-0.050 0-64.221 0-118.398 43.007-135.3 101.791l-0.245 0.993-1.741 0.052c-148.955 0-233.773-55.795-233.773-166.82v-51.188c0-49.447 40.131-89.578 89.578-89.578zM934.296 409.626c49.447 0 89.578 40.131 89.578 89.578l-0.052 49.242c5.989 112.1-77.344 168.765-226.863 168.765l-8.651-0.102c-16.31-56.459-65.498-97.85-124.987-102.346l-0.474-0.029-10.084-0.359-5.375 0.052c42.676-37.618 69.457-92.407 69.457-153.451 0-18.232-2.389-35.906-6.871-52.726l0.323 1.426 223.996-0.052zM512 307.25c84.81 0 153.562 68.753 153.562 153.562s-68.753 153.562-153.562 153.562v0c-84.81 0-153.562-68.753-153.562-153.562s68.753-153.562 153.562-153.562v0zM230.469 51.313c84.81 0 153.562 68.753 153.562 153.562s-68.753 153.562-153.562 153.562v0c-84.81 0-153.562-68.753-153.562-153.562s68.753-153.562 153.562-153.562v0zM793.531 51.313c84.81 0 153.562 68.753 153.562 153.562s-68.753 153.562-153.562 153.562v0c-84.81 0-153.562-68.753-153.562-153.562s68.753-153.562 153.562-153.562v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["PeopleCommunity"],"grid":64},"attrs":[{}],"properties":{"order":286,"id":6,"name":"Attendees","prevSize":64,"code":59689},"setIdx":0,"setId":2,"iconIdx":6},{"icon":{"paths":["M902.026 158.393c0-74.045-60.026-134.071-134.071-134.071v0h-609.416c-74.045 0-134.071 60.026-134.071 134.071v0 609.416c0 74.045 60.026 134.071 134.071 134.071v0h324.989l5.119-20.476c7.898-31.592 24.23-60.454 47.291-83.465l105.21-105.258c-4.519-5.798-7.25-13.183-7.264-21.204v-416.454c0.273-19.715 16.319-35.594 36.074-35.594 0.173 0 0.345 0.001 0.516 0.003h-0.026c0.146-0.002 0.318-0.003 0.491-0.003 19.754 0 35.802 15.877 36.074 35.567v371.819l116.666-116.666c20.86-20.887 47.482-36.014 77.278-42.796l1.070-0.205v-308.755zM219.48 353.405c0-20.135 16.381-36.419 36.565-36.419s36.565 16.284 36.565 36.419v317.189c-0.027 20.12-16.345 36.419-36.468 36.419-0.034 0-0.069 0-0.103 0h0.006c-0.029 0-0.063 0-0.097 0-20.123 0-36.439-16.299-36.468-36.416v-317.191zM426.681 498.837c0-0.043 0-0.095 0-0.147 0-19.57 15.796-35.451 35.333-35.589h0.013c0.146-0.002 0.319-0.003 0.491-0.003 19.469 0 35.286 15.632 35.586 35.029v0.029l1.706 172.928c0 0.058 0 0.127 0 0.195 0 19.57-15.796 35.451-35.333 35.589h-0.013c-0.146 0.002-0.319 0.003-0.491 0.003-19.486 0-35.314-15.659-35.587-35.081v-0.025l-1.706-172.928zM858.148 544.665l-287.79 287.742c-16.291 16.298-28.307 36.869-34.221 59.888l-0.198 0.908-22.329 89.268c-1.006 3.859-1.583 8.289-1.583 12.855 0 29.268 23.726 52.995 52.995 52.995 4.58 0 9.022-0.58 13.261-1.673l-0.368 0.080 89.219-22.281c23.949-6.119 44.538-18.152 60.843-34.468l287.742-287.742c19.448-20.039 31.437-47.411 31.437-77.583 0-61.553-49.897-111.45-111.45-111.45-30.159 0-57.521 11.98-77.586 31.44l0.029-0.027z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["DataUsageEdit"],"grid":64},"attrs":[{}],"properties":{"order":285,"id":7,"name":"EditSeries","prevSize":64,"code":59690},"setIdx":0,"setId":2,"iconIdx":7},{"icon":{"paths":["M768 746.667v53.333c0 53.019-42.981 96-96 96v0h-320c-53.019 0-96-42.981-96-96v0-53.376l-74.667 0.043c-53.019 0-96-42.981-96-96v0-255.829c0-76.583 62.083-138.667 138.667-138.667v0l31.957-0.043 0.043-32.128c0-53.019 42.981-96 96-96v0h320.085c53.019 0 96 42.981 96 96v0 32.128h32c76.581 0.049 138.655 62.092 138.752 138.657l0 0.009 0.128 255.872c0 0.013 0 0.028 0 0.043 0 52.981-42.937 95.933-95.912 95.957l-75.053 0zM672 576h-320c-17.673 0-32 14.327-32 32v0 192c0 17.664 14.336 32 32 32h320c17.673 0 32-14.327 32-32v0-192c0-17.673-14.327-32-32-32v0zM672.085 192h-320.085c-17.673 0-32 14.327-32 32v0l-0.043 32.128h384.128v-32.128c0-17.673-14.327-32-32-32v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Print"],"grid":64},"attrs":[{}],"properties":{"order":281,"id":8,"name":"Print","prevSize":64,"code":59682},"setIdx":0,"setId":2,"iconIdx":8},{"icon":{"paths":["M896 512.939v-150.272h-768v394.667c0 76.583 62.083 138.667 138.667 138.667v0h246.272c-27.404-42.265-43.697-93.942-43.697-149.425 0-153.167 124.166-277.333 277.333-277.333 55.483 0 107.161 16.293 150.51 44.355l-1.085-0.658zM896 266.667c0-76.583-62.083-138.667-138.667-138.667v0h-490.667c-76.583 0-138.667 62.083-138.667 138.667v0 32h768v-32zM981.333 746.667c0-129.603-105.064-234.667-234.667-234.667s-234.667 105.064-234.667 234.667v0c0 129.603 105.064 234.667 234.667 234.667s234.667-105.064 234.667-234.667v0zM725.333 618.667c0-11.782 9.551-21.333 21.333-21.333s21.333 9.551 21.333 21.333v0 170.667c0 11.782-9.551 21.333-21.333 21.333s-21.333-9.551-21.333-21.333v0-170.667zM773.333 874.667c0 14.728-11.939 26.667-26.667 26.667s-26.667-11.939-26.667-26.667v0c0-14.728 11.939-26.667 26.667-26.667s26.667 11.939 26.667 26.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarError"],"grid":64},"attrs":[],"properties":{"order":280,"id":9,"name":"CalendarError","prevSize":64,"code":59670},"setIdx":0,"setId":2,"iconIdx":9},{"icon":{"paths":["M839.11 0.001c102.111 0 184.889 82.777 184.889 184.889v0 654.222c0 102.111-82.777 184.889-184.889 184.889v0h-654.222c-102.111 0-184.889-82.777-184.889-184.889v0-654.222c0-102.111 82.777-184.889 184.889-184.889v0h654.222zM270.223 227.556c-21.517 0.001-39.313 15.929-42.243 36.637l-0.027 0.227-0.399 5.803v483.555l0.399 5.803c2.961 20.929 20.756 36.851 42.268 36.851s39.307-15.921 42.243-36.624l0.027-0.227 0.399-5.803v-483.555l-0.399-5.803c-2.955-20.935-20.752-36.863-42.268-36.864v0zM753.777 227.556c-21.517 0.001-39.313 15.929-42.243 36.637l-0.027 0.227-0.399 5.803v483.555l0.399 5.803c2.961 20.929 20.756 36.851 42.268 36.851s39.307-15.921 42.243-36.624l0.027-0.227 0.399-5.803v-483.555l-0.399-5.803c-2.955-20.935-20.752-36.863-42.268-36.864v0zM512 227.556c-21.517 0.001-39.313 15.929-42.243 36.637l-0.027 0.227-0.399 5.803v483.555l0.399 5.803c2.961 20.929 20.756 36.851 42.268 36.851s39.307-15.921 42.243-36.624l0.027-0.227 0.399-5.803v-483.555l-0.399-5.803c-2.955-20.935-20.752-36.863-42.268-36.864v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarYear"],"grid":64},"attrs":[],"properties":{"order":279,"id":10,"name":"CalendarYear","prevSize":64,"code":59671},"setIdx":0,"setId":2,"iconIdx":10},{"icon":{"paths":["M512 144.41c246.517 0 446.359 199.841 446.359 446.359s-199.841 446.359-446.359 446.359v0c-246.517 0-446.359-199.841-446.359-446.359s199.841-446.359 446.359-446.359v0zM512 301.948c-19.862 0.001-36.289 14.704-38.993 33.819l-0.025 0.209-0.368 5.356v236.308l0.368 5.356c2.734 19.319 19.159 34.016 39.017 34.016s36.283-14.697 38.993-33.807l0.025-0.209 0.368-5.356v-236.308l-0.368-5.356c-2.727-19.324-19.156-34.027-39.017-34.028v0zM888.517 150.869l4.306 3.204 60.337 52.513c8.354 7.262 13.605 17.905 13.605 29.776 0 21.751-17.633 39.385-39.385 39.385-8.078 0-15.586-2.432-21.836-6.603l0.144 0.090-4.254-3.204-60.337-52.513c-8.26-7.257-13.445-17.841-13.445-29.636 0-21.751 17.633-39.385 39.385-39.385 7.988 0 15.42 2.378 21.628 6.465l-0.148-0.091zM630.154 13.129c21.746 0.007 39.372 17.637 39.372 39.385 0 19.858-14.697 36.283-33.807 38.993l-0.209 0.025-5.356 0.368h-236.308c-21.746-0.007-39.372-17.637-39.372-39.385 0-19.858 14.697-36.283 33.807-38.993l0.209-0.025 5.356-0.368h236.308z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["Reminder"],"grid":64},"attrs":[],"properties":{"order":278,"id":11,"name":"Reminder","prevSize":64,"code":59672},"setIdx":0,"setId":2,"iconIdx":11},{"icon":{"paths":["M1023.999 839.11c0 102.111-82.777 184.889-184.889 184.889v0h-654.222c-102.111 0-184.889-82.777-184.889-184.889v0-654.222c0-102.111 82.777-184.889 184.889-184.889v0h654.222c102.111 0 184.889 82.777 184.889 184.889v0 654.222zM796.444 270.223c-0.001-21.517-15.929-39.313-36.637-42.243l-0.227-0.027-5.803-0.399-489.358 0.399c-20.929 2.961-36.851 20.756-36.851 42.268s15.921 39.307 36.624 42.243l0.227 0.027 5.803 0.399 489.358-0.399c20.935-2.955 36.863-20.752 36.864-42.268v0zM796.444 753.777c-0.001-21.517-15.929-39.313-36.637-42.243l-0.227-0.027-5.803-0.399-489.358 0.399c-20.929 2.961-36.851 20.756-36.851 42.268s15.921 39.307 36.624 42.243l0.227 0.027 5.803 0.399 489.358-0.399c20.935-2.955 36.863-20.752 36.864-42.268v0zM796.444 512c-0.001-21.517-15.929-39.313-36.637-42.243l-0.227-0.027-5.803-0.399-489.358 0.399c-20.929 2.961-36.851 20.756-36.851 42.268s15.921 39.307 36.624 42.243l0.227 0.027 5.803 0.399 489.358-0.399c20.935-2.955 36.863-20.752 36.864-42.268v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarAgenda"],"grid":64},"attrs":[],"properties":{"order":277,"id":12,"name":"CalendarAgenda","prevSize":64,"code":59673},"setIdx":0,"setId":2,"iconIdx":12},{"icon":{"paths":["M922.4 352.401v114c-31.531-41.682-81.025-68.33-136.749-68.33-94.44 0-171 76.56-171 171 0 49.456 21 94.015 54.566 125.236l0.104 0.094h-43.32c-62.957 0-114 51.042-114 114v0 22.8c0 31.92 7.752 62.883 22.255 91.2h-284.456c-81.848 0-148.2-66.352-148.2-148.2v0-421.8h820.799zM774.199 101.6c81.848 0 148.2 66.352 148.2 148.2v0 34.2h-820.799v-34.2c0-81.848 66.352-148.2 148.2-148.2v0h524.4z","M1013.599 808.399c0-37.774-30.626-68.4-68.4-68.4v0h-319.2c-37.774 0-68.4 30.626-68.4 68.4v0 22.8c0 89.876 84.816 182.4 227.999 182.4s227.999-92.524 227.999-182.4v-22.8zM910.999 569c0-69.256-56.143-125.399-125.399-125.399s-125.399 56.143-125.399 125.399v0c0 69.256 56.143 125.399 125.399 125.399s125.399-56.143 125.399-125.399v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarAttendee"],"grid":64},"attrs":[],"properties":{"order":276,"id":13,"name":"CalendarAttendee","prevSize":64,"code":59674},"setIdx":0,"setId":2,"iconIdx":13},{"icon":{"paths":["M931.787 144.778l0.21 6.354 0.105 6.406v582.892c0 105.857-85.814 191.671-191.671 191.671v0h-582.892c-4.498-0.004-8.956-0.138-13.381-0.396l0.62 0.030c30.721 47.871 83.675 79.137 143.931 79.137 0.039 0 0.079 0 0.118 0h451.603c149.36 0 270.44-121.080 270.44-270.44v0-451.609c0-60.548-31.508-113.743-79.084-144.043zM-13.128 275.693v433.23c0 94.256 76.41 170.667 170.667 170.667v0h551.384c94.256 0 170.667-76.41 170.667-170.667v0-433.23h-892.716zM157.539-13.128c-94.256 0-170.667 76.41-170.667 170.667v0 39.385h892.716v-39.385c0-94.256-76.41-170.667-170.667-170.667v0h-551.384z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarItemMultiDay"],"grid":64},"attrs":[],"properties":{"order":275,"id":14,"name":"CalendarItemMultiDay","prevSize":64,"code":59675},"setIdx":0,"setId":2,"iconIdx":14},{"icon":{"paths":["M839.109 0.001c102.107 0 184.89 82.774 184.89 184.89v0 654.22c0 102.107-82.774 184.89-184.89 184.89v0h-654.22c-102.107 0-184.89-82.774-184.89-184.89v0-654.22c0-102.107 82.774-184.89 184.89-184.89v0h654.22zM270.221 597.331c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM512 597.331c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM270.221 312.89c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM512 312.89c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM753.779 312.89c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarMonth"],"grid":64},"attrs":[],"properties":{"order":274,"id":15,"name":"CalendarMonth","prevSize":64,"code":59676},"setIdx":0,"setId":2,"iconIdx":15},{"icon":{"paths":["M972.8 332.801v180.326c-50.718-32.885-112.73-52.436-179.31-52.436-183.8 0-332.799 148.999-332.799 332.799 0 66.58 19.552 128.593 53.226 180.612l-0.79-1.302h-295.526c-91.9 0-166.4-74.5-166.4-166.4v0-473.6h921.599zM806.399 51.2c91.9 0 166.4 74.5 166.4 166.4v0 38.4h-921.599v-38.4c0-91.9 74.5-166.4 166.4-166.4v0h588.8zM512 793.6c0 155.523 126.077 281.6 281.6 281.6s281.6-126.077 281.6-281.6v0c0-155.523-126.077-281.6-281.6-281.6s-281.6 126.077-281.6 281.6v0zM947.2 614.4c14.138 0 25.6 11.461 25.6 25.6v0 102.4c0 14.138-11.461 25.6-25.6 25.6v0h-102.4c-14.138 0-25.6-11.461-25.6-25.6s11.461-25.6 25.6-25.6v0h51.2c-23.56-31.226-60.596-51.2-102.298-51.2-0.036 0-0.072 0-0.108 0h0.006c-42.649 0-80.486 20.838-103.782 53.044-4.723 6.184-12.1 10.133-20.399 10.133-14.138 0-25.6-11.461-25.6-25.6 0-5.435 1.693-10.475 4.583-14.62l-0.055 0.084c32.9-45.197 85.628-74.24 145.14-74.24 0.041 0 0.080 0 0.12 0h-0.006c50.176 0 95.488 20.634 128 53.76v-28.16c0-14.138 11.461-25.6 25.6-25.6v0zM665.6 919.040v28.16c0 14.138-11.461 25.6-25.6 25.6s-25.6-11.461-25.6-25.6v0-102.4c0-14.138 11.461-25.6 25.6-25.6v0h102.4c14.138 0 25.6 11.461 25.6 25.6s-11.461 25.6-25.6 25.6v0h-51.2c23.347 31.129 60.57 51.2 102.4 51.2 39.22 0 74.342-17.612 97.843-45.466 4.717-5.382 11.605-8.761 19.283-8.761 14.138 0 25.6 11.461 25.6 25.6 0 6.161-2.176 11.813-5.802 16.23l0.036-0.044c-33.022 39.029-82.034 63.642-136.796 63.642-0.058 0-0.115 0-0.173 0h0.010c-0.072 0-0.156 0-0.241 0-50.047 0-95.29-20.575-127.728-53.728l-0.031-0.032z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarSync"],"grid":64},"attrs":[],"properties":{"order":273,"id":16,"name":"CalendarSync","prevSize":64,"code":59677},"setIdx":0,"setId":2,"iconIdx":16},{"icon":{"paths":["M312.89 455.111v-142.222h398.222v142.222h-398.222z","M839.11 1023.999c102.111 0 184.889-82.777 184.889-184.889v0-654.222c0-102.111-82.777-184.889-184.889-184.889v0h-654.222c-102.111 0-184.889 82.777-184.889 184.889v0 654.222c0 102.111 82.777 184.889 184.889 184.889v0h654.222zM270.223 227.556h483.555c23.564 0 42.667 19.103 42.667 42.667v0 227.556c0 23.564-19.103 42.667-42.667 42.667v0h-483.555c-23.564 0-42.667-19.103-42.667-42.667v0-227.556c0-23.564 19.103-42.667 42.667-42.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarWorkWeek"],"grid":64},"attrs":[],"properties":{"order":272,"id":17,"name":"CalendarWorkWeek","prevSize":64,"code":59678},"setIdx":0,"setId":2,"iconIdx":17},{"icon":{"paths":["M563.299 307.828c162.19 0 254.242 107.41 267.604 237.040h4.095c0.076 0 0.166 0 0.256 0 104.178 0 188.645 84.395 188.761 188.545v0.011c-0.116 104.162-84.583 188.556-188.761 188.556-0.090 0-0.18 0-0.27 0h-543.436c-0.076 0-0.166 0-0.256 0-104.178 0-188.645-84.395-188.761-188.545v-0.011c0.116-104.162 84.583-188.556 188.761-188.556 0.090 0 0.18 0 0.27 0h4.081c13.464-130.499 105.464-237.040 267.654-237.040zM234.977 102.685c42.977 2.367 82.579 14.862 117.075 35.116l-1.218-0.661c51.613 30.084 91.164 76.037 112.441 131.086l0.601 1.769c-101.574 28.823-174.272 102.496-204.479 202.072l-3.533 12.594-2.97 12.185-10.546 1.945c-59.289 12.849-109.22 46.25-143.092 92.212l-0.463 0.658c-37.349-20.048-68.215-47.674-91.442-81.017l-0.558-0.846c-4.242-6.087-6.777-13.639-6.777-21.783 0-16.588 10.517-30.718 25.247-36.086l0.266-0.085c84.115-30.103 129.374-63.995 155.33-113.4 28.26-54.012 33.482-111.301 14.693-188.3-0.698-2.738-1.099-5.883-1.099-9.121 0-21.206 17.191-38.397 38.397-38.397 0.746 0 1.489 0.022 2.225 0.064l-0.102-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherCloudyNight"],"grid":64},"attrs":[],"properties":{"order":271,"id":18,"name":"WeatherCloudyNight","prevSize":64,"code":59679},"setIdx":0,"setId":2,"iconIdx":18},{"icon":{"paths":["M563.298 256.482c162.189 0 254.239 107.358 267.601 237.037h4.095c0.076 0 0.166 0 0.256 0 104.177 0 188.643 84.394 188.759 188.543v0.011c-0.145 104.138-84.6 188.504-188.759 188.504-0.090 0-0.18 0-0.27 0h-543.43c-0.076 0-0.166 0-0.256 0-104.159 0-188.613-84.364-188.759-188.489v-0.014c0.116-104.161 84.582-188.554 188.759-188.554 0.090 0 0.18 0 0.27 0h4.081c13.464-130.549 105.463-237.037 267.652-237.037zM409.609 102.433c82.784 0 156.147 41.724 199.664 105.566-13.676-1.728-29.501-2.714-45.557-2.714-0.146 0-0.294 0-0.44 0h0.023c-153.28 0-264.733 85.855-303.95 215.689l-3.481 12.287-2.97 12.185-10.546 1.997c-82.829 18.057-148.657 77.037-176.056 154.215l-0.518 1.676c-40.157-31.018-65.768-79.18-65.768-133.326 0-89.459 69.912-162.589 158.081-167.736l0.455-0.022 13.157-0.307c20.752-114.106 119.356-199.492 237.906-199.51h0.001z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherCloudy"],"grid":64},"attrs":[],"properties":{"order":270,"id":19,"name":"WeatherCloudy","prevSize":64,"code":59680},"setIdx":0,"setId":2,"iconIdx":19},{"icon":{"paths":["M563.296 307.583c162.234 0 254.23 107.354 267.642 237.028h4.095c0.076 0 0.166 0 0.256 0 104.173 0 188.636 84.391 188.752 188.536v0.011c-0.145 104.135-84.597 188.497-188.752 188.497-0.090 0-0.18 0-0.27 0h-543.46c-0.076 0-0.166 0-0.256 0-104.155 0-188.606-84.361-188.752-188.482v-0.014c0.116-104.157 84.579-188.547 188.752-188.547 0.090 0 0.18 0 0.27 0h4.081c13.464-130.545 105.409-237.028 267.591-237.028zM121.288 520.293c1.85 4.343 2.925 9.396 2.925 14.699 0 14.078-7.576 26.385-18.873 33.069l-0.179 0.097-4.659 2.304-47.405 19.658c-4.333 1.839-9.372 2.91-14.661 2.91-21.205 0-38.395-17.19-38.395-38.395 0-14.041 7.536-26.321 18.785-33.017l0.176-0.097 4.709-2.355 47.405-19.607c4.347-1.854 9.404-2.931 14.713-2.931 15.89 0 29.525 9.652 35.362 23.413l0.095 0.252zM453.383 272.873l-8.806 2.97c-91.33 32.252-156.755 102.644-185.066 195.715l-3.584 12.799-2.97 12.185-10.546 1.997c-32.469 6.959-61.138 19.65-86.282 37.068l0.787-0.516c-17.207-29.085-27.375-64.098-27.375-101.485 0-111.455 90.352-201.807 201.807-201.807 46.077 0 88.547 15.442 122.518 41.434l-0.486-0.356zM48.183 274.46l5.427 1.791 47.405 19.658c13.952 5.958 23.552 19.564 23.552 35.41 0 21.205-17.19 38.395-38.395 38.395-3.254 0-6.414-0.404-9.432-1.167l0.265 0.056-5.273-1.689-47.405-19.658c-13.914-5.975-23.481-19.561-23.481-35.38 0-21.205 17.19-38.395 38.395-38.395 3.21 0 6.328 0.394 9.309 1.136l-0.264-0.055zM243.487 121.595l2.355 4.659 19.607 47.457c1.796 4.286 2.84 9.268 2.84 14.492 0 21.205-17.19 38.395-38.395 38.395-13.993 0-26.237-7.485-32.948-18.67l-0.097-0.174-2.355-4.659-19.607-47.457c-1.796-4.286-2.84-9.268-2.84-14.492 0-21.205 17.19-38.395 38.395-38.395 13.993 0 26.237 7.485 32.948 18.67l0.097 0.174zM466.386 105.264c14.019 5.93 23.677 19.568 23.677 35.462 0 3.314-0.42 6.531-1.209 9.599l0.058-0.266-1.791 5.375-19.607 47.457c-5.958 13.952-19.564 23.552-35.41 23.552-21.205 0-38.395-17.19-38.395-38.395 0-3.254 0.404-6.414 1.167-9.432l-0.056 0.265 1.741-5.427 19.658-47.405c5.923-14.036 19.568-23.708 35.475-23.708 5.302 0 10.352 1.075 14.947 3.018l-0.252-0.095z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherPartlyCloudy"],"grid":64},"attrs":[],"properties":{"order":269,"id":20,"name":"WeatherPartlyCloudy","prevSize":64,"code":59681},"setIdx":0,"setId":2,"iconIdx":20},{"icon":{"paths":["M201.348 953.716c0-6.336 0.667-12.006 2.001-17.008l76.537-296.645h-80.539c-9.338 0-18.176-1.834-26.513-5.503s-15.591-8.587-21.761-14.757c-6.17-6.17-11.088-13.424-14.757-21.761s-5.503-17.175-5.503-26.513c0-6.003 0.833-12.006 2.501-18.009l140.569-506.747c3.669-14.007 11.339-25.345 23.011-34.017s24.679-13.006 39.019-13.006h346.669c9.004 0 17.341 1.751 25.012 5.253s14.424 8.171 20.26 14.007c5.836 5.836 10.422 12.673 13.757 20.51s5.002 16.091 5.002 24.762c0 7.337-1.168 14.34-3.502 21.010l-82.54 234.615h162.579c9.338 0 18.092 1.834 26.263 5.503s15.425 8.671 21.761 15.007c6.336 6.336 11.339 13.59 15.007 21.761s5.503 16.925 5.503 26.263c0 19.009-6.336 35.017-19.009 48.023l-551.269 566.277c-6.67 6.673-14.257 11.836-22.761 15.508s-17.592 5.503-27.263 5.503c-9.672 0-18.676-1.831-27.013-5.503s-15.758-8.754-22.261-15.257c-6.503-6.503-11.589-13.924-15.257-22.261s-5.503-17.341-5.503-27.013zM828.154 388.44c0-1.334-0.583-2.418-1.751-3.252s-2.251-1.251-3.252-1.251h-207.601c-8.671 0-16.175-3.085-22.511-9.255s-9.505-13.59-9.505-22.261c0-1.668 0.167-3.502 0.5-5.503s0.833-3.835 1.501-5.503l97.047-277.636h-346.669c-1.334 4.669-4.335 15.34-9.004 32.016s-10.422 37.268-17.258 61.78c-6.836 24.512-14.424 51.692-22.761 81.54s-16.758 59.946-25.262 90.294c-8.504 30.348-16.758 59.946-24.762 88.793s-15.090 54.527-21.26 77.038c-6.17 22.511-11.172 40.687-15.007 54.527s-5.753 21.093-5.753 21.761c0 3.001 1.501 4.502 4.502 4.502h121.559c9.004 0 16.591 3.085 22.761 9.255s9.255 13.757 9.255 22.761c0 2.001-0.333 4.669-1 8.004l-86.542 336.664v1.501c0 3.669 2.168 5.503 6.503 5.503 1.334 0 2.501-0.5 3.502-1.501l551.269-566.277c1-1 1.501-2.168 1.501-3.502z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherThunder"],"grid":64},"attrs":[],"properties":{"order":268,"id":21,"name":"WeatherThunder","prevSize":64,"code":59654},"setIdx":0,"setId":2,"iconIdx":21},{"icon":{"paths":["M858.233 383.471c91.229 1.168 164.735 75.396 164.735 166.793 0 88.074-68.259 160.205-154.76 166.377l-0.534 0.030-10.261 0.256-5.951 0.36h-40.38c5.644 15.906 8.722 33.094 8.722 50.95 0 85.429-64.751 154.234-150.13 154.234-66.702 0-114.675-32.222-137.918-83.428-2.921-6.25-4.625-13.571-4.625-21.289 0-28.337 22.972-51.309 51.309-51.309 18.576 0 34.846 9.872 43.851 24.655l0.129 0.226 5.028 9.646c7.183 12.416 19.139 18.881 42.228 18.881 27.193 0 47.461-21.55 47.461-51.617 0-26.168-20.164-48.025-46.384-50.95h-620.53c-28.313-0.032-51.252-22.992-51.252-51.309 0-26.201 19.64-47.816 45.001-50.924l0.248-0.025 6.003-0.36 614.475-0.308c3.232 0 6.465 0.102 9.697 0.256l177.631 0.102 3.079-0.308 9.697-0.41c32.411-3.514 57.417-30.729 57.417-63.783 0-35.421-28.715-64.136-64.136-64.136-25.171 0-46.954 14.499-57.454 35.602l-0.168 0.373-4.977 11.596c-8.715 16.628-25.852 27.778-45.595 27.778-28.337 0-51.309-22.972-51.309-51.309 0-6.208 1.103-12.159 3.123-17.667l-0.114 0.356c24.138-64.356 85.138-109.33 156.644-109.34h0.001zM396.555 794.199c21.253 0 38.482 17.229 38.482 38.482s-17.229 38.482-38.482 38.482v0c-21.253 0-38.482-17.229-38.482-38.482s17.229-38.482 38.482-38.482v0zM499.172 75.874c0.176 0 0.382-0.001 0.59-0.001 120.433 0 218.063 97.63 218.063 218.063 0 120.226-97.295 217.727-217.442 218.062h-450.165c-28.313-0.032-51.252-22.992-51.252-51.309 0-26.201 19.64-47.816 45.001-50.924l0.248-0.025 6.003-0.36 456.854-0.256c60.243-4.286 107.492-54.211 107.492-115.171 0-63.758-51.687-115.445-115.445-115.445-63.752 0-115.435 51.676-115.445 115.426v0.001c0 28.337-22.972 51.309-51.309 51.309s-51.309-22.972-51.309-51.309v0c0-120.433 97.63-218.062 218.062-218.062v0zM883.989 229.801c21.253 0 38.482 17.229 38.482 38.482s-17.229 38.482-38.482 38.482v0c-21.253 0-38.482-17.229-38.482-38.482s17.229-38.482 38.482-38.482v0zM191.319 152.838c21.253 0 38.482 17.229 38.482 38.482s-17.229 38.482-38.482 38.482v0c-21.253 0-38.482-17.229-38.482-38.482s17.229-38.482 38.482-38.482v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherBlowingSnow"],"grid":64},"attrs":[],"properties":{"order":267,"id":22,"name":"WeatherBlowingSnow","prevSize":64,"code":59655},"setIdx":0,"setId":2,"iconIdx":22},{"icon":{"paths":["M512 56.889c180.282 0 282.511 119.353 297.359 263.396h4.551c0.101 0 0.221 0 0.341 0 115.781 0 209.652 93.811 209.75 209.57v0.009c-0.129 115.744-93.988 209.523-209.75 209.523-0.12 0-0.24 0-0.36 0h-33.091l-90.055 149.959c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.423-107.349h-121.515l-90.055 150.016c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.423-107.349h-121.572l-89.999 150.016c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.365-107.349h-32.028c-0.101 0-0.221 0-0.341 0-115.741 0-209.588-93.747-209.75-209.45v-0.016c0.161-115.719 94.008-209.466 209.75-209.466 0.1 0 0.2 0 0.3 0h4.535c15.019-145.18 117.191-263.51 297.415-263.51z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherRain"],"grid":64},"attrs":[],"properties":{"order":266,"id":23,"name":"WeatherRain","prevSize":64,"code":59656},"setIdx":0,"setId":2,"iconIdx":23},{"icon":{"paths":["M656.156 827.904c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 56.889c180.282 0 282.511 119.353 297.359 263.396h4.551c0.101 0 0.221 0 0.341 0 115.781 0 209.652 93.811 209.75 209.57v0.009c-0.129 115.744-93.988 209.523-209.75 209.523-0.12 0-0.24 0-0.36 0h-74.335c-5.583 17.508-21.703 29.965-40.732 29.965s-35.149-12.459-40.649-29.664l-0.084-0.303h-317.44l-90.055 149.504c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.423-106.837h-32.028c-0.101 0-0.221 0-0.341 0-115.781 0-209.652-93.811-209.75-209.57v-0.009c0.161-115.719 94.008-209.466 209.75-209.466 0.1 0 0.2 0 0.3 0h4.535c15.019-145.124 117.191-263.452 297.415-263.452zM487.993 779.606c12.86 7.511 21.363 21.247 21.363 36.968 0 5.808-1.16 11.345-3.263 16.392l0.104-0.283-2.617 5.233-31.631 50.972c-7.499 12.908-21.26 21.448-37.016 21.448-23.564 0-42.667-19.103-42.667-42.667 0-5.869 1.185-11.463 3.329-16.552l-0.105 0.28 2.56-5.177 31.631-50.972c7.511-12.861 21.247-21.365 36.969-21.365 7.859 0 15.22 2.124 21.543 5.831l-0.201-0.109zM798.322 785.238c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherRainSnow"],"grid":64},"attrs":[],"properties":{"order":265,"id":24,"name":"WeatherRainSnow","prevSize":64,"code":59657},"setIdx":0,"setId":2,"iconIdx":24},{"icon":{"paths":["M384 861.924c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM640 861.924c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM256 805.035c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 805.035c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM768 805.035c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 56.945c180.281 0 282.511 119.296 297.359 263.396h4.551c0.101 0 0.221 0 0.341 0 115.741 0 209.588 93.747 209.749 209.449v0.016c-0.129 115.744-93.988 209.523-209.749 209.523-0.12 0-0.24 0-0.36 0h-603.8c-0.101 0-0.221 0-0.341 0-115.761 0-209.62-93.779-209.749-209.509v-0.012c0.161-115.719 94.008-209.465 209.749-209.465 0.1 0 0.2 0 0.3 0h4.535c15.019-145.124 117.191-263.452 297.415-263.452z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnow"],"grid":64},"attrs":[],"properties":{"order":264,"id":25,"name":"WeatherSnow","prevSize":64,"code":59658},"setIdx":0,"setId":2,"iconIdx":25},{"icon":{"paths":["M230.86 720.997c-9.408 10.393-22.949 16.895-38.007 16.895-28.277 0-51.2-22.924-51.2-51.2 0-12.69 4.616-24.301 12.262-33.247l-0.059 0.071 79.052-90.316h-181.708c-26.164-0.004-47.741-19.631-50.817-44.964l-0.024-0.246-0.359-5.99c0.004-26.164 19.631-47.741 44.964-50.817l0.246-0.024 5.99-0.359h142.592l-79.104-89.6c-7.958-8.984-12.82-20.872-12.82-33.894 0-28.288 22.932-51.219 51.219-51.219 15.265 0 28.969 6.678 38.353 17.27l0.047 0.054 138.802 157.388h130.458v-130.56l-157.286-138.802c-10.652-9.427-17.334-23.134-17.334-38.4 0-10.765 3.323-20.755 8.998-28.999l-0.113 0.173 3.942-5.069c9.426-10.639 23.124-17.312 38.381-17.312 10.752 0 20.73 3.314 28.968 8.976l-0.173-0.113 5.12 3.942 89.497 79.052 0.052-142.489c0-0.012 0-0.026 0-0.042 0-24.1 16.65-44.31 39.074-49.755l0.35-0.072 5.785-1.024 5.99-0.307c26.164 0.004 47.741 19.631 50.817 44.964l0.024 0.246 0.359 5.99-0.052 143.257 90.624-79.052c8.923-7.748 20.654-12.472 33.489-12.472 28.277 0 51.2 22.924 51.2 51.2 0 15.256-6.672 28.952-17.256 38.331l-0.054 0.047-158.002 137.932v130.354h130.458l138.342-157.491c9.432-10.715 23.177-17.441 38.493-17.441 10.704 0 20.64 3.284 28.858 8.9l-0.176-0.114 5.069 3.942c10.696 9.431 17.408 23.164 17.408 38.465 0 10.716-3.292 20.663-8.92 28.885l0.113-0.175-3.942 5.12-79.002 89.907h142.95c26.164 0.004 47.741 19.631 50.817 44.964l0.024 0.246 0.359 5.99c-0.004 26.164-19.631 47.741-44.964 50.817l-0.246 0.024-5.99 0.359h-143.001l79.104 90.316c7.873 8.958 12.678 20.782 12.678 33.727 0 13.055-4.885 24.967-12.929 34.011l0.046-0.052-4.556 4.556c-8.958 7.873-20.782 12.678-33.727 12.678-13.055 0-24.967-4.885-34.011-12.929l0.052 0.046-4.556-4.556-138.342-157.798h-130.406v130.458l158.054 137.881c10.79 9.437 17.569 23.23 17.569 38.605 0 10.656-3.256 20.552-8.826 28.747l0.114-0.179-3.942 5.12c-9.434 10.759-23.208 17.515-38.558 17.515-10.655 0-20.549-3.254-28.744-8.824l0.179 0.114-5.12-3.892-90.675-79.257v143.308c-0.004 26.164-19.631 47.741-44.964 50.817l-0.246 0.024-5.99 0.359c-26.164-0.004-47.741-19.631-50.817-44.964l-0.024-0.246-0.359-5.99-0.052-142.489-88.883 78.489c-8.978 7.949-20.857 12.802-33.869 12.802-28.278 0-51.201-22.924-51.201-51.201 0-15.266 6.682-28.972 17.279-38.353l0.054-0.047 156.62-138.24v-130.56h-91.597l-138.291 157.798z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnowflake"],"grid":64},"attrs":[],"properties":{"order":263,"id":26,"name":"WeatherSnowflake","prevSize":64,"code":59659},"setIdx":0,"setId":2,"iconIdx":26},{"icon":{"paths":["M448.11 921.551c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM678.483 921.551c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM332.924 870.358c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM563.296 870.358c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM793.669 870.358c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM563.296 205.349c162.234 0 254.23 107.405 267.642 237.028h4.095c0.076 0 0.166 0 0.256 0 104.173 0 188.636 84.391 188.752 188.536v0.011c-0.116 104.157-84.579 188.547-188.752 188.547-0.090 0-0.18 0-0.27 0h-543.46c-0.076 0-0.166 0-0.256 0-104.173 0-188.636-84.391-188.752-188.536v-0.011c0.116-104.157 84.579-188.547 188.752-188.547 0.090 0 0.18 0 0.27 0h4.081c13.464-130.493 105.409-237.028 267.591-237.028zM121.288 418.11c1.839 4.331 2.908 9.371 2.908 14.659 0 14.071-7.569 26.373-18.857 33.058l-0.178 0.097-4.659 2.355-47.405 19.607c-4.333 1.839-9.372 2.91-14.661 2.91-21.205 0-38.395-17.19-38.395-38.395 0-14.041 7.536-26.321 18.785-33.017l0.176-0.097 4.709-2.304 47.405-19.658c4.342-1.849 9.392-2.923 14.695-2.923 15.907 0 29.554 9.672 35.38 23.456l0.095 0.252zM453.383 170.69l-8.806 2.918c-91.279 32.252-156.755 102.695-185.066 195.715l-3.584 12.799-2.97 12.235-10.546 1.945c-32.473 6.974-61.141 19.681-86.278 37.119l0.785-0.515c-17.207-29.085-27.375-64.098-27.375-101.485 0-111.455 90.352-201.807 201.807-201.807 46.077 0 88.547 15.442 122.518 41.434l-0.486-0.356zM48.234 172.225l5.427 1.843 47.405 19.607c14.12 5.884 23.865 19.574 23.865 35.54 0 21.205-17.19 38.395-38.395 38.395-3.368 0-6.634-0.433-9.746-1.248l0.268 0.059-5.324-1.791-47.405-19.658c-13.914-5.975-23.481-19.561-23.481-35.38 0-21.205 17.19-38.395 38.395-38.395 3.21 0 6.328 0.394 9.309 1.136l-0.264-0.055zM243.539 19.361l2.355 4.709 19.607 47.405c1.796 4.286 2.84 9.268 2.84 14.492 0 21.205-17.19 38.395-38.395 38.395-13.993 0-26.237-7.485-32.948-18.67l-0.097-0.174-2.355-4.659-19.607-47.405c-1.839-4.333-2.91-9.372-2.91-14.661 0-21.205 17.19-38.395 38.395-38.395 14.041 0 26.321 7.536 33.017 18.785l0.097 0.176zM466.438 3.081c14.013 5.932 23.665 19.567 23.665 35.457 0 3.297-0.415 6.498-1.197 9.552l0.058-0.266-1.791 5.427-19.607 47.405c-5.958 13.952-19.564 23.552-35.41 23.552-21.205 0-38.395-17.19-38.395-38.395 0-3.254 0.404-6.414 1.167-9.432l-0.056 0.265 1.741-5.375 19.658-47.405c5.923-14.036 19.568-23.708 35.475-23.708 5.302 0 10.352 1.075 14.947 3.018l-0.252-0.095z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnowShowerDay"],"grid":64},"attrs":[],"properties":{"order":262,"id":27,"name":"WeatherSnowShowerDay","prevSize":64,"code":59660},"setIdx":0,"setId":2,"iconIdx":27},{"icon":{"paths":["M448.002 921.589c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM678.396 921.589c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM332.805 870.391c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM563.199 870.391c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM793.593 870.391c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM563.249 205.729c162.249 0 254.253 107.364 267.666 237.050h4.095c0.061 0 0.133 0 0.205 0 104.165 0 188.623 84.369 188.77 188.5v0.014c-0.116 104.167-84.587 188.564-188.77 188.564-0.090 0-0.18 0-0.27 0h-543.409c-0.076 0-0.166 0-0.256 0-104.183 0-188.653-84.399-188.77-188.554v-0.011c0.145-104.144 84.605-188.514 188.77-188.514 0.090 0 0.18 0 0.27 0h4.081c13.465-130.557 105.419-237.050 267.616-237.050zM234.913 0.525c42.984 2.384 82.585 14.896 117.079 35.169l-1.216-0.661c51.638 30.074 91.21 76.032 112.497 131.093l0.601 1.768c-101.629 28.722-174.332 102.449-204.488 202.030l-3.584 12.595-2.918 12.186-10.547 1.945c-59.299 12.862-109.232 46.283-143.098 92.266l-0.463 0.66-7.935-4.352c-33.875-19.736-61.976-45.745-83.509-76.667l-0.558-0.847c-4.248-6.091-6.787-13.648-6.787-21.799 0-16.573 10.499-30.693 25.208-36.073l0.266-0.085c84.119-30.105 129.43-63.998 155.337-113.456 28.313-54.014 33.536-111.306 14.745-188.257-0.707-2.754-1.111-5.916-1.111-9.173 0-21.207 17.192-38.399 38.399-38.399 0.751 0 1.498 0.022 2.238 0.064l-0.102-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnowShowerNight"],"grid":64},"attrs":[],"properties":{"order":261,"id":28,"name":"WeatherSnowShowerNight","prevSize":64,"code":59661},"setIdx":0,"setId":2,"iconIdx":28},{"icon":{"paths":["M511.795 846.892c26.199 0.004 47.806 19.657 50.886 45.025l0.024 0.246 0.359 5.999v74.649c-0.061 28.269-22.992 51.162-51.27 51.162-26.181 0-47.779-19.625-50.885-44.967l-0.025-0.248-0.359-5.947v-74.649c0-28.315 22.955-51.27 51.27-51.27v0zM821.308 747.84l52.808 52.808c8.89 9.207 14.368 21.76 14.368 35.592 0 28.315-22.955 51.27-51.27 51.27-13.857 0-26.431-5.497-35.658-14.43l-52.795-52.743c-9.272-9.279-15.007-22.093-15.007-36.247 0-28.321 22.958-51.279 51.279-51.279 14.167 0 26.992 5.745 36.272 15.032v0zM274.776 747.84c9.274 9.278 15.011 22.093 15.011 36.247s-5.737 26.971-15.011 36.247l-52.756 52.808c-9.279 9.272-22.093 15.007-36.247 15.007-28.321 0-51.279-22.958-51.279-51.279 0-14.167 5.745-26.992 15.032-36.272l52.808-52.808c9.275-9.26 22.080-14.985 36.222-14.985s26.946 5.726 36.223 14.985l-0.001-0.001zM512.513 228.583c156.442 0 283.263 126.821 283.263 283.263s-126.821 283.263-283.263 283.263v0c-156.442 0-283.263-126.821-283.263-283.263s126.821-283.263 283.263-283.263v0zM972.296 461.653c28.291 0.032 51.212 22.974 51.212 51.27 0 26.181-19.625 47.779-44.966 50.885l-0.248 0.025-5.999 0.359h-74.649c-28.269-0.061-51.162-22.992-51.162-51.27 0-26.181 19.625-47.779 44.967-50.885l0.248-0.025 5.947-0.359h74.649zM126.403 460.218c28.269 0.061 51.162 22.992 51.162 51.27 0 26.181-19.625 47.779-44.967 50.885l-0.248 0.025-5.947 0.359h-74.649c-28.291-0.032-51.212-22.974-51.212-51.27 0-26.181 19.625-47.779 44.966-50.885l0.248-0.025 5.999-0.359h74.649zM217.15 146.654l4.87 4.255 52.808 52.808c9.242 9.272 14.955 22.064 14.955 36.192 0 28.315-22.955 51.27-51.27 51.27-11.865 0-22.788-4.030-31.475-10.797l0.114 0.087-4.922-4.307-52.705-52.756c-9.242-9.272-14.955-22.064-14.955-36.192 0-28.315 22.955-51.27 51.27-51.27 11.865 0 22.788 4.030 31.475 10.797l-0.114-0.087zM874.065 150.91c9.277 9.278 15.014 22.094 15.014 36.251 0 11.893-4.049 22.841-10.845 31.538l0.085-0.113-4.255 4.82-52.808 52.808c-9.272 9.242-22.064 14.955-36.192 14.955-28.315 0-51.27-22.955-51.27-51.27 0-11.865 4.030-22.788 10.797-31.475l-0.087 0.114 4.307-4.87 52.756-52.808c9.278-9.274 22.093-15.011 36.247-15.011s26.971 5.737 36.247 15.011v0zM512-0.028c26.199 0.004 47.806 19.657 50.886 45.025l0.024 0.246 0.359 5.999v74.597c-0.032 28.291-22.974 51.212-51.27 51.212-26.181 0-47.779-19.625-50.885-44.966l-0.025-0.248-0.359-5.999v-74.597c0-28.315 22.955-51.27 51.27-51.27v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSunny"],"grid":64},"attrs":[],"properties":{"order":260,"id":29,"name":"WeatherSunny","prevSize":64,"code":59662},"setIdx":0,"setId":2,"iconIdx":29},{"icon":{"paths":["M512 0.008c21.207 0 38.399 17.192 38.399 38.399v0 25.599c0 21.207-17.192 38.399-38.399 38.399s-38.399-17.192-38.399-38.399v0-25.599c0-21.207 17.192-38.399 38.399-38.399v0zM307.203 358.402c0-113.107 91.691-204.797 204.797-204.797s204.797 91.691 204.797 204.797v0c0 113.107-91.691 204.797-204.797 204.797s-204.797-91.691-204.797-204.797v0zM550.399 652.797c0-21.207-17.192-38.399-38.399-38.399s-38.399 17.192-38.399 38.399v0 25.599c0 21.207 17.192 38.399 38.399 38.399s38.399-17.192 38.399-38.399v0-25.599zM192.005 307.203c-21.207 0-38.399 17.192-38.399 38.399s17.192 38.399 38.399 38.399v0h25.599c21.207 0 38.399-17.192 38.399-38.399s-17.192-38.399-38.399-38.399v0h-25.599zM767.995 345.602c0-21.207 17.192-38.399 38.399-38.399v0h25.599c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0h-25.599c-21.207 0-38.399-17.192-38.399-38.399v0zM241.668 193.541c6.839 6.385 16.051 10.305 26.178 10.305 21.207 0 38.399-17.192 38.399-38.399 0-10.128-3.92-19.339-10.327-26.2l0.020 0.023-25.599-25.599c-6.839-6.385-16.051-10.305-26.178-10.305-21.207 0-38.399 17.192-38.399 38.399 0 10.128 3.92 19.339 10.327 26.2l-0.020-0.023 25.599 25.599zM295.94 523.264c-6.947-6.938-16.541-11.231-27.135-11.231s-20.188 4.291-27.136 11.231v0l-25.599 25.599c-7.529 7.029-12.222 17.013-12.222 28.094 0 21.207 17.192 38.399 38.399 38.399 11.081 0 21.064-4.693 28.072-12.199l0.020-0.023 25.599-25.599c6.938-6.947 11.231-16.541 11.231-27.135s-4.291-20.188-11.231-27.136v0zM782.332 193.541c-7.029 7.529-17.013 12.222-28.094 12.222-21.207 0-38.399-17.192-38.399-38.399 0-11.081 4.693-21.064 12.199-28.072l0.023-0.020 25.599-25.599c7.029-7.529 17.013-12.222 28.094-12.222 21.207 0 38.399 17.192 38.399 38.399 0 11.081-4.693 21.064-12.199 28.072l-0.023 0.020-25.599 25.599zM728.060 523.264c6.947-6.938 16.541-11.231 27.135-11.231s20.188 4.291 27.136 11.231v0l25.599 25.599c7.529 7.029 12.222 17.013 12.222 28.094 0 21.207-17.192 38.399-38.399 38.399-11.081 0-21.064-4.693-28.072-12.199l-0.020-0.023-25.599-25.599c-6.938-6.947-11.231-16.541-11.231-27.135s4.291-20.188 11.231-27.136v0zM62.368 1015.595c-6.509 5.242-14.877 8.413-23.985 8.413-12.093 0-22.882-5.591-29.92-14.329l-0.058-0.074c-20.889-26.112 6.092-54.015 6.092-54.015v-0.102l0.82-0.563c2.63-2.129 5.682-4.433 8.807-6.637l0.563-0.377c6.349-4.608 15.513-11.007 27.34-18.637 23.706-15.206 58.060-35.327 101.476-55.347 86.783-40.037 210.736-80.332 358.497-80.332s271.714 40.294 358.497 80.332c39.705 18.337 72.977 36.794 104.772 57.341l-3.295-1.994c14.603 9.417 26.568 17.846 38.201 26.686l-1.492-1.087 0.614 0.512 0.154 0.154 0.154 0.052c8.826 7.099 14.426 17.897 14.426 30.003 0 21.214-17.198 38.413-38.413 38.413-9.109 0-17.477-3.17-24.061-8.468l0.074 0.058-1.536-1.229c-8.059-6.072-17.738-12.816-27.646-19.236l-2.050-1.244c-25.867-16.836-56.068-33.585-87.432-48.261l-4.675-1.966c-79.615-36.761-192.458-73.266-326.293-73.266s-246.678 36.505-326.293 73.266c-39.73 18.33-71.014 36.658-92.159 50.226-11.934 7.664-21.596 14.408-31.014 21.46l1.369-0.98-1.536 1.229z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSunnyHigh"],"grid":64},"attrs":[],"properties":{"order":259,"id":30,"name":"WeatherSunnyHigh","prevSize":64,"code":59663},"setIdx":0,"setId":2,"iconIdx":30},{"icon":{"paths":["M550.4 38.399c0-21.208-17.192-38.4-38.4-38.4s-38.4 17.192-38.4 38.4v0 76.8c0 21.208 17.192 38.4 38.4 38.4s38.4-17.192 38.4-38.4v0-76.8zM871.937 152.063c6.938 6.947 11.231 16.541 11.231 27.136s-4.291 20.189-11.231 27.137l-54.271 54.323c-6.9 6.677-16.314 10.792-26.69 10.792-21.208 0-38.4-17.192-38.4-38.4 0-10.363 4.105-19.768 10.777-26.675l54.262-54.312c6.95-6.954 16.553-11.256 27.162-11.256s20.212 4.302 27.161 11.256v0zM235.007 563.2c-2.947-15.296-4.633-32.888-4.633-50.874 0-155.524 126.077-281.601 281.601-281.601s281.601 126.077 281.601 281.601c0 17.986-1.686 35.578-4.909 52.626l0.276-1.752h196.66c21.208 0 38.4 17.192 38.4 38.4s-17.192 38.4-38.4 38.4v0h-947.2c-21.208 0-38.4-17.192-38.4-38.4s17.192-38.4 38.4-38.4v0h196.608zM243.2 716.8c-21.208 0-38.4 17.192-38.4 38.4s17.192 38.4 38.4 38.4v0h537.6c21.208 0 38.4-17.192 38.4-38.4s-17.192-38.4-38.4-38.4v0h-537.6zM448 870.401c-21.208 0-38.4 17.192-38.4 38.4s17.192 38.4 38.4 38.4v0h128c21.208 0 38.4-17.192 38.4-38.4s-17.192-38.4-38.4-38.4v0h-128zM152.063 152.063c6.947-6.938 16.541-11.231 27.136-11.231s20.189 4.291 27.137 11.231l54.323 54.271c7.241 6.994 11.736 16.788 11.736 27.634 0 21.208-17.192 38.4-38.4 38.4-10.832 0-20.616-4.486-27.598-11.699l-0.010-0.011-54.323-54.272c-6.954-6.95-11.256-16.553-11.256-27.162s4.302-20.212 11.256-27.161v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSunnyLow"],"grid":64},"attrs":[],"properties":{"order":258,"id":31,"name":"WeatherSunnyLow","prevSize":64,"code":59664},"setIdx":0,"setId":2,"iconIdx":31},{"icon":{"paths":["M166.933 955.733c-22.4 0-43.733-4.533-64-13.6s-37.955-21.155-53.067-36.267c-15.111-15.111-27.2-32.8-36.267-53.067s-13.6-41.6-13.6-64v-621.867c0-22.4 4.533-43.733 13.6-64s21.156-37.955 36.267-53.067c15.111-15.111 32.8-27.2 53.067-36.267s41.6-13.6 64-13.6h621.867c22.4 0 43.733 4.533 64 13.6s37.955 21.156 53.067 36.267c15.111 15.111 27.2 32.8 36.267 53.067s13.6 41.6 13.6 64v621.867c0 22.4-4.533 43.733-13.6 64s-21.155 37.955-36.267 53.067c-15.111 15.111-32.8 27.2-53.067 36.267s-41.6 13.6-64 13.6h-208.533v-68.267h204.8c13.867 0 27.022-2.667 39.467-8s23.378-12.711 32.8-22.133c9.422-9.422 16.8-20.355 22.133-32.8s8-25.6 8-39.467v-512h-819.2v512c0 13.867 2.667 27.022 8 39.467s12.711 23.378 22.133 32.8c9.422 9.422 20.355 16.8 32.8 22.133s25.6 8 39.467 8h204.8v68.267zM68.267 204.8h819.2v-34.133c0-13.867-2.667-27.022-8-39.467s-12.711-23.378-22.133-32.8c-9.422-9.422-20.355-16.8-32.8-22.133s-25.6-8-39.467-8h-614.4c-13.867 0-27.022 2.667-39.467 8s-23.378 12.711-32.8 22.133c-9.422 9.422-16.8 20.355-22.133 32.8s-8 25.6-8 39.467zM409.6 409.6c0-9.6 1.778-18.489 5.333-26.667s8.445-15.378 14.667-21.6c6.222-6.222 13.422-11.111 21.6-14.667s17.067-5.333 26.667-5.333c9.245 0 18.045 1.778 26.4 5.333s15.645 8.445 21.867 14.667c6.222 6.222 11.111 13.511 14.667 21.867s5.333 17.155 5.333 26.4c0 9.6-1.778 18.489-5.333 26.667s-8.445 15.378-14.667 21.6c-6.222 6.222-13.422 11.111-21.6 14.667s-17.067 5.333-26.667 5.333c-9.6 0-18.578-1.778-26.933-5.333s-15.555-8.355-21.6-14.4c-6.045-6.045-10.845-13.245-14.4-21.6s-5.333-17.333-5.333-26.933zM443.733 721.6l-46.4 38.4c-6.4 5.333-13.689 8-21.867 8-9.245 0-17.245-3.378-24-10.133s-10.133-14.755-10.133-24c0-11.022 4.089-19.733 12.267-26.133l102.4-85.333c6.4-5.333 13.689-8 21.867-8s15.467 2.667 21.867 8l102.4 85.333c8.178 6.4 12.267 15.111 12.267 26.133 0 9.245-3.378 17.245-10.133 24s-14.755 10.133-24 10.133c-8.178 0-15.467-2.667-21.867-8l-46.4-38.4v268.267c0 9.248-3.378 17.248-10.133 24s-14.755 10.133-24 10.133c-9.245 0-17.245-3.381-24-10.133s-10.133-14.752-10.133-24z"],"width":956,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarToday"],"grid":64},"attrs":[],"properties":{"order":257,"id":32,"name":"CalendarToday","prevSize":64,"code":59665},"setIdx":0,"setId":2,"iconIdx":32},{"icon":{"paths":["M809.143 0c28.571 0 55.905 5.81 82 17.429s48.952 27.238 68.571 46.857c19.619 19.619 35.238 42.477 46.857 68.571s17.429 53.429 17.429 82v594.286c0 28.571-5.809 55.905-17.429 82s-27.238 48.952-46.857 68.571c-19.619 19.619-42.477 35.238-68.571 46.857s-53.429 17.429-82 17.429h-594.286c-28.571 0-55.905-5.809-82-17.429s-48.952-27.238-68.571-46.857c-19.619-19.619-35.238-42.477-46.857-68.571s-17.429-53.429-17.429-82v-594.286c0-28.571 5.809-55.905 17.429-82s27.238-48.952 46.857-68.571c19.619-19.619 42.477-35.238 68.571-46.857s53.429-17.428 82-17.429zM216.571 73.143c-19.429 0-37.905 4-55.429 12s-32.762 18.666-45.714 32c-12.952 13.334-23.238 28.857-30.857 46.571s-11.429 36.286-11.429 55.714h877.714v-2.857c0-19.048-3.905-37.238-11.714-54.571s-18.286-32.571-31.429-45.714c-13.143-13.143-28.381-23.619-45.714-31.429s-35.523-11.714-54.571-11.714zM807.429 950.857c19.048 0 37.238-3.905 54.571-11.714s32.571-18.286 45.714-31.429c13.143-13.143 23.619-28.381 31.429-45.714s11.714-35.523 11.714-54.571v-514.857h-877.714v514.857c0 19.048 3.905 37.238 11.714 54.571s18.286 32.571 31.429 45.714c13.143 13.143 28.381 23.619 45.714 31.429s35.523 11.714 54.571 11.714zM219.429 512c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.477-11.905 23.429-15.714s18.571-5.714 28.857-5.714c10.286 0 19.809 1.905 28.571 5.714s16.381 8.952 22.857 15.429c6.477 6.477 11.619 14.095 15.429 22.857s5.714 18.286 5.714 28.571c0 10.286-1.905 19.905-5.714 28.857s-9.048 16.762-15.714 23.429c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857zM438.857 512c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.477-11.905 23.429-15.714s18.571-5.714 28.857-5.714c10.286 0 19.809 1.905 28.571 5.714s16.381 8.952 22.857 15.429c6.477 6.477 11.619 14.095 15.429 22.857s5.714 18.286 5.714 28.571c0 10.286-1.905 19.905-5.714 28.857s-9.048 16.762-15.714 23.429c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857zM804.571 511.429c0 10.286-1.905 19.905-5.714 28.857s-9.048 16.762-15.714 23.429c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.477-11.905 23.429-15.714s18.571-5.714 28.857-5.714c10.286 0 19.809 1.905 28.571 5.714s16.381 8.952 22.857 15.429c6.477 6.477 11.619 14.095 15.429 22.857s5.714 18.286 5.714 28.571zM365.714 731.429c0 10.286-1.905 19.809-5.714 28.571s-9.048 16.477-15.714 23.143c-6.666 6.666-14.477 11.905-23.429 15.714s-18.571 5.714-28.857 5.714c-10.286 0-19.809-1.905-28.571-5.714s-16.381-8.952-22.857-15.429c-6.477-6.477-11.619-14.095-15.429-22.857s-5.714-18.286-5.714-28.571c0-10.286 1.905-19.905 5.714-28.857s9.048-16.762 15.714-23.429c6.666-6.666 14.381-11.905 23.143-15.714s18.286-5.714 28.571-5.714c10.286 0 19.905 1.905 28.857 5.714s16.666 8.952 23.143 15.429c6.477 6.477 11.619 14.191 15.429 23.143s5.714 18.571 5.714 28.857zM585.143 731.429c0 10.286-1.905 19.809-5.714 28.571s-9.048 16.477-15.714 23.143c-6.666 6.666-14.477 11.905-23.429 15.714s-18.571 5.714-28.857 5.714c-10.286 0-19.809-1.905-28.571-5.714s-16.381-8.952-22.857-15.429c-6.477-6.477-11.619-14.095-15.429-22.857s-5.714-18.286-5.714-28.571c0-10.286 1.905-19.905 5.714-28.857s9.048-16.762 15.714-23.429c6.666-6.666 14.381-11.905 23.143-15.714s18.286-5.714 28.571-5.714c10.286 0 19.905 1.905 28.857 5.714s16.666 8.952 23.143 15.429c6.477 6.477 11.619 14.191 15.429 23.143s5.714 18.571 5.714 28.857z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["Calendar"],"grid":64},"attrs":[],"properties":{"order":256,"id":33,"name":"Calendar","prevSize":64,"code":59666},"setIdx":0,"setId":2,"iconIdx":33},{"icon":{"paths":["M214.857 1024c-28.571 0-55.905-5.809-82-17.429s-48.952-27.238-68.571-46.857c-19.619-19.619-35.238-42.477-46.857-68.571s-17.429-53.429-17.429-82v-594.286c0-28.571 5.809-55.905 17.429-82s27.238-48.952 46.857-68.571c19.619-19.619 42.477-35.238 68.571-46.857s53.429-17.428 82-17.429h594.286c28.571 0 55.905 5.81 82 17.429s48.952 27.238 68.571 46.857c19.619 19.619 35.238 42.477 46.857 68.571s17.429 53.429 17.429 82v594.286c0 28.571-5.809 55.905-17.429 82s-27.238 48.952-46.857 68.571c-19.619 19.619-42.477 35.238-68.571 46.857s-53.429 17.429-82 17.429zM807.429 950.857c19.048 0 37.238-3.905 54.571-11.714s32.571-18.286 45.714-31.429c13.143-13.143 23.619-28.381 31.429-45.714s11.714-35.523 11.714-54.571v-590.857c0-19.048-3.905-37.238-11.714-54.571s-18.286-32.571-31.429-45.714c-13.143-13.143-28.381-23.619-45.714-31.429s-35.523-11.714-54.571-11.714h-590.857c-19.048 0-37.238 3.905-54.571 11.714s-32.571 18.286-45.714 31.429c-13.143 13.143-23.619 28.381-31.429 45.714s-11.714 35.523-11.714 54.571v590.857c0 19.048 3.905 37.238 11.714 54.571s18.286 32.571 31.429 45.714c13.143 13.143 28.381 23.619 45.714 31.429s35.523 11.714 54.571 11.714zM256 292.571c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857h512c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857zM292.571 804.571c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857v-219.429c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.381-11.905 23.143-15.714s18.286-5.714 28.571-5.714h438.857c9.905 0 19.334 1.905 28.286 5.714s16.762 9.048 23.429 15.714c6.666 6.666 11.905 14.477 15.714 23.429s5.714 18.381 5.714 28.286v219.429c0 10.286-1.905 19.809-5.714 28.571s-9.048 16.477-15.714 23.143c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714zM292.571 512v219.429h438.857v-219.429z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarDay"],"grid":64},"attrs":[],"properties":{"order":255,"id":34,"name":"CalendarDay","prevSize":64,"code":59667},"setIdx":0,"setId":2,"iconIdx":34},{"icon":{"paths":["M214.857 1024c-28.571 0-55.905-5.809-82-17.429s-48.952-27.238-68.571-46.857c-19.619-19.619-35.238-42.477-46.857-68.571s-17.429-53.429-17.429-82v-594.286c0-28.571 5.809-55.905 17.429-82s27.238-48.952 46.857-68.571c19.619-19.619 42.477-35.238 68.571-46.857s53.429-17.428 82-17.429h594.286c28.571 0 55.905 5.81 82 17.429s48.952 27.238 68.571 46.857c19.619 19.619 35.238 42.477 46.857 68.571s17.429 53.429 17.429 82v594.286c0 28.571-5.809 55.905-17.429 82s-27.238 48.952-46.857 68.571c-19.619 19.619-42.477 35.238-68.571 46.857s-53.429 17.429-82 17.429zM807.429 950.857c19.048 0 37.238-3.905 54.571-11.714s32.571-18.286 45.714-31.429c13.143-13.143 23.619-28.381 31.429-45.714s11.714-35.523 11.714-54.571v-590.857c0-19.048-3.905-37.238-11.714-54.571s-18.286-32.571-31.429-45.714c-13.143-13.143-28.381-23.619-45.714-31.429s-35.523-11.714-54.571-11.714h-590.857c-19.048 0-37.238 3.905-54.571 11.714s-32.571 18.286-45.714 31.429c-13.143 13.143-23.619 28.381-31.429 45.714s-11.714 35.523-11.714 54.571v590.857c0 19.048 3.905 37.238 11.714 54.571s18.286 32.571 31.429 45.714c13.143 13.143 28.381 23.619 45.714 31.429s35.523 11.714 54.571 11.714zM219.429 768v-512c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714v512c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714zM475.429 768v-512c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714v512c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714zM731.429 768v-512c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714v512c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarWeek"],"grid":64},"attrs":[],"properties":{"order":254,"id":35,"name":"CalendarWeek","prevSize":64,"code":59668},"setIdx":0,"setId":2,"iconIdx":35},{"icon":{"paths":["M384 192c-44.333 0-85.917 8.333-124.75 25s-72.75 39.5-101.75 68.5c-29 29-51.833 62.917-68.5 101.75s-25 80.417-25 124.75c0 27 3.5 54.083 10.5 81.25s17.333 52.583 31 76.25c2 3.667 4.583 7.667 7.75 12s6.25 8.833 9.25 13.5c3 4.667 5.583 9.333 7.75 14s3.25 9 3.25 13c0 8.667-3.167 16.167-9.5 22.5s-13.833 9.5-22.5 9.5c-5.667 0-10.417-1.167-14.25-3.5s-7.583-5.5-11.25-9.5c-12.333-14.333-23.25-30.833-32.75-49.5s-17.417-38.167-23.75-58.5c-6.333-20.333-11.167-40.917-14.5-61.75s-5-40.583-5-59.25c0-35 4.583-68.833 13.75-101.5s22.083-63.25 38.75-91.75c16.667-28.5 36.667-54.417 60-77.75s49.167-43.417 77.5-60.25c28.333-16.833 58.917-29.833 91.75-39s66.917-13.75 102.25-13.75h339l-73.5-73.5c-6.333-6.333-9.5-13.833-9.5-22.5s3.167-16.167 9.5-22.5c6.333-6.333 13.833-9.5 22.5-9.5s16.167 3.167 22.5 9.5l128 128c6.333 6.333 9.5 13.833 9.5 22.5s-3.167 16.167-9.5 22.5l-128 128c-6.333 6.333-13.833 9.5-22.5 9.5s-16.167-3.167-22.5-9.5c-6.333-6.333-9.5-13.833-9.5-22.5s3.167-16.167 9.5-22.5l73.5-73.5zM1024 512c0 35.333-4.58 69.25-13.75 101.75s-22.083 63-38.75 91.5c-16.667 28.5-36.667 54.417-60 77.75s-49.167 43.417-77.5 60.25c-28.333 16.833-58.917 29.833-91.75 39s-66.917 13.75-102.25 13.75h-338.5l73 73.5c6.333 6.333 9.5 13.833 9.5 22.5 0 8.67-3.167 16.17-9.5 22.5s-13.833 9.5-22.5 9.5c-8.667 0-16.167-3.17-22.5-9.5l-128-128c-6.333-6.333-9.5-13.833-9.5-22.5s3.167-16.167 9.5-22.5l128-128c6.333-6.333 13.833-9.5 22.5-9.5s16.167 3.167 22.5 9.5c6.333 6.333 9.5 13.833 9.5 22.5s-3.167 16.167-9.5 22.5l-73 73.5h338.5c44.333 0 85.917-8.333 124.75-25s72.75-39.5 101.75-68.5c29-29 51.833-62.917 68.5-101.75s25-80.417 25-124.75c0-19-1.333-36.667-4-53s-6.667-32.167-12-47.5c-5.333-15.333-11.917-30.333-19.75-45s-16.917-29.833-27.25-45.5c-2.333-3.667-4-6.667-5-9s-1.5-5.667-1.5-10c0-8.667 3.083-16.25 9.25-22.75s13.75-9.75 22.75-9.75c5.667 0 10.417 1.167 14.25 3.5s7.583 5.5 11.25 9.5c12.333 14.333 23.25 30.833 32.75 49.5s17.417 38.25 23.75 58.75c6.33 20.5 11.17 41.167 14.5 62s5 40.583 5 59.25z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["repeat"],"grid":64},"attrs":[],"properties":{"order":253,"id":36,"name":"repeat","prevSize":64,"code":59669},"setIdx":0,"setId":2,"iconIdx":36},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["space"],"defaultCode":32,"grid":64},"attrs":[],"properties":{"id":37,"order":159,"prevSize":64,"code":32,"name":"space"},"setIdx":0,"setId":2,"iconIdx":37},{"icon":{"paths":["M416 449q-13 0-23 9t-9 22q1 14 10 23t22 9h192q13 0 23-9t10-23q0-13-10-22t-23-9h-192zM96 193q0-41 28-69t69-28h638q41 0 69 28t28 69v63q0 43-31 72v424q0 73-52 125-52 51-124 51h-418q-72 0-124-51-52-52-52-125v-424q-31-29-31-72v-63zM193 352v400q0 47 32 79 33 33 78 33h418q45 0 78-33 32-32 32-79v-400h-638zM193 160q-15 0-24 9t-9 24v63q0 12 9 23 9 10 24 10h638q15 0 24-10 9-11 9-23v-63q0-15-9-24t-24-9h-638z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE066"],"defaultCode":57446,"grid":64},"attrs":[],"properties":{"id":38,"order":160,"ligatures":"","prevSize":64,"code":57446,"name":"uniE066"},"setIdx":0,"setId":2,"iconIdx":38},{"icon":{"paths":["M438 475q-12 0-19 7t-7 19q0 11 7 19t19 8h137q19-14 37-24 2-12-6-21-8-8-20-8h-148zM330 838h155q9 28 25 53h-180q-64 0-109-45t-45-111v-366q-20-11-32-29-11-18-11-41v-86q0-33 24-56 23-24 56-24h598q33 0 56 24 24 23 24 56v86q0 23-11 41-12 18-32 29v118q-27-8-53-14v-94h-566v356q0 43 30 73t71 30zM213 186q-10 0-18 9-9 8-9 18v86q0 10 9 18 8 9 18 9h598q10 0 18-9 9-8 9-18v-86q0-10-9-18-8-9-18-9h-598zM981 748q0 63-32 116-31 54-85 85-53 32-118 32-64 0-117-32-54-31-85-85-32-53-32-118 0-64 32-117 31-54 85-85 53-32 117-32 65 0 118 32 54 31 85 85 32 53 32 119zM676 676q6-6 6-14 0-9-6-15t-14-6q-9 0-15 6l-65 64q-7 6-7 14t7 16l65 64q6 6 15 6 8 0 14-6t6-15q0-10-6-16l-27-26h119q35 0 60 24 26 25 26 59 0 13 10 19t22 0q11-6 11-19-2-53-39-90-37-36-90-36h-119z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE06C"],"defaultCode":57452,"grid":64},"attrs":[],"properties":{"id":39,"order":161,"ligatures":"","prevSize":64,"code":57452,"name":"uniE06C"},"setIdx":0,"setId":2,"iconIdx":39},{"icon":{"paths":["M512 63q12 0 23 10 10 9 10 23v64q0 14-10 23-11 10-23 10t-23-10q-10-9-10-23v-64q0-14 10-23 11-10 23-10zM512 705q80 0 136-57 57-56 57-136t-57-136q-56-57-136-57t-136 57q-57 56-57 136t57 136q56 57 136 57zM512 639q-53 2-90-36t-37-91 37-91 90-38 90 38 38 91-37 90-91 37zM928 545q14 0 23-10 10-11 10-23t-10-23q-9-10-23-10h-64q-14 0-23 10-10 11-10 23t10 23q9 10 23 10h64zM512 831q12 0 23 10 10 9 10 23v64q0 14-10 23-11 10-23 10t-23-10q-10-9-10-23v-64q0-14 10-23 11-10 23-10zM160 545q14 0 23-10 10-11 10-23t-10-23q-9-10-23-10h-64q-14 0-23 10-10 11-10 23t10 23q9 10 23 10h64zM201 201q10-8 23-8 14 0 22 8l65 65q13 13 7 30-5 17-22 22-17 6-30-7l-65-65q-8-8-8-22 0-13 8-23v0zM246 823q-8 8-22 8-13 0-22-9t-9-22q0-14 8-22l65-65q13-13 30-7 17 5 22 22 6 17-7 30zM823 201q-10-8-23-8-14 0-22 8l-65 65q-8 8-8 22 0 13 9 22t22 9q14 0 22-8l65-65q8-8 8-22 0-13-8-23v0zM778 823q8 8 22 8 13 0 22-9t9-22q0-14-8-22l-65-65q-8-8-22-8-13 0-22 9t-9 22q0 14 8 22z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE1F6"],"defaultCode":57846,"grid":64},"attrs":[],"properties":{"id":40,"order":162,"ligatures":"","prevSize":64,"code":57846,"name":"uniE1F6"},"setIdx":0,"setId":2,"iconIdx":40},{"icon":{"paths":["M735 127q68 0 115 47t47 115v117q-27-37-66-60v-57q0-41-27-69-28-27-69-27h-446q-41 0-69 27-27 28-27 69v30h512v5q-68 10-111 61h-401v350q0 41 27 69 28 27 69 27h162q6 35 20 66h-182q-68-2-115-48t-47-114v-446q2-68 48-115t114-47h446zM864 512q0 53-38 90t-91 37-90-37-37-90 37-90 90-38 91 37 38 91zM961 801q0 65-54 108-59 52-171 52-111 0-173-52-51-43-51-108 0-41 28-69 27-27 68-27h256q39 0 68 27 29 28 29 69z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE25A"],"defaultCode":57946,"grid":64},"attrs":[],"properties":{"id":41,"order":163,"ligatures":"","prevSize":64,"code":57946,"name":"uniE25A"},"setIdx":0,"setId":2,"iconIdx":41},{"icon":{"paths":["M512 102q127 0 231 72 105 72 151 191 46 118 16 242-29 124-124 209-94 85-220 102-126 16-238-41l-6-3-187 48q-12 2-21-6-10-7-12-17v-4l48-193-3-6q-36-69-43-147l-2-37q0-111 56-205 55-94 149-149 94-56 205-56zM512 154q-96 0-178 47t-131 130-49 178 45 179q4 6 4 12l-39 160 153-39h11l8 4q98 56 211 44 112-11 197-85 85-73 114-182 29-108-10-214-39-105-131-170-92-64-205-64v0zM512 281q10 0 18 8 9 8 9 18v281q0 12-9 19-8 7-18 7t-18-7q-9-7-9-17v-283q2-10 10-18 7-8 17-8zM512 741q16 0 28-10 11-10 11-26 0-17-11-28-12-11-28-11t-28 11q-11 11-11 28 0 16 11 27 12 11 28 9z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE2F4"],"defaultCode":58100,"grid":64},"attrs":[],"properties":{"id":42,"order":165,"ligatures":"","prevSize":64,"code":58100,"name":"uniE2F4"},"setIdx":0,"setId":2,"iconIdx":42},{"icon":{"paths":["M590 205q0-33-23-55-22-23-55-22t-54 23q-22 21-22 54h154zM385 205q0-53 37-90t90-38 90 37 37 91h258q10 0 17 7 8 7 8 18 0 12-8 19-7 7-17 7h-55l-25 215q-24-6-51-8l25-207h-558l62 524q4 39 33 65 28 25 67 25h97q14 27 32 52h-129q-57 0-101-39t-50-97l-62-530h-53q-12 0-19-7-8-7-8-19 0-11 8-18 7-7 19-7h256zM973 741q0 64-31 117t-84 84-116 31q-62 0-115-31-54-31-84-84-31-53-31-116 0-62 31-115 30-54 84-84 53-31 115-31 63 0 116 31 53 30 84 84 31 53 31 114zM838 684q8-8 8-18 0-11-8-19-9-8-19-8t-18 8l-58 60-59-60q-8-8-18-8-11 0-19 8t-8 19q0 10 8 18l60 57-60 60q-8 8-8 18t8 19q8 8 19 8 10 0 18-8l59-60 58 60q8 8 18 8t19-8q8-9 8-19t-8-18l-60-60z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE47E"],"defaultCode":58494,"grid":64},"attrs":[],"properties":{"id":43,"order":166,"ligatures":"","prevSize":64,"code":58494,"name":"uniE47E"},"setIdx":0,"setId":2,"iconIdx":43},{"icon":{"paths":["M449 705q0-27 18-46 18-18 45-19t45 18q18 20 18 47 0 26-18 45-18 18-45 18t-45-18q-18-19-18-45zM471 291q2-15 13-25 12-10 28-10t28 10q11 10 13 25l2 8v221q-4 15-15 25-12 10-28 10t-28-10q-11-10-13-25l-2-8v-213zM938 512q0 115-56 214-57 99-156 156-99 56-214 56t-214-56q-99-57-156-156-56-99-56-215t57-213q58-97 155-155 97-57 214-57t214 57q97 58 155 155 57 97 57 214zM854 512q0-92-46-171t-125-125-171-46-171 46-125 125-46 171 46 171 125 125 171 46 171-46 125-125 46-171z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE5ED"],"defaultCode":58861,"grid":64},"attrs":[],"properties":{"id":44,"order":167,"ligatures":"","prevSize":64,"code":58861,"name":"uniE5ED"},"setIdx":0,"setId":2,"iconIdx":44},{"icon":{"paths":["M129 319v386q-2 53 36 90 38 36 91 36h512q53 0 91-36 38-37 36-90v-322q2-51-36-89t-91-38h-309l-72-57q-8-6-18-6h-113q-53 0-90 36-37 37-37 90v0zM193 319q0-26 18-45 18-18 45-18h100l56 45-56 51h-163v-33zM485 319h283q27 0 45 20 18 19 18 46v320q0 26-18 45-18 18-45 18h-512q-27 0-45-18-18-19-18-45v-289h176q12 0 20-8z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE643"],"defaultCode":58947,"grid":64},"attrs":[],"properties":{"id":45,"order":168,"ligatures":"","prevSize":64,"code":58947,"name":"uniE643"},"setIdx":0,"setId":2,"iconIdx":45},{"icon":{"paths":["M129 256v383q-2 53 36 91t91 38h78q-10-31-12-63h-66q-27 0-45-20-18-19-18-44v-289h176q12 0 20-8l96-88h283q27 0 45 18 18 19 18 45v39q35 19 66 43v-82q0-53-38-90-38-36-91-36h-309l-72-58q-8-6-18-8h-113q-53 2-90 39t-37 90v0zM193 256q0-27 18-45t45-18h100l56 43-56 53h-163v-33zM672 961q78 0 144-39 67-39 106-106 39-66 39-144t-39-145q-39-66-106-105-66-39-144-38t-145 39q-66 38-105 104-39 67-39 145t39 144q39 67 105 106 67 39 145 39zM672 512q14 0 23 9 10 9 10 24v94h96q12 0 21 10t9 24q0 13-9 22-9 10-21 10h-96v96q0 12-10 21-9 9-22 9-14 0-24-9t-10-21v-96h-94q-15 0-24-10-9-9-9-22 0-14 9-24t24-10h96v-94q0-15 9-24t22-9z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE645"],"defaultCode":58949,"grid":64},"attrs":[],"properties":{"id":46,"order":169,"ligatures":"","prevSize":64,"code":58949,"name":"uniE645"},"setIdx":0,"setId":2,"iconIdx":46},{"icon":{"paths":["M867 128q32 0 60 13 29 12 50 34 21 21 34 49 13 29 13 60v519q0 32-13 60-12 29-34 50-21 21-49 34-29 13-60 13h-711q-32 0-60-13-29-12-50-34-21-21-34-49-13-29-13-60v-519q0-32 13-60 12-29 34-50 21-21 49-34 29-13 60-13h711zM160 192q-19 0-37 7-17 8-31 21-13 13-20 31-8 17-8 37v14l448 268 448-268v-14q0-19-7-37-8-17-21-31-13-13-31-20-17-8-37-8h-704zM864 896q19 0 37-7 17-8 31-21 13-13 20-31 8-17 8-37v-423l-431 258q-8 5-17 5t-16-4l-432-259v423q0 19 7 37 8 17 21 31 13 13 31 20 17 8 37 8h704z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE715"],"defaultCode":59157,"grid":64},"attrs":[],"properties":{"id":47,"order":170,"ligatures":"","prevSize":64,"code":59157,"name":"uniE715"},"setIdx":0,"setId":2,"iconIdx":47},{"icon":{"paths":["M352 704h320q13 0 23 9 9 9 9 23 0 11-7 20-8 9-19 11l-6 1h-320q-13 0-23-9-9-9-9-23 0-11 7-20 8-9 19-11zM224 448h576q13 0 23 9 9 9 9 23 0 11-7 20-8 9-19 11l-6 1h-576q-13 0-23-9-9-9-9-23 0-11 7-20 8-9 19-11zM96 192h832q13 0 23 9 9 9 9 23 0 11-7 20-8 9-19 11l-6 1h-832q-13 0-23-9-9-9-9-23 0-11 7-20 8-9 19-11z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE71C"],"defaultCode":59164,"grid":64},"attrs":[],"properties":{"id":48,"order":171,"ligatures":"","prevSize":64,"code":59164,"name":"uniE71C"},"setIdx":0,"setId":2,"iconIdx":48},{"icon":{"paths":["M128 800q0-32 12-61t35-52l350-350q9-9 22-9t23 9q9 9 9 22t-9 23l-350 350q-13 13-20 31-8 17-8 36 0 20 7 38 8 17 21 30t30 21q18 7 38 7 19 0 36-6 18-7 31-21l420-411q27-27 42-63 15-35 15-73t-15-73q-14-35-40-62-25-26-60-42-34-16-73-16-40 0-76 14-35 13-64 42l-384 384q-9 9-22 9t-23-9q-9-9-9-22t9-23l384-384q20-20 40-34t43-23q22-9 46-14 24-4 52-4 53 0 100 20 46 21 81 56t55 82q20 46 20 99 0 25-5 50t-15 48q-10 24-24 45t-32 38l-419 412q-23 22-53 34-29 11-61 11-33 0-62-12-29-13-50-35-21-21-34-50-12-29-13-62z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE723"],"defaultCode":59171,"grid":64},"attrs":[],"properties":{"id":49,"order":172,"ligatures":"","prevSize":64,"code":59171,"name":"uniE723"},"setIdx":0,"setId":2,"iconIdx":49},{"icon":{"paths":["M454.5 57.5q8.5-17 24.5-26.5 15.5-9 33.25-9t32.75 9q16 9.5 24.5 26.5l123.5 250.5 276.5 40q19 3 33 15 13 11.5 18.5 28.5t1.5 34q-4 18.5-18 31.5l-199.5 195 47 275q3.5 19-4 36.5-7 16-21.5 26.5t-32 12q-18.5 1.5-35.5-7.5l-247-129.5-247 129.5q-17 9-35.5 7.5-17.5-1.5-32-12t-21.5-26.5q-7-17.5-4-36.5l47.5-275-200-195q-14-13-18-31.5-4-17 1.5-34t19-28.5q14-12 33-15l276-40zM512 86l-123.5 250q-7 14.5-19.75 23.75t-28.25 11.25l-276.5 40.5 200 194.5q11.5 11.5 16.25 26.5t2.25 30.5l-47.5 275 247.5-130q14-7 29.75-7t29.75 7l247 130-47-275q-3-15.5 2-30.5t16-26.5l200-194.5-276-40.5q-16-2-28.75-11.25t-19.75-23.75z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_star_regular"],"defaultCode":59188,"grid":64},"attrs":[],"properties":{"id":50,"order":173,"ligatures":"","prevSize":64,"code":59188,"name":"ic_fluent_star_regular"},"setIdx":0,"setId":2,"iconIdx":50},{"icon":{"paths":["M870 741v-209q27-14 52-32v241q0 54-38 92-38 37-91 37h-562q-53 0-91-37-38-38-38-90v-411q0-51 38-89t89-38h242q-6 24-8 51h-232q-32 0-55 23-22 22-22 53v16l358 211 74-43q24 16 53 27l-115 67q-10 6-20 2l-350-204v333q0 33 22 56 23 22 55 22h564q30 0 53-22 22-23 22-56v0zM512 281q0 63 31 116 30 54 84 84 53 31 115 31 63 0 116-31 53-30 84-84 31-53 31-115 0-63-31-116t-84-84-116-31q-62 0-115 31-54 31-84 84-31 53-31 115zM788 147q9-6 19-6t18 6l88 91q9 8 9 18t-9 18l-88 91q-8 6-18 6t-19-7q-8-8-8-18t8-18l46-47h-78q-37 0-64 26-26 27-26 64v12q0 12-8 19-7 8-18 8t-18-8q-8-7-8-17v-14q0-58 41-100t101-42h78l-46-45q-8-8-8-18t8-19z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE7AA"],"defaultCode":59306,"grid":64},"attrs":[],"properties":{"id":51,"order":174,"ligatures":"","prevSize":64,"code":59306,"name":"uniE7AA"},"setIdx":0,"setId":2,"iconIdx":51},{"icon":{"paths":["M412 256h-105q-43 0-73 30-29 29-29 72v205h180q10 0 17 7 8 8 8 18v4q2 26 13 49t30 35q22 14 59 15t59-15q19-12 31-35 4-10 8-24 4-13 4-27v-2q0-10 8-18 7-7 19-7h178v-31q27-14 51-32v268q0 63-45 109-45 45-108 45h-410q-63 0-108-45-45-46-45-109v-410q0-63 45-108t108-45h113q-6 24-8 51v0zM360 614h-155v154q0 43 29 73 30 29 73 29h410q43 0 73-29 29-30 29-73v-154h-155q-5 27-17 50-16 34-47 55-37 22-88 23t-88-23q-31-21-47-55-12-23-17-50v0zM692 512q62 0 115-31 53-30 84-84 31-53 31-115 0-63-31-116t-84-84-116-31q-62 0-116 31-53 31-83 84-31 53-31 116 0 62 31 115 30 54 83 84 54 31 115 31h2zM571 299q-8-6-8-17 0-12 7-19 8-7 19-7t17 8l60 58v-144q0-10 7-17t18-7 19 7q7 7 7 17v144l59-58q6-8 18-8 11 0 18 7t7 19q0 11-8 17l-102 102q-7 9-17 9h-2q-10 0-16-9z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE7B8"],"defaultCode":59320,"grid":64},"attrs":[],"properties":{"id":52,"order":175,"ligatures":"","prevSize":64,"code":59320,"name":"uniE7B8"},"setIdx":0,"setId":2,"iconIdx":52},{"icon":{"paths":["M750 512q65 0 119-32 55-31 86-87 32-55 32-120 0-64-32-118-31-55-86-86-54-32-118-32-65 0-120 32-56 31-87 86-32 54-32 118 0 65 32 120 31 56 87 87 55 32 119 32zM750 457q-60 0-109-35l256-256q31 41 35 93t-20 98q-23 46-67 73t-95 27zM858 127l-256 256q-39-55-35-123 4-67 53-116 48-48 115-53 68-5 123 36zM860 526v201q-2 25-20 42-19 17-45 17h-572q-24-2-42-20-17-18-17-43v-324l340 176q10 3 20-2l103-53q-29-14-54-35l-61 33-348-180v-41q2-25 20-42 19-17 45-17h248q4-29 15-56h-271q-47 4-79 38-31 34-31 81v428q2 47 36 80 35 33 82 33h574q47-4 79-38 31-34 31-81v-229q-24 18-53 32v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE7D0"],"defaultCode":59344,"grid":64},"attrs":[],"properties":{"id":53,"order":176,"ligatures":"","prevSize":64,"code":59344,"name":"uniE7D0"},"setIdx":0,"setId":2,"iconIdx":53},{"icon":{"paths":["M319 512q0 27-18 45t-45 18-45-18-18-45 18-45 45-18 45 18 18 45zM575 512q0 27-18 45t-45 18-45-18-18-45 18-45 45-18 45 18 18 45zM768 575q27 0 45-18t18-45-18-45-45-18-45 18-18 45 18 45 45 18z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE824"],"defaultCode":59428,"grid":64},"attrs":[],"properties":{"id":54,"order":177,"ligatures":"","prevSize":64,"code":59428,"name":"uniE824"},"setIdx":0,"setId":2,"iconIdx":54},{"icon":{"paths":["M289 205q10-10 9-24-1-13-10-22t-22-9q-12 0-22 8l-84 86-21-21q-8-10-21-9-14 1-23 10t-9 22q0 12 8 22l43 43q10 8 24 8 13 0 21-8zM416 768h491q13 0 22 9t10 22q1 12-7 21t-21 11h-495q-13 0-22-8t-10-20 7-23q8-10 21-12h4zM416 492h491q13 0 22 8t10 20-7 23q-8 10-21 12h-495q-13 0-22-9t-10-22q-1-12 7-21t21-11h4zM416 213h491q13 0 22 9t10 22q1 12-7 21t-21 11h-495q-13 0-22-8t-10-20 7-23q8-10 21-12h4zM289 713q10 10 10 23 0 14-10 22l-107 106q-8 10-21 10-14 0-24-10l-43-41q-14-14-9-32 5-19 24-23 18-4 30 10l21 19 84-84q10-8 23-8 14 0 22 8v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE84D"],"defaultCode":59469,"grid":64},"attrs":[],"properties":{"id":55,"order":178,"ligatures":"","prevSize":64,"code":59469,"name":"uniE84D"},"setIdx":0,"setId":2,"iconIdx":55},{"icon":{"paths":["M1024 96v256q0 13-9 22-10 10-23 10h-256q-13 0-22-9-10-10-10-23t9-22q10-10 23-10h180q-27-60-70-107-42-48-96-81-53-33-115-50-62-18-127-18-56 0-110 14-53 15-101 41-48 27-89 64-41 38-72 84-19 29-33 62-4 8-7 17-2 8-6 16-6 10-12 16t-18 6q-13 0-23-9-9-10-9-23 0-6 1-10 26-75 74-138 48-62 111-108 63-45 138-71 75-25 154-25 71 0 138 18t126 52q58 33 107 83 49 49 83 111v-168q0-13 9-22 10-10 23-10t22 9q10 10 10 23zM990 672q0 8-7 25-6 17-15 35t-19 34q-9 17-14 25-36 53-83 96-46 43-101 73-54 31-115 47-61 17-125 17-69 0-135-17-65-16-123-49-57-32-106-79-48-47-83-107v156q0 13-9 22-10 10-23 10t-22-9q-10-10-10-23v-256q0-13 9-22 10-10 23-10h256q13 0 22 9 10 10 10 23t-9 22q-10 10-23 10h-187q27 60 70 107 43 48 96 81t115 50q62 18 127 18 56 0 109-14 54-14 102-41 48-26 89-64 41-37 72-84 19-29 33-62 4-8 7-17 2-8 6-16 6-10 12-16t18-6q14 0 23 9 10 9 10 23z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE895"],"defaultCode":59541,"grid":64},"attrs":[],"properties":{"id":56,"order":179,"ligatures":"","prevSize":64,"code":59541,"name":"uniE895"},"setIdx":0,"setId":2,"iconIdx":56},{"icon":{"paths":["M192 251q0-52 21-98 20-45 56-79 35-34 81-54t98-20q51 0 98 20 46 19 81 53t56 80 21 98q0 33-6 63-7 30-22 59-68 11-127 46 44-28 67-71 24-44 24-96 0-39-15-73-16-34-42-60-26-25-61-40t-74-15q-40 0-75 15t-61 41-41 61-15 75q0 38 15 73 14 35 40 62 25 26 60 41 34 16 73 16 27 0 52-6 24-6 48-20-58 35-99 90h-1q-50 0-96-20-45-20-80-55-35-34-55-80-21-45-21-96v-10zM448 736q0-59 23-112 22-52 61-91t92-62q52-23 112-23 39 0 76 10t69 29 58 45q27 27 46 59 18 32 29 69 10 36 10 76 0 59-23 112-22 52-61 91t-92 62q-52 23-112 23t-112-22q-53-23-92-62t-61-91q-23-53-23-113zM0 702q0-25 10-48t28-40q17-17 40-28 22-10 47-10h279q-6 15-13 31-6 16-10 33h-253q-13 0-25 5-11 5-20 14-9 8-14 20-5 11-5 25 0 50 17 89 16 38 45 67 29 28 67 48 37 19 80 30 42 12 86 17t85 5q13 17 28 33 15 15 33 29-14 1-28 1-14 1-29 1-65 0-131-9t-126-36q-44-20-79-48-35-27-60-61-25-35-38-77-14-42-14-91zM768 768h96q13 0 22-9 10-10 10-23t-9-22q-10-10-23-10h-96v-96q0-13-9-22-10-10-23-10t-22 9q-10 10-10 23v96h-96q-13 0-22 9-10 10-10 23t9 22q10 10 23 10h96v96q0 13 9 22 10 10 23 10t22-9q10-10 10-23v-96z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE8FA"],"defaultCode":59642,"grid":64},"attrs":[],"properties":{"id":57,"order":180,"ligatures":"","prevSize":64,"code":59642,"name":"uniE8FA"},"setIdx":0,"setId":2,"iconIdx":57},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uni0000"],"defaultCode":59648,"grid":64},"attrs":[],"properties":{"id":58,"order":181,"prevSize":64,"code":59648,"name":"uni0000"},"setIdx":0,"setId":2,"iconIdx":58},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uni0001"],"defaultCode":59649,"grid":64},"attrs":[],"properties":{"id":59,"order":182,"prevSize":64,"code":59649,"name":"uni0001"},"setIdx":0,"setId":2,"iconIdx":59},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE900"],"defaultCode":59650,"grid":64},"attrs":[],"properties":{"id":60,"order":183,"prevSize":64,"code":59650,"name":"uniE900"},"setIdx":0,"setId":2,"iconIdx":60},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE901"],"defaultCode":59651,"grid":64},"attrs":[],"properties":{"id":61,"order":184,"ligatures":"","prevSize":64,"code":59651,"name":"uniE901"},"setIdx":0,"setId":2,"iconIdx":61},{"icon":{"paths":["M486 1024h-486v-486h486v486zM1024 1024h-486v-486h486v486zM486 486h-486v-486h486v486zM1024 486h-486v-486h486v486z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE902"],"defaultCode":59652,"grid":64},"attrs":[],"properties":{"id":62,"order":185,"ligatures":"","prevSize":64,"code":59652,"name":"uniE902"},"setIdx":0,"setId":2,"iconIdx":62},{"icon":{"paths":["M522 439v175h291q-5 29-22 67-18 38-52 72t-88 58q-53 24-129 24-65 0-123-25-58-26-101-69-43-44-68-103t-25-126 25-126 68-102q43-44 101-70 58-25 123-25 75 0 125 25 51 26 79 54l139-134q-33-31-72-56-38-25-81-42-43-18-90-27-48-9-100-9-106 0-199 40t-162 109q-70 70-111 164-40 93-40 199t40 199q41 94 110 163 70 70 163 110t199 40q111 0 202-37 90-37 154-103 65-67 101-159 35-92 35-201 0-25-2-45-3-21-6-40h-484z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE903"],"defaultCode":59653,"grid":64},"attrs":[],"properties":{"id":63,"order":186,"ligatures":"","prevSize":64,"code":59653,"name":"uniE903"},"setIdx":0,"setId":2,"iconIdx":63},{"icon":{"paths":["M342.5 105.5q9.5 9 9.5 22.5t-9.5 22.5l-233 233.5h434.5q97.5 0 187 37.5 86 36.5 152.5 103t103 152.5q37.5 89.5 37.5 187 0 13.5-9.25 22.75t-22.75 9.25-22.75-9.25-9.25-22.75q0-84.5-32.5-162-32-74.5-89.5-132t-132-89.5q-77.5-32.5-162-32.5h-434.5l233 233.5q9.5 9 9.5 22.5t-9.25 22.75-22.75 9.25-22.5-9.5l-288-288q-9.5-9-9.5-22.5t9.5-22.5l288-288q9-9.5 22.5-9.5t22.5 9.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_arrow_reply_regular"],"defaultCode":59770,"grid":64},"attrs":[],"properties":{"id":64,"order":188,"ligatures":"","prevSize":64,"code":59770,"name":"ic_fluent_arrow_reply_regular"},"setIdx":0,"setId":2,"iconIdx":64},{"icon":{"paths":["M612 657l293 293q10 11 24 11 13 0 22-10 10-9 10-22 0-14-11-24l-831-831q-10-11-24-11-13 0-22 10-10 9-10 22 0 14 11 24l293 293-5 10-180 59q-16 6-20 24-4 17 8 30l137 137-170 170-8 53 53-8 170-170 137 137q13 12 30 8 18-4 24-20l59-180zM565 610l-4 2q-12 6-16 19l-47 141-246-246 141-47q13-4 19-16l2-4zM813 477l-131 70 47 47 115-62q43-22 50-70t-28-81l-223-225q-14-15-37-23-22-8-45-4-22 4-41 17-18 14-28 32l-62 117 47 47 70-133q8-14 24-16 17-3 27 8l223 225q13 10 9 27-3 16-17 24v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE985"],"defaultCode":59781,"grid":64},"attrs":[],"properties":{"id":65,"order":189,"ligatures":"","prevSize":64,"code":59781,"name":"uniE985"},"setIdx":0,"setId":2,"iconIdx":65},{"icon":{"paths":["M256 193q-27 0-45 18t-18 45v512q0 27 18 45t45 18v-223q0-41 28-68 27-28 68-28h320q41 0 68 28 28 27 28 68v223q27 0 45-18t18-45v-408q0-26-18-45l-104-104q-19-18-45-18h-23v96q0 39-29 66-28 28-67 28h-129q-39 0-68-28-29-27-29-66v-96h-63zM385 193v96q0 12 9 21t22 9h129q12 0 21-9t9-21v-96h-190zM705 831v-223q0-14-10-23-9-10-23-10h-320q-14 0-23 10-10 9-10 23v223h386zM129 256q0-53 37-90t90-37h408q53 0 92 37l102 102q37 39 37 92v408q0 53-37 90t-90 37h-512q-53 2-90-36t-37-91v-512z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEA43"],"defaultCode":59971,"grid":64},"attrs":[],"properties":{"id":66,"order":190,"ligatures":"","prevSize":64,"code":59971,"name":"uniEA43"},"setIdx":0,"setId":2,"iconIdx":66},{"icon":{"paths":["M432 96q-92 0-169 45t-122 122-45 169 45 169 122 122 169 45q121 0 213-78l227 230q11 8 24 8t23-9q9-10 9-23t-8-24l-230-227q39-45 59-99 19-54 19-114 0-92-45-169t-122-122-169-45v0zM160 432q0-74 37-136 36-63 99-99 62-37 136-37t136 37q63 36 100 99 37 62 37 136t-37 136q-37 63-100 100-62 37-136 37t-136-37q-63-37-99-100-37-62-37-136v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEA7D"],"defaultCode":60029,"grid":64},"attrs":[],"properties":{"id":67,"order":191,"ligatures":"","prevSize":64,"code":60029,"name":"uniEA7D"},"setIdx":0,"setId":2,"iconIdx":67},{"icon":{"paths":["M76 72q16-15 35-4l831 415q19 9 19 29t-19 29l-831 415q-19 11-35-4-17-14-10-32l124-408-124-408q-7-18 10-32v0zM248 545l-98 321 706-354-706-354 98 321h360q13 0 23 10 10 11 10 23t-10 23q-10 10-23 10h-360z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEA8E"],"defaultCode":60046,"grid":64},"attrs":[],"properties":{"id":68,"order":192,"ligatures":"","prevSize":64,"code":60046,"name":"uniEA8E"},"setIdx":0,"setId":2,"iconIdx":68},{"icon":{"paths":["M288 576q-13 0-22.5 9.25t-9.5 22.75v128q0 13.5 9.5 22.75t22.75 9.25 22.5-9.25 9.25-22.75v-10.5h21.5q20 0 37.25-10t27.25-27.25 10-37.5-10-37.5-27.25-27.25-37.25-10h-53.5zM341.5 661.5h-21.5v-21.5h21.5q4.5 0 7.5 3.25t3 7.5-3 7.5-7.5 3.25zM640 608q0-13.5 9.5-22.75t22.5-9.25h64q13 0 22.5 9.25t9.5 22.75-9.5 22.75-22.5 9.25h-32v21.5h32q13 0 22.5 9.25t9.5 22.5-9.5 22.75-22.5 9.5h-32v10.5q0 13-9.25 22.5t-22.5 9.5-22.75-9.25-9.5-22.75v-128zM480 576q-13.5 0-22.75 9.25t-9.25 22.75v128q0 13.5 9.25 22.75t22.75 9.25h32q26 0 48-13t35-35 13-48-13-48-35-35-48-13h-32zM512 704v-64q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25zM128 128q0-35 17.25-64.25t46.75-46.5 64-17.25h293.5q19 0 36.75 7.25t31.25 20.75l250.5 250.5q13.5 13.5 20.75 31.25t7.25 36.75v106.5q28.5 10.5 46.25 35.25t17.75 55.25v256.5q0 31-17.75 55.75t-46.25 34.75v5.5q0 35-17.25 64.25t-46.5 46.5-64.25 17.25h-512q-34.5 0-64-17.25t-46.75-46.5-17.25-64.25v-5.5q-28.5-10-46.25-34.75t-17.75-55.75v-256.5q0-30.5 17.75-55.25t46.25-35.25v-325zM832 384h-224q-26 0-48-13t-35-35-13-48v-224h-256q-17.5 0-32 8.5t-23.25 23.25-8.75 32.25v319.5h640v-63.5zM192 896q0 17.5 8.75 32.25t23.25 23.25 32 8.5h512q17.5 0 32.25-8.5t23.25-23.25 8.5-32.25h-640zM576 77.5v210.5q0 13.5 9.5 22.75t22.5 9.25h211zM160 511.5q-13 0-22.5 9.5t-9.5 22.5v256.5q0 13 9.5 22.5t22.5 9.5h704q13 0 22.5-9.5t9.5-22.5v-256.5q0-13-9.5-22.5t-22.5-9.5h-704z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_document_pdf_regular"],"defaultCode":60048,"grid":64},"attrs":[],"properties":{"id":69,"order":193,"ligatures":"","prevSize":64,"code":60048,"name":"ic_fluent_document_pdf_regular"},"setIdx":0,"setId":2,"iconIdx":69},{"icon":{"paths":["M128 192v-4q0-39 15-73 16-34 42-60 27-25 62-40 34-15 73-15 40 0 75 15t61 41 41 61 15 75-15 75-41 61-61 41-75 15-75-15-61-41-41-61-15-75zM448 192v-2q0-26-10-49-11-23-28-40-18-17-41-27t-49-10-50 10q-23 10-40 28-17 17-28 40-10 24-10 50t10 50q10 23 28 40 17 17 40 28 23 10 50 10 26 0 49-10 24-10 41-28 17-17 28-40 10-23 10-50zM640 317q0-25 10-48 11-23 28-40 18-17 41-27t49-10 49 10q24 10 41 28 17 17 28 40 10 24 10 50 0 25-10 49-10 23-27 40-17 18-40 28-22 11-48 11-28 0-52-10t-41-27q-18-18-28-42-10-23-10-52zM832 320q0-13-5-25-5-11-14-20-8-9-20-14t-25-5-25 5q-11 5-20 14-9 8-14 20-5 11-5 25 0 13 5 25t13 20q9 9 21 14 11 5 25 5 13 0 25-5 11-5 20-14 9-8 14-20 5-11 5-25zM515 384q25 0 48 10 23 11 40 28 17 18 27 41t10 49-10 50q-10 23-27 41-17 17-41 27-23 10-50 10-25 0-49-10-23-10-40-27-18-17-28-40-11-22-11-48 0-28 10-52t27-41q18-18 42-28 23-10 52-10zM96 448h235q-11 30-11 64h-224q-11 0-17 4-7 4-10 11t-4 15-1 17v17q0 30 11 57 12 26 31 48t44 39q24 17 51 27-5 16-7 32t-2 33q-37-12-72-34-35-23-61-53-27-30-43-67t-16-79v-35q0-19 7-37 8-17 21-31 13-13 31-20 17-8 37-8zM517 576q12 0 23-6 11-5 19-14t12-21q5-11 5-23 0-13-5-25-5-11-14-20-8-9-20-14t-25-5-25 5q-11 5-20 14-9 8-14 20-5 11-5 25 0 15 5 27 6 12 15 20t22 13q13 4 27 4zM832 800q0-19-4-38 29-6 53-20 25-13 42-32 18-20 27-45 10-26 10-57 0-13-9-22-10-10-23-10h-235q11-30 11-64h224q19 0 37 7 17 8 31 21 13 13 20 31 8 17 8 37 0 45-14 81-14 37-40 65-25 27-61 46-35 18-78 26 0-6 1-13v-13zM256 800q0-20 7-37 8-18 21-31t30-20q18-8 38-8h320q20 0 37 7 18 8 31 21t20 30q8 18 8 38 0 55-21 97-21 41-56 70-35 28-82 42-46 15-97 15t-97-14q-47-14-82-43-35-28-56-70t-21-97zM704 800q0-13-9-22-10-10-23-10h-320q-13 0-22 9-10 10-10 23 0 41 16 72 16 30 43 49 26 20 61 29 34 10 72 10 37 0 72-9 34-10 61-29 27-20 43-50t16-72z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEBDA"],"defaultCode":60378,"grid":64},"attrs":[],"properties":{"id":70,"order":194,"ligatures":"","prevSize":64,"code":60378,"name":"uniEBDA"},"setIdx":0,"setId":2,"iconIdx":70},{"icon":{"paths":["M502 193q112 10 194 87 82 76 98 188 15 112-42 208-58 96-163 136-106 40-212 4-107-36-168-130 84-22 147-68 82-61 119-159 45-123 27-266v0zM862 512q-2-78-32-150-29-71-86-125-56-55-129-83-72-29-152-25-14 0-24 11-9 12-5 26 27 147-18 270-35 92-119 146-61 36-143 51-15 4-22 17-7 14-1 28 39 80 108 134 68 54 153 74 85 19 171 0 86-20 154-74 67-54 106-133t37-167h2z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEE44"],"defaultCode":60996,"grid":64},"attrs":[],"properties":{"id":71,"order":195,"ligatures":"","prevSize":64,"code":60996,"name":"uniEE44"},"setIdx":0,"setId":2,"iconIdx":71},{"icon":{"paths":["M449 289q0-15-10-24-9-9-22-9-14 0-24 9t-10 24v94h-94q-15 0-24 10t-9 24q0 13 9 22 9 10 24 10h96v96q0 12 9 21t23 9q13 0 22-9 10-9 10-21v-96h96q12 0 21-10 9-9 9-22 0-14-9-24t-21-10h-96v-94zM416 705q100 0 180-64l246 246q8 10 21 10 14 0 24-10t10-24q0-13-10-21l-246-246q64-80 64-180 0-101-63-179-62-79-161-102-98-22-189 22t-135 134-22 188q23 99 102 162 78 64 179 64v0zM416 193q61 0 112 29 52 30 81 81 30 51 31 113 1 61-30 112-30 52-82 81-51 30-112 30-62 0-113-30-51-29-81-81-29-51-29-112 0-62 29-113 30-51 81-81 51-29 113-29v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEE8E"],"defaultCode":61070,"grid":64},"attrs":[],"properties":{"id":72,"order":196,"ligatures":"","prevSize":64,"code":61070,"name":"uniEE8E"},"setIdx":0,"setId":2,"iconIdx":72},{"icon":{"paths":["M432 209v14h160v-14q0-35-24-58-23-24-56-24t-56 24q-24 23-24 58v0zM369 223v-14q0-62 42-104t101-42 101 42 42 104v14h242q12 0 22 10 9 11 9 23t-9 23q-10 10-22 10h-49l-62 528q-6 62-51 103t-106 41h-234q-61 0-106-41t-51-103l-62-528h-47q-14 0-24-10-9-11-9-23t9-23q10-10 22-10h242zM301 811q4 37 31 60 26 24 63 24h234q37 0 63-24 27-23 31-60l61-522h-542zM416 399q14 0 23 10 10 9 10 23v320q0 14-10 23-9 9-22 9-14 0-24-9t-10-23v-320q2-14 11-23 9-10 22-10v0zM641 432q0-14-10-23-10-10-24-10-13 0-22 10-10 9-10 23v320q0 14 10 23 9 9 22 9 14 0 24-9t10-23v-320z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEEA6"],"defaultCode":61094,"grid":64},"attrs":[],"properties":{"id":73,"order":197,"ligatures":"","prevSize":64,"code":61094,"name":"uniEEA6"},"setIdx":0,"setId":2,"iconIdx":73},{"icon":{"paths":["M258 303q-43 25-90 15-47-9-77-48t-26-87q3-48 36-82 34-33 82-36 48-4 87 26t48 77q10 47-15 88l143 145q31-18 66-18t66 18l143-145q-25-41-15-88 9-47 48-77t87-26q48 3 82 36 33 34 36 82 4 48-26 87t-77 48q-47 10-90-15l-143 143q18 31 18 66t-18 66l145 143q41-25 88-15 47 9 77 48t26 87q-3 48-36 82-34 33-82 36-48 4-87-26t-48-77q-10-47 15-90l-143-143q-31 18-66 18t-66-18l-143 143q25 43 15 90-9 47-48 77t-87 26q-48-3-82-36-33-34-36-82-4-48 26-87t77-48q47-10 90 15l143-143q-18-31-17-66t17-66zM256 193q0-27-18-47-19-19-45-19-27 0-46 19-18 20-18 47 0 26 18 45 19 18 46 18 26 0 45-18 18-19 18-45v0zM256 831q0-26-18-45-19-18-45-18-27 0-46 18-18 19-19 45-1 27 18 46 20 18 47 18 26 0 45-18 18-19 18-46v0zM831 256q27 0 47-18 19-19 19-45 0-27-19-47-20-19-47-19-26 0-45 19-18 20-18 47 0 26 18 45 19 18 45 18zM897 831q0-26-19-45-20-18-47-18-26 0-45 18-18 19-18 45 0 27 18 46 19 18 45 18 27 0 47-18 19-19 19-46zM575 512q0-27-18-45t-45-18-45 18-18 45 18 45 45 18 45-18 18-45z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEEEB"],"defaultCode":61163,"grid":64},"attrs":[],"properties":{"id":74,"order":198,"ligatures":"","prevSize":64,"code":61163,"name":"uniEEEB"},"setIdx":0,"setId":2,"iconIdx":74},{"icon":{"paths":["M139 512q0-102 50-187 51-85 136-136 85-50 187-50t187 50q85 51 136 136 50 85 50 187t-50 187q-51 85-136 136-85 50-187 50t-187-50q-85-51-136-136-50-85-50-187zM512 86q-117 0-214 57-97 58-155 155-57 97-57 214t57 214q58 97 155 155 97 57 214 57t214-57q97-58 155-155 57-97 57-214t-57-214q-58-97-155-155-97-57-214-57v0zM512 575q27 0 45-18t18-45-18-45-45-18-45 18-18 45 18 45 45 18zM385 512q0 27-19 45-20 18-47 18-26 0-45-18-18-18-18-45t18-45q19-18 45-18 27 0 46 18 18 18 18 45h2zM705 575q26 0 45-18 18-18 18-45t-18-45q-19-18-45-18-27 0-46 18-18 18-18 45t18 45q19 18 46 18z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF0F4"],"defaultCode":61684,"grid":64},"attrs":[],"properties":{"id":75,"order":199,"ligatures":"","prevSize":64,"code":61684,"name":"uniF0F4"},"setIdx":0,"setId":2,"iconIdx":75},{"icon":{"paths":["M512 127q0-16-12-29-13-12-30-12t-31 12q-13 13-13 29v299h-297q-18 0-31 13-12 14-12 31t12 30q13 12 29 12h299v299q0 16 13 30 14 13 31 13t30-13q12-14 12-30v-299h299q16 0 30-12 13-13 13-30t-13-31q-14-13-30-13h-299v-299z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF107"],"defaultCode":61703,"grid":64},"attrs":[],"properties":{"id":76,"order":200,"ligatures":"","prevSize":64,"code":61703,"name":"uniF107"},"setIdx":0,"setId":2,"iconIdx":76},{"icon":{"paths":["M512 150q-68 0-126 32-58 33-93 92-37 64-37 142v178l-55 131h624l-57-131v-92q0-15 9-24t23-9q13 0 22 9t9 24v78l60 135q12 26-4 50-17 23-45 23h-201q-2 54-39 91-37 36-90 36t-90-36q-37-37-39-91h-199q-28 0-45-23-16-24-4-50l58-135v-164q0-97 45-174 43-74 116-115 74-41 158-41 55 0 106 18 13 5 18 16t1 23q-4 13-15 19-12 6-24 2-43-14-86-14v0zM512 854q27 0 45-19 18-20 18-47h-126q0 27 18 47 18 19 45 19v0zM651 299h-110q-15 2-22 11t-7 23q0 13 9 21t24 8h43l-72 103q-8 16 1 32 9 15 28 15h110q13-2 21-12 8-11 7-23t-10-20-22-8h-45l74-103q8-16-1-32-9-15-28-15v0zM907 86h-153q-13 2-21 11t-7 22q1 12 10 21 9 10 22 10h90l-119 188q-8 16 1 32 9 15 28 15l153-2q13 0 21-10 8-11 7-23t-10-21q-9-10-22-10h-92l121-188q8-16-2-31-10-14-27-14z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF11D"],"defaultCode":61725,"grid":64},"attrs":[],"properties":{"id":77,"order":201,"ligatures":"","prevSize":64,"code":61725,"name":"uniF11D"},"setIdx":0,"setId":2,"iconIdx":77},{"icon":{"paths":["M238 512l172 172q8 8 9 21 1 12-7 22-9 10-21 11t-22-5l-234-233-4-8-2-13v6-8l2-10 6-8 228-228q8-8 20-9t22 7q9 9 11 21t-6 22l-174 177h274q111 0 197 38 86 39 135 109t51 160l2 12q0 12-10 23-10 10-24 10-13 0-22-10-10-11-10-23 0-111-81-181-82-71-222-75h-290l172 172z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF176"],"defaultCode":61814,"grid":64},"attrs":[],"properties":{"id":78,"order":202,"ligatures":"","prevSize":64,"code":61814,"name":"uniF176"},"setIdx":0,"setId":2,"iconIdx":78},{"icon":{"paths":["M600 231q8 9 9 20t-5 21l-174 177h82q111 0 197 38 86 39 135 109t51 160l2 12q0 12-10 23-10 10-24 10-13 0-22-10-10-11-10-23 0-111-81-181-82-71-222-75h-98l170 172q10 8 10 21 0 12-8 22t-20 11q-13 1-23-5l-235-237-2-9-3-10 3-10 6-8 227-228q10-10 24-10 13 0 21 10v0zM137 457l223-224q11-8 23-9t21 7q10 9 12 21t-6 22l-205 205 203 203q8 8 8 20 0 13-7 22-8 9-20 11t-22-4l-230-229q-8-8-9-20-1-11 5-19l227-230z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF17A"],"defaultCode":61818,"grid":64},"attrs":[],"properties":{"id":79,"order":203,"ligatures":"","prevSize":64,"code":61818,"name":"uniF17A"},"setIdx":0,"setId":2,"iconIdx":79},{"icon":{"paths":["M772 64q37 0 72 15 34 15 60 41 25 26 41 60 15 34 15 72v520q0 37-15 72-15 34-41 60-26 25-60 41-34 15-72 15h-520q-37 0-72-15-34-15-60-41-25-26-41-60-15-34-15-72v-520q0-37 15-72 15-34 41-60 26-25 60-41 34-15 72-15h520zM253 128q-24 0-47 10t-40 28q-17 17-28 40-10 22-10 47v3h768v-2q0-25-10-48t-28-40q-17-17-40-28-22-10-47-10h-518zM771 896q24 0 47-10t40-28q17-17 28-40 10-22 10-47v-451h-768v450q0 25 10 48t28 40q17 17 40 28 22 10 47 10h518zM651 458q0 19 6 38 6 18 17 34t26 28 34 19q1 7 1 15 1 8 1 16v16q-1 7-2 15-19 7-34 19t-26 28q-11 15-17 34-5 18-5 38v12t1 11q-22 19-49 31-19-18-42-28t-50-10q-26 0-50 10-23 9-41 28-28-11-50-30 0-6 1-12v-11q0-20-5-39-6-18-17-34t-26-28-34-19q-1-7-1-15-1-8-1-16v-16q1-7 2-15 18-7 34-19 15-12 26-28 11-15 17-34 5-18 5-38v-12t-1-11q22-19 49-31 18 18 42 28t50 10q25 0 50-10 24-10 41-28 28 11 50 30 0 6-1 12 0 6-1 12zM560 608q0-20-14-34t-34-14-34 14-14 34 14 34 34 14 34-14 14-34z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF259"],"defaultCode":62041,"grid":64},"attrs":[],"properties":{"id":80,"order":204,"ligatures":"","prevSize":64,"code":62041,"name":"uniF259"},"setIdx":0,"setId":2,"iconIdx":80},{"icon":{"paths":["M233 628q-50-13-93-43-42-30-74-70-31-41-48-90-18-49-18-101 0-44 11-86 11-41 32-77 20-36 49-66 29-29 65-51 35-21 77-32 41-12 86-12 66 0 125 25 58 25 101 68 44 44 69 102t25 125h-64q0-16-2-32t-6-32h-122q0 16 1 32t1 32q0 32-3 63-2 31-6 63v2h-172q2 14 5 28t7 28v0q-11 31-23 62-11 31-23 62zM266 192h107q-1-10-6-30-4-20-11-40t-16-37q-9-16-19-21h-1q-11 4-20 21-9 16-16 37-6 20-11 40-4 19-7 30zM98 192h103q9-58 31-112-42 15-77 44-34 29-57 68zM542 192q-22-39-57-68-34-29-77-44 21 53 30 112h104zM72 256q-4 16-6 32t-2 32 2 32 6 32h122q0-16-1-32t-1-32 1-32q0-16 1-32h-122zM381 256h-122l-2 32t-1 32 1 32q0 16 1 32h123l2-32t1-32-1-32q0-16-2-32zM1024 416v96q0 13-9 22-10 10-23 10t-22-9q-10-10-10-23v-64h-384v64q0 13-9 22-10 10-23 10t-22-9q-10-10-10-23v-96q0-13 9-22 10-10 23-10h192v-34q1-8 5-15 3-6 9-11 7-4 18-4t17 4 10 11q3 7 4 15t1 17v17h192q13 0 22 9 10 10 10 23zM99 448q22 39 56 68 35 28 77 44-21-53-30-112h-103zM1024 672q0 13-9 22-10 10-23 10h-160v128q0 13-5 25-5 11-14 20-8 9-20 14-11 5-25 5h-32q-13 0-22-9-10-10-10-23 0-11 4-17t11-10q7-3 15-4t17-1h17v-128h-160q-13 0-22-9-10-10-10-23t9-22q10-10 23-10h160q0-6 4-15t10-18 12-17 10-14h-132q-13 0-22-9-10-10-10-23t9-22q10-10 23-10h192q13 0 22 9 10 10 10 23 0 9-5 17l-52 79h153q13 0 22 9 10 10 10 23zM560 928q0 13-9 23-9 9-23 9-10 0-18-6-8-5-12-15l-40-107h-148l-40 107q-3 9-12 15-8 6-18 6-13 0-22-9-10-10-10-23 0-7 2-11l48-127q24-65 48-129l48-128q3-10 12-14 8-5 18-5t18 4q8 5 12 14 24 65 47 129 24 64 49 128l48 127q2 5 2 12zM384 635l-50 133h100z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF2B7"],"defaultCode":62135,"grid":64},"attrs":[],"properties":{"id":81,"order":205,"ligatures":"","prevSize":64,"code":62135,"name":"uniF2B7"},"setIdx":0,"setId":2,"iconIdx":81},{"icon":{"paths":["M657 129q50-49 119-50 70-1 119 48t49 119q0 69-49 119l-477 479q-17 16-37 22l-254 92q-12 5-27 1-14-3-23-13t-12-23q-4-14 1-26l92-254q6-20 22-35zM850 174q-31-31-74-31t-74 31l-49 49 146 148 51-52q31-30 31-73t-31-72v0zM754 416l-146-148-383 385q-6 4-8 11l-80 223 223-80q7-2 11-8zM567 127h-471q-14 0-23 10-10 10-10 24 0 13 10 22 9 10 23 10h408zM438 256h-342q-14 0-23 9-10 9-10 23 0 13 10 22 9 9 23 9h279zM311 383h-215q-14 0-23 10-10 10-10 24 0 13 10 22 9 10 23 10h152z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF3BE"],"defaultCode":62398,"grid":64},"attrs":[],"properties":{"id":82,"order":206,"ligatures":"","prevSize":64,"code":62398,"name":"uniF3BE"},"setIdx":0,"setId":2,"iconIdx":82},{"icon":{"paths":["M860 164q-37-37-87-37t-87 37l-473 473q-16 18-25 41l-59 176q-6 18 8 33 15 14 33 8l176-59q23-9 41-25l473-473q37-37 37-87t-37-87v0zM733 209q17-16 41-16 25 0 41 16t16 41q0 24-16 43l-47 45-82-82zM641 301l82 84-381 381q-8 6-16 8l-115 39 39-115q2-8 8-16z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF3DC"],"defaultCode":62428,"grid":64},"attrs":[],"properties":{"id":83,"order":207,"ligatures":"","prevSize":64,"code":62428,"name":"uniF3DC"},"setIdx":0,"setId":2,"iconIdx":83},{"icon":{"paths":["M129 160q0-13 9-23t22-10h704q21 0 29 18 8 19-4 33l-176 238 176 237q12 15 4 33-8 19-29 19h-671v202q0 13-9 21-8 8-20 10h-4q-13 0-22-7t-9-20v-751zM801 193h-608v446h608l-154-205q-6-8-6-18t6-19z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF40C"],"defaultCode":62476,"grid":64},"attrs":[],"properties":{"id":84,"order":208,"ligatures":"","prevSize":64,"code":62476,"name":"uniF40C"},"setIdx":0,"setId":2,"iconIdx":84},{"icon":{"paths":["M106 106l768 768q11 11 11 24t-9 23q-10 9-23 9t-24-10l-215-215h-421v202q0 13-9 21-8 8-20 10h-4q-13 0-22-7t-9-20v-692l-68-67q-12-13-8-31 4-19 23-23 18-4 30 8v0zM219 127h645q21 0 29 18 8 19-4 33l-176 238 176 237q12 15 4 33-8 19-29 19h-69l-64-66h70l-154-205q-6-8-6-18t6-19l154-204h-518zM193 283v358l356-2z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF40F"],"defaultCode":62479,"grid":64},"attrs":[],"properties":{"id":85,"order":209,"ligatures":"","prevSize":64,"code":62479,"name":"uniF40F"},"setIdx":0,"setId":2,"iconIdx":85},{"icon":{"paths":["M805 193q47 0 80 32 33 33 33 78v418q0 45-33 78-33 32-80 32h-586q-47 0-80-32-33-33-33-78v-418q0-45 33-78 33-32 80-32h586zM864 391l-340 187q-10 6-22 2l-342-189v330q0 22 17 40 18 17 42 17h586q24 0 42-17 17-18 17-40v-330zM805 246h-586q-24 0-42 17-17 18-17 40v27l352 194 352-194v-27q0-22-17-40-18-17-42-17v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF509"],"defaultCode":62729,"grid":64},"attrs":[],"properties":{"id":86,"order":210,"ligatures":"","prevSize":64,"code":62729,"name":"uniF509"},"setIdx":0,"setId":2,"iconIdx":86},{"icon":{"paths":["M795 111q49 0 84 34 34 35 34 84v566q0 49-34 84-35 34-84 34h-566q-49 0-84-34-34-35-34-84v-566q0-49 34-84 35-34 84-34h566zM164 795q0 26 19 46 20 19 46 19h566q26 0 46-19 19-20 19-46v-191h-194q-11 53-52 89t-94 38h-8q-55 0-97-34-42-33-55-87l-2-6h-194v191zM795 164h-566q-26 0-46 19-19 20-19 46v320h221q10 0 17 6 8 6 10 16v4q0 27 13 51 13 23 37 37 23 13 50 13t50-13q24-14 37-37 13-24 13-51 0-10 8-17 7-7 17-9h223v-320q0-26-19-46-20-19-46-19z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF516"],"defaultCode":62742,"grid":64},"attrs":[],"properties":{"id":87,"order":211,"ligatures":"","prevSize":64,"code":62742,"name":"uniF516"},"setIdx":0,"setId":2,"iconIdx":87},{"icon":{"paths":["M133 348l363-215q14-8 28-2l367 217q20 12 33 33 12 20 14 43v334q0 55-38 95t-93 42h-584q-55 2-95-36t-42-93v-336q0-22 10-43 10-20 31-35l369-219zM874 465l-348 182q-12 6-24 2l-352-184v293q0 28 19 50 19 21 48 23h584q28 0 50-19 21-19 23-48v-299zM512 197l-346 206 346 179 346-181z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF522"],"defaultCode":62754,"grid":64},"attrs":[],"properties":{"id":88,"order":212,"ligatures":"","prevSize":64,"code":62754,"name":"uniF522"},"setIdx":0,"setId":2,"iconIdx":88},{"icon":{"paths":["M918 332q32-15 50-45 17-31 12-67t-31-61q-25-26-61-30t-67 13q-30 18-45 51-10 26-7 52 3 25 16 47 14 21 36 35 23 13 47 14 25 1 50-9v0zM219 193h502q-8 26-6 53h-496q-24 0-42 17-17 18-17 40v27l352 194 279-153q32 20 69 22l-336 185q-10 6-22 2l-342-189v330q0 22 17 40 18 17 42 17h586q24 0 42-17 17-18 17-40v-326q27 0 54-6v332q0 45-33 78-33 32-80 32h-586q-47 0-80-32-33-33-33-78v-418q0-45 33-78 33-32 80-32v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF529"],"defaultCode":62761,"grid":64},"attrs":[],"properties":{"id":89,"order":213,"ligatures":"","prevSize":64,"code":62761,"name":"uniF529"},"setIdx":0,"setId":2,"iconIdx":89},{"icon":{"paths":["M256 332q0-10 7-18 7-7 20-7h358q10 0 17 7 8 8 8 19t-8 18q-7 7-17 7h-358q-13 0-20-7t-7-17v-2zM539 461q-13 0-20 7t-7 18q0 12 7 19t18 7h104q10 0 17-7 8-7 8-19 0-11-8-18-7-7-17-7h-102zM512 639q0-10 7-17 7-8 18-8h104q10 0 17 8 8 7 8 18t-8 18q-7 8-17 8h-102q-13 0-20-8-7-7-7-17v-2zM283 461q-13 0-20 7t-7 17v154q0 12 7 19 7 8 20 8h153q10 0 18-8 7-7 7-17v-156q0-10-7-17-8-7-18-7h-153zM307 614v-102h103v102h-103zM102 256q0-43 30-73 30-29 73-29h512q43 0 73 29 29 30 29 73v51q43 0 73 30t30 73v280q0 53-38 91t-91 38h-562q-53 0-91-38t-38-89v-436zM768 256q0-20-15-36-16-15-36-15h-512q-21 0-36 15-15 16-15 36v434q0 33 22 55 23 23 55 23h564q30 0 53-23 22-22 22-55v-280q0-21-15-36-15-16-36-16v332q0 12-7 20-7 7-18 7-12 0-19-7-7-8-7-18v-436z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF565"],"defaultCode":62821,"grid":64},"attrs":[],"properties":{"id":90,"order":214,"ligatures":"","prevSize":64,"code":62821,"name":"uniF565"},"setIdx":0,"setId":2,"iconIdx":90},{"icon":{"paths":["M506 117q12 0 19 8t7 18v336h336q13 0 20 8 7 9 8 20t-7 18-21 7h-336v336q0 13-7 20t-18 7-20-7q-8-7-8-20v-336h-336q-10 0-18-7t-8-18 8-20q8-8 18-8h336v-336q0-10 8-18 9-8 19-8z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF598"],"defaultCode":62872,"grid":64},"attrs":[],"properties":{"id":91,"order":215,"ligatures":"","prevSize":64,"code":62872,"name":"uniF598"},"setIdx":0,"setId":2,"iconIdx":91},{"icon":{"paths":["M682 150l-137 139q-13 10-13 25 0 16 13 28l137 137q12 10 27 13h2q14-3 24-13l139-137q11-12 11-28 0-15-11-25l-139-139q-10-11-25-11-16 0-28 11zM618 492l-86-86v86h86zM532 223l113-110q27-27 65-27t64 27l137 137q27 26 27 64t-27 65l-110 113h4q39 0 65 26 27 27 25 64v223q2 39-25 65-26 27-65 25h-586q-39 0-65-26-27-25-27-64v-586q2-39 28-65 25-27 64-25h223q37-2 64 25 26 26 26 65v4zM709 545h-177v297h273q16 0 26-11 11-10 11-26v-223q0-17-11-27-10-10-26-10h-96zM182 219v273h297v-273q0-16-10-26-10-11-27-11h-223q-16 0-26 11-11 10-11 26v0zM182 545v260q0 16 11 26 10 11 26 11h260v-297h-297z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF599"],"defaultCode":62873,"grid":64},"attrs":[],"properties":{"id":92,"order":216,"ligatures":"","prevSize":64,"code":62873,"name":"uniF599"},"setIdx":0,"setId":2,"iconIdx":92},{"icon":{"paths":["M512 154q-33 0-54 22-22 23-22 54 0 32 22 55 21 22 54 22t55-22q23-23 23-55 0-31-23-54-22-22-55-22zM385 229q0-51 37-89t90-38 90 38 38 90q1 53-37 91-38 37-91 37t-90-37q-37-38-37-92v0zM795 205q-23 0-38 15-16 16-15 36t16 36q14 15 36 15 21 0 36-15 16-16 15-36t-16-36q-14-15-34-15zM692 256q0-43 30-73 30-29 72-29t71 29q30 30 30 73t-30 73q-29 29-71 29t-72-29q-30-30-30-73zM180 256q0-20 15-36 14-15 35-15 22 0 37 15 16 16 15 36t-16 36q-14 15-36 15-21 0-35-15-15-16-15-36zM231 154q-43 0-73 29-31 30-30 73t31 73q29 29 71 29t73-29q31-30 31-73t-31-73q-31-29-72-29v0zM262 768q-45 2-77-29-31-30-31-73v-193q0-4 4-8t8-4h90q4-29 18-51h-108q-27 0-45 18-19 18-19 45v193q0 32 14 63 13 31 39 52 25 22 57 32t64 4q-10-22-14-49zM748 817q32 6 64-4t57-32q26-21 39-52 14-31 14-63v-193q0-27-19-45-18-18-45-18h-108q14 22 18 51h90q4 0 8 4t4 8v193q0 43-31 73-32 31-75 29-6 27-16 49v0zM371 410q-27 0-45 18-19 18-19 45v244q0 55 28 102 27 47 75 75 47 28 102 28t102-28q48-28 75-75 28-47 28-102v-244q0-27-19-45-18-18-45-18h-282zM358 473q0-4 4-8 5-4 9-4h282q4 0 9 4 4 4 4 8v244q0 63-45 108-46 45-109 45t-109-45q-45-45-45-108v-244z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF5B8"],"defaultCode":62904,"grid":64},"attrs":[],"properties":{"id":93,"order":217,"ligatures":"","prevSize":64,"code":62904,"name":"uniF5B8"},"setIdx":0,"setId":2,"iconIdx":93},{"icon":{"paths":["M608 575q39 0 68 29t29 68v33q0 63-39 122-39 60-109 95-76 39-173 39t-173-39q-70-35-109-95-39-59-39-122v-33q0-39 29-68t68-29h448zM608 639h-448q-13 0-22 10t-9 23v33q0 47 30 91 29 44 85 70 61 29 140 29t140-29q56-26 86-70 31-44 31-91v-33q0-13-10-23t-23-10v0zM385 160q72 0 123 51t51 125-51 125-124 51-124-51-51-125 51-125 125-51v0zM385 223q-47 0-80 33t-33 80 33 80 79 33 79-33 33-80-33-80-80-33h2zM690 70l4 4 107 104 104-104q10-11 24-11 13 0 22 10 10 9 10 22 0 14-11 24l-104 104 104 107q8 8 9 19 2 11-5 22l-4 4q-8 8-19 9t-22-5l-108-111-107 107q-12 12-30 8-19-4-23-23-4-18 8-30l107-107-107-104q-8-8-9-20-1-11 5-21l4-4q8-8 18-9 9-2 19 3z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF5D0"],"defaultCode":62928,"grid":64},"attrs":[],"properties":{"id":94,"order":218,"ligatures":"","prevSize":64,"code":62928,"name":"uniF5D0"},"setIdx":0,"setId":2,"iconIdx":94},{"icon":{"paths":["M688 123q-22-23-51-32t-58-5q-30 4-56 22-25 17-40 44l-129 241-198 80q-23 8-27 31-4 22 12 39l140 139-183 184-12 72 72-12 184-183 139 140q17 16 39 12 23-4 31-27l80-198 241-129q27-15 44-40 18-26 22-56 4-29-5-58t-32-49zM559 193q10-19 32-22 21-3 36 11l215 215q14 15 11 36-3 22-22 32l-253 137q-15 8-21 23l-61 153-250-250 153-61q15-6 23-21z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF5FF"],"defaultCode":62975,"grid":64},"attrs":[],"properties":{"id":95,"order":219,"ligatures":"","prevSize":64,"code":62975,"name":"uniF5FF"},"setIdx":0,"setId":2,"iconIdx":95},{"icon":{"paths":["M416 127q-13 0-22 10t-9 24q0 13 9 22 9 10 22 10h63v638h-63q-13 0-23 10-10 9-9 22 1 14 10 23t22 9h192q13 0 23-9t10-23q0-13-10-22-10-10-23-10h-63v-638h63q13 0 23-10 10-9 10-22 0-14-10-24t-23-10h-192zM256 256h160v63h-160q-27 0-45 20-18 19-18 46v254q0 27 18 46 18 20 45 20h160v63h-160q-53 0-90-38t-37-91v-256q0-51 37-89t90-38zM768 705h-160v63h160q53 0 90-38t37-91v-256q2-51-36-89t-91-38h-160v63h160q27 0 45 20 18 19 18 46v254q0 27-18 46-18 20-45 20v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF668"],"defaultCode":63080,"grid":64},"attrs":[],"properties":{"id":96,"order":220,"ligatures":"","prevSize":64,"code":63080,"name":"uniF668"},"setIdx":0,"setId":2,"iconIdx":96},{"icon":{"paths":["M451 131q8-16 25-27 18-10 37-10t36 10q16 11 24 27l95 193 213 30q18 4 33 17 16 12 22 30 6 19 1 38-5 20-19 32l-154 150 37 210q4 21-4 38-9 18-24 30t-35 13q-19 1-36-7l-190-100-190 100q-17 8-36 7-20-1-35-13t-24-30q-8-17-4-38l37-210-154-150q-14-12-19-32-5-19 1-38 6-18 22-30 15-13 33-17l213-30zM512 201l-84 170q-16 30-51 37l-187 26 136 131q26 27 20 62l-33 186 168-88q31-16 64 0l166 88-31-186q-6-35 18-62l136-131-187-26q-35-7-51-37z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF70D"],"defaultCode":63245,"grid":64},"attrs":[],"properties":{"id":97,"order":221,"ligatures":"","prevSize":64,"code":63245,"name":"uniF70D"},"setIdx":0,"setId":2,"iconIdx":97},{"icon":{"paths":["M727 299q-14 14-35 14-20 0-35-14-14-14-14-35 0-20 14-35 15-14 35-14 21 0 35 14 14 15 14 35 0 21-14 35zM162 586q-37-37-37-90 0-54 37-90l305-304q37-36 90-36l209-3q53 0 91 38t38 92v217q-2 51-39 88l-299 299q-39 37-92 37t-90-37zM207 451q-19 18-19 45 0 26 19 45l213 211q18 18 45 18t45-18l301-299q18-19 18-45l2-215q0-27-19-47-19-19-46-19l-209 2q-27 0-45 18l-303 304h-2zM127 625q-12 34-4 71t35 64l125 125q36 37 84 56 47 20 97 20t97-20q47-19 84-56l223-223q27-27 27-68v-49l-295 295q-57 57-136 57t-136-57l-170-170q-21-21-31-45v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF7B6"],"defaultCode":63414,"grid":64},"attrs":[],"properties":{"id":98,"order":222,"ligatures":"","prevSize":64,"code":63414,"name":"uniF7B6"},"setIdx":0,"setId":2,"iconIdx":98},{"icon":{"paths":["M256 512q0-13 9-23 9-9 23-9h192v-192q0-13 9-23 9-9 23-9 13 0 23 9 9 9 9 23v192h192q13 0 23 9 9 9 9 23 0 13-9 23-9 9-23 9h-192v192q0 13-9 23-9 9-23 9-13 0-23-9-9-9-9-23v-192h-192q-13 0-23-9-9-9-9-23zM512 1024q104 0 199-40 92-39 163-110t110-162q40-96 40-200t-40-199q-39-92-110-163t-162-110q-96-40-200-40t-199 40q-92 39-163 110t-110 162q-40 96-40 200t40 199q39 92 110 163t162 110q96 40 200 40zM512 960q-91 0-174-35-81-34-143-96t-96-142q-35-84-35-175t35-174q34-81 96-143t142-96q84-35 175-35t174 35q81 34 143 96t96 142q35 84 35 175t-35 174q-34 81-96 143t-142 96q-84 35-175 35z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uF002A"],"defaultCode":983082,"grid":64},"attrs":[],"properties":{"id":99,"order":223,"ligatures":"","prevSize":64,"code":983082,"name":"uF002A"},"setIdx":0,"setId":2,"iconIdx":99},{"icon":{"paths":["M342.5 105.5q9.5 9 9.5 22.5t-9.5 22.5l-265 265.5 265 265.5q9.5 9 9.5 22.5t-9.25 22.75-22.75 9.25-22.5-9.5l-288-288q-9.5-9-9.5-22.5t9.5-22.5l288-288q9-9.5 22.5-9.5t22.5 9.5zM534.5 105.5q9.5 9 9.5 22.5t-9.5 22.5l-233 233.5h242.5q97.5 0 187 37.5 86 36.5 152.5 103t103 152.5q37.5 89.5 37.5 187 0 13.5-9.25 22.75t-22.75 9.25-22.75-9.25-9.25-22.75q0-84.5-32.5-162-32-74.5-89.5-132t-132-89.5q-77.5-32.5-162-32.5h-242.5l233 233.5q9.5 9 9.5 22.5t-9.25 22.75-22.75 9.25-22.5-9.5l-288-288q-9.5-9-9.5-22.5t9.5-22.5l288-288q9-9.5 22.5-9.5t22.5 9.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_arrow_reply_all_regular"],"defaultCode":983874,"grid":64},"attrs":[],"properties":{"id":100,"order":224,"ligatures":"","prevSize":64,"code":983874,"name":"ic_fluent_arrow_reply_all_regular"},"setIdx":0,"setId":2,"iconIdx":100},{"icon":{"paths":["M832 32q0-13.5-9.25-22.75t-22.75-9.25-22.75 9.25-9.25 22.75v882.5l-137.5-137q-9-9.5-22.5-9.5t-22.75 9.25-9.25 22.75 9.5 22.5l192 192q9 9.5 22.5 9.5t22.5-9.5l192-192q9.5-9 9.5-22.5t-9.25-22.75-22.75-9.25-22.5 9.5l-137.5 137v-882.5zM32 128q-13.5 0-22.75 9.25t-9.25 22.75 9.25 22.75 22.75 9.25h576q13.5 0 22.75-9.25t9.25-22.75-9.25-22.75-22.75-9.25h-576zM192 352q0-13.5 9.25-22.75t22.75-9.25h384q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-384q-13.5 0-22.75-9.25t-9.25-22.75zM416 512q-13.5 0-22.75 9.25t-9.25 22.75 9.25 22.75 22.75 9.25h192q13.5 0 22.75-9.25t9.25-22.75-9.25-22.75-22.75-9.25h-192z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_arrow_sort_down_lines_regular"],"defaultCode":983946,"grid":64},"attrs":[],"properties":{"id":101,"order":225,"ligatures":"","prevSize":64,"code":983946,"name":"ic_fluent_arrow_sort_down_lines_regular"},"setIdx":0,"setId":2,"iconIdx":101},{"icon":{"paths":["M286 20.5q-4-9.5-12-15t-18-5.5-18 5.5-12 15l-176 448q-4.5 12 0.75 24.25t17.5 17 24.5-0.5 17.25-17.75l42-107.5h208l42 107.5q5 12.5 17.25 17.75t24.5 0.5 17.5-17 0.75-24.25zM256 119.5l79 200.5h-158zM128 576q-13 0-22.5 9.25t-9.5 22.75 9.5 22.75 22.5 9.25h196l-222.5 334.5q-5 7-5.5 16t3.75 16.75 11.75 12.25 16.5 4.5h256q13.5 0 22.75-9.25t9.25-22.75-9.25-22.75-22.75-9.25h-196l222.5-334q5-7.5 5.5-16.5t-3.75-16.75-11.75-12.25-16.5-4.5h-256zM800 0q13.5 0 22.75 9.25t9.25 22.75v882.5l137.5-137q9-9.5 22.5-9.5t22.75 9.25 9.25 22.75-9.5 22.5l-192 192q-9 9.5-22.5 9.5t-22.5-9.5l-192-192q-9.5-9-9.5-22.5t9.25-22.75 22.75-9.25 22.5 9.5l137.5 137v-882.5q0-13.5 9.25-22.75t22.75-9.25z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_text_sort_ascending_regular"],"defaultCode":996870,"grid":64},"attrs":[],"properties":{"id":102,"order":226,"ligatures":"","prevSize":64,"code":996870,"name":"ic_fluent_text_sort_ascending_regular"},"setIdx":0,"setId":2,"iconIdx":102},{"icon":{"paths":["M64 544q0-57.5 15-110.5t42-99.25 65-84.25 84.25-65 99.25-42 110.5-15 110.5 15 99.25 42 84.25 65 65 84.25 42 99.25 15 110.5-15 110.5-42 99.25-65 84.25-84.25 65-99.25 42-110.5 15-110.5-15-99.25-42-84.25-65-65-84.25-42-99.25-15-110.5zM705 273.5q-47.5-40-105.25-60.75t-119.75-20.75q-48.5 0-93.5 12.5t-84 35.5-71.25 55.25-55.25 71.25-35.5 84-12.5 93.5q0 62 20.75 119.75t60.75 105.25zM832 544q0-62-20.75-119.75t-60.75-105.25l-495.5 495.5q47.5 40 105.25 60.75t119.75 20.75q48.5 0 93.5-12.5t84-35.5 71.25-55.25 55.25-71.25 35.5-84 12.5-93.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF140"],"defaultCode":61760,"grid":64},"attrs":[],"properties":{"id":103,"order":157,"ligatures":"","prevSize":64,"code":61760,"name":"uniF140"},"setIdx":0,"setId":2,"iconIdx":103},{"icon":{"paths":["M0 992q0-13 4.25-27t7.25-26.5q11.5-47.5 24-94t24-94q-29.5-55-44.5-115t-15-122.5q0-70.5 18.25-136.25t51.5-122.75 80-103.75 103.75-80.25 122.5-51.75 136-18.25 135.75 18.25 122.25 51.75 103.75 80 80.25 103.5 51.75 122.25 18.25 135.75q0 70-18.25 135.25t-51.25 122.25-79.5 104-103.25 80.5-121.75 52-135.5 18.5q-62 0-122-14.25t-115-42.75l-238 56q-5 1-7.5 1-13.5 0-22.75-9.25t-9.25-22.75zM510 960q62 0 119.5-16t107.5-45 91.25-69.75 70.5-90.75 45.25-107.5 16-119.5-16-119.25-45.25-106.75-70.25-90.5-91-70-107.25-45-118.75-16-118.75 16-107 45-90.5 69.75-70 90.25-45.25 106.75-16 118.75q0 32.5 4 60t11.5 53.75 18 52.25 24 54.5q4 8 4 15.5 0 5.5-3 20.5t-8 34.5-10.75 42-11.25 43-10 37.25-6.5 24.75q34-8 67.25-16t67.25-16.5q17-4 35.5-9.5t36-5.5q4 0 7.5 1.25t7.5 2.75q27 12.5 52.25 22.75t50.75 17.25 52.5 11 57.5 4zM352 448q-13 0-22.5-9.5t-9.5-22.5 9.5-22.5 22.5-9.5h320q13 0 22.5 9.5t9.5 22.5-9.5 22.5-22.5 9.5h-320zM352 640q-13 0-22.5-9.5t-9.5-22.5 9.5-22.5 22.5-9.5h192q13 0 22.5 9.5t9.5 22.5-9.5 22.5-22.5 9.5h-192z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE15F"],"defaultCode":59581,"grid":64},"attrs":[],"properties":{"id":104,"order":155,"ligatures":"","prevSize":64,"code":59581,"name":"uniE15F"},"setIdx":0,"setId":2,"iconIdx":104},{"icon":{"paths":["M0 395v-203q0-35 17.25-64.25t46.5-46.5 64.25-17.25h768q35 0 64.25 17.25t46.5 46.5 17.25 64.25v512q0 35-17.25 64.25t-46.5 46.5-64.25 17.25h-448v-64h448q17.5 0 32.25-8.5t23.25-23.25 8.5-32.25v-512q0-17.5-8.5-32.25t-23.25-23.25-32.25-8.5h-768q-17.5 0-32.25 8.5t-23.25 23.25-8.5 32.25v144.5q-36.5 24.5-64 58.5zM192 290v-2q0-13.5 9.25-22.75t22.75-9.25h576q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-444q-62-32-132-32-16 0-32 2zM544 512h256q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-256q-13.5 0-22.75-9.25t-9.25-22.75 9.25-22.75 22.75-9.25zM224 800q-61 0-113-30.5-50.5-30-80.5-80.5-30.5-52-30.5-113t30.5-113q30-50.5 80.5-80.5 52-30.5 113-30.5t113 30.5q50.5 30 80.5 80.5 30.5 52 30.5 113t-30.5 113q-30 50.5-80.5 80.5-52 30.5-113 30.5zM64 815.5q35 23.5 75 35.5 41.5 13 85 13t85-13q40-12 75-35.5v176.5q0 12.5-8.25 21.5t-20.5 10.25-22.25-6.25l-90-67q-8.5-6.5-19-6.5t-19 6.5l-90 67q-10 7.5-22.25 6.25t-20.5-10.25-8.25-21.5v-176.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_certificate_regular"],"defaultCode":60309,"grid":64},"attrs":[],"properties":{"id":105,"order":156,"ligatures":"","prevSize":64,"code":60309,"name":"ic_fluent_certificate_regular"},"setIdx":0,"setId":2,"iconIdx":105},{"icon":{"paths":["M256 128q-35 0-64.25 17.25t-46.5 46.5-17.25 64.25v512q0 35 17.25 64.25t46.5 46.5 64.25 17.25h512q35 0 64.25-17.25t46.5-46.5 17.25-64.25v-160q0-13.5 9.25-22.75t22.75-9.25 22.75 9.25 9.25 22.75v160q0 52-26 97-25.5 43.5-69 69-45 26-97 26h-512q-52 0-97-26-43.5-25.5-69-69-26-45-26-97v-512q0-52 26-97 25.5-43.5 69-69 45-26 97-26h160q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-160zM576 96q0-13.5 9.25-22.75t22.75-9.25h320q13.5 0 22.75 9.25t9.25 22.75v320q0 13.5-9.25 22.75t-22.75 9.25-22.75-9.25-9.25-22.75v-242.5l-265.5 265q-9 9.5-22.5 9.5t-22.75-9.25-9.25-22.75 9.5-22.5l265-265.5h-242.5q-13.5 0-22.75-9.25t-9.25-22.75z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_open_regular"],"defaultCode":59559,"grid":64},"attrs":[],"properties":{"id":106,"order":158,"ligatures":"","prevSize":64,"code":59559,"name":"ic_fluent_open_regular"},"setIdx":0,"setId":2,"iconIdx":106},{"icon":{"paths":["M192 864v-224q0-19.5-7.5-37t-20.75-30.75-30.75-20.75-37-7.5q-13 0-22.5-9.5t-9.5-22.5 9.5-22.5 22.5-9.5q19.5 0 37-7.5t30.75-20.75 20.75-30.75 7.5-37v-227.5q0-31.5 12.75-60t34-49.75 49.75-34 60-12.75q14.5 0 25 8.25t10.5 23.75q0 13-9.5 22.5t-22.5 9.5q-19.5 0-37 7.5t-30.75 20.75-20.75 30.75-7.5 37v224q0 38-16.75 71.75t-47.25 56.25q30.5 22.5 47.25 56.25t16.75 71.75v224q0 19.5 7.5 37t20.75 30.75 30.75 20.75 37 7.5q13 0 22.5 9.5t9.5 22.5q0 15.5-10.5 23.75t-25 8.25q-32.5 0-61-13t-49.75-35-33.5-51-12.25-61zM640 992q0-13 9.5-22.5t22.5-9.5q19.5 0 37-7.5t30.75-20.75 20.75-30.75 7.5-37v-224q0-38 16.75-71.75t47.25-56.25q-30.5-22.5-47.25-56.25t-16.75-71.75v-224q0-19.5-7.5-37t-20.75-30.75-30.75-20.75-37-7.5q-13 0-22.5-9.5t-9.5-22.5q0-15.5 10.5-23.75t25-8.25q32.5 0 61 13t49.75 35 33.5 51 12.25 61v224q0 19.5 7.5 37t20.75 30.75 30.75 20.75 37 7.5q13 0 22.5 9.5t9.5 22.5-9.5 22.5-22.5 9.5q-19.5 0-37 7.5t-30.75 20.75-20.75 30.75-7.5 37v227.5q0 31.5-12.75 60t-34 49.75-49.75 34-60 12.75q-14.5 0-25-8.25t-10.5-23.75z"],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE943"],"defaultCode":59715,"grid":64,"attrs":[]},"attrs":[],"properties":{"id":513,"order":339,"ligatures":"","prevSize":64,"code":59715,"name":"uniE943"},"setIdx":1,"setId":1,"iconIdx":512}],"height":1024,"metadata":{"name":"WinoIcons"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"WinoIcons","majorVersion":1,"minorVersion":2},"metrics":{"emSize":1024,"baseline":0,"whitespace":0},"embed":false,"noie8":true,"ie7":false,"showMetrics":true,"showMetadata":false,"showVersion":true,"includeMetadata":false,"showSelector":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon","height":64,"columns":16,"margin":16,"autoHost":false,"overrideSize":"true"},"historySize":50,"showCodes":true,"gridSize":16,"showLiga":false,"quickUsageToken":{"WinoFont":"NGM2MDA2ZDBhZCMxNzM1ODE4MDQ1I0l0MmFPYTVxUDg4MHlPbU1VNDBOclhDQnF3eWY0K2NkdDNzT1BNTEw2bWEw"},"showGrid":false}} \ No newline at end of file +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M579.728 166.24c33.396-43.11 58.712-104.043 49.555-166.24-54.583 3.793-118.383 38.715-155.609 84.234-33.935 41.244-61.825 102.598-50.932 162.146 59.67 1.867 121.255-33.898 156.986-80.14v0zM874.667 751.301c-23.88 53.226-35.371 77.009-66.134 124.153-42.912 65.81-103.42 147.755-178.472 148.358-66.613 0.723-83.789-43.652-174.222-43.11-90.433 0.482-109.285 43.953-176.018 43.291-74.992-0.662-132.328-74.6-175.24-140.41-120.058-183.882-132.687-399.735-58.653-514.555 52.668-81.524 135.739-129.211 213.783-129.211 79.42 0 129.395 43.833 195.17 43.833 63.8 0 102.642-43.953 194.511-43.953 69.545 0 143.22 38.113 195.648 103.862-171.888 94.771-144.058 341.692 29.626 407.743v0z"],"attrs":[{}],"width":875,"isMulticolor":false,"isMulticolor2":false,"grid":64,"tags":["apple"]},"attrs":[{}],"properties":{"order":341,"id":515,"name":"apple","prevSize":64,"code":59691},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M1017.6 236.8c-6.4-6.4-16-12.8-25.6-12.8h-352c-19.2 0-32 12.8-32 32v96c0 19.2 12.8 32 32 32h3.2l-70.4 96-137.6-224h76.8c19.2 0 32-12.8 32-32v-96c0-19.2-12.8-32-32-32h-448c-19.2 0-32 12.8-32 32v96c0 19.2 12.8 32 32 32h73.6l246.4 361.6v214.4h-96c-19.2 0-32 12.8-32 32v96c0 19.2 12.8 32 32 32h448c19.2 0 32-12.8 32-32v-96c0-19.2-12.8-32-32-32h-96v-156.8l208-291.2h112c12.8 0 25.6-9.6 28.8-22.4l32-96c6.4-9.6 3.2-19.2-3.2-28.8z"],"attrs":[{"fill":"rgb(96, 1, 209)"}],"isMulticolor":false,"isMulticolor2":false,"grid":64,"tags":["yahoo"]},"attrs":[{"fill":"rgb(96, 1, 209)"}],"properties":{"order":340,"id":514,"name":"yahoo","prevSize":64,"code":59692},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M383.104 817.159h257.792c-10.809 62.218-64.398 108.929-128.896 108.929s-118.087-46.709-128.784-108.147l-0.112-0.781zM512 76.377c180.495 0 326.815 146.32 326.815 326.815v0 174.302l61.79 137.698c2.268 4.959 3.591 10.757 3.591 16.864 0 22.838-18.494 41.356-41.323 41.396h-701.567c-22.86-0.004-41.39-18.537-41.39-41.396 0-6.124 1.33-11.937 3.715-17.166l-0.106 0.259 61.659-137.698v-174.825l0.218-10.894c6.374-175.471 150.154-315.303 326.597-315.311h0.001zM991.329 348.592c18.045 0.006 32.671 14.635 32.671 32.682 0 16.479-12.195 30.108-28.053 32.357l-0.174 0.020-4.445 0.305h-87.15c-18.045-0.006-32.671-14.635-32.671-32.682 0-16.479 12.195-30.108 28.053-32.357l0.174-0.020 4.445-0.305h87.15zM119.822 348.592c18.045 0.006 32.671 14.635 32.671 32.682 0 16.479-12.195 30.108-28.053 32.357l-0.174 0.020-4.445 0.305h-87.15c-18.045-0.006-32.671-14.635-32.671-32.682 0-16.479 12.195-30.108 28.053-32.357l0.174-0.020 4.445-0.305h87.15zM973.899 100.213c4.085 5.396 6.543 12.22 6.543 19.618 0 8.949-3.596 17.057-9.422 22.959l0.003-0.003-3.66 3.181-87.15 65.363c-5.406 4.109-12.249 6.582-19.67 6.582-18.049 0-32.682-14.632-32.682-32.682 0-8.975 3.618-17.106 9.476-23.013l-0.002 0.002 3.66-3.181 87.15-65.363c5.393-4.081 12.215-6.536 19.609-6.536 10.655 0 20.12 5.099 26.086 12.991l0.059 0.082zM95.855 93.676l87.15 65.363c7.973 6.026 13.073 15.49 13.073 26.145 0 18.049-14.632 32.682-32.682 32.682-7.394 0-14.215-2.455-19.691-6.596l0.082 0.059-87.15-65.363c-7.973-6.026-13.073-15.49-13.073-26.145 0-18.049 14.632-32.682 32.682-32.682 7.394 0 14.215 2.455 19.691 6.596l-0.082-0.059z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["AlertOn"],"grid":64},"attrs":[{}],"properties":{"order":295,"id":0,"name":"AlertOn","prevSize":64,"code":59683},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M381.385 756.278c10.288 10.296 16.652 24.514 16.652 40.219 0 31.425-25.474 56.899-56.899 56.899-15.72 0-29.95-6.375-40.247-16.68l-284.271-284.668c-10.275-10.292-16.628-24.5-16.628-40.191s6.353-29.9 16.628-40.193l284.325-284.325c10.299-10.305 24.529-16.68 40.249-16.68 31.425 0 56.899 25.474 56.899 56.899 0 15.705-6.363 29.925-16.652 40.221v0l-187.447 187.332h374.892c246.345 0.003 446.972 195.732 454.859 440.159l0.019 0.723 0.228 14.222c0 31.418-25.47 56.889-56.889 56.889s-56.889-25.47-56.889-56.889v0c0-0.004 0-0.008 0-0.012 0-184.009-145.607-334.010-327.887-341.068l-0.641-0.020-12.8-0.228h-374.665l187.161 187.389z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["ArrowReply"],"grid":64},"attrs":[{}],"properties":{"order":294,"id":1,"name":"ArrowReply","prevSize":64,"code":59684},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M306.912 780.724l-222.258-222.258c-10.527-10.177-24.885-16.449-40.708-16.449-32.362 0-58.597 26.235-58.597 58.597 0 15.822 6.272 30.181 16.465 40.724l263.669 263.669c10.604 10.6 25.251 17.156 41.427 17.156s30.825-6.556 41.427-17.156l644.563-644.563c10.177-10.527 16.449-24.885 16.449-40.708 0-32.362-26.235-58.597-58.597-58.597-15.822 0-30.181 6.272-40.724 16.465l-603.119 603.119z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Checkmark"],"grid":64},"attrs":[{}],"properties":{"order":293,"id":2,"name":"Checkmark","prevSize":64,"code":59685},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M662.947 731.4c-3.51 18.673-7.46 36.567-11.798 53.729-25.576 22.407-41.637 55.132-41.637 91.608 0 0.053 0 0.105 0 0.157v-0.008c0 8.483 0.439 16.772 1.316 24.865-29.107 61.481-64.065 97.803-98.827 97.803-58.36 0-117.013-102.094-148.119-253.723l-2.828-14.334h301.894zM671.235 943.681c-8.206-19.281-12.975-41.709-12.975-65.251 0-0.543 0.002-1.086 0.008-1.627l-0.001 0.083c0-40.39 32.743-73.133 73.133-73.133v0h243.777c40.39 0 73.133 32.743 73.133 73.133v0c0 54.411-22.379 97.999-59.092 127.447-36.128 29.010-84.591 43.198-135.931 43.198s-99.803-14.139-135.931-43.198c-12.774-10.256-23.68-22.139-32.6-35.463l-0.358-0.568c-4.723-7.052-9.128-15.142-12.785-23.631l-0.379-0.99zM999.652 512c0 32.325-3.169 63.968-9.166 94.585-21.277-56.194-74.647-95.421-137.178-95.421-37.718 0-72.102 14.272-98.048 37.71l0.128-0.113c0.298-10.824 0.467-23.565 0.467-36.345 0-23.195-0.559-46.258-1.665-69.178l0.125 3.234-1.852-31.983h237.44c6.339 31.496 9.751 64.114 9.751 97.511zM755.777 658.266v-0.828c0-53.853 43.657-97.511 97.511-97.511s97.511 43.657 97.511 97.511v0 0.828c-0.331 53.467-43.752 96.682-97.265 96.682-0.087 0-0.173 0-0.259 0h0.014c-24.28 0-46.464-8.873-63.529-23.549-20.677-17.79-33.756-43.912-33.982-73.093v-0.040zM744.271 754.949c-2.966-3.306-5.892-6.895-8.642-10.621l-0.28-0.398-1.414 7.557-0.682 3.413h11.019zM76.419 731.4h209.941c17.747 101.509 47.926 187.903 87.37 248.311-125.917-38.179-228.001-122.208-288.918-232.201l-1.274-2.508-7.118-13.603zM34.148 414.489h237.44c-2.204 29.179-3.461 63.199-3.461 97.513 0 41.535 1.841 82.641 5.446 123.239l-0.376-5.252 2.779 28.279h-229.297c-14.188-43.749-22.368-94.087-22.368-146.335 0-34.49 3.564-68.149 10.346-100.626l-0.555 3.184zM678.987 414.489c2.401 29.154 3.77 63.106 3.77 97.377 0 41.679-2.024 82.884-5.979 123.524l0.406-5.158-3.022 28.034h-324.322c-5.44-44.095-8.545-95.136-8.545-146.903 0-25.71 0.766-51.24 2.275-76.57l-0.166 3.489 1.658-23.792h333.926zM655.584 52.528l-5.315-8.288c147.859 44.866 263.922 153.857 317.538 293.766l1.128 3.349h-223.788c-15.407-117.794-46.659-219.010-89.612-288.779zM367.781 46.044l5.948-1.804c-42.953 65.869-74.888 162.356-91.855 275.663l-3.022 21.452h-223.69c54.001-141.32 167.597-249.225 309.207-294.359l3.461-0.953zM512 24.543c64.308 0 129.007 123.937 156.7 301.455l2.291 15.358h-317.983c26.377-185.709 92.879-316.813 158.992-316.813z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["GlobePerson"],"grid":64},"attrs":[{}],"properties":{"order":291,"id":3,"name":"JoinOnline","prevSize":64,"code":59686},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M224.171 597.333h468.821c4.437 7.339 9.856 14.165 16.213 20.224l30.72 29.099c-4.388 16.237-10.53 30.451-18.388 43.515l0.425-0.763c-8.432 14.527-18.147 27.055-29.302 38.134l-0.010 0.010-33.877-11.307c-8.718-2.968-18.761-4.681-29.204-4.681-32.297 0-60.767 16.386-77.55 41.297l-0.211 0.333-30.805 45.227c-10.828 15.816-17.291 35.363-17.291 56.42 0 27.465 10.996 52.362 28.826 70.529l-0.015-0.016 9.685 9.728c-23.083 2.432-47.36 3.627-72.875 3.627-123.307 0-218.795-28.032-285.483-85.333-34.179-29.513-55.68-72.903-55.68-121.315 0-0.010 0-0.020 0-0.031l-0 0.002v-38.699c0-53.019 42.981-96 96-96h0zM725.803 522.453l21.461-50.645c10.069-23.765 34.176-36.693 57.856-31.744l5.035 1.323 26.88 8.619c26.709 8.533 47.104 31.36 53.717 60.032 15.659 68.181-3.157 151.168-56.405 248.96-53.205 97.707-111.531 156.416-174.933 176.213-6.636 2.127-14.27 3.353-22.19 3.353-18.661 0-35.732-6.807-48.866-18.073l0.101 0.084-5.291-4.821-20.395-20.48c-10.137-10.436-16.386-24.694-16.386-40.412 0-10.061 2.561-19.524 7.066-27.773l-0.152 0.303 2.987-4.949 30.805-45.227c12.117-17.792 32.853-26.24 52.779-21.973l5.419 1.493 56.832 18.944c22.956-17.637 41.925-39.192 56.19-63.812l0.557-1.041c11.81-19.519 20.664-42.288 25.231-66.569l0.199-1.271 1.621-11.477-47.317-44.928c-10.773-10.504-17.456-25.161-17.456-41.378 0-6.126 0.954-12.029 2.72-17.57l-0.113 0.409 2.048-5.589v0zM469.333 85.547c117.821-0 213.333 95.513 213.333 213.333s-95.513 213.333-213.333 213.333v0c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["PersonCall"],"grid":64},"attrs":[{}],"properties":{"order":288,"id":4,"name":"PersonCall","prevSize":64,"code":59687},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M512 37.103c-163.958 0-296.811 132.853-296.811 296.811 0 32.785 26.578 59.363 59.363 59.363s59.363-26.578 59.363-59.363v0c0-98.422 79.665-178.087 178.087-178.087s178.087 79.665 178.087 178.087c0 48.44-11.814 76.815-26.001 96.701-15.553 21.667-37.102 37.873-66.961 58.472l-6.886 4.63c-26.535 18.165-60.728 41.494-87.203 74.024-31.283 38.467-50.399 87.084-50.399 152.026v29.681c0 32.785 26.578 59.363 59.363 59.363s59.363-26.578 59.363-59.363v0-29.681c0-38.941 10.567-60.787 23.745-77.112 15.256-18.639 35.795-32.768 66.13-53.604l3.146-2.197c29.444-20.184 67.257-46.659 96.167-87.144 30.453-42.266 48.262-95.573 48.262-165.799 0-163.958-132.853-296.811-296.811-296.811zM512 1061.101c40.981 0 74.202-33.222 74.202-74.202s-33.222-74.202-74.202-74.202v0c-40.981 0-74.202 33.222-74.202 74.202s33.222 74.202 74.202 74.202v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Question"],"grid":64},"attrs":[{}],"properties":{"order":287,"id":5,"name":"Question","prevSize":64,"code":59688},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M652.765 665.562c49.447 0 89.578 40.131 89.578 89.578l-0.052 49.242c5.989 112.1-77.344 168.765-226.863 168.765-148.955 0-233.773-55.795-233.773-166.82v-51.188c0-49.447 40.131-89.578 89.578-89.578h281.531zM89.704 409.626h223.996c-4.099 15.32-6.454 32.909-6.454 51.049 0 57.132 23.359 108.81 61.049 146.001l0.023 0.022 8.292 7.73-5.375-0.052c-0.016 0-0.034 0-0.050 0-64.221 0-118.398 43.007-135.3 101.791l-0.245 0.993-1.741 0.052c-148.955 0-233.773-55.795-233.773-166.82v-51.188c0-49.447 40.131-89.578 89.578-89.578zM934.296 409.626c49.447 0 89.578 40.131 89.578 89.578l-0.052 49.242c5.989 112.1-77.344 168.765-226.863 168.765l-8.651-0.102c-16.31-56.459-65.498-97.85-124.987-102.346l-0.474-0.029-10.084-0.359-5.375 0.052c42.676-37.618 69.457-92.407 69.457-153.451 0-18.232-2.389-35.906-6.871-52.726l0.323 1.426 223.996-0.052zM512 307.25c84.81 0 153.562 68.753 153.562 153.562s-68.753 153.562-153.562 153.562v0c-84.81 0-153.562-68.753-153.562-153.562s68.753-153.562 153.562-153.562v0zM230.469 51.313c84.81 0 153.562 68.753 153.562 153.562s-68.753 153.562-153.562 153.562v0c-84.81 0-153.562-68.753-153.562-153.562s68.753-153.562 153.562-153.562v0zM793.531 51.313c84.81 0 153.562 68.753 153.562 153.562s-68.753 153.562-153.562 153.562v0c-84.81 0-153.562-68.753-153.562-153.562s68.753-153.562 153.562-153.562v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["PeopleCommunity"],"grid":64},"attrs":[{}],"properties":{"order":286,"id":6,"name":"Attendees","prevSize":64,"code":59689},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M902.026 158.393c0-74.045-60.026-134.071-134.071-134.071v0h-609.416c-74.045 0-134.071 60.026-134.071 134.071v0 609.416c0 74.045 60.026 134.071 134.071 134.071v0h324.989l5.119-20.476c7.898-31.592 24.23-60.454 47.291-83.465l105.21-105.258c-4.519-5.798-7.25-13.183-7.264-21.204v-416.454c0.273-19.715 16.319-35.594 36.074-35.594 0.173 0 0.345 0.001 0.516 0.003h-0.026c0.146-0.002 0.318-0.003 0.491-0.003 19.754 0 35.802 15.877 36.074 35.567v371.819l116.666-116.666c20.86-20.887 47.482-36.014 77.278-42.796l1.070-0.205v-308.755zM219.48 353.405c0-20.135 16.381-36.419 36.565-36.419s36.565 16.284 36.565 36.419v317.189c-0.027 20.12-16.345 36.419-36.468 36.419-0.034 0-0.069 0-0.103 0h0.006c-0.029 0-0.063 0-0.097 0-20.123 0-36.439-16.299-36.468-36.416v-317.191zM426.681 498.837c0-0.043 0-0.095 0-0.147 0-19.57 15.796-35.451 35.333-35.589h0.013c0.146-0.002 0.319-0.003 0.491-0.003 19.469 0 35.286 15.632 35.586 35.029v0.029l1.706 172.928c0 0.058 0 0.127 0 0.195 0 19.57-15.796 35.451-35.333 35.589h-0.013c-0.146 0.002-0.319 0.003-0.491 0.003-19.486 0-35.314-15.659-35.587-35.081v-0.025l-1.706-172.928zM858.148 544.665l-287.79 287.742c-16.291 16.298-28.307 36.869-34.221 59.888l-0.198 0.908-22.329 89.268c-1.006 3.859-1.583 8.289-1.583 12.855 0 29.268 23.726 52.995 52.995 52.995 4.58 0 9.022-0.58 13.261-1.673l-0.368 0.080 89.219-22.281c23.949-6.119 44.538-18.152 60.843-34.468l287.742-287.742c19.448-20.039 31.437-47.411 31.437-77.583 0-61.553-49.897-111.45-111.45-111.45-30.159 0-57.521 11.98-77.586 31.44l0.029-0.027z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["DataUsageEdit"],"grid":64},"attrs":[{}],"properties":{"order":285,"id":7,"name":"EditSeries","prevSize":64,"code":59690},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M768 746.667v53.333c0 53.019-42.981 96-96 96v0h-320c-53.019 0-96-42.981-96-96v0-53.376l-74.667 0.043c-53.019 0-96-42.981-96-96v0-255.829c0-76.583 62.083-138.667 138.667-138.667v0l31.957-0.043 0.043-32.128c0-53.019 42.981-96 96-96v0h320.085c53.019 0 96 42.981 96 96v0 32.128h32c76.581 0.049 138.655 62.092 138.752 138.657l0 0.009 0.128 255.872c0 0.013 0 0.028 0 0.043 0 52.981-42.937 95.933-95.912 95.957l-75.053 0zM672 576h-320c-17.673 0-32 14.327-32 32v0 192c0 17.664 14.336 32 32 32h320c17.673 0 32-14.327 32-32v0-192c0-17.673-14.327-32-32-32v0zM672.085 192h-320.085c-17.673 0-32 14.327-32 32v0l-0.043 32.128h384.128v-32.128c0-17.673-14.327-32-32-32v0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Print"],"grid":64},"attrs":[{}],"properties":{"order":281,"id":8,"name":"Print","prevSize":64,"code":59682},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M896 512.939v-150.272h-768v394.667c0 76.583 62.083 138.667 138.667 138.667v0h246.272c-27.404-42.265-43.697-93.942-43.697-149.425 0-153.167 124.166-277.333 277.333-277.333 55.483 0 107.161 16.293 150.51 44.355l-1.085-0.658zM896 266.667c0-76.583-62.083-138.667-138.667-138.667v0h-490.667c-76.583 0-138.667 62.083-138.667 138.667v0 32h768v-32zM981.333 746.667c0-129.603-105.064-234.667-234.667-234.667s-234.667 105.064-234.667 234.667v0c0 129.603 105.064 234.667 234.667 234.667s234.667-105.064 234.667-234.667v0zM725.333 618.667c0-11.782 9.551-21.333 21.333-21.333s21.333 9.551 21.333 21.333v0 170.667c0 11.782-9.551 21.333-21.333 21.333s-21.333-9.551-21.333-21.333v0-170.667zM773.333 874.667c0 14.728-11.939 26.667-26.667 26.667s-26.667-11.939-26.667-26.667v0c0-14.728 11.939-26.667 26.667-26.667s26.667 11.939 26.667 26.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarError"],"grid":64},"attrs":[],"properties":{"order":280,"id":9,"name":"CalendarError","prevSize":64,"code":59670},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M839.11 0.001c102.111 0 184.889 82.777 184.889 184.889v0 654.222c0 102.111-82.777 184.889-184.889 184.889v0h-654.222c-102.111 0-184.889-82.777-184.889-184.889v0-654.222c0-102.111 82.777-184.889 184.889-184.889v0h654.222zM270.223 227.556c-21.517 0.001-39.313 15.929-42.243 36.637l-0.027 0.227-0.399 5.803v483.555l0.399 5.803c2.961 20.929 20.756 36.851 42.268 36.851s39.307-15.921 42.243-36.624l0.027-0.227 0.399-5.803v-483.555l-0.399-5.803c-2.955-20.935-20.752-36.863-42.268-36.864v0zM753.777 227.556c-21.517 0.001-39.313 15.929-42.243 36.637l-0.027 0.227-0.399 5.803v483.555l0.399 5.803c2.961 20.929 20.756 36.851 42.268 36.851s39.307-15.921 42.243-36.624l0.027-0.227 0.399-5.803v-483.555l-0.399-5.803c-2.955-20.935-20.752-36.863-42.268-36.864v0zM512 227.556c-21.517 0.001-39.313 15.929-42.243 36.637l-0.027 0.227-0.399 5.803v483.555l0.399 5.803c2.961 20.929 20.756 36.851 42.268 36.851s39.307-15.921 42.243-36.624l0.027-0.227 0.399-5.803v-483.555l-0.399-5.803c-2.955-20.935-20.752-36.863-42.268-36.864v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarYear"],"grid":64},"attrs":[],"properties":{"order":279,"id":10,"name":"CalendarYear","prevSize":64,"code":59671},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M512 144.41c246.517 0 446.359 199.841 446.359 446.359s-199.841 446.359-446.359 446.359v0c-246.517 0-446.359-199.841-446.359-446.359s199.841-446.359 446.359-446.359v0zM512 301.948c-19.862 0.001-36.289 14.704-38.993 33.819l-0.025 0.209-0.368 5.356v236.308l0.368 5.356c2.734 19.319 19.159 34.016 39.017 34.016s36.283-14.697 38.993-33.807l0.025-0.209 0.368-5.356v-236.308l-0.368-5.356c-2.727-19.324-19.156-34.027-39.017-34.028v0zM888.517 150.869l4.306 3.204 60.337 52.513c8.354 7.262 13.605 17.905 13.605 29.776 0 21.751-17.633 39.385-39.385 39.385-8.078 0-15.586-2.432-21.836-6.603l0.144 0.090-4.254-3.204-60.337-52.513c-8.26-7.257-13.445-17.841-13.445-29.636 0-21.751 17.633-39.385 39.385-39.385 7.988 0 15.42 2.378 21.628 6.465l-0.148-0.091zM630.154 13.129c21.746 0.007 39.372 17.637 39.372 39.385 0 19.858-14.697 36.283-33.807 38.993l-0.209 0.025-5.356 0.368h-236.308c-21.746-0.007-39.372-17.637-39.372-39.385 0-19.858 14.697-36.283 33.807-38.993l0.209-0.025 5.356-0.368h236.308z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["Reminder"],"grid":64},"attrs":[],"properties":{"order":278,"id":11,"name":"Reminder","prevSize":64,"code":59672},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M1023.999 839.11c0 102.111-82.777 184.889-184.889 184.889v0h-654.222c-102.111 0-184.889-82.777-184.889-184.889v0-654.222c0-102.111 82.777-184.889 184.889-184.889v0h654.222c102.111 0 184.889 82.777 184.889 184.889v0 654.222zM796.444 270.223c-0.001-21.517-15.929-39.313-36.637-42.243l-0.227-0.027-5.803-0.399-489.358 0.399c-20.929 2.961-36.851 20.756-36.851 42.268s15.921 39.307 36.624 42.243l0.227 0.027 5.803 0.399 489.358-0.399c20.935-2.955 36.863-20.752 36.864-42.268v0zM796.444 753.777c-0.001-21.517-15.929-39.313-36.637-42.243l-0.227-0.027-5.803-0.399-489.358 0.399c-20.929 2.961-36.851 20.756-36.851 42.268s15.921 39.307 36.624 42.243l0.227 0.027 5.803 0.399 489.358-0.399c20.935-2.955 36.863-20.752 36.864-42.268v0zM796.444 512c-0.001-21.517-15.929-39.313-36.637-42.243l-0.227-0.027-5.803-0.399-489.358 0.399c-20.929 2.961-36.851 20.756-36.851 42.268s15.921 39.307 36.624 42.243l0.227 0.027 5.803 0.399 489.358-0.399c20.935-2.955 36.863-20.752 36.864-42.268v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarAgenda"],"grid":64},"attrs":[],"properties":{"order":277,"id":12,"name":"CalendarAgenda","prevSize":64,"code":59673},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M922.4 352.401v114c-31.531-41.682-81.025-68.33-136.749-68.33-94.44 0-171 76.56-171 171 0 49.456 21 94.015 54.566 125.236l0.104 0.094h-43.32c-62.957 0-114 51.042-114 114v0 22.8c0 31.92 7.752 62.883 22.255 91.2h-284.456c-81.848 0-148.2-66.352-148.2-148.2v0-421.8h820.799zM774.199 101.6c81.848 0 148.2 66.352 148.2 148.2v0 34.2h-820.799v-34.2c0-81.848 66.352-148.2 148.2-148.2v0h524.4z","M1013.599 808.399c0-37.774-30.626-68.4-68.4-68.4v0h-319.2c-37.774 0-68.4 30.626-68.4 68.4v0 22.8c0 89.876 84.816 182.4 227.999 182.4s227.999-92.524 227.999-182.4v-22.8zM910.999 569c0-69.256-56.143-125.399-125.399-125.399s-125.399 56.143-125.399 125.399v0c0 69.256 56.143 125.399 125.399 125.399s125.399-56.143 125.399-125.399v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarAttendee"],"grid":64},"attrs":[],"properties":{"order":276,"id":13,"name":"CalendarAttendee","prevSize":64,"code":59674},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M931.787 144.778l0.21 6.354 0.105 6.406v582.892c0 105.857-85.814 191.671-191.671 191.671v0h-582.892c-4.498-0.004-8.956-0.138-13.381-0.396l0.62 0.030c30.721 47.871 83.675 79.137 143.931 79.137 0.039 0 0.079 0 0.118 0h451.603c149.36 0 270.44-121.080 270.44-270.44v0-451.609c0-60.548-31.508-113.743-79.084-144.043zM-13.128 275.693v433.23c0 94.256 76.41 170.667 170.667 170.667v0h551.384c94.256 0 170.667-76.41 170.667-170.667v0-433.23h-892.716zM157.539-13.128c-94.256 0-170.667 76.41-170.667 170.667v0 39.385h892.716v-39.385c0-94.256-76.41-170.667-170.667-170.667v0h-551.384z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarItemMultiDay"],"grid":64},"attrs":[],"properties":{"order":275,"id":14,"name":"CalendarItemMultiDay","prevSize":64,"code":59675},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M839.109 0.001c102.107 0 184.89 82.774 184.89 184.89v0 654.22c0 102.107-82.774 184.89-184.89 184.89v0h-654.22c-102.107 0-184.89-82.774-184.89-184.89v0-654.22c0-102.107 82.774-184.89 184.89-184.89v0h654.22zM270.221 597.331c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM512 597.331c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM270.221 312.89c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM512 312.89c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0zM753.779 312.89c-39.276 0-71.11 31.834-71.11 71.11s31.834 71.11 71.11 71.11v0c39.276 0 71.11-31.834 71.11-71.11s-31.834-71.11-71.11-71.11v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarMonth"],"grid":64},"attrs":[],"properties":{"order":274,"id":15,"name":"CalendarMonth","prevSize":64,"code":59676},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M972.8 332.801v180.326c-50.718-32.885-112.73-52.436-179.31-52.436-183.8 0-332.799 148.999-332.799 332.799 0 66.58 19.552 128.593 53.226 180.612l-0.79-1.302h-295.526c-91.9 0-166.4-74.5-166.4-166.4v0-473.6h921.599zM806.399 51.2c91.9 0 166.4 74.5 166.4 166.4v0 38.4h-921.599v-38.4c0-91.9 74.5-166.4 166.4-166.4v0h588.8zM512 793.6c0 155.523 126.077 281.6 281.6 281.6s281.6-126.077 281.6-281.6v0c0-155.523-126.077-281.6-281.6-281.6s-281.6 126.077-281.6 281.6v0zM947.2 614.4c14.138 0 25.6 11.461 25.6 25.6v0 102.4c0 14.138-11.461 25.6-25.6 25.6v0h-102.4c-14.138 0-25.6-11.461-25.6-25.6s11.461-25.6 25.6-25.6v0h51.2c-23.56-31.226-60.596-51.2-102.298-51.2-0.036 0-0.072 0-0.108 0h0.006c-42.649 0-80.486 20.838-103.782 53.044-4.723 6.184-12.1 10.133-20.399 10.133-14.138 0-25.6-11.461-25.6-25.6 0-5.435 1.693-10.475 4.583-14.62l-0.055 0.084c32.9-45.197 85.628-74.24 145.14-74.24 0.041 0 0.080 0 0.12 0h-0.006c50.176 0 95.488 20.634 128 53.76v-28.16c0-14.138 11.461-25.6 25.6-25.6v0zM665.6 919.040v28.16c0 14.138-11.461 25.6-25.6 25.6s-25.6-11.461-25.6-25.6v0-102.4c0-14.138 11.461-25.6 25.6-25.6v0h102.4c14.138 0 25.6 11.461 25.6 25.6s-11.461 25.6-25.6 25.6v0h-51.2c23.347 31.129 60.57 51.2 102.4 51.2 39.22 0 74.342-17.612 97.843-45.466 4.717-5.382 11.605-8.761 19.283-8.761 14.138 0 25.6 11.461 25.6 25.6 0 6.161-2.176 11.813-5.802 16.23l0.036-0.044c-33.022 39.029-82.034 63.642-136.796 63.642-0.058 0-0.115 0-0.173 0h0.010c-0.072 0-0.156 0-0.241 0-50.047 0-95.29-20.575-127.728-53.728l-0.031-0.032z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarSync"],"grid":64},"attrs":[],"properties":{"order":273,"id":16,"name":"CalendarSync","prevSize":64,"code":59677},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M312.89 455.111v-142.222h398.222v142.222h-398.222z","M839.11 1023.999c102.111 0 184.889-82.777 184.889-184.889v0-654.222c0-102.111-82.777-184.889-184.889-184.889v0h-654.222c-102.111 0-184.889 82.777-184.889 184.889v0 654.222c0 102.111 82.777 184.889 184.889 184.889v0h654.222zM270.223 227.556h483.555c23.564 0 42.667 19.103 42.667 42.667v0 227.556c0 23.564-19.103 42.667-42.667 42.667v0h-483.555c-23.564 0-42.667-19.103-42.667-42.667v0-227.556c0-23.564 19.103-42.667 42.667-42.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarWorkWeek"],"grid":64},"attrs":[],"properties":{"order":272,"id":17,"name":"CalendarWorkWeek","prevSize":64,"code":59678},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M563.299 307.828c162.19 0 254.242 107.41 267.604 237.040h4.095c0.076 0 0.166 0 0.256 0 104.178 0 188.645 84.395 188.761 188.545v0.011c-0.116 104.162-84.583 188.556-188.761 188.556-0.090 0-0.18 0-0.27 0h-543.436c-0.076 0-0.166 0-0.256 0-104.178 0-188.645-84.395-188.761-188.545v-0.011c0.116-104.162 84.583-188.556 188.761-188.556 0.090 0 0.18 0 0.27 0h4.081c13.464-130.499 105.464-237.040 267.654-237.040zM234.977 102.685c42.977 2.367 82.579 14.862 117.075 35.116l-1.218-0.661c51.613 30.084 91.164 76.037 112.441 131.086l0.601 1.769c-101.574 28.823-174.272 102.496-204.479 202.072l-3.533 12.594-2.97 12.185-10.546 1.945c-59.289 12.849-109.22 46.25-143.092 92.212l-0.463 0.658c-37.349-20.048-68.215-47.674-91.442-81.017l-0.558-0.846c-4.242-6.087-6.777-13.639-6.777-21.783 0-16.588 10.517-30.718 25.247-36.086l0.266-0.085c84.115-30.103 129.374-63.995 155.33-113.4 28.26-54.012 33.482-111.301 14.693-188.3-0.698-2.738-1.099-5.883-1.099-9.121 0-21.206 17.191-38.397 38.397-38.397 0.746 0 1.489 0.022 2.225 0.064l-0.102-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherCloudyNight"],"grid":64},"attrs":[],"properties":{"order":271,"id":18,"name":"WeatherCloudyNight","prevSize":64,"code":59679},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M563.298 256.482c162.189 0 254.239 107.358 267.601 237.037h4.095c0.076 0 0.166 0 0.256 0 104.177 0 188.643 84.394 188.759 188.543v0.011c-0.145 104.138-84.6 188.504-188.759 188.504-0.090 0-0.18 0-0.27 0h-543.43c-0.076 0-0.166 0-0.256 0-104.159 0-188.613-84.364-188.759-188.489v-0.014c0.116-104.161 84.582-188.554 188.759-188.554 0.090 0 0.18 0 0.27 0h4.081c13.464-130.549 105.463-237.037 267.652-237.037zM409.609 102.433c82.784 0 156.147 41.724 199.664 105.566-13.676-1.728-29.501-2.714-45.557-2.714-0.146 0-0.294 0-0.44 0h0.023c-153.28 0-264.733 85.855-303.95 215.689l-3.481 12.287-2.97 12.185-10.546 1.997c-82.829 18.057-148.657 77.037-176.056 154.215l-0.518 1.676c-40.157-31.018-65.768-79.18-65.768-133.326 0-89.459 69.912-162.589 158.081-167.736l0.455-0.022 13.157-0.307c20.752-114.106 119.356-199.492 237.906-199.51h0.001z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherCloudy"],"grid":64},"attrs":[],"properties":{"order":270,"id":19,"name":"WeatherCloudy","prevSize":64,"code":59680},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M563.296 307.583c162.234 0 254.23 107.354 267.642 237.028h4.095c0.076 0 0.166 0 0.256 0 104.173 0 188.636 84.391 188.752 188.536v0.011c-0.145 104.135-84.597 188.497-188.752 188.497-0.090 0-0.18 0-0.27 0h-543.46c-0.076 0-0.166 0-0.256 0-104.155 0-188.606-84.361-188.752-188.482v-0.014c0.116-104.157 84.579-188.547 188.752-188.547 0.090 0 0.18 0 0.27 0h4.081c13.464-130.545 105.409-237.028 267.591-237.028zM121.288 520.293c1.85 4.343 2.925 9.396 2.925 14.699 0 14.078-7.576 26.385-18.873 33.069l-0.179 0.097-4.659 2.304-47.405 19.658c-4.333 1.839-9.372 2.91-14.661 2.91-21.205 0-38.395-17.19-38.395-38.395 0-14.041 7.536-26.321 18.785-33.017l0.176-0.097 4.709-2.355 47.405-19.607c4.347-1.854 9.404-2.931 14.713-2.931 15.89 0 29.525 9.652 35.362 23.413l0.095 0.252zM453.383 272.873l-8.806 2.97c-91.33 32.252-156.755 102.644-185.066 195.715l-3.584 12.799-2.97 12.185-10.546 1.997c-32.469 6.959-61.138 19.65-86.282 37.068l0.787-0.516c-17.207-29.085-27.375-64.098-27.375-101.485 0-111.455 90.352-201.807 201.807-201.807 46.077 0 88.547 15.442 122.518 41.434l-0.486-0.356zM48.183 274.46l5.427 1.791 47.405 19.658c13.952 5.958 23.552 19.564 23.552 35.41 0 21.205-17.19 38.395-38.395 38.395-3.254 0-6.414-0.404-9.432-1.167l0.265 0.056-5.273-1.689-47.405-19.658c-13.914-5.975-23.481-19.561-23.481-35.38 0-21.205 17.19-38.395 38.395-38.395 3.21 0 6.328 0.394 9.309 1.136l-0.264-0.055zM243.487 121.595l2.355 4.659 19.607 47.457c1.796 4.286 2.84 9.268 2.84 14.492 0 21.205-17.19 38.395-38.395 38.395-13.993 0-26.237-7.485-32.948-18.67l-0.097-0.174-2.355-4.659-19.607-47.457c-1.796-4.286-2.84-9.268-2.84-14.492 0-21.205 17.19-38.395 38.395-38.395 13.993 0 26.237 7.485 32.948 18.67l0.097 0.174zM466.386 105.264c14.019 5.93 23.677 19.568 23.677 35.462 0 3.314-0.42 6.531-1.209 9.599l0.058-0.266-1.791 5.375-19.607 47.457c-5.958 13.952-19.564 23.552-35.41 23.552-21.205 0-38.395-17.19-38.395-38.395 0-3.254 0.404-6.414 1.167-9.432l-0.056 0.265 1.741-5.427 19.658-47.405c5.923-14.036 19.568-23.708 35.475-23.708 5.302 0 10.352 1.075 14.947 3.018l-0.252-0.095z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherPartlyCloudy"],"grid":64},"attrs":[],"properties":{"order":269,"id":20,"name":"WeatherPartlyCloudy","prevSize":64,"code":59681},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M201.348 953.716c0-6.336 0.667-12.006 2.001-17.008l76.537-296.645h-80.539c-9.338 0-18.176-1.834-26.513-5.503s-15.591-8.587-21.761-14.757c-6.17-6.17-11.088-13.424-14.757-21.761s-5.503-17.175-5.503-26.513c0-6.003 0.833-12.006 2.501-18.009l140.569-506.747c3.669-14.007 11.339-25.345 23.011-34.017s24.679-13.006 39.019-13.006h346.669c9.004 0 17.341 1.751 25.012 5.253s14.424 8.171 20.26 14.007c5.836 5.836 10.422 12.673 13.757 20.51s5.002 16.091 5.002 24.762c0 7.337-1.168 14.34-3.502 21.010l-82.54 234.615h162.579c9.338 0 18.092 1.834 26.263 5.503s15.425 8.671 21.761 15.007c6.336 6.336 11.339 13.59 15.007 21.761s5.503 16.925 5.503 26.263c0 19.009-6.336 35.017-19.009 48.023l-551.269 566.277c-6.67 6.673-14.257 11.836-22.761 15.508s-17.592 5.503-27.263 5.503c-9.672 0-18.676-1.831-27.013-5.503s-15.758-8.754-22.261-15.257c-6.503-6.503-11.589-13.924-15.257-22.261s-5.503-17.341-5.503-27.013zM828.154 388.44c0-1.334-0.583-2.418-1.751-3.252s-2.251-1.251-3.252-1.251h-207.601c-8.671 0-16.175-3.085-22.511-9.255s-9.505-13.59-9.505-22.261c0-1.668 0.167-3.502 0.5-5.503s0.833-3.835 1.501-5.503l97.047-277.636h-346.669c-1.334 4.669-4.335 15.34-9.004 32.016s-10.422 37.268-17.258 61.78c-6.836 24.512-14.424 51.692-22.761 81.54s-16.758 59.946-25.262 90.294c-8.504 30.348-16.758 59.946-24.762 88.793s-15.090 54.527-21.26 77.038c-6.17 22.511-11.172 40.687-15.007 54.527s-5.753 21.093-5.753 21.761c0 3.001 1.501 4.502 4.502 4.502h121.559c9.004 0 16.591 3.085 22.761 9.255s9.255 13.757 9.255 22.761c0 2.001-0.333 4.669-1 8.004l-86.542 336.664v1.501c0 3.669 2.168 5.503 6.503 5.503 1.334 0 2.501-0.5 3.502-1.501l551.269-566.277c1-1 1.501-2.168 1.501-3.502z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherThunder"],"grid":64},"attrs":[],"properties":{"order":268,"id":21,"name":"WeatherThunder","prevSize":64,"code":59654},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M858.233 383.471c91.229 1.168 164.735 75.396 164.735 166.793 0 88.074-68.259 160.205-154.76 166.377l-0.534 0.030-10.261 0.256-5.951 0.36h-40.38c5.644 15.906 8.722 33.094 8.722 50.95 0 85.429-64.751 154.234-150.13 154.234-66.702 0-114.675-32.222-137.918-83.428-2.921-6.25-4.625-13.571-4.625-21.289 0-28.337 22.972-51.309 51.309-51.309 18.576 0 34.846 9.872 43.851 24.655l0.129 0.226 5.028 9.646c7.183 12.416 19.139 18.881 42.228 18.881 27.193 0 47.461-21.55 47.461-51.617 0-26.168-20.164-48.025-46.384-50.95h-620.53c-28.313-0.032-51.252-22.992-51.252-51.309 0-26.201 19.64-47.816 45.001-50.924l0.248-0.025 6.003-0.36 614.475-0.308c3.232 0 6.465 0.102 9.697 0.256l177.631 0.102 3.079-0.308 9.697-0.41c32.411-3.514 57.417-30.729 57.417-63.783 0-35.421-28.715-64.136-64.136-64.136-25.171 0-46.954 14.499-57.454 35.602l-0.168 0.373-4.977 11.596c-8.715 16.628-25.852 27.778-45.595 27.778-28.337 0-51.309-22.972-51.309-51.309 0-6.208 1.103-12.159 3.123-17.667l-0.114 0.356c24.138-64.356 85.138-109.33 156.644-109.34h0.001zM396.555 794.199c21.253 0 38.482 17.229 38.482 38.482s-17.229 38.482-38.482 38.482v0c-21.253 0-38.482-17.229-38.482-38.482s17.229-38.482 38.482-38.482v0zM499.172 75.874c0.176 0 0.382-0.001 0.59-0.001 120.433 0 218.063 97.63 218.063 218.063 0 120.226-97.295 217.727-217.442 218.062h-450.165c-28.313-0.032-51.252-22.992-51.252-51.309 0-26.201 19.64-47.816 45.001-50.924l0.248-0.025 6.003-0.36 456.854-0.256c60.243-4.286 107.492-54.211 107.492-115.171 0-63.758-51.687-115.445-115.445-115.445-63.752 0-115.435 51.676-115.445 115.426v0.001c0 28.337-22.972 51.309-51.309 51.309s-51.309-22.972-51.309-51.309v0c0-120.433 97.63-218.062 218.062-218.062v0zM883.989 229.801c21.253 0 38.482 17.229 38.482 38.482s-17.229 38.482-38.482 38.482v0c-21.253 0-38.482-17.229-38.482-38.482s17.229-38.482 38.482-38.482v0zM191.319 152.838c21.253 0 38.482 17.229 38.482 38.482s-17.229 38.482-38.482 38.482v0c-21.253 0-38.482-17.229-38.482-38.482s17.229-38.482 38.482-38.482v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherBlowingSnow"],"grid":64},"attrs":[],"properties":{"order":267,"id":22,"name":"WeatherBlowingSnow","prevSize":64,"code":59655},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M512 56.889c180.282 0 282.511 119.353 297.359 263.396h4.551c0.101 0 0.221 0 0.341 0 115.781 0 209.652 93.811 209.75 209.57v0.009c-0.129 115.744-93.988 209.523-209.75 209.523-0.12 0-0.24 0-0.36 0h-33.091l-90.055 149.959c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.423-107.349h-121.515l-90.055 150.016c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.423-107.349h-121.572l-89.999 150.016c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.365-107.349h-32.028c-0.101 0-0.221 0-0.341 0-115.741 0-209.588-93.747-209.75-209.45v-0.016c0.161-115.719 94.008-209.466 209.75-209.466 0.1 0 0.2 0 0.3 0h4.535c15.019-145.18 117.191-263.51 297.415-263.51z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherRain"],"grid":64},"attrs":[],"properties":{"order":266,"id":23,"name":"WeatherRain","prevSize":64,"code":59656},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M656.156 827.904c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 56.889c180.282 0 282.511 119.353 297.359 263.396h4.551c0.101 0 0.221 0 0.341 0 115.781 0 209.652 93.811 209.75 209.57v0.009c-0.129 115.744-93.988 209.523-209.75 209.523-0.12 0-0.24 0-0.36 0h-74.335c-5.583 17.508-21.703 29.965-40.732 29.965s-35.149-12.459-40.649-29.664l-0.084-0.303h-317.44l-90.055 149.504c-7.517 12.829-21.236 21.308-36.936 21.308-23.564 0-42.667-19.103-42.667-42.667 0-5.795 1.155-11.319 3.248-16.356l-0.104 0.283 2.56-5.233 65.423-106.837h-32.028c-0.101 0-0.221 0-0.341 0-115.781 0-209.652-93.811-209.75-209.57v-0.009c0.161-115.719 94.008-209.466 209.75-209.466 0.1 0 0.2 0 0.3 0h4.535c15.019-145.124 117.191-263.452 297.415-263.452zM487.993 779.606c12.86 7.511 21.363 21.247 21.363 36.968 0 5.808-1.16 11.345-3.263 16.392l0.104-0.283-2.617 5.233-31.631 50.972c-7.499 12.908-21.26 21.448-37.016 21.448-23.564 0-42.667-19.103-42.667-42.667 0-5.869 1.185-11.463 3.329-16.552l-0.105 0.28 2.56-5.177 31.631-50.972c7.511-12.861 21.247-21.365 36.969-21.365 7.859 0 15.22 2.124 21.543 5.831l-0.201-0.109zM798.322 785.238c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherRainSnow"],"grid":64},"attrs":[],"properties":{"order":265,"id":24,"name":"WeatherRainSnow","prevSize":64,"code":59657},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M384 861.924c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM640 861.924c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM256 805.035c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 805.035c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM768 805.035c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 56.945c180.281 0 282.511 119.296 297.359 263.396h4.551c0.101 0 0.221 0 0.341 0 115.741 0 209.588 93.747 209.749 209.449v0.016c-0.129 115.744-93.988 209.523-209.749 209.523-0.12 0-0.24 0-0.36 0h-603.8c-0.101 0-0.221 0-0.341 0-115.761 0-209.62-93.779-209.749-209.509v-0.012c0.161-115.719 94.008-209.465 209.749-209.465 0.1 0 0.2 0 0.3 0h4.535c15.019-145.124 117.191-263.452 297.415-263.452z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnow"],"grid":64},"attrs":[],"properties":{"order":264,"id":25,"name":"WeatherSnow","prevSize":64,"code":59658},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M230.86 720.997c-9.408 10.393-22.949 16.895-38.007 16.895-28.277 0-51.2-22.924-51.2-51.2 0-12.69 4.616-24.301 12.262-33.247l-0.059 0.071 79.052-90.316h-181.708c-26.164-0.004-47.741-19.631-50.817-44.964l-0.024-0.246-0.359-5.99c0.004-26.164 19.631-47.741 44.964-50.817l0.246-0.024 5.99-0.359h142.592l-79.104-89.6c-7.958-8.984-12.82-20.872-12.82-33.894 0-28.288 22.932-51.219 51.219-51.219 15.265 0 28.969 6.678 38.353 17.27l0.047 0.054 138.802 157.388h130.458v-130.56l-157.286-138.802c-10.652-9.427-17.334-23.134-17.334-38.4 0-10.765 3.323-20.755 8.998-28.999l-0.113 0.173 3.942-5.069c9.426-10.639 23.124-17.312 38.381-17.312 10.752 0 20.73 3.314 28.968 8.976l-0.173-0.113 5.12 3.942 89.497 79.052 0.052-142.489c0-0.012 0-0.026 0-0.042 0-24.1 16.65-44.31 39.074-49.755l0.35-0.072 5.785-1.024 5.99-0.307c26.164 0.004 47.741 19.631 50.817 44.964l0.024 0.246 0.359 5.99-0.052 143.257 90.624-79.052c8.923-7.748 20.654-12.472 33.489-12.472 28.277 0 51.2 22.924 51.2 51.2 0 15.256-6.672 28.952-17.256 38.331l-0.054 0.047-158.002 137.932v130.354h130.458l138.342-157.491c9.432-10.715 23.177-17.441 38.493-17.441 10.704 0 20.64 3.284 28.858 8.9l-0.176-0.114 5.069 3.942c10.696 9.431 17.408 23.164 17.408 38.465 0 10.716-3.292 20.663-8.92 28.885l0.113-0.175-3.942 5.12-79.002 89.907h142.95c26.164 0.004 47.741 19.631 50.817 44.964l0.024 0.246 0.359 5.99c-0.004 26.164-19.631 47.741-44.964 50.817l-0.246 0.024-5.99 0.359h-143.001l79.104 90.316c7.873 8.958 12.678 20.782 12.678 33.727 0 13.055-4.885 24.967-12.929 34.011l0.046-0.052-4.556 4.556c-8.958 7.873-20.782 12.678-33.727 12.678-13.055 0-24.967-4.885-34.011-12.929l0.052 0.046-4.556-4.556-138.342-157.798h-130.406v130.458l158.054 137.881c10.79 9.437 17.569 23.23 17.569 38.605 0 10.656-3.256 20.552-8.826 28.747l0.114-0.179-3.942 5.12c-9.434 10.759-23.208 17.515-38.558 17.515-10.655 0-20.549-3.254-28.744-8.824l0.179 0.114-5.12-3.892-90.675-79.257v143.308c-0.004 26.164-19.631 47.741-44.964 50.817l-0.246 0.024-5.99 0.359c-26.164-0.004-47.741-19.631-50.817-44.964l-0.024-0.246-0.359-5.99-0.052-142.489-88.883 78.489c-8.978 7.949-20.857 12.802-33.869 12.802-28.278 0-51.201-22.924-51.201-51.201 0-15.266 6.682-28.972 17.279-38.353l0.054-0.047 156.62-138.24v-130.56h-91.597l-138.291 157.798z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnowflake"],"grid":64},"attrs":[],"properties":{"order":263,"id":26,"name":"WeatherSnowflake","prevSize":64,"code":59659},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M448.11 921.551c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM678.483 921.551c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM332.924 870.358c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM563.296 870.358c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM793.669 870.358c21.205 0 38.395 17.19 38.395 38.395s-17.19 38.395-38.395 38.395v0c-21.205 0-38.395-17.19-38.395-38.395s17.19-38.395 38.395-38.395v0zM563.296 205.349c162.234 0 254.23 107.405 267.642 237.028h4.095c0.076 0 0.166 0 0.256 0 104.173 0 188.636 84.391 188.752 188.536v0.011c-0.116 104.157-84.579 188.547-188.752 188.547-0.090 0-0.18 0-0.27 0h-543.46c-0.076 0-0.166 0-0.256 0-104.173 0-188.636-84.391-188.752-188.536v-0.011c0.116-104.157 84.579-188.547 188.752-188.547 0.090 0 0.18 0 0.27 0h4.081c13.464-130.493 105.409-237.028 267.591-237.028zM121.288 418.11c1.839 4.331 2.908 9.371 2.908 14.659 0 14.071-7.569 26.373-18.857 33.058l-0.178 0.097-4.659 2.355-47.405 19.607c-4.333 1.839-9.372 2.91-14.661 2.91-21.205 0-38.395-17.19-38.395-38.395 0-14.041 7.536-26.321 18.785-33.017l0.176-0.097 4.709-2.304 47.405-19.658c4.342-1.849 9.392-2.923 14.695-2.923 15.907 0 29.554 9.672 35.38 23.456l0.095 0.252zM453.383 170.69l-8.806 2.918c-91.279 32.252-156.755 102.695-185.066 195.715l-3.584 12.799-2.97 12.235-10.546 1.945c-32.473 6.974-61.141 19.681-86.278 37.119l0.785-0.515c-17.207-29.085-27.375-64.098-27.375-101.485 0-111.455 90.352-201.807 201.807-201.807 46.077 0 88.547 15.442 122.518 41.434l-0.486-0.356zM48.234 172.225l5.427 1.843 47.405 19.607c14.12 5.884 23.865 19.574 23.865 35.54 0 21.205-17.19 38.395-38.395 38.395-3.368 0-6.634-0.433-9.746-1.248l0.268 0.059-5.324-1.791-47.405-19.658c-13.914-5.975-23.481-19.561-23.481-35.38 0-21.205 17.19-38.395 38.395-38.395 3.21 0 6.328 0.394 9.309 1.136l-0.264-0.055zM243.539 19.361l2.355 4.709 19.607 47.405c1.796 4.286 2.84 9.268 2.84 14.492 0 21.205-17.19 38.395-38.395 38.395-13.993 0-26.237-7.485-32.948-18.67l-0.097-0.174-2.355-4.659-19.607-47.405c-1.839-4.333-2.91-9.372-2.91-14.661 0-21.205 17.19-38.395 38.395-38.395 14.041 0 26.321 7.536 33.017 18.785l0.097 0.176zM466.438 3.081c14.013 5.932 23.665 19.567 23.665 35.457 0 3.297-0.415 6.498-1.197 9.552l0.058-0.266-1.791 5.427-19.607 47.405c-5.958 13.952-19.564 23.552-35.41 23.552-21.205 0-38.395-17.19-38.395-38.395 0-3.254 0.404-6.414 1.167-9.432l-0.056 0.265 1.741-5.375 19.658-47.405c5.923-14.036 19.568-23.708 35.475-23.708 5.302 0 10.352 1.075 14.947 3.018l-0.252-0.095z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnowShowerDay"],"grid":64},"attrs":[],"properties":{"order":262,"id":27,"name":"WeatherSnowShowerDay","prevSize":64,"code":59660},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M448.002 921.589c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM678.396 921.589c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM332.805 870.391c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM563.199 870.391c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM793.593 870.391c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0c-21.207 0-38.399-17.192-38.399-38.399s17.192-38.399 38.399-38.399v0zM563.249 205.729c162.249 0 254.253 107.364 267.666 237.050h4.095c0.061 0 0.133 0 0.205 0 104.165 0 188.623 84.369 188.77 188.5v0.014c-0.116 104.167-84.587 188.564-188.77 188.564-0.090 0-0.18 0-0.27 0h-543.409c-0.076 0-0.166 0-0.256 0-104.183 0-188.653-84.399-188.77-188.554v-0.011c0.145-104.144 84.605-188.514 188.77-188.514 0.090 0 0.18 0 0.27 0h4.081c13.465-130.557 105.419-237.050 267.616-237.050zM234.913 0.525c42.984 2.384 82.585 14.896 117.079 35.169l-1.216-0.661c51.638 30.074 91.21 76.032 112.497 131.093l0.601 1.768c-101.629 28.722-174.332 102.449-204.488 202.030l-3.584 12.595-2.918 12.186-10.547 1.945c-59.299 12.862-109.232 46.283-143.098 92.266l-0.463 0.66-7.935-4.352c-33.875-19.736-61.976-45.745-83.509-76.667l-0.558-0.847c-4.248-6.091-6.787-13.648-6.787-21.799 0-16.573 10.499-30.693 25.208-36.073l0.266-0.085c84.119-30.105 129.43-63.998 155.337-113.456 28.313-54.014 33.536-111.306 14.745-188.257-0.707-2.754-1.111-5.916-1.111-9.173 0-21.207 17.192-38.399 38.399-38.399 0.751 0 1.498 0.022 2.238 0.064l-0.102-0.005z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSnowShowerNight"],"grid":64},"attrs":[],"properties":{"order":261,"id":28,"name":"WeatherSnowShowerNight","prevSize":64,"code":59661},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M511.795 846.892c26.199 0.004 47.806 19.657 50.886 45.025l0.024 0.246 0.359 5.999v74.649c-0.061 28.269-22.992 51.162-51.27 51.162-26.181 0-47.779-19.625-50.885-44.967l-0.025-0.248-0.359-5.947v-74.649c0-28.315 22.955-51.27 51.27-51.27v0zM821.308 747.84l52.808 52.808c8.89 9.207 14.368 21.76 14.368 35.592 0 28.315-22.955 51.27-51.27 51.27-13.857 0-26.431-5.497-35.658-14.43l-52.795-52.743c-9.272-9.279-15.007-22.093-15.007-36.247 0-28.321 22.958-51.279 51.279-51.279 14.167 0 26.992 5.745 36.272 15.032v0zM274.776 747.84c9.274 9.278 15.011 22.093 15.011 36.247s-5.737 26.971-15.011 36.247l-52.756 52.808c-9.279 9.272-22.093 15.007-36.247 15.007-28.321 0-51.279-22.958-51.279-51.279 0-14.167 5.745-26.992 15.032-36.272l52.808-52.808c9.275-9.26 22.080-14.985 36.222-14.985s26.946 5.726 36.223 14.985l-0.001-0.001zM512.513 228.583c156.442 0 283.263 126.821 283.263 283.263s-126.821 283.263-283.263 283.263v0c-156.442 0-283.263-126.821-283.263-283.263s126.821-283.263 283.263-283.263v0zM972.296 461.653c28.291 0.032 51.212 22.974 51.212 51.27 0 26.181-19.625 47.779-44.966 50.885l-0.248 0.025-5.999 0.359h-74.649c-28.269-0.061-51.162-22.992-51.162-51.27 0-26.181 19.625-47.779 44.967-50.885l0.248-0.025 5.947-0.359h74.649zM126.403 460.218c28.269 0.061 51.162 22.992 51.162 51.27 0 26.181-19.625 47.779-44.967 50.885l-0.248 0.025-5.947 0.359h-74.649c-28.291-0.032-51.212-22.974-51.212-51.27 0-26.181 19.625-47.779 44.966-50.885l0.248-0.025 5.999-0.359h74.649zM217.15 146.654l4.87 4.255 52.808 52.808c9.242 9.272 14.955 22.064 14.955 36.192 0 28.315-22.955 51.27-51.27 51.27-11.865 0-22.788-4.030-31.475-10.797l0.114 0.087-4.922-4.307-52.705-52.756c-9.242-9.272-14.955-22.064-14.955-36.192 0-28.315 22.955-51.27 51.27-51.27 11.865 0 22.788 4.030 31.475 10.797l-0.114-0.087zM874.065 150.91c9.277 9.278 15.014 22.094 15.014 36.251 0 11.893-4.049 22.841-10.845 31.538l0.085-0.113-4.255 4.82-52.808 52.808c-9.272 9.242-22.064 14.955-36.192 14.955-28.315 0-51.27-22.955-51.27-51.27 0-11.865 4.030-22.788 10.797-31.475l-0.087 0.114 4.307-4.87 52.756-52.808c9.278-9.274 22.093-15.011 36.247-15.011s26.971 5.737 36.247 15.011v0zM512-0.028c26.199 0.004 47.806 19.657 50.886 45.025l0.024 0.246 0.359 5.999v74.597c-0.032 28.291-22.974 51.212-51.27 51.212-26.181 0-47.779-19.625-50.885-44.966l-0.025-0.248-0.359-5.999v-74.597c0-28.315 22.955-51.27 51.27-51.27v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSunny"],"grid":64},"attrs":[],"properties":{"order":260,"id":29,"name":"WeatherSunny","prevSize":64,"code":59662},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M512 0.008c21.207 0 38.399 17.192 38.399 38.399v0 25.599c0 21.207-17.192 38.399-38.399 38.399s-38.399-17.192-38.399-38.399v0-25.599c0-21.207 17.192-38.399 38.399-38.399v0zM307.203 358.402c0-113.107 91.691-204.797 204.797-204.797s204.797 91.691 204.797 204.797v0c0 113.107-91.691 204.797-204.797 204.797s-204.797-91.691-204.797-204.797v0zM550.399 652.797c0-21.207-17.192-38.399-38.399-38.399s-38.399 17.192-38.399 38.399v0 25.599c0 21.207 17.192 38.399 38.399 38.399s38.399-17.192 38.399-38.399v0-25.599zM192.005 307.203c-21.207 0-38.399 17.192-38.399 38.399s17.192 38.399 38.399 38.399v0h25.599c21.207 0 38.399-17.192 38.399-38.399s-17.192-38.399-38.399-38.399v0h-25.599zM767.995 345.602c0-21.207 17.192-38.399 38.399-38.399v0h25.599c21.207 0 38.399 17.192 38.399 38.399s-17.192 38.399-38.399 38.399v0h-25.599c-21.207 0-38.399-17.192-38.399-38.399v0zM241.668 193.541c6.839 6.385 16.051 10.305 26.178 10.305 21.207 0 38.399-17.192 38.399-38.399 0-10.128-3.92-19.339-10.327-26.2l0.020 0.023-25.599-25.599c-6.839-6.385-16.051-10.305-26.178-10.305-21.207 0-38.399 17.192-38.399 38.399 0 10.128 3.92 19.339 10.327 26.2l-0.020-0.023 25.599 25.599zM295.94 523.264c-6.947-6.938-16.541-11.231-27.135-11.231s-20.188 4.291-27.136 11.231v0l-25.599 25.599c-7.529 7.029-12.222 17.013-12.222 28.094 0 21.207 17.192 38.399 38.399 38.399 11.081 0 21.064-4.693 28.072-12.199l0.020-0.023 25.599-25.599c6.938-6.947 11.231-16.541 11.231-27.135s-4.291-20.188-11.231-27.136v0zM782.332 193.541c-7.029 7.529-17.013 12.222-28.094 12.222-21.207 0-38.399-17.192-38.399-38.399 0-11.081 4.693-21.064 12.199-28.072l0.023-0.020 25.599-25.599c7.029-7.529 17.013-12.222 28.094-12.222 21.207 0 38.399 17.192 38.399 38.399 0 11.081-4.693 21.064-12.199 28.072l-0.023 0.020-25.599 25.599zM728.060 523.264c6.947-6.938 16.541-11.231 27.135-11.231s20.188 4.291 27.136 11.231v0l25.599 25.599c7.529 7.029 12.222 17.013 12.222 28.094 0 21.207-17.192 38.399-38.399 38.399-11.081 0-21.064-4.693-28.072-12.199l-0.020-0.023-25.599-25.599c-6.938-6.947-11.231-16.541-11.231-27.135s4.291-20.188 11.231-27.136v0zM62.368 1015.595c-6.509 5.242-14.877 8.413-23.985 8.413-12.093 0-22.882-5.591-29.92-14.329l-0.058-0.074c-20.889-26.112 6.092-54.015 6.092-54.015v-0.102l0.82-0.563c2.63-2.129 5.682-4.433 8.807-6.637l0.563-0.377c6.349-4.608 15.513-11.007 27.34-18.637 23.706-15.206 58.060-35.327 101.476-55.347 86.783-40.037 210.736-80.332 358.497-80.332s271.714 40.294 358.497 80.332c39.705 18.337 72.977 36.794 104.772 57.341l-3.295-1.994c14.603 9.417 26.568 17.846 38.201 26.686l-1.492-1.087 0.614 0.512 0.154 0.154 0.154 0.052c8.826 7.099 14.426 17.897 14.426 30.003 0 21.214-17.198 38.413-38.413 38.413-9.109 0-17.477-3.17-24.061-8.468l0.074 0.058-1.536-1.229c-8.059-6.072-17.738-12.816-27.646-19.236l-2.050-1.244c-25.867-16.836-56.068-33.585-87.432-48.261l-4.675-1.966c-79.615-36.761-192.458-73.266-326.293-73.266s-246.678 36.505-326.293 73.266c-39.73 18.33-71.014 36.658-92.159 50.226-11.934 7.664-21.596 14.408-31.014 21.46l1.369-0.98-1.536 1.229z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSunnyHigh"],"grid":64},"attrs":[],"properties":{"order":259,"id":30,"name":"WeatherSunnyHigh","prevSize":64,"code":59663},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M550.4 38.399c0-21.208-17.192-38.4-38.4-38.4s-38.4 17.192-38.4 38.4v0 76.8c0 21.208 17.192 38.4 38.4 38.4s38.4-17.192 38.4-38.4v0-76.8zM871.937 152.063c6.938 6.947 11.231 16.541 11.231 27.136s-4.291 20.189-11.231 27.137l-54.271 54.323c-6.9 6.677-16.314 10.792-26.69 10.792-21.208 0-38.4-17.192-38.4-38.4 0-10.363 4.105-19.768 10.777-26.675l54.262-54.312c6.95-6.954 16.553-11.256 27.162-11.256s20.212 4.302 27.161 11.256v0zM235.007 563.2c-2.947-15.296-4.633-32.888-4.633-50.874 0-155.524 126.077-281.601 281.601-281.601s281.601 126.077 281.601 281.601c0 17.986-1.686 35.578-4.909 52.626l0.276-1.752h196.66c21.208 0 38.4 17.192 38.4 38.4s-17.192 38.4-38.4 38.4v0h-947.2c-21.208 0-38.4-17.192-38.4-38.4s17.192-38.4 38.4-38.4v0h196.608zM243.2 716.8c-21.208 0-38.4 17.192-38.4 38.4s17.192 38.4 38.4 38.4v0h537.6c21.208 0 38.4-17.192 38.4-38.4s-17.192-38.4-38.4-38.4v0h-537.6zM448 870.401c-21.208 0-38.4 17.192-38.4 38.4s17.192 38.4 38.4 38.4v0h128c21.208 0 38.4-17.192 38.4-38.4s-17.192-38.4-38.4-38.4v0h-128zM152.063 152.063c6.947-6.938 16.541-11.231 27.136-11.231s20.189 4.291 27.137 11.231l54.323 54.271c7.241 6.994 11.736 16.788 11.736 27.634 0 21.208-17.192 38.4-38.4 38.4-10.832 0-20.616-4.486-27.598-11.699l-0.010-0.011-54.323-54.272c-6.954-6.95-11.256-16.553-11.256-27.162s4.302-20.212 11.256-27.161v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["WeatherSunnyLow"],"grid":64},"attrs":[],"properties":{"order":258,"id":31,"name":"WeatherSunnyLow","prevSize":64,"code":59664},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M166.933 955.733c-22.4 0-43.733-4.533-64-13.6s-37.955-21.155-53.067-36.267c-15.111-15.111-27.2-32.8-36.267-53.067s-13.6-41.6-13.6-64v-621.867c0-22.4 4.533-43.733 13.6-64s21.156-37.955 36.267-53.067c15.111-15.111 32.8-27.2 53.067-36.267s41.6-13.6 64-13.6h621.867c22.4 0 43.733 4.533 64 13.6s37.955 21.156 53.067 36.267c15.111 15.111 27.2 32.8 36.267 53.067s13.6 41.6 13.6 64v621.867c0 22.4-4.533 43.733-13.6 64s-21.155 37.955-36.267 53.067c-15.111 15.111-32.8 27.2-53.067 36.267s-41.6 13.6-64 13.6h-208.533v-68.267h204.8c13.867 0 27.022-2.667 39.467-8s23.378-12.711 32.8-22.133c9.422-9.422 16.8-20.355 22.133-32.8s8-25.6 8-39.467v-512h-819.2v512c0 13.867 2.667 27.022 8 39.467s12.711 23.378 22.133 32.8c9.422 9.422 20.355 16.8 32.8 22.133s25.6 8 39.467 8h204.8v68.267zM68.267 204.8h819.2v-34.133c0-13.867-2.667-27.022-8-39.467s-12.711-23.378-22.133-32.8c-9.422-9.422-20.355-16.8-32.8-22.133s-25.6-8-39.467-8h-614.4c-13.867 0-27.022 2.667-39.467 8s-23.378 12.711-32.8 22.133c-9.422 9.422-16.8 20.355-22.133 32.8s-8 25.6-8 39.467zM409.6 409.6c0-9.6 1.778-18.489 5.333-26.667s8.445-15.378 14.667-21.6c6.222-6.222 13.422-11.111 21.6-14.667s17.067-5.333 26.667-5.333c9.245 0 18.045 1.778 26.4 5.333s15.645 8.445 21.867 14.667c6.222 6.222 11.111 13.511 14.667 21.867s5.333 17.155 5.333 26.4c0 9.6-1.778 18.489-5.333 26.667s-8.445 15.378-14.667 21.6c-6.222 6.222-13.422 11.111-21.6 14.667s-17.067 5.333-26.667 5.333c-9.6 0-18.578-1.778-26.933-5.333s-15.555-8.355-21.6-14.4c-6.045-6.045-10.845-13.245-14.4-21.6s-5.333-17.333-5.333-26.933zM443.733 721.6l-46.4 38.4c-6.4 5.333-13.689 8-21.867 8-9.245 0-17.245-3.378-24-10.133s-10.133-14.755-10.133-24c0-11.022 4.089-19.733 12.267-26.133l102.4-85.333c6.4-5.333 13.689-8 21.867-8s15.467 2.667 21.867 8l102.4 85.333c8.178 6.4 12.267 15.111 12.267 26.133 0 9.245-3.378 17.245-10.133 24s-14.755 10.133-24 10.133c-8.178 0-15.467-2.667-21.867-8l-46.4-38.4v268.267c0 9.248-3.378 17.248-10.133 24s-14.755 10.133-24 10.133c-9.245 0-17.245-3.381-24-10.133s-10.133-14.752-10.133-24z"],"width":956,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarToday"],"grid":64},"attrs":[],"properties":{"order":257,"id":32,"name":"CalendarToday","prevSize":64,"code":59665},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M809.143 0c28.571 0 55.905 5.81 82 17.429s48.952 27.238 68.571 46.857c19.619 19.619 35.238 42.477 46.857 68.571s17.429 53.429 17.429 82v594.286c0 28.571-5.809 55.905-17.429 82s-27.238 48.952-46.857 68.571c-19.619 19.619-42.477 35.238-68.571 46.857s-53.429 17.429-82 17.429h-594.286c-28.571 0-55.905-5.809-82-17.429s-48.952-27.238-68.571-46.857c-19.619-19.619-35.238-42.477-46.857-68.571s-17.429-53.429-17.429-82v-594.286c0-28.571 5.809-55.905 17.429-82s27.238-48.952 46.857-68.571c19.619-19.619 42.477-35.238 68.571-46.857s53.429-17.428 82-17.429zM216.571 73.143c-19.429 0-37.905 4-55.429 12s-32.762 18.666-45.714 32c-12.952 13.334-23.238 28.857-30.857 46.571s-11.429 36.286-11.429 55.714h877.714v-2.857c0-19.048-3.905-37.238-11.714-54.571s-18.286-32.571-31.429-45.714c-13.143-13.143-28.381-23.619-45.714-31.429s-35.523-11.714-54.571-11.714zM807.429 950.857c19.048 0 37.238-3.905 54.571-11.714s32.571-18.286 45.714-31.429c13.143-13.143 23.619-28.381 31.429-45.714s11.714-35.523 11.714-54.571v-514.857h-877.714v514.857c0 19.048 3.905 37.238 11.714 54.571s18.286 32.571 31.429 45.714c13.143 13.143 28.381 23.619 45.714 31.429s35.523 11.714 54.571 11.714zM219.429 512c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.477-11.905 23.429-15.714s18.571-5.714 28.857-5.714c10.286 0 19.809 1.905 28.571 5.714s16.381 8.952 22.857 15.429c6.477 6.477 11.619 14.095 15.429 22.857s5.714 18.286 5.714 28.571c0 10.286-1.905 19.905-5.714 28.857s-9.048 16.762-15.714 23.429c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857zM438.857 512c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.477-11.905 23.429-15.714s18.571-5.714 28.857-5.714c10.286 0 19.809 1.905 28.571 5.714s16.381 8.952 22.857 15.429c6.477 6.477 11.619 14.095 15.429 22.857s5.714 18.286 5.714 28.571c0 10.286-1.905 19.905-5.714 28.857s-9.048 16.762-15.714 23.429c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857zM804.571 511.429c0 10.286-1.905 19.905-5.714 28.857s-9.048 16.762-15.714 23.429c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.477-11.905 23.429-15.714s18.571-5.714 28.857-5.714c10.286 0 19.809 1.905 28.571 5.714s16.381 8.952 22.857 15.429c6.477 6.477 11.619 14.095 15.429 22.857s5.714 18.286 5.714 28.571zM365.714 731.429c0 10.286-1.905 19.809-5.714 28.571s-9.048 16.477-15.714 23.143c-6.666 6.666-14.477 11.905-23.429 15.714s-18.571 5.714-28.857 5.714c-10.286 0-19.809-1.905-28.571-5.714s-16.381-8.952-22.857-15.429c-6.477-6.477-11.619-14.095-15.429-22.857s-5.714-18.286-5.714-28.571c0-10.286 1.905-19.905 5.714-28.857s9.048-16.762 15.714-23.429c6.666-6.666 14.381-11.905 23.143-15.714s18.286-5.714 28.571-5.714c10.286 0 19.905 1.905 28.857 5.714s16.666 8.952 23.143 15.429c6.477 6.477 11.619 14.191 15.429 23.143s5.714 18.571 5.714 28.857zM585.143 731.429c0 10.286-1.905 19.809-5.714 28.571s-9.048 16.477-15.714 23.143c-6.666 6.666-14.477 11.905-23.429 15.714s-18.571 5.714-28.857 5.714c-10.286 0-19.809-1.905-28.571-5.714s-16.381-8.952-22.857-15.429c-6.477-6.477-11.619-14.095-15.429-22.857s-5.714-18.286-5.714-28.571c0-10.286 1.905-19.905 5.714-28.857s9.048-16.762 15.714-23.429c6.666-6.666 14.381-11.905 23.143-15.714s18.286-5.714 28.571-5.714c10.286 0 19.905 1.905 28.857 5.714s16.666 8.952 23.143 15.429c6.477 6.477 11.619 14.191 15.429 23.143s5.714 18.571 5.714 28.857z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["Calendar"],"grid":64},"attrs":[],"properties":{"order":256,"id":33,"name":"Calendar","prevSize":64,"code":59666},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M214.857 1024c-28.571 0-55.905-5.809-82-17.429s-48.952-27.238-68.571-46.857c-19.619-19.619-35.238-42.477-46.857-68.571s-17.429-53.429-17.429-82v-594.286c0-28.571 5.809-55.905 17.429-82s27.238-48.952 46.857-68.571c19.619-19.619 42.477-35.238 68.571-46.857s53.429-17.428 82-17.429h594.286c28.571 0 55.905 5.81 82 17.429s48.952 27.238 68.571 46.857c19.619 19.619 35.238 42.477 46.857 68.571s17.429 53.429 17.429 82v594.286c0 28.571-5.809 55.905-17.429 82s-27.238 48.952-46.857 68.571c-19.619 19.619-42.477 35.238-68.571 46.857s-53.429 17.429-82 17.429zM807.429 950.857c19.048 0 37.238-3.905 54.571-11.714s32.571-18.286 45.714-31.429c13.143-13.143 23.619-28.381 31.429-45.714s11.714-35.523 11.714-54.571v-590.857c0-19.048-3.905-37.238-11.714-54.571s-18.286-32.571-31.429-45.714c-13.143-13.143-28.381-23.619-45.714-31.429s-35.523-11.714-54.571-11.714h-590.857c-19.048 0-37.238 3.905-54.571 11.714s-32.571 18.286-45.714 31.429c-13.143 13.143-23.619 28.381-31.429 45.714s-11.714 35.523-11.714 54.571v590.857c0 19.048 3.905 37.238 11.714 54.571s18.286 32.571 31.429 45.714c13.143 13.143 28.381 23.619 45.714 31.429s35.523 11.714 54.571 11.714zM256 292.571c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857h512c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857zM292.571 804.571c-10.286 0-19.905-1.905-28.857-5.714s-16.666-8.952-23.143-15.429c-6.477-6.477-11.619-14.191-15.429-23.143s-5.714-18.571-5.714-28.857v-219.429c0-10.286 1.905-19.809 5.714-28.571s9.048-16.477 15.714-23.143c6.666-6.666 14.381-11.905 23.143-15.714s18.286-5.714 28.571-5.714h438.857c9.905 0 19.334 1.905 28.286 5.714s16.762 9.048 23.429 15.714c6.666 6.666 11.905 14.477 15.714 23.429s5.714 18.381 5.714 28.286v219.429c0 10.286-1.905 19.809-5.714 28.571s-9.048 16.477-15.714 23.143c-6.666 6.666-14.381 11.905-23.143 15.714s-18.286 5.714-28.571 5.714zM292.571 512v219.429h438.857v-219.429z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarDay"],"grid":64},"attrs":[],"properties":{"order":255,"id":34,"name":"CalendarDay","prevSize":64,"code":59667},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M214.857 1024c-28.571 0-55.905-5.809-82-17.429s-48.952-27.238-68.571-46.857c-19.619-19.619-35.238-42.477-46.857-68.571s-17.429-53.429-17.429-82v-594.286c0-28.571 5.809-55.905 17.429-82s27.238-48.952 46.857-68.571c19.619-19.619 42.477-35.238 68.571-46.857s53.429-17.428 82-17.429h594.286c28.571 0 55.905 5.81 82 17.429s48.952 27.238 68.571 46.857c19.619 19.619 35.238 42.477 46.857 68.571s17.429 53.429 17.429 82v594.286c0 28.571-5.809 55.905-17.429 82s-27.238 48.952-46.857 68.571c-19.619 19.619-42.477 35.238-68.571 46.857s-53.429 17.429-82 17.429zM807.429 950.857c19.048 0 37.238-3.905 54.571-11.714s32.571-18.286 45.714-31.429c13.143-13.143 23.619-28.381 31.429-45.714s11.714-35.523 11.714-54.571v-590.857c0-19.048-3.905-37.238-11.714-54.571s-18.286-32.571-31.429-45.714c-13.143-13.143-28.381-23.619-45.714-31.429s-35.523-11.714-54.571-11.714h-590.857c-19.048 0-37.238 3.905-54.571 11.714s-32.571 18.286-45.714 31.429c-13.143 13.143-23.619 28.381-31.429 45.714s-11.714 35.523-11.714 54.571v590.857c0 19.048 3.905 37.238 11.714 54.571s18.286 32.571 31.429 45.714c13.143 13.143 28.381 23.619 45.714 31.429s35.523 11.714 54.571 11.714zM219.429 768v-512c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714v512c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714zM475.429 768v-512c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714v512c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714zM731.429 768v-512c0-9.905 3.619-18.477 10.857-25.714s15.809-10.857 25.714-10.857c9.905 0 18.477 3.619 25.714 10.857s10.857 15.809 10.857 25.714v512c0 9.905-3.619 18.477-10.857 25.714s-15.809 10.857-25.714 10.857c-9.905 0-18.477-3.619-25.714-10.857s-10.857-15.809-10.857-25.714z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["CalendarWeek"],"grid":64},"attrs":[],"properties":{"order":254,"id":35,"name":"CalendarWeek","prevSize":64,"code":59668},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M384 192c-44.333 0-85.917 8.333-124.75 25s-72.75 39.5-101.75 68.5c-29 29-51.833 62.917-68.5 101.75s-25 80.417-25 124.75c0 27 3.5 54.083 10.5 81.25s17.333 52.583 31 76.25c2 3.667 4.583 7.667 7.75 12s6.25 8.833 9.25 13.5c3 4.667 5.583 9.333 7.75 14s3.25 9 3.25 13c0 8.667-3.167 16.167-9.5 22.5s-13.833 9.5-22.5 9.5c-5.667 0-10.417-1.167-14.25-3.5s-7.583-5.5-11.25-9.5c-12.333-14.333-23.25-30.833-32.75-49.5s-17.417-38.167-23.75-58.5c-6.333-20.333-11.167-40.917-14.5-61.75s-5-40.583-5-59.25c0-35 4.583-68.833 13.75-101.5s22.083-63.25 38.75-91.75c16.667-28.5 36.667-54.417 60-77.75s49.167-43.417 77.5-60.25c28.333-16.833 58.917-29.833 91.75-39s66.917-13.75 102.25-13.75h339l-73.5-73.5c-6.333-6.333-9.5-13.833-9.5-22.5s3.167-16.167 9.5-22.5c6.333-6.333 13.833-9.5 22.5-9.5s16.167 3.167 22.5 9.5l128 128c6.333 6.333 9.5 13.833 9.5 22.5s-3.167 16.167-9.5 22.5l-128 128c-6.333 6.333-13.833 9.5-22.5 9.5s-16.167-3.167-22.5-9.5c-6.333-6.333-9.5-13.833-9.5-22.5s3.167-16.167 9.5-22.5l73.5-73.5zM1024 512c0 35.333-4.58 69.25-13.75 101.75s-22.083 63-38.75 91.5c-16.667 28.5-36.667 54.417-60 77.75s-49.167 43.417-77.5 60.25c-28.333 16.833-58.917 29.833-91.75 39s-66.917 13.75-102.25 13.75h-338.5l73 73.5c6.333 6.333 9.5 13.833 9.5 22.5 0 8.67-3.167 16.17-9.5 22.5s-13.833 9.5-22.5 9.5c-8.667 0-16.167-3.17-22.5-9.5l-128-128c-6.333-6.333-9.5-13.833-9.5-22.5s3.167-16.167 9.5-22.5l128-128c6.333-6.333 13.833-9.5 22.5-9.5s16.167 3.167 22.5 9.5c6.333 6.333 9.5 13.833 9.5 22.5s-3.167 16.167-9.5 22.5l-73 73.5h338.5c44.333 0 85.917-8.333 124.75-25s72.75-39.5 101.75-68.5c29-29 51.833-62.917 68.5-101.75s25-80.417 25-124.75c0-19-1.333-36.667-4-53s-6.667-32.167-12-47.5c-5.333-15.333-11.917-30.333-19.75-45s-16.917-29.833-27.25-45.5c-2.333-3.667-4-6.667-5-9s-1.5-5.667-1.5-10c0-8.667 3.083-16.25 9.25-22.75s13.75-9.75 22.75-9.75c5.667 0 10.417 1.167 14.25 3.5s7.583 5.5 11.25 9.5c12.333 14.333 23.25 30.833 32.75 49.5s17.417 38.25 23.75 58.75c6.33 20.5 11.17 41.167 14.5 62s5 40.583 5 59.25z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["repeat"],"grid":64},"attrs":[],"properties":{"order":253,"id":36,"name":"repeat","prevSize":64,"code":59669},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["space"],"defaultCode":32,"grid":64},"attrs":[],"properties":{"id":37,"order":159,"prevSize":64,"code":32,"name":"space"},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M416 449q-13 0-23 9t-9 22q1 14 10 23t22 9h192q13 0 23-9t10-23q0-13-10-22t-23-9h-192zM96 193q0-41 28-69t69-28h638q41 0 69 28t28 69v63q0 43-31 72v424q0 73-52 125-52 51-124 51h-418q-72 0-124-51-52-52-52-125v-424q-31-29-31-72v-63zM193 352v400q0 47 32 79 33 33 78 33h418q45 0 78-33 32-32 32-79v-400h-638zM193 160q-15 0-24 9t-9 24v63q0 12 9 23 9 10 24 10h638q15 0 24-10 9-11 9-23v-63q0-15-9-24t-24-9h-638z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE066"],"defaultCode":57446,"grid":64},"attrs":[],"properties":{"id":38,"order":160,"ligatures":"","prevSize":64,"code":57446,"name":"uniE066"},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M438 475q-12 0-19 7t-7 19q0 11 7 19t19 8h137q19-14 37-24 2-12-6-21-8-8-20-8h-148zM330 838h155q9 28 25 53h-180q-64 0-109-45t-45-111v-366q-20-11-32-29-11-18-11-41v-86q0-33 24-56 23-24 56-24h598q33 0 56 24 24 23 24 56v86q0 23-11 41-12 18-32 29v118q-27-8-53-14v-94h-566v356q0 43 30 73t71 30zM213 186q-10 0-18 9-9 8-9 18v86q0 10 9 18 8 9 18 9h598q10 0 18-9 9-8 9-18v-86q0-10-9-18-8-9-18-9h-598zM981 748q0 63-32 116-31 54-85 85-53 32-118 32-64 0-117-32-54-31-85-85-32-53-32-118 0-64 32-117 31-54 85-85 53-32 117-32 65 0 118 32 54 31 85 85 32 53 32 119zM676 676q6-6 6-14 0-9-6-15t-14-6q-9 0-15 6l-65 64q-7 6-7 14t7 16l65 64q6 6 15 6 8 0 14-6t6-15q0-10-6-16l-27-26h119q35 0 60 24 26 25 26 59 0 13 10 19t22 0q11-6 11-19-2-53-39-90-37-36-90-36h-119z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE06C"],"defaultCode":57452,"grid":64},"attrs":[],"properties":{"id":39,"order":161,"ligatures":"","prevSize":64,"code":57452,"name":"uniE06C"},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M512 63q12 0 23 10 10 9 10 23v64q0 14-10 23-11 10-23 10t-23-10q-10-9-10-23v-64q0-14 10-23 11-10 23-10zM512 705q80 0 136-57 57-56 57-136t-57-136q-56-57-136-57t-136 57q-57 56-57 136t57 136q56 57 136 57zM512 639q-53 2-90-36t-37-91 37-91 90-38 90 38 38 91-37 90-91 37zM928 545q14 0 23-10 10-11 10-23t-10-23q-9-10-23-10h-64q-14 0-23 10-10 11-10 23t10 23q9 10 23 10h64zM512 831q12 0 23 10 10 9 10 23v64q0 14-10 23-11 10-23 10t-23-10q-10-9-10-23v-64q0-14 10-23 11-10 23-10zM160 545q14 0 23-10 10-11 10-23t-10-23q-9-10-23-10h-64q-14 0-23 10-10 11-10 23t10 23q9 10 23 10h64zM201 201q10-8 23-8 14 0 22 8l65 65q13 13 7 30-5 17-22 22-17 6-30-7l-65-65q-8-8-8-22 0-13 8-23v0zM246 823q-8 8-22 8-13 0-22-9t-9-22q0-14 8-22l65-65q13-13 30-7 17 5 22 22 6 17-7 30zM823 201q-10-8-23-8-14 0-22 8l-65 65q-8 8-8 22 0 13 9 22t22 9q14 0 22-8l65-65q8-8 8-22 0-13-8-23v0zM778 823q8 8 22 8 13 0 22-9t9-22q0-14-8-22l-65-65q-8-8-22-8-13 0-22 9t-9 22q0 14 8 22z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE1F6"],"defaultCode":57846,"grid":64},"attrs":[],"properties":{"id":40,"order":162,"ligatures":"","prevSize":64,"code":57846,"name":"uniE1F6"},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M735 127q68 0 115 47t47 115v117q-27-37-66-60v-57q0-41-27-69-28-27-69-27h-446q-41 0-69 27-27 28-27 69v30h512v5q-68 10-111 61h-401v350q0 41 27 69 28 27 69 27h162q6 35 20 66h-182q-68-2-115-48t-47-114v-446q2-68 48-115t114-47h446zM864 512q0 53-38 90t-91 37-90-37-37-90 37-90 90-38 91 37 38 91zM961 801q0 65-54 108-59 52-171 52-111 0-173-52-51-43-51-108 0-41 28-69 27-27 68-27h256q39 0 68 27 29 28 29 69z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE25A"],"defaultCode":57946,"grid":64},"attrs":[],"properties":{"id":41,"order":163,"ligatures":"","prevSize":64,"code":57946,"name":"uniE25A"},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M512 102q127 0 231 72 105 72 151 191 46 118 16 242-29 124-124 209-94 85-220 102-126 16-238-41l-6-3-187 48q-12 2-21-6-10-7-12-17v-4l48-193-3-6q-36-69-43-147l-2-37q0-111 56-205 55-94 149-149 94-56 205-56zM512 154q-96 0-178 47t-131 130-49 178 45 179q4 6 4 12l-39 160 153-39h11l8 4q98 56 211 44 112-11 197-85 85-73 114-182 29-108-10-214-39-105-131-170-92-64-205-64v0zM512 281q10 0 18 8 9 8 9 18v281q0 12-9 19-8 7-18 7t-18-7q-9-7-9-17v-283q2-10 10-18 7-8 17-8zM512 741q16 0 28-10 11-10 11-26 0-17-11-28-12-11-28-11t-28 11q-11 11-11 28 0 16 11 27 12 11 28 9z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE2F4"],"defaultCode":58100,"grid":64},"attrs":[],"properties":{"id":42,"order":165,"ligatures":"","prevSize":64,"code":58100,"name":"uniE2F4"},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M590 205q0-33-23-55-22-23-55-22t-54 23q-22 21-22 54h154zM385 205q0-53 37-90t90-38 90 37 37 91h258q10 0 17 7 8 7 8 18 0 12-8 19-7 7-17 7h-55l-25 215q-24-6-51-8l25-207h-558l62 524q4 39 33 65 28 25 67 25h97q14 27 32 52h-129q-57 0-101-39t-50-97l-62-530h-53q-12 0-19-7-8-7-8-19 0-11 8-18 7-7 19-7h256zM973 741q0 64-31 117t-84 84-116 31q-62 0-115-31-54-31-84-84-31-53-31-116 0-62 31-115 30-54 84-84 53-31 115-31 63 0 116 31 53 30 84 84 31 53 31 114zM838 684q8-8 8-18 0-11-8-19-9-8-19-8t-18 8l-58 60-59-60q-8-8-18-8-11 0-19 8t-8 19q0 10 8 18l60 57-60 60q-8 8-8 18t8 19q8 8 19 8 10 0 18-8l59-60 58 60q8 8 18 8t19-8q8-9 8-19t-8-18l-60-60z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE47E"],"defaultCode":58494,"grid":64},"attrs":[],"properties":{"id":43,"order":166,"ligatures":"","prevSize":64,"code":58494,"name":"uniE47E"},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M449 705q0-27 18-46 18-18 45-19t45 18q18 20 18 47 0 26-18 45-18 18-45 18t-45-18q-18-19-18-45zM471 291q2-15 13-25 12-10 28-10t28 10q11 10 13 25l2 8v221q-4 15-15 25-12 10-28 10t-28-10q-11-10-13-25l-2-8v-213zM938 512q0 115-56 214-57 99-156 156-99 56-214 56t-214-56q-99-57-156-156-56-99-56-215t57-213q58-97 155-155 97-57 214-57t214 57q97 58 155 155 57 97 57 214zM854 512q0-92-46-171t-125-125-171-46-171 46-125 125-46 171 46 171 125 125 171 46 171-46 125-125 46-171z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE5ED"],"defaultCode":58861,"grid":64},"attrs":[],"properties":{"id":44,"order":167,"ligatures":"","prevSize":64,"code":58861,"name":"uniE5ED"},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M129 319v386q-2 53 36 90 38 36 91 36h512q53 0 91-36 38-37 36-90v-322q2-51-36-89t-91-38h-309l-72-57q-8-6-18-6h-113q-53 0-90 36-37 37-37 90v0zM193 319q0-26 18-45 18-18 45-18h100l56 45-56 51h-163v-33zM485 319h283q27 0 45 20 18 19 18 46v320q0 26-18 45-18 18-45 18h-512q-27 0-45-18-18-19-18-45v-289h176q12 0 20-8z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE643"],"defaultCode":58947,"grid":64},"attrs":[],"properties":{"id":45,"order":168,"ligatures":"","prevSize":64,"code":58947,"name":"uniE643"},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M129 256v383q-2 53 36 91t91 38h78q-10-31-12-63h-66q-27 0-45-20-18-19-18-44v-289h176q12 0 20-8l96-88h283q27 0 45 18 18 19 18 45v39q35 19 66 43v-82q0-53-38-90-38-36-91-36h-309l-72-58q-8-6-18-8h-113q-53 2-90 39t-37 90v0zM193 256q0-27 18-45t45-18h100l56 43-56 53h-163v-33zM672 961q78 0 144-39 67-39 106-106 39-66 39-144t-39-145q-39-66-106-105-66-39-144-38t-145 39q-66 38-105 104-39 67-39 145t39 144q39 67 105 106 67 39 145 39zM672 512q14 0 23 9 10 9 10 24v94h96q12 0 21 10t9 24q0 13-9 22-9 10-21 10h-96v96q0 12-10 21-9 9-22 9-14 0-24-9t-10-21v-96h-94q-15 0-24-10-9-9-9-22 0-14 9-24t24-10h96v-94q0-15 9-24t22-9z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE645"],"defaultCode":58949,"grid":64},"attrs":[],"properties":{"id":46,"order":169,"ligatures":"","prevSize":64,"code":58949,"name":"uniE645"},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M867 128q32 0 60 13 29 12 50 34 21 21 34 49 13 29 13 60v519q0 32-13 60-12 29-34 50-21 21-49 34-29 13-60 13h-711q-32 0-60-13-29-12-50-34-21-21-34-49-13-29-13-60v-519q0-32 13-60 12-29 34-50 21-21 49-34 29-13 60-13h711zM160 192q-19 0-37 7-17 8-31 21-13 13-20 31-8 17-8 37v14l448 268 448-268v-14q0-19-7-37-8-17-21-31-13-13-31-20-17-8-37-8h-704zM864 896q19 0 37-7 17-8 31-21 13-13 20-31 8-17 8-37v-423l-431 258q-8 5-17 5t-16-4l-432-259v423q0 19 7 37 8 17 21 31 13 13 31 20 17 8 37 8h704z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE715"],"defaultCode":59157,"grid":64},"attrs":[],"properties":{"id":47,"order":170,"ligatures":"","prevSize":64,"code":59157,"name":"uniE715"},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M352 704h320q13 0 23 9 9 9 9 23 0 11-7 20-8 9-19 11l-6 1h-320q-13 0-23-9-9-9-9-23 0-11 7-20 8-9 19-11zM224 448h576q13 0 23 9 9 9 9 23 0 11-7 20-8 9-19 11l-6 1h-576q-13 0-23-9-9-9-9-23 0-11 7-20 8-9 19-11zM96 192h832q13 0 23 9 9 9 9 23 0 11-7 20-8 9-19 11l-6 1h-832q-13 0-23-9-9-9-9-23 0-11 7-20 8-9 19-11z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE71C"],"defaultCode":59164,"grid":64},"attrs":[],"properties":{"id":48,"order":171,"ligatures":"","prevSize":64,"code":59164,"name":"uniE71C"},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M128 800q0-32 12-61t35-52l350-350q9-9 22-9t23 9q9 9 9 22t-9 23l-350 350q-13 13-20 31-8 17-8 36 0 20 7 38 8 17 21 30t30 21q18 7 38 7 19 0 36-6 18-7 31-21l420-411q27-27 42-63 15-35 15-73t-15-73q-14-35-40-62-25-26-60-42-34-16-73-16-40 0-76 14-35 13-64 42l-384 384q-9 9-22 9t-23-9q-9-9-9-22t9-23l384-384q20-20 40-34t43-23q22-9 46-14 24-4 52-4 53 0 100 20 46 21 81 56t55 82q20 46 20 99 0 25-5 50t-15 48q-10 24-24 45t-32 38l-419 412q-23 22-53 34-29 11-61 11-33 0-62-12-29-13-50-35-21-21-34-50-12-29-13-62z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE723"],"defaultCode":59171,"grid":64},"attrs":[],"properties":{"id":49,"order":172,"ligatures":"","prevSize":64,"code":59171,"name":"uniE723"},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M454.5 57.5q8.5-17 24.5-26.5 15.5-9 33.25-9t32.75 9q16 9.5 24.5 26.5l123.5 250.5 276.5 40q19 3 33 15 13 11.5 18.5 28.5t1.5 34q-4 18.5-18 31.5l-199.5 195 47 275q3.5 19-4 36.5-7 16-21.5 26.5t-32 12q-18.5 1.5-35.5-7.5l-247-129.5-247 129.5q-17 9-35.5 7.5-17.5-1.5-32-12t-21.5-26.5q-7-17.5-4-36.5l47.5-275-200-195q-14-13-18-31.5-4-17 1.5-34t19-28.5q14-12 33-15l276-40zM512 86l-123.5 250q-7 14.5-19.75 23.75t-28.25 11.25l-276.5 40.5 200 194.5q11.5 11.5 16.25 26.5t2.25 30.5l-47.5 275 247.5-130q14-7 29.75-7t29.75 7l247 130-47-275q-3-15.5 2-30.5t16-26.5l200-194.5-276-40.5q-16-2-28.75-11.25t-19.75-23.75z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_star_regular"],"defaultCode":59188,"grid":64},"attrs":[],"properties":{"id":50,"order":173,"ligatures":"","prevSize":64,"code":59188,"name":"ic_fluent_star_regular"},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M870 741v-209q27-14 52-32v241q0 54-38 92-38 37-91 37h-562q-53 0-91-37-38-38-38-90v-411q0-51 38-89t89-38h242q-6 24-8 51h-232q-32 0-55 23-22 22-22 53v16l358 211 74-43q24 16 53 27l-115 67q-10 6-20 2l-350-204v333q0 33 22 56 23 22 55 22h564q30 0 53-22 22-23 22-56v0zM512 281q0 63 31 116 30 54 84 84 53 31 115 31 63 0 116-31 53-30 84-84 31-53 31-115 0-63-31-116t-84-84-116-31q-62 0-115 31-54 31-84 84-31 53-31 115zM788 147q9-6 19-6t18 6l88 91q9 8 9 18t-9 18l-88 91q-8 6-18 6t-19-7q-8-8-8-18t8-18l46-47h-78q-37 0-64 26-26 27-26 64v12q0 12-8 19-7 8-18 8t-18-8q-8-7-8-17v-14q0-58 41-100t101-42h78l-46-45q-8-8-8-18t8-19z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE7AA"],"defaultCode":59306,"grid":64},"attrs":[],"properties":{"id":51,"order":174,"ligatures":"","prevSize":64,"code":59306,"name":"uniE7AA"},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M412 256h-105q-43 0-73 30-29 29-29 72v205h180q10 0 17 7 8 8 8 18v4q2 26 13 49t30 35q22 14 59 15t59-15q19-12 31-35 4-10 8-24 4-13 4-27v-2q0-10 8-18 7-7 19-7h178v-31q27-14 51-32v268q0 63-45 109-45 45-108 45h-410q-63 0-108-45-45-46-45-109v-410q0-63 45-108t108-45h113q-6 24-8 51v0zM360 614h-155v154q0 43 29 73 30 29 73 29h410q43 0 73-29 29-30 29-73v-154h-155q-5 27-17 50-16 34-47 55-37 22-88 23t-88-23q-31-21-47-55-12-23-17-50v0zM692 512q62 0 115-31 53-30 84-84 31-53 31-115 0-63-31-116t-84-84-116-31q-62 0-116 31-53 31-83 84-31 53-31 116 0 62 31 115 30 54 83 84 54 31 115 31h2zM571 299q-8-6-8-17 0-12 7-19 8-7 19-7t17 8l60 58v-144q0-10 7-17t18-7 19 7q7 7 7 17v144l59-58q6-8 18-8 11 0 18 7t7 19q0 11-8 17l-102 102q-7 9-17 9h-2q-10 0-16-9z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE7B8"],"defaultCode":59320,"grid":64},"attrs":[],"properties":{"id":52,"order":175,"ligatures":"","prevSize":64,"code":59320,"name":"uniE7B8"},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M750 512q65 0 119-32 55-31 86-87 32-55 32-120 0-64-32-118-31-55-86-86-54-32-118-32-65 0-120 32-56 31-87 86-32 54-32 118 0 65 32 120 31 56 87 87 55 32 119 32zM750 457q-60 0-109-35l256-256q31 41 35 93t-20 98q-23 46-67 73t-95 27zM858 127l-256 256q-39-55-35-123 4-67 53-116 48-48 115-53 68-5 123 36zM860 526v201q-2 25-20 42-19 17-45 17h-572q-24-2-42-20-17-18-17-43v-324l340 176q10 3 20-2l103-53q-29-14-54-35l-61 33-348-180v-41q2-25 20-42 19-17 45-17h248q4-29 15-56h-271q-47 4-79 38-31 34-31 81v428q2 47 36 80 35 33 82 33h574q47-4 79-38 31-34 31-81v-229q-24 18-53 32v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE7D0"],"defaultCode":59344,"grid":64},"attrs":[],"properties":{"id":53,"order":176,"ligatures":"","prevSize":64,"code":59344,"name":"uniE7D0"},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M319 512q0 27-18 45t-45 18-45-18-18-45 18-45 45-18 45 18 18 45zM575 512q0 27-18 45t-45 18-45-18-18-45 18-45 45-18 45 18 18 45zM768 575q27 0 45-18t18-45-18-45-45-18-45 18-18 45 18 45 45 18z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE824"],"defaultCode":59428,"grid":64},"attrs":[],"properties":{"id":54,"order":177,"ligatures":"","prevSize":64,"code":59428,"name":"uniE824"},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M289 205q10-10 9-24-1-13-10-22t-22-9q-12 0-22 8l-84 86-21-21q-8-10-21-9-14 1-23 10t-9 22q0 12 8 22l43 43q10 8 24 8 13 0 21-8zM416 768h491q13 0 22 9t10 22q1 12-7 21t-21 11h-495q-13 0-22-8t-10-20 7-23q8-10 21-12h4zM416 492h491q13 0 22 8t10 20-7 23q-8 10-21 12h-495q-13 0-22-9t-10-22q-1-12 7-21t21-11h4zM416 213h491q13 0 22 9t10 22q1 12-7 21t-21 11h-495q-13 0-22-8t-10-20 7-23q8-10 21-12h4zM289 713q10 10 10 23 0 14-10 22l-107 106q-8 10-21 10-14 0-24-10l-43-41q-14-14-9-32 5-19 24-23 18-4 30 10l21 19 84-84q10-8 23-8 14 0 22 8v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE84D"],"defaultCode":59469,"grid":64},"attrs":[],"properties":{"id":55,"order":178,"ligatures":"","prevSize":64,"code":59469,"name":"uniE84D"},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M1024 96v256q0 13-9 22-10 10-23 10h-256q-13 0-22-9-10-10-10-23t9-22q10-10 23-10h180q-27-60-70-107-42-48-96-81-53-33-115-50-62-18-127-18-56 0-110 14-53 15-101 41-48 27-89 64-41 38-72 84-19 29-33 62-4 8-7 17-2 8-6 16-6 10-12 16t-18 6q-13 0-23-9-9-10-9-23 0-6 1-10 26-75 74-138 48-62 111-108 63-45 138-71 75-25 154-25 71 0 138 18t126 52q58 33 107 83 49 49 83 111v-168q0-13 9-22 10-10 23-10t22 9q10 10 10 23zM990 672q0 8-7 25-6 17-15 35t-19 34q-9 17-14 25-36 53-83 96-46 43-101 73-54 31-115 47-61 17-125 17-69 0-135-17-65-16-123-49-57-32-106-79-48-47-83-107v156q0 13-9 22-10 10-23 10t-22-9q-10-10-10-23v-256q0-13 9-22 10-10 23-10h256q13 0 22 9 10 10 10 23t-9 22q-10 10-23 10h-187q27 60 70 107 43 48 96 81t115 50q62 18 127 18 56 0 109-14 54-14 102-41 48-26 89-64 41-37 72-84 19-29 33-62 4-8 7-17 2-8 6-16 6-10 12-16t18-6q14 0 23 9 10 9 10 23z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE895"],"defaultCode":59541,"grid":64},"attrs":[],"properties":{"id":56,"order":179,"ligatures":"","prevSize":64,"code":59541,"name":"uniE895"},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M192 251q0-52 21-98 20-45 56-79 35-34 81-54t98-20q51 0 98 20 46 19 81 53t56 80 21 98q0 33-6 63-7 30-22 59-68 11-127 46 44-28 67-71 24-44 24-96 0-39-15-73-16-34-42-60-26-25-61-40t-74-15q-40 0-75 15t-61 41-41 61-15 75q0 38 15 73 14 35 40 62 25 26 60 41 34 16 73 16 27 0 52-6 24-6 48-20-58 35-99 90h-1q-50 0-96-20-45-20-80-55-35-34-55-80-21-45-21-96v-10zM448 736q0-59 23-112 22-52 61-91t92-62q52-23 112-23 39 0 76 10t69 29 58 45q27 27 46 59 18 32 29 69 10 36 10 76 0 59-23 112-22 52-61 91t-92 62q-52 23-112 23t-112-22q-53-23-92-62t-61-91q-23-53-23-113zM0 702q0-25 10-48t28-40q17-17 40-28 22-10 47-10h279q-6 15-13 31-6 16-10 33h-253q-13 0-25 5-11 5-20 14-9 8-14 20-5 11-5 25 0 50 17 89 16 38 45 67 29 28 67 48 37 19 80 30 42 12 86 17t85 5q13 17 28 33 15 15 33 29-14 1-28 1-14 1-29 1-65 0-131-9t-126-36q-44-20-79-48-35-27-60-61-25-35-38-77-14-42-14-91zM768 768h96q13 0 22-9 10-10 10-23t-9-22q-10-10-23-10h-96v-96q0-13-9-22-10-10-23-10t-22 9q-10 10-10 23v96h-96q-13 0-22 9-10 10-10 23t9 22q10 10 23 10h96v96q0 13 9 22 10 10 23 10t22-9q10-10 10-23v-96z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE8FA"],"defaultCode":59642,"grid":64},"attrs":[],"properties":{"id":57,"order":180,"ligatures":"","prevSize":64,"code":59642,"name":"uniE8FA"},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uni0000"],"defaultCode":59648,"grid":64},"attrs":[],"properties":{"id":58,"order":181,"prevSize":64,"code":59648,"name":"uni0000"},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uni0001"],"defaultCode":59649,"grid":64},"attrs":[],"properties":{"id":59,"order":182,"prevSize":64,"code":59649,"name":"uni0001"},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE900"],"defaultCode":59650,"grid":64},"attrs":[],"properties":{"id":60,"order":183,"prevSize":64,"code":59650,"name":"uniE900"},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M0 1024v0 0 0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE901"],"defaultCode":59651,"grid":64},"attrs":[],"properties":{"id":61,"order":184,"ligatures":"","prevSize":64,"code":59651,"name":"uniE901"},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M486 1024h-486v-486h486v486zM1024 1024h-486v-486h486v486zM486 486h-486v-486h486v486zM1024 486h-486v-486h486v486z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE902"],"defaultCode":59652,"grid":64},"attrs":[],"properties":{"id":62,"order":185,"ligatures":"","prevSize":64,"code":59652,"name":"uniE902"},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M522 439v175h291q-5 29-22 67-18 38-52 72t-88 58q-53 24-129 24-65 0-123-25-58-26-101-69-43-44-68-103t-25-126 25-126 68-102q43-44 101-70 58-25 123-25 75 0 125 25 51 26 79 54l139-134q-33-31-72-56-38-25-81-42-43-18-90-27-48-9-100-9-106 0-199 40t-162 109q-70 70-111 164-40 93-40 199t40 199q41 94 110 163 70 70 163 110t199 40q111 0 202-37 90-37 154-103 65-67 101-159 35-92 35-201 0-25-2-45-3-21-6-40h-484z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE903"],"defaultCode":59653,"grid":64},"attrs":[],"properties":{"id":63,"order":186,"ligatures":"","prevSize":64,"code":59653,"name":"uniE903"},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M342.5 105.5q9.5 9 9.5 22.5t-9.5 22.5l-233 233.5h434.5q97.5 0 187 37.5 86 36.5 152.5 103t103 152.5q37.5 89.5 37.5 187 0 13.5-9.25 22.75t-22.75 9.25-22.75-9.25-9.25-22.75q0-84.5-32.5-162-32-74.5-89.5-132t-132-89.5q-77.5-32.5-162-32.5h-434.5l233 233.5q9.5 9 9.5 22.5t-9.25 22.75-22.75 9.25-22.5-9.5l-288-288q-9.5-9-9.5-22.5t9.5-22.5l288-288q9-9.5 22.5-9.5t22.5 9.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_arrow_reply_regular"],"defaultCode":59770,"grid":64},"attrs":[],"properties":{"id":64,"order":188,"ligatures":"","prevSize":64,"code":59770,"name":"ic_fluent_arrow_reply_regular"},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M612 657l293 293q10 11 24 11 13 0 22-10 10-9 10-22 0-14-11-24l-831-831q-10-11-24-11-13 0-22 10-10 9-10 22 0 14 11 24l293 293-5 10-180 59q-16 6-20 24-4 17 8 30l137 137-170 170-8 53 53-8 170-170 137 137q13 12 30 8 18-4 24-20l59-180zM565 610l-4 2q-12 6-16 19l-47 141-246-246 141-47q13-4 19-16l2-4zM813 477l-131 70 47 47 115-62q43-22 50-70t-28-81l-223-225q-14-15-37-23-22-8-45-4-22 4-41 17-18 14-28 32l-62 117 47 47 70-133q8-14 24-16 17-3 27 8l223 225q13 10 9 27-3 16-17 24v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE985"],"defaultCode":59781,"grid":64},"attrs":[],"properties":{"id":65,"order":189,"ligatures":"","prevSize":64,"code":59781,"name":"uniE985"},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M256 193q-27 0-45 18t-18 45v512q0 27 18 45t45 18v-223q0-41 28-68 27-28 68-28h320q41 0 68 28 28 27 28 68v223q27 0 45-18t18-45v-408q0-26-18-45l-104-104q-19-18-45-18h-23v96q0 39-29 66-28 28-67 28h-129q-39 0-68-28-29-27-29-66v-96h-63zM385 193v96q0 12 9 21t22 9h129q12 0 21-9t9-21v-96h-190zM705 831v-223q0-14-10-23-9-10-23-10h-320q-14 0-23 10-10 9-10 23v223h386zM129 256q0-53 37-90t90-37h408q53 0 92 37l102 102q37 39 37 92v408q0 53-37 90t-90 37h-512q-53 2-90-36t-37-91v-512z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEA43"],"defaultCode":59971,"grid":64},"attrs":[],"properties":{"id":66,"order":190,"ligatures":"","prevSize":64,"code":59971,"name":"uniEA43"},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M432 96q-92 0-169 45t-122 122-45 169 45 169 122 122 169 45q121 0 213-78l227 230q11 8 24 8t23-9q9-10 9-23t-8-24l-230-227q39-45 59-99 19-54 19-114 0-92-45-169t-122-122-169-45v0zM160 432q0-74 37-136 36-63 99-99 62-37 136-37t136 37q63 36 100 99 37 62 37 136t-37 136q-37 63-100 100-62 37-136 37t-136-37q-63-37-99-100-37-62-37-136v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEA7D"],"defaultCode":60029,"grid":64},"attrs":[],"properties":{"id":67,"order":191,"ligatures":"","prevSize":64,"code":60029,"name":"uniEA7D"},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M76 72q16-15 35-4l831 415q19 9 19 29t-19 29l-831 415q-19 11-35-4-17-14-10-32l124-408-124-408q-7-18 10-32v0zM248 545l-98 321 706-354-706-354 98 321h360q13 0 23 10 10 11 10 23t-10 23q-10 10-23 10h-360z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEA8E"],"defaultCode":60046,"grid":64},"attrs":[],"properties":{"id":68,"order":192,"ligatures":"","prevSize":64,"code":60046,"name":"uniEA8E"},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M288 576q-13 0-22.5 9.25t-9.5 22.75v128q0 13.5 9.5 22.75t22.75 9.25 22.5-9.25 9.25-22.75v-10.5h21.5q20 0 37.25-10t27.25-27.25 10-37.5-10-37.5-27.25-27.25-37.25-10h-53.5zM341.5 661.5h-21.5v-21.5h21.5q4.5 0 7.5 3.25t3 7.5-3 7.5-7.5 3.25zM640 608q0-13.5 9.5-22.75t22.5-9.25h64q13 0 22.5 9.25t9.5 22.75-9.5 22.75-22.5 9.25h-32v21.5h32q13 0 22.5 9.25t9.5 22.5-9.5 22.75-22.5 9.5h-32v10.5q0 13-9.25 22.5t-22.5 9.5-22.75-9.25-9.5-22.75v-128zM480 576q-13.5 0-22.75 9.25t-9.25 22.75v128q0 13.5 9.25 22.75t22.75 9.25h32q26 0 48-13t35-35 13-48-13-48-35-35-48-13h-32zM512 704v-64q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25zM128 128q0-35 17.25-64.25t46.75-46.5 64-17.25h293.5q19 0 36.75 7.25t31.25 20.75l250.5 250.5q13.5 13.5 20.75 31.25t7.25 36.75v106.5q28.5 10.5 46.25 35.25t17.75 55.25v256.5q0 31-17.75 55.75t-46.25 34.75v5.5q0 35-17.25 64.25t-46.5 46.5-64.25 17.25h-512q-34.5 0-64-17.25t-46.75-46.5-17.25-64.25v-5.5q-28.5-10-46.25-34.75t-17.75-55.75v-256.5q0-30.5 17.75-55.25t46.25-35.25v-325zM832 384h-224q-26 0-48-13t-35-35-13-48v-224h-256q-17.5 0-32 8.5t-23.25 23.25-8.75 32.25v319.5h640v-63.5zM192 896q0 17.5 8.75 32.25t23.25 23.25 32 8.5h512q17.5 0 32.25-8.5t23.25-23.25 8.5-32.25h-640zM576 77.5v210.5q0 13.5 9.5 22.75t22.5 9.25h211zM160 511.5q-13 0-22.5 9.5t-9.5 22.5v256.5q0 13 9.5 22.5t22.5 9.5h704q13 0 22.5-9.5t9.5-22.5v-256.5q0-13-9.5-22.5t-22.5-9.5h-704z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_document_pdf_regular"],"defaultCode":60048,"grid":64},"attrs":[],"properties":{"id":69,"order":193,"ligatures":"","prevSize":64,"code":60048,"name":"ic_fluent_document_pdf_regular"},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M128 192v-4q0-39 15-73 16-34 42-60 27-25 62-40 34-15 73-15 40 0 75 15t61 41 41 61 15 75-15 75-41 61-61 41-75 15-75-15-61-41-41-61-15-75zM448 192v-2q0-26-10-49-11-23-28-40-18-17-41-27t-49-10-50 10q-23 10-40 28-17 17-28 40-10 24-10 50t10 50q10 23 28 40 17 17 40 28 23 10 50 10 26 0 49-10 24-10 41-28 17-17 28-40 10-23 10-50zM640 317q0-25 10-48 11-23 28-40 18-17 41-27t49-10 49 10q24 10 41 28 17 17 28 40 10 24 10 50 0 25-10 49-10 23-27 40-17 18-40 28-22 11-48 11-28 0-52-10t-41-27q-18-18-28-42-10-23-10-52zM832 320q0-13-5-25-5-11-14-20-8-9-20-14t-25-5-25 5q-11 5-20 14-9 8-14 20-5 11-5 25 0 13 5 25t13 20q9 9 21 14 11 5 25 5 13 0 25-5 11-5 20-14 9-8 14-20 5-11 5-25zM515 384q25 0 48 10 23 11 40 28 17 18 27 41t10 49-10 50q-10 23-27 41-17 17-41 27-23 10-50 10-25 0-49-10-23-10-40-27-18-17-28-40-11-22-11-48 0-28 10-52t27-41q18-18 42-28 23-10 52-10zM96 448h235q-11 30-11 64h-224q-11 0-17 4-7 4-10 11t-4 15-1 17v17q0 30 11 57 12 26 31 48t44 39q24 17 51 27-5 16-7 32t-2 33q-37-12-72-34-35-23-61-53-27-30-43-67t-16-79v-35q0-19 7-37 8-17 21-31 13-13 31-20 17-8 37-8zM517 576q12 0 23-6 11-5 19-14t12-21q5-11 5-23 0-13-5-25-5-11-14-20-8-9-20-14t-25-5-25 5q-11 5-20 14-9 8-14 20-5 11-5 25 0 15 5 27 6 12 15 20t22 13q13 4 27 4zM832 800q0-19-4-38 29-6 53-20 25-13 42-32 18-20 27-45 10-26 10-57 0-13-9-22-10-10-23-10h-235q11-30 11-64h224q19 0 37 7 17 8 31 21 13 13 20 31 8 17 8 37 0 45-14 81-14 37-40 65-25 27-61 46-35 18-78 26 0-6 1-13v-13zM256 800q0-20 7-37 8-18 21-31t30-20q18-8 38-8h320q20 0 37 7 18 8 31 21t20 30q8 18 8 38 0 55-21 97-21 41-56 70-35 28-82 42-46 15-97 15t-97-14q-47-14-82-43-35-28-56-70t-21-97zM704 800q0-13-9-22-10-10-23-10h-320q-13 0-22 9-10 10-10 23 0 41 16 72 16 30 43 49 26 20 61 29 34 10 72 10 37 0 72-9 34-10 61-29 27-20 43-50t16-72z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEBDA"],"defaultCode":60378,"grid":64},"attrs":[],"properties":{"id":70,"order":194,"ligatures":"","prevSize":64,"code":60378,"name":"uniEBDA"},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M502 193q112 10 194 87 82 76 98 188 15 112-42 208-58 96-163 136-106 40-212 4-107-36-168-130 84-22 147-68 82-61 119-159 45-123 27-266v0zM862 512q-2-78-32-150-29-71-86-125-56-55-129-83-72-29-152-25-14 0-24 11-9 12-5 26 27 147-18 270-35 92-119 146-61 36-143 51-15 4-22 17-7 14-1 28 39 80 108 134 68 54 153 74 85 19 171 0 86-20 154-74 67-54 106-133t37-167h2z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEE44"],"defaultCode":60996,"grid":64},"attrs":[],"properties":{"id":71,"order":195,"ligatures":"","prevSize":64,"code":60996,"name":"uniEE44"},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M449 289q0-15-10-24-9-9-22-9-14 0-24 9t-10 24v94h-94q-15 0-24 10t-9 24q0 13 9 22 9 10 24 10h96v96q0 12 9 21t23 9q13 0 22-9 10-9 10-21v-96h96q12 0 21-10 9-9 9-22 0-14-9-24t-21-10h-96v-94zM416 705q100 0 180-64l246 246q8 10 21 10 14 0 24-10t10-24q0-13-10-21l-246-246q64-80 64-180 0-101-63-179-62-79-161-102-98-22-189 22t-135 134-22 188q23 99 102 162 78 64 179 64v0zM416 193q61 0 112 29 52 30 81 81 30 51 31 113 1 61-30 112-30 52-82 81-51 30-112 30-62 0-113-30-51-29-81-81-29-51-29-112 0-62 29-113 30-51 81-81 51-29 113-29v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEE8E"],"defaultCode":61070,"grid":64},"attrs":[],"properties":{"id":72,"order":196,"ligatures":"","prevSize":64,"code":61070,"name":"uniEE8E"},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M432 209v14h160v-14q0-35-24-58-23-24-56-24t-56 24q-24 23-24 58v0zM369 223v-14q0-62 42-104t101-42 101 42 42 104v14h242q12 0 22 10 9 11 9 23t-9 23q-10 10-22 10h-49l-62 528q-6 62-51 103t-106 41h-234q-61 0-106-41t-51-103l-62-528h-47q-14 0-24-10-9-11-9-23t9-23q10-10 22-10h242zM301 811q4 37 31 60 26 24 63 24h234q37 0 63-24 27-23 31-60l61-522h-542zM416 399q14 0 23 10 10 9 10 23v320q0 14-10 23-9 9-22 9-14 0-24-9t-10-23v-320q2-14 11-23 9-10 22-10v0zM641 432q0-14-10-23-10-10-24-10-13 0-22 10-10 9-10 23v320q0 14 10 23 9 9 22 9 14 0 24-9t10-23v-320z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEEA6"],"defaultCode":61094,"grid":64},"attrs":[],"properties":{"id":73,"order":197,"ligatures":"","prevSize":64,"code":61094,"name":"uniEEA6"},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M258 303q-43 25-90 15-47-9-77-48t-26-87q3-48 36-82 34-33 82-36 48-4 87 26t48 77q10 47-15 88l143 145q31-18 66-18t66 18l143-145q-25-41-15-88 9-47 48-77t87-26q48 3 82 36 33 34 36 82 4 48-26 87t-77 48q-47 10-90-15l-143 143q18 31 18 66t-18 66l145 143q41-25 88-15 47 9 77 48t26 87q-3 48-36 82-34 33-82 36-48 4-87-26t-48-77q-10-47 15-90l-143-143q-31 18-66 18t-66-18l-143 143q25 43 15 90-9 47-48 77t-87 26q-48-3-82-36-33-34-36-82-4-48 26-87t77-48q47-10 90 15l143-143q-18-31-17-66t17-66zM256 193q0-27-18-47-19-19-45-19-27 0-46 19-18 20-18 47 0 26 18 45 19 18 46 18 26 0 45-18 18-19 18-45v0zM256 831q0-26-18-45-19-18-45-18-27 0-46 18-18 19-19 45-1 27 18 46 20 18 47 18 26 0 45-18 18-19 18-46v0zM831 256q27 0 47-18 19-19 19-45 0-27-19-47-20-19-47-19-26 0-45 19-18 20-18 47 0 26 18 45 19 18 45 18zM897 831q0-26-19-45-20-18-47-18-26 0-45 18-18 19-18 45 0 27 18 46 19 18 45 18 27 0 47-18 19-19 19-46zM575 512q0-27-18-45t-45-18-45 18-18 45 18 45 45 18 45-18 18-45z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniEEEB"],"defaultCode":61163,"grid":64},"attrs":[],"properties":{"id":74,"order":198,"ligatures":"","prevSize":64,"code":61163,"name":"uniEEEB"},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M139 512q0-102 50-187 51-85 136-136 85-50 187-50t187 50q85 51 136 136 50 85 50 187t-50 187q-51 85-136 136-85 50-187 50t-187-50q-85-51-136-136-50-85-50-187zM512 86q-117 0-214 57-97 58-155 155-57 97-57 214t57 214q58 97 155 155 97 57 214 57t214-57q97-58 155-155 57-97 57-214t-57-214q-58-97-155-155-97-57-214-57v0zM512 575q27 0 45-18t18-45-18-45-45-18-45 18-18 45 18 45 45 18zM385 512q0 27-19 45-20 18-47 18-26 0-45-18-18-18-18-45t18-45q19-18 45-18 27 0 46 18 18 18 18 45h2zM705 575q26 0 45-18 18-18 18-45t-18-45q-19-18-45-18-27 0-46 18-18 18-18 45t18 45q19 18 46 18z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF0F4"],"defaultCode":61684,"grid":64},"attrs":[],"properties":{"id":75,"order":199,"ligatures":"","prevSize":64,"code":61684,"name":"uniF0F4"},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M512 127q0-16-12-29-13-12-30-12t-31 12q-13 13-13 29v299h-297q-18 0-31 13-12 14-12 31t12 30q13 12 29 12h299v299q0 16 13 30 14 13 31 13t30-13q12-14 12-30v-299h299q16 0 30-12 13-13 13-30t-13-31q-14-13-30-13h-299v-299z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF107"],"defaultCode":61703,"grid":64},"attrs":[],"properties":{"id":76,"order":200,"ligatures":"","prevSize":64,"code":61703,"name":"uniF107"},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M512 150q-68 0-126 32-58 33-93 92-37 64-37 142v178l-55 131h624l-57-131v-92q0-15 9-24t23-9q13 0 22 9t9 24v78l60 135q12 26-4 50-17 23-45 23h-201q-2 54-39 91-37 36-90 36t-90-36q-37-37-39-91h-199q-28 0-45-23-16-24-4-50l58-135v-164q0-97 45-174 43-74 116-115 74-41 158-41 55 0 106 18 13 5 18 16t1 23q-4 13-15 19-12 6-24 2-43-14-86-14v0zM512 854q27 0 45-19 18-20 18-47h-126q0 27 18 47 18 19 45 19v0zM651 299h-110q-15 2-22 11t-7 23q0 13 9 21t24 8h43l-72 103q-8 16 1 32 9 15 28 15h110q13-2 21-12 8-11 7-23t-10-20-22-8h-45l74-103q8-16-1-32-9-15-28-15v0zM907 86h-153q-13 2-21 11t-7 22q1 12 10 21 9 10 22 10h90l-119 188q-8 16 1 32 9 15 28 15l153-2q13 0 21-10 8-11 7-23t-10-21q-9-10-22-10h-92l121-188q8-16-2-31-10-14-27-14z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF11D"],"defaultCode":61725,"grid":64},"attrs":[],"properties":{"id":77,"order":201,"ligatures":"","prevSize":64,"code":61725,"name":"uniF11D"},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M238 512l172 172q8 8 9 21 1 12-7 22-9 10-21 11t-22-5l-234-233-4-8-2-13v6-8l2-10 6-8 228-228q8-8 20-9t22 7q9 9 11 21t-6 22l-174 177h274q111 0 197 38 86 39 135 109t51 160l2 12q0 12-10 23-10 10-24 10-13 0-22-10-10-11-10-23 0-111-81-181-82-71-222-75h-290l172 172z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF176"],"defaultCode":61814,"grid":64},"attrs":[],"properties":{"id":78,"order":202,"ligatures":"","prevSize":64,"code":61814,"name":"uniF176"},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M600 231q8 9 9 20t-5 21l-174 177h82q111 0 197 38 86 39 135 109t51 160l2 12q0 12-10 23-10 10-24 10-13 0-22-10-10-11-10-23 0-111-81-181-82-71-222-75h-98l170 172q10 8 10 21 0 12-8 22t-20 11q-13 1-23-5l-235-237-2-9-3-10 3-10 6-8 227-228q10-10 24-10 13 0 21 10v0zM137 457l223-224q11-8 23-9t21 7q10 9 12 21t-6 22l-205 205 203 203q8 8 8 20 0 13-7 22-8 9-20 11t-22-4l-230-229q-8-8-9-20-1-11 5-19l227-230z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF17A"],"defaultCode":61818,"grid":64},"attrs":[],"properties":{"id":79,"order":203,"ligatures":"","prevSize":64,"code":61818,"name":"uniF17A"},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M772 64q37 0 72 15 34 15 60 41 25 26 41 60 15 34 15 72v520q0 37-15 72-15 34-41 60-26 25-60 41-34 15-72 15h-520q-37 0-72-15-34-15-60-41-25-26-41-60-15-34-15-72v-520q0-37 15-72 15-34 41-60 26-25 60-41 34-15 72-15h520zM253 128q-24 0-47 10t-40 28q-17 17-28 40-10 22-10 47v3h768v-2q0-25-10-48t-28-40q-17-17-40-28-22-10-47-10h-518zM771 896q24 0 47-10t40-28q17-17 28-40 10-22 10-47v-451h-768v450q0 25 10 48t28 40q17 17 40 28 22 10 47 10h518zM651 458q0 19 6 38 6 18 17 34t26 28 34 19q1 7 1 15 1 8 1 16v16q-1 7-2 15-19 7-34 19t-26 28q-11 15-17 34-5 18-5 38v12t1 11q-22 19-49 31-19-18-42-28t-50-10q-26 0-50 10-23 9-41 28-28-11-50-30 0-6 1-12v-11q0-20-5-39-6-18-17-34t-26-28-34-19q-1-7-1-15-1-8-1-16v-16q1-7 2-15 18-7 34-19 15-12 26-28 11-15 17-34 5-18 5-38v-12t-1-11q22-19 49-31 18 18 42 28t50 10q25 0 50-10 24-10 41-28 28 11 50 30 0 6-1 12 0 6-1 12zM560 608q0-20-14-34t-34-14-34 14-14 34 14 34 34 14 34-14 14-34z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF259"],"defaultCode":62041,"grid":64},"attrs":[],"properties":{"id":80,"order":204,"ligatures":"","prevSize":64,"code":62041,"name":"uniF259"},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M233 628q-50-13-93-43-42-30-74-70-31-41-48-90-18-49-18-101 0-44 11-86 11-41 32-77 20-36 49-66 29-29 65-51 35-21 77-32 41-12 86-12 66 0 125 25 58 25 101 68 44 44 69 102t25 125h-64q0-16-2-32t-6-32h-122q0 16 1 32t1 32q0 32-3 63-2 31-6 63v2h-172q2 14 5 28t7 28v0q-11 31-23 62-11 31-23 62zM266 192h107q-1-10-6-30-4-20-11-40t-16-37q-9-16-19-21h-1q-11 4-20 21-9 16-16 37-6 20-11 40-4 19-7 30zM98 192h103q9-58 31-112-42 15-77 44-34 29-57 68zM542 192q-22-39-57-68-34-29-77-44 21 53 30 112h104zM72 256q-4 16-6 32t-2 32 2 32 6 32h122q0-16-1-32t-1-32 1-32q0-16 1-32h-122zM381 256h-122l-2 32t-1 32 1 32q0 16 1 32h123l2-32t1-32-1-32q0-16-2-32zM1024 416v96q0 13-9 22-10 10-23 10t-22-9q-10-10-10-23v-64h-384v64q0 13-9 22-10 10-23 10t-22-9q-10-10-10-23v-96q0-13 9-22 10-10 23-10h192v-34q1-8 5-15 3-6 9-11 7-4 18-4t17 4 10 11q3 7 4 15t1 17v17h192q13 0 22 9 10 10 10 23zM99 448q22 39 56 68 35 28 77 44-21-53-30-112h-103zM1024 672q0 13-9 22-10 10-23 10h-160v128q0 13-5 25-5 11-14 20-8 9-20 14-11 5-25 5h-32q-13 0-22-9-10-10-10-23 0-11 4-17t11-10q7-3 15-4t17-1h17v-128h-160q-13 0-22-9-10-10-10-23t9-22q10-10 23-10h160q0-6 4-15t10-18 12-17 10-14h-132q-13 0-22-9-10-10-10-23t9-22q10-10 23-10h192q13 0 22 9 10 10 10 23 0 9-5 17l-52 79h153q13 0 22 9 10 10 10 23zM560 928q0 13-9 23-9 9-23 9-10 0-18-6-8-5-12-15l-40-107h-148l-40 107q-3 9-12 15-8 6-18 6-13 0-22-9-10-10-10-23 0-7 2-11l48-127q24-65 48-129l48-128q3-10 12-14 8-5 18-5t18 4q8 5 12 14 24 65 47 129 24 64 49 128l48 127q2 5 2 12zM384 635l-50 133h100z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF2B7"],"defaultCode":62135,"grid":64},"attrs":[],"properties":{"id":81,"order":205,"ligatures":"","prevSize":64,"code":62135,"name":"uniF2B7"},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M657 129q50-49 119-50 70-1 119 48t49 119q0 69-49 119l-477 479q-17 16-37 22l-254 92q-12 5-27 1-14-3-23-13t-12-23q-4-14 1-26l92-254q6-20 22-35zM850 174q-31-31-74-31t-74 31l-49 49 146 148 51-52q31-30 31-73t-31-72v0zM754 416l-146-148-383 385q-6 4-8 11l-80 223 223-80q7-2 11-8zM567 127h-471q-14 0-23 10-10 10-10 24 0 13 10 22 9 10 23 10h408zM438 256h-342q-14 0-23 9-10 9-10 23 0 13 10 22 9 9 23 9h279zM311 383h-215q-14 0-23 10-10 10-10 24 0 13 10 22 9 10 23 10h152z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF3BE"],"defaultCode":62398,"grid":64},"attrs":[],"properties":{"id":82,"order":206,"ligatures":"","prevSize":64,"code":62398,"name":"uniF3BE"},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M860 164q-37-37-87-37t-87 37l-473 473q-16 18-25 41l-59 176q-6 18 8 33 15 14 33 8l176-59q23-9 41-25l473-473q37-37 37-87t-37-87v0zM733 209q17-16 41-16 25 0 41 16t16 41q0 24-16 43l-47 45-82-82zM641 301l82 84-381 381q-8 6-16 8l-115 39 39-115q2-8 8-16z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF3DC"],"defaultCode":62428,"grid":64},"attrs":[],"properties":{"id":83,"order":207,"ligatures":"","prevSize":64,"code":62428,"name":"uniF3DC"},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M129 160q0-13 9-23t22-10h704q21 0 29 18 8 19-4 33l-176 238 176 237q12 15 4 33-8 19-29 19h-671v202q0 13-9 21-8 8-20 10h-4q-13 0-22-7t-9-20v-751zM801 193h-608v446h608l-154-205q-6-8-6-18t6-19z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF40C"],"defaultCode":62476,"grid":64},"attrs":[],"properties":{"id":84,"order":208,"ligatures":"","prevSize":64,"code":62476,"name":"uniF40C"},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M106 106l768 768q11 11 11 24t-9 23q-10 9-23 9t-24-10l-215-215h-421v202q0 13-9 21-8 8-20 10h-4q-13 0-22-7t-9-20v-692l-68-67q-12-13-8-31 4-19 23-23 18-4 30 8v0zM219 127h645q21 0 29 18 8 19-4 33l-176 238 176 237q12 15 4 33-8 19-29 19h-69l-64-66h70l-154-205q-6-8-6-18t6-19l154-204h-518zM193 283v358l356-2z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF40F"],"defaultCode":62479,"grid":64},"attrs":[],"properties":{"id":85,"order":209,"ligatures":"","prevSize":64,"code":62479,"name":"uniF40F"},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M805 193q47 0 80 32 33 33 33 78v418q0 45-33 78-33 32-80 32h-586q-47 0-80-32-33-33-33-78v-418q0-45 33-78 33-32 80-32h586zM864 391l-340 187q-10 6-22 2l-342-189v330q0 22 17 40 18 17 42 17h586q24 0 42-17 17-18 17-40v-330zM805 246h-586q-24 0-42 17-17 18-17 40v27l352 194 352-194v-27q0-22-17-40-18-17-42-17v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF509"],"defaultCode":62729,"grid":64},"attrs":[],"properties":{"id":86,"order":210,"ligatures":"","prevSize":64,"code":62729,"name":"uniF509"},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M795 111q49 0 84 34 34 35 34 84v566q0 49-34 84-35 34-84 34h-566q-49 0-84-34-34-35-34-84v-566q0-49 34-84 35-34 84-34h566zM164 795q0 26 19 46 20 19 46 19h566q26 0 46-19 19-20 19-46v-191h-194q-11 53-52 89t-94 38h-8q-55 0-97-34-42-33-55-87l-2-6h-194v191zM795 164h-566q-26 0-46 19-19 20-19 46v320h221q10 0 17 6 8 6 10 16v4q0 27 13 51 13 23 37 37 23 13 50 13t50-13q24-14 37-37 13-24 13-51 0-10 8-17 7-7 17-9h223v-320q0-26-19-46-20-19-46-19z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF516"],"defaultCode":62742,"grid":64},"attrs":[],"properties":{"id":87,"order":211,"ligatures":"","prevSize":64,"code":62742,"name":"uniF516"},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M133 348l363-215q14-8 28-2l367 217q20 12 33 33 12 20 14 43v334q0 55-38 95t-93 42h-584q-55 2-95-36t-42-93v-336q0-22 10-43 10-20 31-35l369-219zM874 465l-348 182q-12 6-24 2l-352-184v293q0 28 19 50 19 21 48 23h584q28 0 50-19 21-19 23-48v-299zM512 197l-346 206 346 179 346-181z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF522"],"defaultCode":62754,"grid":64},"attrs":[],"properties":{"id":88,"order":212,"ligatures":"","prevSize":64,"code":62754,"name":"uniF522"},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M918 332q32-15 50-45 17-31 12-67t-31-61q-25-26-61-30t-67 13q-30 18-45 51-10 26-7 52 3 25 16 47 14 21 36 35 23 13 47 14 25 1 50-9v0zM219 193h502q-8 26-6 53h-496q-24 0-42 17-17 18-17 40v27l352 194 279-153q32 20 69 22l-336 185q-10 6-22 2l-342-189v330q0 22 17 40 18 17 42 17h586q24 0 42-17 17-18 17-40v-326q27 0 54-6v332q0 45-33 78-33 32-80 32h-586q-47 0-80-32-33-33-33-78v-418q0-45 33-78 33-32 80-32v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF529"],"defaultCode":62761,"grid":64},"attrs":[],"properties":{"id":89,"order":213,"ligatures":"","prevSize":64,"code":62761,"name":"uniF529"},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M256 332q0-10 7-18 7-7 20-7h358q10 0 17 7 8 8 8 19t-8 18q-7 7-17 7h-358q-13 0-20-7t-7-17v-2zM539 461q-13 0-20 7t-7 18q0 12 7 19t18 7h104q10 0 17-7 8-7 8-19 0-11-8-18-7-7-17-7h-102zM512 639q0-10 7-17 7-8 18-8h104q10 0 17 8 8 7 8 18t-8 18q-7 8-17 8h-102q-13 0-20-8-7-7-7-17v-2zM283 461q-13 0-20 7t-7 17v154q0 12 7 19 7 8 20 8h153q10 0 18-8 7-7 7-17v-156q0-10-7-17-8-7-18-7h-153zM307 614v-102h103v102h-103zM102 256q0-43 30-73 30-29 73-29h512q43 0 73 29 29 30 29 73v51q43 0 73 30t30 73v280q0 53-38 91t-91 38h-562q-53 0-91-38t-38-89v-436zM768 256q0-20-15-36-16-15-36-15h-512q-21 0-36 15-15 16-15 36v434q0 33 22 55 23 23 55 23h564q30 0 53-23 22-22 22-55v-280q0-21-15-36-15-16-36-16v332q0 12-7 20-7 7-18 7-12 0-19-7-7-8-7-18v-436z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF565"],"defaultCode":62821,"grid":64},"attrs":[],"properties":{"id":90,"order":214,"ligatures":"","prevSize":64,"code":62821,"name":"uniF565"},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M506 117q12 0 19 8t7 18v336h336q13 0 20 8 7 9 8 20t-7 18-21 7h-336v336q0 13-7 20t-18 7-20-7q-8-7-8-20v-336h-336q-10 0-18-7t-8-18 8-20q8-8 18-8h336v-336q0-10 8-18 9-8 19-8z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF598"],"defaultCode":62872,"grid":64},"attrs":[],"properties":{"id":91,"order":215,"ligatures":"","prevSize":64,"code":62872,"name":"uniF598"},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M682 150l-137 139q-13 10-13 25 0 16 13 28l137 137q12 10 27 13h2q14-3 24-13l139-137q11-12 11-28 0-15-11-25l-139-139q-10-11-25-11-16 0-28 11zM618 492l-86-86v86h86zM532 223l113-110q27-27 65-27t64 27l137 137q27 26 27 64t-27 65l-110 113h4q39 0 65 26 27 27 25 64v223q2 39-25 65-26 27-65 25h-586q-39 0-65-26-27-25-27-64v-586q2-39 28-65 25-27 64-25h223q37-2 64 25 26 26 26 65v4zM709 545h-177v297h273q16 0 26-11 11-10 11-26v-223q0-17-11-27-10-10-26-10h-96zM182 219v273h297v-273q0-16-10-26-10-11-27-11h-223q-16 0-26 11-11 10-11 26v0zM182 545v260q0 16 11 26 10 11 26 11h260v-297h-297z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF599"],"defaultCode":62873,"grid":64},"attrs":[],"properties":{"id":92,"order":216,"ligatures":"","prevSize":64,"code":62873,"name":"uniF599"},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M512 154q-33 0-54 22-22 23-22 54 0 32 22 55 21 22 54 22t55-22q23-23 23-55 0-31-23-54-22-22-55-22zM385 229q0-51 37-89t90-38 90 38 38 90q1 53-37 91-38 37-91 37t-90-37q-37-38-37-92v0zM795 205q-23 0-38 15-16 16-15 36t16 36q14 15 36 15 21 0 36-15 16-16 15-36t-16-36q-14-15-34-15zM692 256q0-43 30-73 30-29 72-29t71 29q30 30 30 73t-30 73q-29 29-71 29t-72-29q-30-30-30-73zM180 256q0-20 15-36 14-15 35-15 22 0 37 15 16 16 15 36t-16 36q-14 15-36 15-21 0-35-15-15-16-15-36zM231 154q-43 0-73 29-31 30-30 73t31 73q29 29 71 29t73-29q31-30 31-73t-31-73q-31-29-72-29v0zM262 768q-45 2-77-29-31-30-31-73v-193q0-4 4-8t8-4h90q4-29 18-51h-108q-27 0-45 18-19 18-19 45v193q0 32 14 63 13 31 39 52 25 22 57 32t64 4q-10-22-14-49zM748 817q32 6 64-4t57-32q26-21 39-52 14-31 14-63v-193q0-27-19-45-18-18-45-18h-108q14 22 18 51h90q4 0 8 4t4 8v193q0 43-31 73-32 31-75 29-6 27-16 49v0zM371 410q-27 0-45 18-19 18-19 45v244q0 55 28 102 27 47 75 75 47 28 102 28t102-28q48-28 75-75 28-47 28-102v-244q0-27-19-45-18-18-45-18h-282zM358 473q0-4 4-8 5-4 9-4h282q4 0 9 4 4 4 4 8v244q0 63-45 108-46 45-109 45t-109-45q-45-45-45-108v-244z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF5B8"],"defaultCode":62904,"grid":64},"attrs":[],"properties":{"id":93,"order":217,"ligatures":"","prevSize":64,"code":62904,"name":"uniF5B8"},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M608 575q39 0 68 29t29 68v33q0 63-39 122-39 60-109 95-76 39-173 39t-173-39q-70-35-109-95-39-59-39-122v-33q0-39 29-68t68-29h448zM608 639h-448q-13 0-22 10t-9 23v33q0 47 30 91 29 44 85 70 61 29 140 29t140-29q56-26 86-70 31-44 31-91v-33q0-13-10-23t-23-10v0zM385 160q72 0 123 51t51 125-51 125-124 51-124-51-51-125 51-125 125-51v0zM385 223q-47 0-80 33t-33 80 33 80 79 33 79-33 33-80-33-80-80-33h2zM690 70l4 4 107 104 104-104q10-11 24-11 13 0 22 10 10 9 10 22 0 14-11 24l-104 104 104 107q8 8 9 19 2 11-5 22l-4 4q-8 8-19 9t-22-5l-108-111-107 107q-12 12-30 8-19-4-23-23-4-18 8-30l107-107-107-104q-8-8-9-20-1-11 5-21l4-4q8-8 18-9 9-2 19 3z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF5D0"],"defaultCode":62928,"grid":64},"attrs":[],"properties":{"id":94,"order":218,"ligatures":"","prevSize":64,"code":62928,"name":"uniF5D0"},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M688 123q-22-23-51-32t-58-5q-30 4-56 22-25 17-40 44l-129 241-198 80q-23 8-27 31-4 22 12 39l140 139-183 184-12 72 72-12 184-183 139 140q17 16 39 12 23-4 31-27l80-198 241-129q27-15 44-40 18-26 22-56 4-29-5-58t-32-49zM559 193q10-19 32-22 21-3 36 11l215 215q14 15 11 36-3 22-22 32l-253 137q-15 8-21 23l-61 153-250-250 153-61q15-6 23-21z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF5FF"],"defaultCode":62975,"grid":64},"attrs":[],"properties":{"id":95,"order":219,"ligatures":"","prevSize":64,"code":62975,"name":"uniF5FF"},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M416 127q-13 0-22 10t-9 24q0 13 9 22 9 10 22 10h63v638h-63q-13 0-23 10-10 9-9 22 1 14 10 23t22 9h192q13 0 23-9t10-23q0-13-10-22-10-10-23-10h-63v-638h63q13 0 23-10 10-9 10-22 0-14-10-24t-23-10h-192zM256 256h160v63h-160q-27 0-45 20-18 19-18 46v254q0 27 18 46 18 20 45 20h160v63h-160q-53 0-90-38t-37-91v-256q0-51 37-89t90-38zM768 705h-160v63h160q53 0 90-38t37-91v-256q2-51-36-89t-91-38h-160v63h160q27 0 45 20 18 19 18 46v254q0 27-18 46-18 20-45 20v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF668"],"defaultCode":63080,"grid":64},"attrs":[],"properties":{"id":96,"order":220,"ligatures":"","prevSize":64,"code":63080,"name":"uniF668"},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M451 131q8-16 25-27 18-10 37-10t36 10q16 11 24 27l95 193 213 30q18 4 33 17 16 12 22 30 6 19 1 38-5 20-19 32l-154 150 37 210q4 21-4 38-9 18-24 30t-35 13q-19 1-36-7l-190-100-190 100q-17 8-36 7-20-1-35-13t-24-30q-8-17-4-38l37-210-154-150q-14-12-19-32-5-19 1-38 6-18 22-30 15-13 33-17l213-30zM512 201l-84 170q-16 30-51 37l-187 26 136 131q26 27 20 62l-33 186 168-88q31-16 64 0l166 88-31-186q-6-35 18-62l136-131-187-26q-35-7-51-37z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF70D"],"defaultCode":63245,"grid":64},"attrs":[],"properties":{"id":97,"order":221,"ligatures":"","prevSize":64,"code":63245,"name":"uniF70D"},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M727 299q-14 14-35 14-20 0-35-14-14-14-14-35 0-20 14-35 15-14 35-14 21 0 35 14 14 15 14 35 0 21-14 35zM162 586q-37-37-37-90 0-54 37-90l305-304q37-36 90-36l209-3q53 0 91 38t38 92v217q-2 51-39 88l-299 299q-39 37-92 37t-90-37zM207 451q-19 18-19 45 0 26 19 45l213 211q18 18 45 18t45-18l301-299q18-19 18-45l2-215q0-27-19-47-19-19-46-19l-209 2q-27 0-45 18l-303 304h-2zM127 625q-12 34-4 71t35 64l125 125q36 37 84 56 47 20 97 20t97-20q47-19 84-56l223-223q27-27 27-68v-49l-295 295q-57 57-136 57t-136-57l-170-170q-21-21-31-45v0z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF7B6"],"defaultCode":63414,"grid":64},"attrs":[],"properties":{"id":98,"order":222,"ligatures":"","prevSize":64,"code":63414,"name":"uniF7B6"},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M256 512q0-13 9-23 9-9 23-9h192v-192q0-13 9-23 9-9 23-9 13 0 23 9 9 9 9 23v192h192q13 0 23 9 9 9 9 23 0 13-9 23-9 9-23 9h-192v192q0 13-9 23-9 9-23 9-13 0-23-9-9-9-9-23v-192h-192q-13 0-23-9-9-9-9-23zM512 1024q104 0 199-40 92-39 163-110t110-162q40-96 40-200t-40-199q-39-92-110-163t-162-110q-96-40-200-40t-199 40q-92 39-163 110t-110 162q-40 96-40 200t40 199q39 92 110 163t162 110q96 40 200 40zM512 960q-91 0-174-35-81-34-143-96t-96-142q-35-84-35-175t35-174q34-81 96-143t142-96q84-35 175-35t174 35q81 34 143 96t96 142q35 84 35 175t-35 174q-34 81-96 143t-142 96q-84 35-175 35z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uF002A"],"defaultCode":983082,"grid":64},"attrs":[],"properties":{"id":99,"order":223,"ligatures":"","prevSize":64,"code":983082,"name":"uF002A"},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M342.5 105.5q9.5 9 9.5 22.5t-9.5 22.5l-265 265.5 265 265.5q9.5 9 9.5 22.5t-9.25 22.75-22.75 9.25-22.5-9.5l-288-288q-9.5-9-9.5-22.5t9.5-22.5l288-288q9-9.5 22.5-9.5t22.5 9.5zM534.5 105.5q9.5 9 9.5 22.5t-9.5 22.5l-233 233.5h242.5q97.5 0 187 37.5 86 36.5 152.5 103t103 152.5q37.5 89.5 37.5 187 0 13.5-9.25 22.75t-22.75 9.25-22.75-9.25-9.25-22.75q0-84.5-32.5-162-32-74.5-89.5-132t-132-89.5q-77.5-32.5-162-32.5h-242.5l233 233.5q9.5 9 9.5 22.5t-9.25 22.75-22.75 9.25-22.5-9.5l-288-288q-9.5-9-9.5-22.5t9.5-22.5l288-288q9-9.5 22.5-9.5t22.5 9.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_arrow_reply_all_regular"],"defaultCode":983874,"grid":64},"attrs":[],"properties":{"id":100,"order":224,"ligatures":"","prevSize":64,"code":983874,"name":"ic_fluent_arrow_reply_all_regular"},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M832 32q0-13.5-9.25-22.75t-22.75-9.25-22.75 9.25-9.25 22.75v882.5l-137.5-137q-9-9.5-22.5-9.5t-22.75 9.25-9.25 22.75 9.5 22.5l192 192q9 9.5 22.5 9.5t22.5-9.5l192-192q9.5-9 9.5-22.5t-9.25-22.75-22.75-9.25-22.5 9.5l-137.5 137v-882.5zM32 128q-13.5 0-22.75 9.25t-9.25 22.75 9.25 22.75 22.75 9.25h576q13.5 0 22.75-9.25t9.25-22.75-9.25-22.75-22.75-9.25h-576zM192 352q0-13.5 9.25-22.75t22.75-9.25h384q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-384q-13.5 0-22.75-9.25t-9.25-22.75zM416 512q-13.5 0-22.75 9.25t-9.25 22.75 9.25 22.75 22.75 9.25h192q13.5 0 22.75-9.25t9.25-22.75-9.25-22.75-22.75-9.25h-192z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_arrow_sort_down_lines_regular"],"defaultCode":983946,"grid":64},"attrs":[],"properties":{"id":101,"order":225,"ligatures":"","prevSize":64,"code":983946,"name":"ic_fluent_arrow_sort_down_lines_regular"},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M286 20.5q-4-9.5-12-15t-18-5.5-18 5.5-12 15l-176 448q-4.5 12 0.75 24.25t17.5 17 24.5-0.5 17.25-17.75l42-107.5h208l42 107.5q5 12.5 17.25 17.75t24.5 0.5 17.5-17 0.75-24.25zM256 119.5l79 200.5h-158zM128 576q-13 0-22.5 9.25t-9.5 22.75 9.5 22.75 22.5 9.25h196l-222.5 334.5q-5 7-5.5 16t3.75 16.75 11.75 12.25 16.5 4.5h256q13.5 0 22.75-9.25t9.25-22.75-9.25-22.75-22.75-9.25h-196l222.5-334q5-7.5 5.5-16.5t-3.75-16.75-11.75-12.25-16.5-4.5h-256zM800 0q13.5 0 22.75 9.25t9.25 22.75v882.5l137.5-137q9-9.5 22.5-9.5t22.75 9.25 9.25 22.75-9.5 22.5l-192 192q-9 9.5-22.5 9.5t-22.5-9.5l-192-192q-9.5-9-9.5-22.5t9.25-22.75 22.75-9.25 22.5 9.5l137.5 137v-882.5q0-13.5 9.25-22.75t22.75-9.25z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_text_sort_ascending_regular"],"defaultCode":996870,"grid":64},"attrs":[],"properties":{"id":102,"order":226,"ligatures":"","prevSize":64,"code":996870,"name":"ic_fluent_text_sort_ascending_regular"},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M64 544q0-57.5 15-110.5t42-99.25 65-84.25 84.25-65 99.25-42 110.5-15 110.5 15 99.25 42 84.25 65 65 84.25 42 99.25 15 110.5-15 110.5-42 99.25-65 84.25-84.25 65-99.25 42-110.5 15-110.5-15-99.25-42-84.25-65-65-84.25-42-99.25-15-110.5zM705 273.5q-47.5-40-105.25-60.75t-119.75-20.75q-48.5 0-93.5 12.5t-84 35.5-71.25 55.25-55.25 71.25-35.5 84-12.5 93.5q0 62 20.75 119.75t60.75 105.25zM832 544q0-62-20.75-119.75t-60.75-105.25l-495.5 495.5q47.5 40 105.25 60.75t119.75 20.75q48.5 0 93.5-12.5t84-35.5 71.25-55.25 55.25-71.25 35.5-84 12.5-93.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniF140"],"defaultCode":61760,"grid":64},"attrs":[],"properties":{"id":103,"order":157,"ligatures":"","prevSize":64,"code":61760,"name":"uniF140"},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M0 992q0-13 4.25-27t7.25-26.5q11.5-47.5 24-94t24-94q-29.5-55-44.5-115t-15-122.5q0-70.5 18.25-136.25t51.5-122.75 80-103.75 103.75-80.25 122.5-51.75 136-18.25 135.75 18.25 122.25 51.75 103.75 80 80.25 103.5 51.75 122.25 18.25 135.75q0 70-18.25 135.25t-51.25 122.25-79.5 104-103.25 80.5-121.75 52-135.5 18.5q-62 0-122-14.25t-115-42.75l-238 56q-5 1-7.5 1-13.5 0-22.75-9.25t-9.25-22.75zM510 960q62 0 119.5-16t107.5-45 91.25-69.75 70.5-90.75 45.25-107.5 16-119.5-16-119.25-45.25-106.75-70.25-90.5-91-70-107.25-45-118.75-16-118.75 16-107 45-90.5 69.75-70 90.25-45.25 106.75-16 118.75q0 32.5 4 60t11.5 53.75 18 52.25 24 54.5q4 8 4 15.5 0 5.5-3 20.5t-8 34.5-10.75 42-11.25 43-10 37.25-6.5 24.75q34-8 67.25-16t67.25-16.5q17-4 35.5-9.5t36-5.5q4 0 7.5 1.25t7.5 2.75q27 12.5 52.25 22.75t50.75 17.25 52.5 11 57.5 4zM352 448q-13 0-22.5-9.5t-9.5-22.5 9.5-22.5 22.5-9.5h320q13 0 22.5 9.5t9.5 22.5-9.5 22.5-22.5 9.5h-320zM352 640q-13 0-22.5-9.5t-9.5-22.5 9.5-22.5 22.5-9.5h192q13 0 22.5 9.5t9.5 22.5-9.5 22.5-22.5 9.5h-192z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE15F"],"defaultCode":59581,"grid":64},"attrs":[],"properties":{"id":104,"order":155,"ligatures":"","prevSize":64,"code":59581,"name":"uniE15F"},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M0 395v-203q0-35 17.25-64.25t46.5-46.5 64.25-17.25h768q35 0 64.25 17.25t46.5 46.5 17.25 64.25v512q0 35-17.25 64.25t-46.5 46.5-64.25 17.25h-448v-64h448q17.5 0 32.25-8.5t23.25-23.25 8.5-32.25v-512q0-17.5-8.5-32.25t-23.25-23.25-32.25-8.5h-768q-17.5 0-32.25 8.5t-23.25 23.25-8.5 32.25v144.5q-36.5 24.5-64 58.5zM192 290v-2q0-13.5 9.25-22.75t22.75-9.25h576q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-444q-62-32-132-32-16 0-32 2zM544 512h256q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-256q-13.5 0-22.75-9.25t-9.25-22.75 9.25-22.75 22.75-9.25zM224 800q-61 0-113-30.5-50.5-30-80.5-80.5-30.5-52-30.5-113t30.5-113q30-50.5 80.5-80.5 52-30.5 113-30.5t113 30.5q50.5 30 80.5 80.5 30.5 52 30.5 113t-30.5 113q-30 50.5-80.5 80.5-52 30.5-113 30.5zM64 815.5q35 23.5 75 35.5 41.5 13 85 13t85-13q40-12 75-35.5v176.5q0 12.5-8.25 21.5t-20.5 10.25-22.25-6.25l-90-67q-8.5-6.5-19-6.5t-19 6.5l-90 67q-10 7.5-22.25 6.25t-20.5-10.25-8.25-21.5v-176.5z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_certificate_regular"],"defaultCode":60309,"grid":64},"attrs":[],"properties":{"id":105,"order":156,"ligatures":"","prevSize":64,"code":60309,"name":"ic_fluent_certificate_regular"},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M256 128q-35 0-64.25 17.25t-46.5 46.5-17.25 64.25v512q0 35 17.25 64.25t46.5 46.5 64.25 17.25h512q35 0 64.25-17.25t46.5-46.5 17.25-64.25v-160q0-13.5 9.25-22.75t22.75-9.25 22.75 9.25 9.25 22.75v160q0 52-26 97-25.5 43.5-69 69-45 26-97 26h-512q-52 0-97-26-43.5-25.5-69-69-26-45-26-97v-512q0-52 26-97 25.5-43.5 69-69 45-26 97-26h160q13.5 0 22.75 9.25t9.25 22.75-9.25 22.75-22.75 9.25h-160zM576 96q0-13.5 9.25-22.75t22.75-9.25h320q13.5 0 22.75 9.25t9.25 22.75v320q0 13.5-9.25 22.75t-22.75 9.25-22.75-9.25-9.25-22.75v-242.5l-265.5 265q-9 9.5-22.5 9.5t-22.75-9.25-9.25-22.75 9.5-22.5l265-265.5h-242.5q-13.5 0-22.75-9.25t-9.25-22.75z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["ic_fluent_open_regular"],"defaultCode":59559,"grid":64},"attrs":[],"properties":{"id":106,"order":158,"ligatures":"","prevSize":64,"code":59559,"name":"ic_fluent_open_regular"},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M192 864v-224q0-19.5-7.5-37t-20.75-30.75-30.75-20.75-37-7.5q-13 0-22.5-9.5t-9.5-22.5 9.5-22.5 22.5-9.5q19.5 0 37-7.5t30.75-20.75 20.75-30.75 7.5-37v-227.5q0-31.5 12.75-60t34-49.75 49.75-34 60-12.75q14.5 0 25 8.25t10.5 23.75q0 13-9.5 22.5t-22.5 9.5q-19.5 0-37 7.5t-30.75 20.75-20.75 30.75-7.5 37v224q0 38-16.75 71.75t-47.25 56.25q30.5 22.5 47.25 56.25t16.75 71.75v224q0 19.5 7.5 37t20.75 30.75 30.75 20.75 37 7.5q13 0 22.5 9.5t9.5 22.5q0 15.5-10.5 23.75t-25 8.25q-32.5 0-61-13t-49.75-35-33.5-51-12.25-61zM640 992q0-13 9.5-22.5t22.5-9.5q19.5 0 37-7.5t30.75-20.75 20.75-30.75 7.5-37v-224q0-38 16.75-71.75t47.25-56.25q-30.5-22.5-47.25-56.25t-16.75-71.75v-224q0-19.5-7.5-37t-20.75-30.75-30.75-20.75-37-7.5q-13 0-22.5-9.5t-9.5-22.5q0-15.5 10.5-23.75t25-8.25q32.5 0 61 13t49.75 35 33.5 51 12.25 61v224q0 19.5 7.5 37t20.75 30.75 30.75 20.75 37 7.5q13 0 22.5 9.5t9.5 22.5-9.5 22.5-22.5 9.5q-19.5 0-37 7.5t-30.75 20.75-20.75 30.75-7.5 37v227.5q0 31.5-12.75 60t-34 49.75-49.75 34-60 12.75q-14.5 0-25-8.25t-10.5-23.75z"],"isMulticolor":false,"isMulticolor2":false,"tags":["uniE943"],"defaultCode":59715,"grid":64,"attrs":[]},"attrs":[],"properties":{"id":513,"order":339,"ligatures":"","prevSize":64,"code":59715,"name":"uniE943"},"setIdx":0,"setId":1,"iconIdx":109}],"height":1024,"metadata":{"name":"WinoIcons"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"WinoIcons","majorVersion":1,"minorVersion":2},"metrics":{"emSize":1024,"baseline":0,"whitespace":0},"embed":false,"noie8":true,"ie7":false,"showMetrics":true,"showMetadata":false,"showVersion":true,"includeMetadata":false,"showSelector":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon","height":64,"columns":16,"margin":16,"autoHost":false,"overrideSize":"true"},"historySize":50,"showCodes":true,"gridSize":16,"showLiga":false,"quickUsageToken":{"WinoFont":"NGM2MDA2ZDBhZCMxNzM1ODE4MDQ1I0l0MmFPYTVxUDg4MHlPbU1VNDBOclhDQnF3eWY0K2NkdDNzT1BNTEw2bWEw"},"showGrid":false}} \ No newline at end of file diff --git a/WinoMail.Packaging/Package.appxmanifest b/WinoMail.Packaging/Package.appxmanifest index 4cad55ce..ceab6104 100644 --- a/WinoMail.Packaging/Package.appxmanifest +++ b/WinoMail.Packaging/Package.appxmanifest @@ -113,5 +113,6 @@ +