From 12d3814626c63c1204e048c24172a9d9c08e4bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Thu, 18 Apr 2024 01:44:37 +0200 Subject: [PATCH] Initial commit. --- .editorconfig | 290 + .gitattributes | 2 + .gitignore | 404 + Wino.BackgroundTasks/AppUpdatedTask.cs | 34 + .../Properties/AssemblyInfo.cs | 29 + Wino.BackgroundTasks/SessionConnectedTask.cs | 48 + .../Wino.BackgroundTasks.csproj | 166 + Wino.Calendar/App.xaml | 7 + Wino.Calendar/App.xaml.cs | 100 + .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1430 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 7700 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 2937 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 1647 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1255 bytes Wino.Calendar/Assets/StoreLogo.png | Bin 0 -> 1451 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 3204 bytes Wino.Calendar/MainPage.xaml | 14 + Wino.Calendar/MainPage.xaml.cs | 30 + Wino.Calendar/Package.appxmanifest | 58 + Wino.Calendar/Properties/AssemblyInfo.cs | 29 + Wino.Calendar/Properties/Default.rd.xml | 31 + Wino.Calendar/Wino.Calendar.csproj | 172 + Wino.Core.Domain/Constants.cs | 14 + Wino.Core.Domain/Entities/AccountSignature.cs | 13 + .../Entities/AddressInformation.cs | 53 + .../Entities/CustomServerInformation.cs | 49 + Wino.Core.Domain/Entities/MailAccount.cs | 78 + .../Entities/MailAccountPreferences.cs | 39 + Wino.Core.Domain/Entities/MailCopy.cs | 140 + Wino.Core.Domain/Entities/MailItemFolder.cs | 72 + Wino.Core.Domain/Entities/MergedInbox.cs | 13 + .../Entities/SystemFolderConfiguration.cs | 12 + Wino.Core.Domain/Entities/TokenInformation.cs | 26 + .../Enums/AccountAttentionReason.cs | 9 + .../Enums/AccountCreationDialogState.cs | 14 + .../Enums/AccountSynchronizerState.cs | 12 + Wino.Core.Domain/Enums/AppLanguage.cs | 16 + Wino.Core.Domain/Enums/AppThemeType.cs | 9 + .../Enums/ApplicationElementTheme.cs | 9 + .../Enums/BackgroundSynchronizationReason.cs | 8 + Wino.Core.Domain/Enums/ChangeRequestType.cs | 24 + .../Enums/CustomIncomingServerType.cs | 8 + Wino.Core.Domain/Enums/DraftCreationReason.cs | 10 + .../Enums/EditorToolbarSectionType.cs | 11 + Wino.Core.Domain/Enums/FilterOptionType.cs | 10 + Wino.Core.Domain/Enums/FolderOperation.cs | 23 + .../Enums/ImapAuthenticationMethod.cs | 13 + .../Enums/ImapConnectionSecurity.cs | 10 + .../Enums/InfoBarAnimationType.cs | 8 + Wino.Core.Domain/Enums/InfoBarMessageType.cs | 10 + Wino.Core.Domain/Enums/MailAttachmentType.cs | 16 + Wino.Core.Domain/Enums/MailImportance.cs | 9 + Wino.Core.Domain/Enums/MailListDisplayMode.cs | 9 + Wino.Core.Domain/Enums/MailMarkAsOption.cs | 9 + Wino.Core.Domain/Enums/MailOperation.cs | 49 + Wino.Core.Domain/Enums/MailProviderType.cs | 11 + Wino.Core.Domain/Enums/MenuPaneMode.cs | 8 + .../Enums/NavigationReferenceFrame.cs | 8 + Wino.Core.Domain/Enums/PickFolderReason.cs | 12 + Wino.Core.Domain/Enums/ReaderFont.cs | 15 + Wino.Core.Domain/Enums/SortingOptionType.cs | 8 + Wino.Core.Domain/Enums/SpecialFolderType.cs | 24 + Wino.Core.Domain/Enums/StorePurchaseResult.cs | 19 + .../Enums/SynchronizationCompletedState.cs | 9 + Wino.Core.Domain/Enums/SynchronizationType.cs | 11 + Wino.Core.Domain/Enums/WinoPage.cs | 25 + .../AccountSetupCanceledException.cs | 7 + .../AuthenticationAttentionException.cs | 19 + .../Exceptions/AuthenticationException.cs | 18 + ...oundTaskExecutionRequestDeniedException.cs | 9 + ...ckgroundTaskRegistrationFailedException.cs | 9 + .../ComposerMimeNotFoundException.cs | 11 + .../CustomThemeCreationFailedException.cs | 11 + .../GoogleAuthenticationException.cs | 7 + .../Exceptions/ImapClientPoolException.cs | 11 + .../Exceptions/InvalidMoveTargetException.cs | 6 + .../SynchronizerEntityNotFoundException.cs | 11 + .../Exceptions/SynchronizerException.cs | 15 + ...stemFolderConfigurationMissingException.cs | 7 + .../UnavailableSpecialFolderException.cs | 20 + ...questExecutionSynchronizationInterfaces.cs | 17 + .../Interfaces/IAccountCreationDialog.cs | 11 + .../Interfaces/IAccountMenuItem.cs | 13 + .../Interfaces/IAccountPickerDialog.cs | 6 + .../IAccountProviderDetailViewModel.cs | 17 + .../Interfaces/IAccountProviderDetails.cs | 11 + .../Interfaces/IAccountService.cs | 79 + .../Interfaces/IAppInitializerService.cs | 11 + .../Interfaces/IApplicationResourceManager.cs | 11 + .../Interfaces/IAuthenticationProvider.cs | 9 + Wino.Core.Domain/Interfaces/IAuthenticator.cs | 53 + .../Interfaces/IAutoDiscoveryService.cs | 18 + .../Interfaces/IBackgroundTaskService.cs | 19 + .../Interfaces/IClipboardService.cs | 9 + .../Interfaces/IConfigurationService.cs | 11 + .../Interfaces/IConfirmationDialog.cs | 9 + .../Interfaces/IContextMenuItemService.cs | 14 + .../Interfaces/IContextMenuProvider.cs | 30 + .../ICustomServerAccountCreationDialog.cs | 19 + Wino.Core.Domain/Interfaces/IDialogService.cs | 42 + Wino.Core.Domain/Interfaces/IDispatcher.cs | 10 + Wino.Core.Domain/Interfaces/IFileService.cs | 12 + .../Interfaces/IFolderMenuItem.cs | 30 + Wino.Core.Domain/Interfaces/IFolderService.cs | 92 + Wino.Core.Domain/Interfaces/IFontService.cs | 16 + .../Interfaces/IImapTestService.cs | 10 + .../Interfaces/IInitializeAsync.cs | 12 + .../Interfaces/IKeyPressService.cs | 8 + .../Interfaces/ILaunchProtocolService.cs | 10 + .../Interfaces/ILogInitializer.cs | 9 + Wino.Core.Domain/Interfaces/IMailService.cs | 81 + Wino.Core.Domain/Interfaces/IMenuItem.cs | 41 + Wino.Core.Domain/Interfaces/IMenuOperation.cs | 8 + .../Interfaces/INativeAppService.cs | 25 + .../Interfaces/INavigationAware.cs | 10 + .../Interfaces/INotificationBuilder.cs | 26 + .../Interfaces/IPreferencesService.cs | 144 + .../Interfaces/IProviderDetail.cs | 13 + .../Interfaces/IProviderService.cs | 11 + Wino.Core.Domain/Interfaces/IRequestBundle.cs | 60 + .../Interfaces/ISignatureService.cs | 33 + .../Interfaces/IStatePersistenceService.cs | 47 + .../Interfaces/IStoreManagementService.cs | 19 + .../Interfaces/IStoreRatingDialog.cs | 8 + .../Interfaces/IStoreRatingService.cs | 10 + .../Interfaces/ISynchronizationProgress.cs | 19 + Wino.Core.Domain/Interfaces/IThemeService.cs | 27 + .../Interfaces/IThreadingStrategy.cs | 13 + .../Interfaces/IThreadingStrategyProvider.cs | 13 + .../Interfaces/ITranslationService.cs | 13 + .../Interfaces/IUnderlyingThemeService.cs | 7 + .../Interfaces/IWinoNavigationService.cs | 18 + .../Interfaces/IWinoRequestDelegator.cs | 35 + .../Interfaces/IWinoRequestProcessor.cs | 22 + .../Accounts/ImapAuthenticationMethodModel.cs | 10 + .../Accounts/ImapConnectionSecurityModel.cs | 10 + .../Models/Accounts/ProviderDetail.cs | 47 + .../Authentication/TokenInformationBase.cs | 20 + .../GoogleAuthorizationRequest.cs | 72 + .../GoogleTokenizationRequest.cs | 27 + ...utoDiscoveryConnectionTestFailedPackage.cs | 21 + .../AutoDiscoveryMinimalSettings.cs | 9 + .../AutoDiscoveryProviderSetting.cs | 22 + .../AutoDiscovery/AutoDiscoverySettings.cs | 72 + .../Models/Comparers/DateComparer.cs | 32 + .../Models/Comparers/DateTimeComparer.cs | 16 + .../Models/Comparers/FolderNameComparer.cs | 13 + .../Models/Comparers/ListItemComparer.cs | 38 + .../Models/Comparers/NameComparer.cs | 13 + .../Models/Folders/AccountFolderTree.cs | 33 + .../Models/Folders/FolderOperationMenuItem.cs | 14 + .../Models/Folders/IMailItemFolder.cs | 31 + .../Models/MailItem/DraftCreationOptions.cs | 40 + .../MailItem/DraftPreperationRequest.cs | 23 + Wino.Core.Domain/Models/MailItem/IMailItem.cs | 33 + .../Models/MailItem/IMailItemThread.cs | 16 + .../Models/MailItem/MailDetailInformation.cs | 18 + .../Models/MailItem/MailDragPackage.cs | 25 + .../Models/MailItem/MailFolderPairMetadata.cs | 11 + .../Models/MailItem/MailInsertPackage.cs | 7 + .../MailItem/MailListInitializationOptions.cs | 15 + .../MailOperationPreperationRequest.cs | 69 + .../Models/MailItem/MimeMessageInformation.cs | 9 + .../OutlookSpecialFolderIdInformation.cs | 13 + .../MailItem/SendDraftPreparationRequest.cs | 7 + .../Models/MailItem/ThreadMailItem.cs | 87 + .../Models/Menus/MailOperationMenuItem.cs | 21 + .../Models/Menus/MenuOperationItemBase.cs | 18 + .../Navigation/NavigateMailFolderEventArgs.cs | 24 + .../Models/Navigation/NavigationMode.cs | 10 + .../Navigation/NavigationTransitionType.cs | 8 + .../Models/Personalization/AppThemeBase.cs | 29 + .../Personalization/CustomThemeMetadata.cs | 12 + .../Personalization/ElementThemeContainer.cs | 16 + .../MailListPaneLengthPreferences.cs | 4 + .../Models/Reader/EditorToolbarSection.cs | 30 + .../Models/Reader/FilterOption.cs | 16 + .../Models/Reader/MailRenderModel.cs | 25 + .../Models/Reader/MailRenderingOptions.cs | 19 + .../Models/Reader/ReaderFontModel.cs | 6 + .../Models/Reader/SortingOption.cs | 29 + .../Models/Requests/IUIMessage.cs | 10 + .../Models/Requests/RequestBase.cs | 27 + .../Models/Requests/ToggleRequestRule.cs | 15 + .../Models/Store/StoreProductType.cs | 7 + .../Synchronization/SynchronizationOptions.cs | 44 + .../Synchronization/SynchronizationResult.cs | 21 + .../Models/Translations/AppLanguageModel.cs | 6 + .../Translations/WinoTranslationDictionary.cs | 45 + .../Translations/ca_ES/resources.json | 468 + .../Translations/cs_CZ/resources.json | 468 + .../Translations/da_DK/resources.json | 468 + .../Translations/de_DE/resources.json | 468 + .../Translations/en_US/resources.json | 482 + .../Translations/es_ES/resources.json | 468 + .../Translations/fr_FR/resources.json | 468 + .../Translations/it_IT/resources.json | 468 + .../Translations/ja_JP/resources.json | 468 + .../Translations/nl_NL/resources.json | 468 + .../Translations/pl_PL/resources.json | 468 + .../Translations/ru_RU/resources.json | 468 + .../Translations/tr_TR/resources.json | 468 + .../Translations/uk_UA/resources.json | 468 + .../Translations/zh_CN/resources.json | 468 + Wino.Core.Domain/Translator.Designer.cs | 2916 ++++ Wino.Core.Domain/Translator.tt | 60 + Wino.Core.Domain/Wino.Core.Domain.csproj | 64 + Wino.Core.UWP/CoreUWPContainerSetup.cs | 27 + Wino.Core.UWP/Dispatcher.cs | 20 + .../Extensions/ElementThemeExtensions.cs | 34 + .../Models/Personalization/CustomAppTheme.cs | 31 + .../Personalization/PreDefinedAppTheme.cs | 34 + .../Models/Personalization/SystemAppTheme.cs | 13 + Wino.Core.UWP/Properties/AssemblyInfo.cs | 29 + Wino.Core.UWP/Properties/Wino.Core.UWP.rd.xml | 33 + .../Services/AppInitializerService.cs | 52 + .../Services/BackgroundSynchronizer.cs | 144 + .../Services/BackgroundTaskService.cs | 136 + Wino.Core.UWP/Services/ClipboardService.cs | 19 + .../Services/ConfigurationService.cs | 46 + Wino.Core.UWP/Services/FileService.cs | 38 + Wino.Core.UWP/Services/KeyPressService.cs | 16 + Wino.Core.UWP/Services/NativeAppService.cs | 131 + Wino.Core.UWP/Services/NotificationBuilder.cs | 195 + .../Services/StoreManagementService.cs | 73 + Wino.Core.UWP/Services/StoreRatingService.cs | 137 + Wino.Core.UWP/Services/ThemeService.cs | 446 + .../Services/UnderlyingThemeService.cs | 32 + Wino.Core.UWP/Wino.Core.UWP.csproj | 184 + Wino.Core/Authenticators/BaseAuthenticator.cs | 22 + .../Authenticators/CustomAuthenticator.cs | 34 + .../Authenticators/GmailAuthenticator.cs | 219 + .../Authenticators/Office365Authenticator.cs | 13 + .../Authenticators/OutlookAuthenticator.cs | 115 + .../Authenticators/YahooAuthenticator.cs | 40 + Wino.Core/CoreContainerSetup.cs | 46 + Wino.Core/Extensions/FolderTreeExtensions.cs | 54 + .../Extensions/GoogleIntegratorExtensions.cs | 162 + .../Extensions/HtmlAgilityPackExtensions.cs | 121 + Wino.Core/Extensions/ListExtensions.cs | 58 + Wino.Core/Extensions/LongExtensions.cs | 58 + .../Extensions/MailkitClientExtensions.cs | 187 + Wino.Core/Extensions/MailkitExtensions.cs | 22 + Wino.Core/Extensions/MimeExtensions.cs | 52 + .../Extensions/OutlookIntegratorExtensions.cs | 65 + Wino.Core/Extensions/SqlKataExtensions.cs | 15 + Wino.Core/Extensions/StringExtensions.cs | 22 + .../Extensions/TokenizationExtensions.cs | 31 + Wino.Core/GlobalSuppressions.cs | 10 + Wino.Core/Http/GmailClientMessageHandler.cs | 29 + Wino.Core/Http/MicrosoftImmutableIdHandler.cs | 19 + .../Http/MicrosoftJsonContractResolver.cs | 36 + Wino.Core/Http/MicrosoftTokenProvider.cs | 33 + Wino.Core/Integration/BaseMailIntegrator.cs | 130 + Wino.Core/Integration/ImapClientPool.cs | 179 + .../Processors/DefaultChangeProcessor.cs | 124 + .../Threading/APIThreadingStrategy.cs | 141 + .../Threading/GmailThreadingStrategy.cs | 10 + .../Threading/ImapThreadStrategy.cs | 178 + .../Threading/OutlookThreadingStrategy.cs | 14 + Wino.Core/MenuItems/AccountMenuItem.cs | 85 + .../MenuItems/FixAccountIssuesMenuItem.cs | 16 + Wino.Core/MenuItems/FolderMenuItem.cs | 75 + Wino.Core/MenuItems/ManageAccountsMenuItem.cs | 4 + Wino.Core/MenuItems/MenuItemBase.cs | 63 + Wino.Core/MenuItems/MenuItemCollection.cs | 175 + .../MenuItems/MergedAccountFolderMenuItem.cs | 110 + Wino.Core/MenuItems/MergedAccountMenuItem.cs | 55 + .../MergedAccountMoreFolderMenuItem.cs | 12 + Wino.Core/MenuItems/NewMailMenuItem.cs | 4 + .../MenuItems/ObservableRangeCollection.cs | 164 + Wino.Core/MenuItems/RateMenuItem.cs | 4 + Wino.Core/MenuItems/SeperatorItem.cs | 4 + Wino.Core/MenuItems/SettingsItem.cs | 4 + .../Accounts/AccountMenuItemExtended.cs | 14 + .../Accounts/AccountsMenuRefreshRequested.cs | 7 + .../ProtocolAuthorizationCallbackReceived.cs | 10 + .../Mails/CancelRenderingContentRequested.cs | 7 + .../Mails/ClearMailSelectionsRequested.cs | 7 + .../Mails/CreateNewComposeMailRequested.cs | 10 + .../Messages/Mails/HtmlRenderingRequested.cs | 8 + .../Mails/ImapSetupBackNavigationRequested.cs | 11 + .../Mails/ImapSetupDismissRequested.cs | 10 + .../Mails/ImapSetupNavigationRequested.cs | 11 + .../Mails/MailItemNavigationRequested.cs | 11 + .../Messages/Mails/NavigateMailFolderEvent.cs | 17 + .../Mails/RefreshUnreadCountsMessage.cs | 6 + .../Messages/Mails/SaveAsPDFRequested.cs | 11 + .../Mails/SelectedMailItemsChanged.cs | 8 + .../BackBreadcrumNavigationRequested.cs | 7 + .../BreadcrumbNavigationRequested.cs | 12 + .../Navigation/NavigateSettingsRequested.cs | 7 + .../Messages/Shell/ApplicationThemeChanged.cs | 8 + ...ateNewMailWithMultipleAccountsRequested.cs | 16 + .../Messages/Shell/InfoBarMessageRequested.cs | 17 + Wino.Core/Messages/Shell/LanguageChanged.cs | 7 + .../Shell/MailtoProtocolMessageRequested.cs | 4 + .../Shell/NavigationPaneModeChanged.cs | 10 + Wino.Core/Messages/Shell/ShellStateUpdated.cs | 7 + .../AccountSynchronizationCompleted.cs | 7 + .../AccountSynchronizerStateChanged.cs | 12 + .../NewSynchronizationRequested.cs | 10 + Wino.Core/Mime/HtmlPreviewVisitor.cs | 248 + Wino.Core/Mime/ImapMessageCreationPackage.cs | 9 + Wino.Core/Misc/RequestComparer.cs | 36 + Wino.Core/Requests/AlwaysMoveToRequest.cs | 39 + Wino.Core/Requests/Bundles/RequestBundle.cs | 59 + .../Requests/Bundles/TaskRequestBundle.cs | 24 + Wino.Core/Requests/ChangeFlagRequest.cs | 59 + Wino.Core/Requests/CreateDraftRequest.cs | 52 + Wino.Core/Requests/DeleteRequest.cs | 49 + Wino.Core/Requests/MarkReadRequest.cs | 59 + Wino.Core/Requests/MoveRequest.cs | 45 + Wino.Core/Requests/MoveToFocusedRequest.cs | 27 + Wino.Core/Requests/RenameFolderRequest.cs | 19 + Wino.Core/Requests/SendDraftRequest.cs | 41 + Wino.Core/Requests/UIMessages.cs | 25 + Wino.Core/Services/AccountService.cs | 403 + Wino.Core/Services/AuthenticationProvider.cs | 34 + Wino.Core/Services/AutoDiscoveryService.cs | 56 + Wino.Core/Services/BaseDatabaseService.cs | 22 + Wino.Core/Services/ContactService.cs | 54 + Wino.Core/Services/ContextMenuItemService.cs | 182 + Wino.Core/Services/DatabaseService.cs | 69 + Wino.Core/Services/FolderService.cs | 592 + Wino.Core/Services/FontService.cs | 50 + Wino.Core/Services/ImapTestService.cs | 53 + Wino.Core/Services/LogInitializer.cs | 41 + Wino.Core/Services/MailService.cs | 833 ++ Wino.Core/Services/MimeFileService.cs | 242 + Wino.Core/Services/ProviderService.cs | 40 + Wino.Core/Services/SignatureService.cs | 91 + .../Services/ThreadingStrategyProvider.cs | 32 + Wino.Core/Services/ThumbnailService.cs | 64 + Wino.Core/Services/TokenService.cs | 31 + Wino.Core/Services/TranslationService.cs | 84 + Wino.Core/Services/WinoRequestDelegator.cs | 154 + Wino.Core/Services/WinoRequestProcessor.cs | 239 + Wino.Core/Synchronizers/BaseSynchronizer.cs | 331 + Wino.Core/Synchronizers/GmailSynchronizer.cs | 917 ++ Wino.Core/Synchronizers/ImapSynchronizer.cs | 866 ++ .../Synchronizers/OutlookSynchronizer.cs | 632 + Wino.Core/Wino.Core.csproj | 48 + Wino.Core/WinoErrors.cs | 42 + Wino.Core/WinoSynchronizerFactory.cs | 126 + Wino.Mail.ViewModels/AboutPageViewModel.cs | 120 + .../AccountDetailsPageViewModel.cs | 158 + .../AccountManagementViewModel.cs | 377 + Wino.Mail.ViewModels/AppShellViewModel.cs | 1063 ++ Wino.Mail.ViewModels/BaseViewModel.cs | 95 + .../Collections/WinoMailCollection.cs | 467 + Wino.Mail.ViewModels/ComposePageViewModel.cs | 494 + .../Data/AccountProviderDetailViewModel.cs | 26 + .../Data/AppColorViewModel.cs | 23 + .../Data/BreadcrumbNavigationItemViewModel.cs | 33 + .../Data/FolderPivotViewModel.cs | 33 + .../Data/MailAttachmentViewModel.cs | 100 + .../Data/MailItemContainer.cs | 20 + .../Data/MailItemViewModel.cs | 106 + .../MergedAccountProviderDetailViewModel.cs | 27 + .../Data/ThreadMailItemViewModel.cs | 127 + Wino.Mail.ViewModels/GlobalSuppressions.cs | 8 + Wino.Mail.ViewModels/IdlePageViewModel.cs | 38 + Wino.Mail.ViewModels/MailListPageViewModel.cs | 922 ++ .../MailRenderingPageViewModel.cs | 619 + .../MergedAccountDetailsPageViewModel.cs | 216 + .../MessageListPageViewModel.cs | 87 + .../Messages/ActiveMailFolderChangedEvent.cs | 14 + .../Messages/ActiveMailItemChangedEvent.cs | 20 + .../Messages/MailItemSelectedEvent.cs | 19 + .../Messages/MailItemSelectionRemovedEvent.cs | 17 + .../ResetSingleMailItemSelectionEvent.cs | 19 + .../Messages/SelectMailItemContainerEvent.cs | 9 + .../NewAccountManagementPageViewModel.cs | 11 + .../PersonalizationPageViewModel.cs | 303 + .../ReadingPanePageViewModel.cs | 77 + .../SettingOptionsPageViewModel.cs | 85 + Wino.Mail.ViewModels/SettingsPageViewModel.cs | 11 + Wino.Mail.ViewModels/SettingsViewModel.cs | 11 + .../SignatureManagementPageViewModel.cs | 93 + Wino.Mail.ViewModels/WelcomePageViewModel.cs | 37 + .../Wino.Mail.ViewModels.csproj | 22 + Wino.Mail/Activation/ActivationHandler.cs | 39 + .../Activation/BackgroundActivationHandler.cs | 174 + .../Activation/DefaultActivationHandler.cs | 23 + Wino.Mail/Activation/FileActivationHandler.cs | 68 + .../Activation/ProtocolActivationHandler.cs | 56 + .../ToastNotificationActivationHandler.cs | 79 + Wino.Mail/App.xaml | 212 + Wino.Mail/App.xaml.cs | 334 + Wino.Mail/AppShell.xaml | 613 + Wino.Mail/AppShell.xaml.cs | 303 + Wino.Mail/AppThemes/Acrylic.xaml | 43 + Wino.Mail/AppThemes/Clouds.xaml | 27 + Wino.Mail/AppThemes/Custom.xaml | 53 + Wino.Mail/AppThemes/Forest.xaml | 27 + Wino.Mail/AppThemes/Garden.xaml | 27 + Wino.Mail/AppThemes/Mica.xaml | 28 + Wino.Mail/AppThemes/Nighty.xaml | 27 + Wino.Mail/AppThemes/Snowflake.xaml | 27 + Wino.Mail/AppThemes/TestTheme.xaml | 22 + Wino.Mail/Assets/BadgeLogo.scale-100.png | Bin 0 -> 228 bytes Wino.Mail/Assets/BadgeLogo.scale-125.png | Bin 0 -> 265 bytes Wino.Mail/Assets/BadgeLogo.scale-150.png | Bin 0 -> 338 bytes Wino.Mail/Assets/BadgeLogo.scale-200.png | Bin 0 -> 437 bytes Wino.Mail/Assets/BadgeLogo.scale-400.png | Bin 0 -> 903 bytes Wino.Mail/Assets/EML/eml.png | Bin 0 -> 8387 bytes Wino.Mail/Assets/FileTypes/type_archive.png | Bin 0 -> 348 bytes Wino.Mail/Assets/FileTypes/type_audio.png | Bin 0 -> 504 bytes .../Assets/FileTypes/type_executable.png | Bin 0 -> 678 bytes Wino.Mail/Assets/FileTypes/type_html.png | Bin 0 -> 591 bytes Wino.Mail/Assets/FileTypes/type_image.png | Bin 0 -> 599 bytes Wino.Mail/Assets/FileTypes/type_none.png | Bin 0 -> 1396 bytes Wino.Mail/Assets/FileTypes/type_other.png | Bin 0 -> 256 bytes Wino.Mail/Assets/FileTypes/type_pdf.png | Bin 0 -> 712 bytes Wino.Mail/Assets/FileTypes/type_rar.png | Bin 0 -> 621 bytes Wino.Mail/Assets/FileTypes/type_video.png | Bin 0 -> 413 bytes Wino.Mail/Assets/LargeTile.scale-100.png | Bin 0 -> 16019 bytes Wino.Mail/Assets/LargeTile.scale-125.png | Bin 0 -> 22931 bytes Wino.Mail/Assets/LargeTile.scale-150.png | Bin 0 -> 30328 bytes Wino.Mail/Assets/LargeTile.scale-200.png | Bin 0 -> 47742 bytes Wino.Mail/Assets/LargeTile.scale-400.png | Bin 0 -> 132614 bytes Wino.Mail/Assets/NotificationIcons/delete.png | Bin 0 -> 26317 bytes .../Assets/NotificationIcons/dismiss.png | Bin 0 -> 16527 bytes .../Assets/NotificationIcons/markread.png | Bin 0 -> 31920 bytes .../Assets/NotificationIcons/profile-dark.png | Bin 0 -> 2445 bytes .../NotificationIcons/profile-light.png | Bin 0 -> 2728 bytes Wino.Mail/Assets/Providers/Gmail.png | Bin 0 -> 4463 bytes Wino.Mail/Assets/Providers/IMAP4.png | Bin 0 -> 26087 bytes Wino.Mail/Assets/Providers/Office 365.png | Bin 0 -> 92451 bytes Wino.Mail/Assets/Providers/Outlook.png | Bin 0 -> 66213 bytes Wino.Mail/Assets/Providers/Yahoo.png | Bin 0 -> 12269 bytes Wino.Mail/Assets/ReleaseNotes/170.md | 11 + Wino.Mail/Assets/SmallTile.scale-100.png | Bin 0 -> 2829 bytes Wino.Mail/Assets/SmallTile.scale-125.png | Bin 0 -> 4153 bytes Wino.Mail/Assets/SmallTile.scale-150.png | Bin 0 -> 5332 bytes Wino.Mail/Assets/SmallTile.scale-200.png | Bin 0 -> 8445 bytes Wino.Mail/Assets/SmallTile.scale-400.png | Bin 0 -> 25168 bytes Wino.Mail/Assets/SplashScreen.scale-100.png | Bin 0 -> 16555 bytes Wino.Mail/Assets/SplashScreen.scale-125.png | Bin 0 -> 23043 bytes Wino.Mail/Assets/SplashScreen.scale-150.png | Bin 0 -> 30860 bytes Wino.Mail/Assets/SplashScreen.scale-200.png | Bin 0 -> 47925 bytes Wino.Mail/Assets/SplashScreen.scale-400.png | Bin 0 -> 134337 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 5276 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 0 -> 7321 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 0 -> 9988 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 15466 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 45566 bytes ...go.altform-lightunplated_targetsize-16.png | Bin 0 -> 764 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 0 -> 1381 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 0 -> 57423 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 0 -> 2129 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 0 -> 4106 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 764 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 57423 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 2129 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 4106 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 2276 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 3359 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 4639 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 7199 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 21457 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 568 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 956 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1381 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 38319 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1475 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 2751 bytes Wino.Mail/Assets/StoreLogo.backup.png | Bin 0 -> 1451 bytes Wino.Mail/Assets/StoreLogo.scale-100.png | Bin 0 -> 4376 bytes Wino.Mail/Assets/StoreLogo.scale-125.png | Bin 0 -> 6386 bytes Wino.Mail/Assets/StoreLogo.scale-150.png | Bin 0 -> 8367 bytes Wino.Mail/Assets/StoreLogo.scale-200.png | Bin 0 -> 13061 bytes Wino.Mail/Assets/StoreLogo.scale-400.png | Bin 0 -> 39329 bytes Wino.Mail/Assets/Thumbnails/airbnb.com.png | Bin 0 -> 2385 bytes Wino.Mail/Assets/Thumbnails/apple.com.png | Bin 0 -> 2113 bytes Wino.Mail/Assets/Thumbnails/google.com.png | Bin 0 -> 2722 bytes Wino.Mail/Assets/Thumbnails/microsoft.com.png | Bin 0 -> 574 bytes .../Assets/Thumbnails/steampowered.com.png | Bin 0 -> 3396 bytes Wino.Mail/Assets/Thumbnails/uber.com.png | Bin 0 -> 1392 bytes Wino.Mail/Assets/Thumbnails/youtube.com.png | Bin 0 -> 2641 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 0 -> 5574 bytes .../Assets/Wide310x150Logo.scale-125.png | Bin 0 -> 7905 bytes .../Assets/Wide310x150Logo.scale-150.png | Bin 0 -> 10601 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 16555 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 0 -> 47925 bytes Wino.Mail/Assets/WinoIcons.ttf | Bin 0 -> 15104 bytes Wino.Mail/BackgroundImages/Acrylic.jpg | Bin 0 -> 114756 bytes Wino.Mail/BackgroundImages/Clouds.jpg | Bin 0 -> 124682 bytes Wino.Mail/BackgroundImages/Forest.jpg | Bin 0 -> 84848 bytes Wino.Mail/BackgroundImages/Garden.jpg | Bin 0 -> 56394 bytes Wino.Mail/BackgroundImages/Mica.jpg | Bin 0 -> 91893 bytes Wino.Mail/BackgroundImages/Nighty.jpg | Bin 0 -> 985413 bytes Wino.Mail/BackgroundImages/Snowflake.jpg | Bin 0 -> 81795 bytes Wino.Mail/BasePage.cs | 78 + .../Behaviors/BindableCommandBarBehavior.cs | 202 + .../CreateMailNavigationItemBehavior.cs | 86 + Wino.Mail/Controls/AccountNavigationItem.cs | 55 + .../Controls/Advanced/WinoAppTitleBar.xaml | 110 + .../Controls/Advanced/WinoAppTitleBar.xaml.cs | 169 + Wino.Mail/Controls/Advanced/WinoListView.cs | 382 + Wino.Mail/Controls/ControlConstants.cs | 68 + Wino.Mail/Controls/ImagePreviewControl.cs | 145 + .../MailItemDisplayInformationControl.xaml | 276 + .../MailItemDisplayInformationControl.xaml.cs | 282 + Wino.Mail/Controls/RendererCommandBar.cs | 136 + Wino.Mail/Controls/SettingsMenuItemControl.cs | 73 + Wino.Mail/Controls/WinoFontIcon.cs | 96 + Wino.Mail/Controls/WinoFontIconSource.cs | 34 + Wino.Mail/Controls/WinoInfoBar.cs | 91 + Wino.Mail/Controls/WinoNavigationViewItem.cs | 47 + Wino.Mail/Controls/WinoPivotControl.xaml | 123 + Wino.Mail/Controls/WinoPivotControl.xaml.cs | 195 + Wino.Mail/Controls/WinoSwipeControlItems.cs | 82 + .../Converters/ReverseBooleanConverter.cs | 25 + .../ReverseBooleanToVisibilityConverter.cs | 23 + Wino.Mail/Dialogs/AccountCreationDialog.xaml | 59 + .../Dialogs/AccountCreationDialog.xaml.cs | 33 + Wino.Mail/Dialogs/AccountEditDialog.xaml | 19 + Wino.Mail/Dialogs/AccountEditDialog.xaml.cs | 22 + Wino.Mail/Dialogs/AccountPickerDialog.xaml | 19 + Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs | 27 + .../Dialogs/BaseAccountCreationDialog.cs | 52 + Wino.Mail/Dialogs/ConfirmationDialog.xaml | 29 + Wino.Mail/Dialogs/ConfirmationDialog.xaml.cs | 80 + .../Dialogs/CustomThemeBuilderDialog.xaml | 85 + .../Dialogs/CustomThemeBuilderDialog.xaml.cs | 65 + Wino.Mail/Dialogs/MoveMailDialog.xaml | 59 + Wino.Mail/Dialogs/MoveMailDialog.xaml.cs | 75 + Wino.Mail/Dialogs/NewAccountDialog.xaml | 79 + Wino.Mail/Dialogs/NewAccountDialog.xaml.cs | 79 + Wino.Mail/Dialogs/NewImapSetupDialog.xaml | 25 + Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs | 79 + Wino.Mail/Dialogs/StoreRatingDialog.xaml | 24 + Wino.Mail/Dialogs/StoreRatingDialog.xaml.cs | 21 + .../SystemFolderConfigurationDialog.xaml | 99 + .../SystemFolderConfigurationDialog.xaml.cs | 71 + Wino.Mail/Dialogs/TextInputDialog.xaml | 29 + Wino.Mail/Dialogs/TextInputDialog.xaml.cs | 40 + Wino.Mail/Dialogs/WinoMessageDialog.xaml | 25 + Wino.Mail/Dialogs/WinoMessageDialog.xaml.cs | 60 + Wino.Mail/Extensions/AnimationExtensions.cs | 116 + Wino.Mail/Extensions/CompositionEnums.cs | 73 + .../CompositionExtensions.Implicit.cs | 200 + .../Extensions/CompositionExtensions.Size.cs | 127 + Wino.Mail/Extensions/EnumerableExtensions.cs | 18 + Wino.Mail/Extensions/MimeKitExtensions.cs | 19 + Wino.Mail/Extensions/UIExtensions.cs | 20 + Wino.Mail/Extensions/UtilExtensions.cs | 107 + Wino.Mail/GlobalSuppressions.cs | 8 + Wino.Mail/Helpers/JsonHelpers.cs | 25 + .../Helpers/SettingsStorageExtensions.cs | 119 + Wino.Mail/Helpers/WinoVisualTreeHelper.cs | 38 + Wino.Mail/Helpers/XamlHelpers.cs | 399 + Wino.Mail/JS/Quill/Editor/full.html | 278 + Wino.Mail/JS/Quill/darkreader.js | 3187 +++++ Wino.Mail/JS/Quill/full.html | 287 + Wino.Mail/JS/Quill/highlight.min.js | 3 + Wino.Mail/JS/Quill/image-resize.min.js | 1 + Wino.Mail/JS/Quill/katex.min.css | 1 + Wino.Mail/JS/Quill/katex.min.js | 4 + Wino.Mail/JS/Quill/monokai-sublime.min.css | 1 + Wino.Mail/JS/Quill/quill.core.css | 397 + Wino.Mail/JS/Quill/quill.core.js | 8522 ++++++++++++ Wino.Mail/JS/Quill/quill.js | 11489 ++++++++++++++++ Wino.Mail/JS/Quill/quill.min.js | 8 + Wino.Mail/JS/Quill/quill.min.js.map | 1 + Wino.Mail/JS/Quill/quill.snow.css | 947 ++ Wino.Mail/JS/Quill/reader.css | 10 + Wino.Mail/JS/Quill/reader.html | 32 + .../MenuFlyouts/AccountSelectorFlyout.cs | 59 + Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs | 220 + .../MenuFlyouts/FolderOperationFlyout.cs | 28 + .../FolderOperationMenuFlyoutItem.cs | 12 + Wino.Mail/MenuFlyouts/MailOperationFlyout.cs | 28 + .../MailOperationMenuFlyoutItem.cs | 12 + Wino.Mail/MenuFlyouts/MoveButtonFlyout.cs | 88 + .../MenuFlyouts/RendererCommandBarItem.cs | 39 + Wino.Mail/MenuFlyouts/WinoOperationFlyout.cs | 50 + .../MenuFlyouts/WinoOperationFlyoutItem.cs | 58 + Wino.Mail/Package.appxmanifest | 111 + Wino.Mail/Properties/AssemblyInfo.cs | 30 + Wino.Mail/Properties/Default.rd.xml | 209 + ...ccountProviderViewModelTemplateSelector.cs | 20 + .../AppThemePreviewTemplateSelector.cs | 25 + .../Selectors/FileAttachmentTypeSelector.cs | 57 + .../MailItemContainerStyleSelector.cs | 19 + ...lItemDisplayModePreviewTemplateSelector.cs | 34 + .../Selectors/MailItemDisplaySelector.cs | 22 + .../NavigationMenuTemplateSelector.cs | 60 + .../RendererCommandBarItemTemplateSelector.cs | 84 + .../Services/ApplicationResourceManager.cs | 23 + Wino.Mail/Services/DialogService.cs | 335 + Wino.Mail/Services/LaunchProtocolService.cs | 11 + Wino.Mail/Services/PreferencesService.cs | 193 + Wino.Mail/Services/StatePersistenceService.cs | 132 + Wino.Mail/Services/ToastActivationService.cs | 20 + Wino.Mail/Services/WinoNavigationService.cs | 163 + Wino.Mail/Styles/Colors.xaml | 19 + Wino.Mail/Styles/CommandBarItems.xaml | 158 + Wino.Mail/Styles/CommandBarItems.xaml.cs | 12 + Wino.Mail/Styles/ContentPresenters.xaml | 32 + Wino.Mail/Styles/Converters.xaml | 7 + Wino.Mail/Styles/FontIcons.xaml | 29 + Wino.Mail/Styles/ImagePreviewControl.xaml | 44 + Wino.Mail/Styles/ItemContainerStyles.xaml | 291 + Wino.Mail/Styles/WinoInfoBar.xaml | 422 + Wino.Mail/Views/Abstract/AboutPageAbstract.cs | 8 + .../Abstract/AccountDetailsPageAbstract.cs | 8 + .../Abstract/AccountManagementPageAbstract.cs | 10 + Wino.Mail/Views/Abstract/AppShellAbstract.cs | 8 + .../Views/Abstract/ComposePageAbstract.cs | 8 + Wino.Mail/Views/Abstract/IdlePageAbstract.cs | 8 + .../Views/Abstract/MailListPageAbstract.cs | 9 + .../Abstract/MailRenderingPageAbstract.cs | 26 + .../MergedAccountDetailsPageAbstract.cs | 8 + .../Views/Abstract/MessageListPageAbstract.cs | 6 + .../NewAccountManagementPageAbstract.cs | 8 + .../Abstract/PersonalizationPageAbstract.cs | 10 + .../Views/Abstract/ReadingPanePageAbstract.cs | 6 + .../Abstract/SettingOptionsPageAbstract.cs | 8 + .../Views/Abstract/SettingsPageAbstract.cs | 6 + Wino.Mail/Views/Abstract/SettingsPageBase.cs | 16 + .../SignatureManagementPageAbstract.cs | 6 + .../Views/Abstract/WelcomePageAbstract.cs | 9 + .../Views/Account/AccountDetailsPage.xaml | 212 + .../Views/Account/AccountDetailsPage.xaml.cs | 30 + .../Views/Account/AccountManagementPage.xaml | 262 + .../Account/AccountManagementPage.xaml.cs | 16 + .../Account/MergedAccountDetailsPage.xaml | 169 + .../Account/MergedAccountDetailsPage.xaml.cs | 13 + Wino.Mail/Views/ComposePage.xaml | 656 + Wino.Mail/Views/ComposePage.xaml.cs | 570 + Wino.Mail/Views/IdlePage.xaml | 30 + Wino.Mail/Views/IdlePage.xaml.cs | 12 + .../ImapSetup/AdvancedImapSetupPage.xaml | 268 + .../ImapSetup/AdvancedImapSetupPage.xaml.cs | 220 + .../Views/ImapSetup/AutoDiscoveryPage.xaml | 30 + .../Views/ImapSetup/AutoDiscoveryPage.xaml.cs | 50 + .../ImapSetup/PreparingImapFoldersPage.xaml | 31 + .../PreparingImapFoldersPage.xaml.cs | 30 + .../ImapSetup/TestingImapConnectionPage.xaml | 32 + .../TestingImapConnectionPage.xaml.cs | 80 + .../Views/ImapSetup/WelcomeImapSetupPage.xaml | 101 + .../ImapSetup/WelcomeImapSetupPage.xaml.cs | 90 + Wino.Mail/Views/MailListPage.xaml | 891 ++ Wino.Mail/Views/MailListPage.xaml.cs | 536 + Wino.Mail/Views/MailRenderingPage.xaml | 359 + Wino.Mail/Views/MailRenderingPage.xaml.cs | 287 + Wino.Mail/Views/NewAccountManagementPage.xaml | 47 + .../Views/NewAccountManagementPage.xaml.cs | 111 + Wino.Mail/Views/Settings/AboutPage.xaml | 127 + Wino.Mail/Views/Settings/AboutPage.xaml.cs | 12 + Wino.Mail/Views/Settings/MessageListPage.xaml | 105 + .../Views/Settings/MessageListPage.xaml.cs | 12 + .../Views/Settings/PersonalizationPage.xaml | 306 + .../Settings/PersonalizationPage.xaml.cs | 12 + Wino.Mail/Views/Settings/ReadingPanePage.xaml | 115 + .../Views/Settings/ReadingPanePage.xaml.cs | 12 + .../Views/Settings/SettingOptionsPage.xaml | 97 + .../Views/Settings/SettingOptionsPage.xaml.cs | 19 + .../Settings/SignatureManagementPage.xaml | 284 + .../Settings/SignatureManagementPage.xaml.cs | 319 + Wino.Mail/Views/SettingsPage.xaml | 47 + Wino.Mail/Views/SettingsPage.xaml.cs | 92 + Wino.Mail/Views/WelcomePage.xaml | 28 + Wino.Mail/Views/WelcomePage.xaml.cs | 19 + Wino.Mail/Wino.Mail.csproj | 888 ++ Wino.Mail/Wino.sln | 25 + Wino.sln | 231 + crowdin.yml | 3 + 671 files changed, 77295 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Wino.BackgroundTasks/AppUpdatedTask.cs create mode 100644 Wino.BackgroundTasks/Properties/AssemblyInfo.cs create mode 100644 Wino.BackgroundTasks/SessionConnectedTask.cs create mode 100644 Wino.BackgroundTasks/Wino.BackgroundTasks.csproj create mode 100644 Wino.Calendar/App.xaml create mode 100644 Wino.Calendar/App.xaml.cs create mode 100644 Wino.Calendar/Assets/LockScreenLogo.scale-200.png create mode 100644 Wino.Calendar/Assets/SplashScreen.scale-200.png create mode 100644 Wino.Calendar/Assets/Square150x150Logo.scale-200.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.scale-200.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 Wino.Calendar/Assets/StoreLogo.png create mode 100644 Wino.Calendar/Assets/Wide310x150Logo.scale-200.png create mode 100644 Wino.Calendar/MainPage.xaml create mode 100644 Wino.Calendar/MainPage.xaml.cs create mode 100644 Wino.Calendar/Package.appxmanifest create mode 100644 Wino.Calendar/Properties/AssemblyInfo.cs create mode 100644 Wino.Calendar/Properties/Default.rd.xml create mode 100644 Wino.Calendar/Wino.Calendar.csproj create mode 100644 Wino.Core.Domain/Constants.cs create mode 100644 Wino.Core.Domain/Entities/AccountSignature.cs create mode 100644 Wino.Core.Domain/Entities/AddressInformation.cs create mode 100644 Wino.Core.Domain/Entities/CustomServerInformation.cs create mode 100644 Wino.Core.Domain/Entities/MailAccount.cs create mode 100644 Wino.Core.Domain/Entities/MailAccountPreferences.cs create mode 100644 Wino.Core.Domain/Entities/MailCopy.cs create mode 100644 Wino.Core.Domain/Entities/MailItemFolder.cs create mode 100644 Wino.Core.Domain/Entities/MergedInbox.cs create mode 100644 Wino.Core.Domain/Entities/SystemFolderConfiguration.cs create mode 100644 Wino.Core.Domain/Entities/TokenInformation.cs create mode 100644 Wino.Core.Domain/Enums/AccountAttentionReason.cs create mode 100644 Wino.Core.Domain/Enums/AccountCreationDialogState.cs create mode 100644 Wino.Core.Domain/Enums/AccountSynchronizerState.cs create mode 100644 Wino.Core.Domain/Enums/AppLanguage.cs create mode 100644 Wino.Core.Domain/Enums/AppThemeType.cs create mode 100644 Wino.Core.Domain/Enums/ApplicationElementTheme.cs create mode 100644 Wino.Core.Domain/Enums/BackgroundSynchronizationReason.cs create mode 100644 Wino.Core.Domain/Enums/ChangeRequestType.cs create mode 100644 Wino.Core.Domain/Enums/CustomIncomingServerType.cs create mode 100644 Wino.Core.Domain/Enums/DraftCreationReason.cs create mode 100644 Wino.Core.Domain/Enums/EditorToolbarSectionType.cs create mode 100644 Wino.Core.Domain/Enums/FilterOptionType.cs create mode 100644 Wino.Core.Domain/Enums/FolderOperation.cs create mode 100644 Wino.Core.Domain/Enums/ImapAuthenticationMethod.cs create mode 100644 Wino.Core.Domain/Enums/ImapConnectionSecurity.cs create mode 100644 Wino.Core.Domain/Enums/InfoBarAnimationType.cs create mode 100644 Wino.Core.Domain/Enums/InfoBarMessageType.cs create mode 100644 Wino.Core.Domain/Enums/MailAttachmentType.cs create mode 100644 Wino.Core.Domain/Enums/MailImportance.cs create mode 100644 Wino.Core.Domain/Enums/MailListDisplayMode.cs create mode 100644 Wino.Core.Domain/Enums/MailMarkAsOption.cs create mode 100644 Wino.Core.Domain/Enums/MailOperation.cs create mode 100644 Wino.Core.Domain/Enums/MailProviderType.cs create mode 100644 Wino.Core.Domain/Enums/MenuPaneMode.cs create mode 100644 Wino.Core.Domain/Enums/NavigationReferenceFrame.cs create mode 100644 Wino.Core.Domain/Enums/PickFolderReason.cs create mode 100644 Wino.Core.Domain/Enums/ReaderFont.cs create mode 100644 Wino.Core.Domain/Enums/SortingOptionType.cs create mode 100644 Wino.Core.Domain/Enums/SpecialFolderType.cs create mode 100644 Wino.Core.Domain/Enums/StorePurchaseResult.cs create mode 100644 Wino.Core.Domain/Enums/SynchronizationCompletedState.cs create mode 100644 Wino.Core.Domain/Enums/SynchronizationType.cs create mode 100644 Wino.Core.Domain/Enums/WinoPage.cs create mode 100644 Wino.Core.Domain/Exceptions/AccountSetupCanceledException.cs create mode 100644 Wino.Core.Domain/Exceptions/AuthenticationAttentionException.cs create mode 100644 Wino.Core.Domain/Exceptions/AuthenticationException.cs create mode 100644 Wino.Core.Domain/Exceptions/BackgroundTaskExecutionRequestDeniedException.cs create mode 100644 Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs create mode 100644 Wino.Core.Domain/Exceptions/ComposerMimeNotFoundException.cs create mode 100644 Wino.Core.Domain/Exceptions/CustomThemeCreationFailedException.cs create mode 100644 Wino.Core.Domain/Exceptions/GoogleAuthenticationException.cs create mode 100644 Wino.Core.Domain/Exceptions/ImapClientPoolException.cs create mode 100644 Wino.Core.Domain/Exceptions/InvalidMoveTargetException.cs create mode 100644 Wino.Core.Domain/Exceptions/SynchronizerEntityNotFoundException.cs create mode 100644 Wino.Core.Domain/Exceptions/SynchronizerException.cs create mode 100644 Wino.Core.Domain/Exceptions/SystemFolderConfigurationMissingException.cs create mode 100644 Wino.Core.Domain/Exceptions/UnavailableSpecialFolderException.cs create mode 100644 Wino.Core.Domain/Interfaces/AfterRequestExecutionSynchronizationInterfaces.cs create mode 100644 Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs create mode 100644 Wino.Core.Domain/Interfaces/IAccountMenuItem.cs create mode 100644 Wino.Core.Domain/Interfaces/IAccountPickerDialog.cs create mode 100644 Wino.Core.Domain/Interfaces/IAccountProviderDetailViewModel.cs create mode 100644 Wino.Core.Domain/Interfaces/IAccountProviderDetails.cs create mode 100644 Wino.Core.Domain/Interfaces/IAccountService.cs create mode 100644 Wino.Core.Domain/Interfaces/IAppInitializerService.cs create mode 100644 Wino.Core.Domain/Interfaces/IApplicationResourceManager.cs create mode 100644 Wino.Core.Domain/Interfaces/IAuthenticationProvider.cs create mode 100644 Wino.Core.Domain/Interfaces/IAuthenticator.cs create mode 100644 Wino.Core.Domain/Interfaces/IAutoDiscoveryService.cs create mode 100644 Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs create mode 100644 Wino.Core.Domain/Interfaces/IClipboardService.cs create mode 100644 Wino.Core.Domain/Interfaces/IConfigurationService.cs create mode 100644 Wino.Core.Domain/Interfaces/IConfirmationDialog.cs create mode 100644 Wino.Core.Domain/Interfaces/IContextMenuItemService.cs create mode 100644 Wino.Core.Domain/Interfaces/IContextMenuProvider.cs create mode 100644 Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs create mode 100644 Wino.Core.Domain/Interfaces/IDialogService.cs create mode 100644 Wino.Core.Domain/Interfaces/IDispatcher.cs create mode 100644 Wino.Core.Domain/Interfaces/IFileService.cs create mode 100644 Wino.Core.Domain/Interfaces/IFolderMenuItem.cs create mode 100644 Wino.Core.Domain/Interfaces/IFolderService.cs create mode 100644 Wino.Core.Domain/Interfaces/IFontService.cs create mode 100644 Wino.Core.Domain/Interfaces/IImapTestService.cs create mode 100644 Wino.Core.Domain/Interfaces/IInitializeAsync.cs create mode 100644 Wino.Core.Domain/Interfaces/IKeyPressService.cs create mode 100644 Wino.Core.Domain/Interfaces/ILaunchProtocolService.cs create mode 100644 Wino.Core.Domain/Interfaces/ILogInitializer.cs create mode 100644 Wino.Core.Domain/Interfaces/IMailService.cs create mode 100644 Wino.Core.Domain/Interfaces/IMenuItem.cs create mode 100644 Wino.Core.Domain/Interfaces/IMenuOperation.cs create mode 100644 Wino.Core.Domain/Interfaces/INativeAppService.cs create mode 100644 Wino.Core.Domain/Interfaces/INavigationAware.cs create mode 100644 Wino.Core.Domain/Interfaces/INotificationBuilder.cs create mode 100644 Wino.Core.Domain/Interfaces/IPreferencesService.cs create mode 100644 Wino.Core.Domain/Interfaces/IProviderDetail.cs create mode 100644 Wino.Core.Domain/Interfaces/IProviderService.cs create mode 100644 Wino.Core.Domain/Interfaces/IRequestBundle.cs create mode 100644 Wino.Core.Domain/Interfaces/ISignatureService.cs create mode 100644 Wino.Core.Domain/Interfaces/IStatePersistenceService.cs create mode 100644 Wino.Core.Domain/Interfaces/IStoreManagementService.cs create mode 100644 Wino.Core.Domain/Interfaces/IStoreRatingDialog.cs create mode 100644 Wino.Core.Domain/Interfaces/IStoreRatingService.cs create mode 100644 Wino.Core.Domain/Interfaces/ISynchronizationProgress.cs create mode 100644 Wino.Core.Domain/Interfaces/IThemeService.cs create mode 100644 Wino.Core.Domain/Interfaces/IThreadingStrategy.cs create mode 100644 Wino.Core.Domain/Interfaces/IThreadingStrategyProvider.cs create mode 100644 Wino.Core.Domain/Interfaces/ITranslationService.cs create mode 100644 Wino.Core.Domain/Interfaces/IUnderlyingThemeService.cs create mode 100644 Wino.Core.Domain/Interfaces/IWinoNavigationService.cs create mode 100644 Wino.Core.Domain/Interfaces/IWinoRequestDelegator.cs create mode 100644 Wino.Core.Domain/Interfaces/IWinoRequestProcessor.cs create mode 100644 Wino.Core.Domain/Models/Accounts/ImapAuthenticationMethodModel.cs create mode 100644 Wino.Core.Domain/Models/Accounts/ImapConnectionSecurityModel.cs create mode 100644 Wino.Core.Domain/Models/Accounts/ProviderDetail.cs create mode 100644 Wino.Core.Domain/Models/Authentication/TokenInformationBase.cs create mode 100644 Wino.Core.Domain/Models/Authorization/GoogleAuthorizationRequest.cs create mode 100644 Wino.Core.Domain/Models/Authorization/GoogleTokenizationRequest.cs create mode 100644 Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryConnectionTestFailedPackage.cs create mode 100644 Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryMinimalSettings.cs create mode 100644 Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryProviderSetting.cs create mode 100644 Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoverySettings.cs create mode 100644 Wino.Core.Domain/Models/Comparers/DateComparer.cs create mode 100644 Wino.Core.Domain/Models/Comparers/DateTimeComparer.cs create mode 100644 Wino.Core.Domain/Models/Comparers/FolderNameComparer.cs create mode 100644 Wino.Core.Domain/Models/Comparers/ListItemComparer.cs create mode 100644 Wino.Core.Domain/Models/Comparers/NameComparer.cs create mode 100644 Wino.Core.Domain/Models/Folders/AccountFolderTree.cs create mode 100644 Wino.Core.Domain/Models/Folders/FolderOperationMenuItem.cs create mode 100644 Wino.Core.Domain/Models/Folders/IMailItemFolder.cs create mode 100644 Wino.Core.Domain/Models/MailItem/DraftCreationOptions.cs create mode 100644 Wino.Core.Domain/Models/MailItem/DraftPreperationRequest.cs create mode 100644 Wino.Core.Domain/Models/MailItem/IMailItem.cs create mode 100644 Wino.Core.Domain/Models/MailItem/IMailItemThread.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MailDetailInformation.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MailDragPackage.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MailFolderPairMetadata.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MailInsertPackage.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MailOperationPreperationRequest.cs create mode 100644 Wino.Core.Domain/Models/MailItem/MimeMessageInformation.cs create mode 100644 Wino.Core.Domain/Models/MailItem/OutlookSpecialFolderIdInformation.cs create mode 100644 Wino.Core.Domain/Models/MailItem/SendDraftPreparationRequest.cs create mode 100644 Wino.Core.Domain/Models/MailItem/ThreadMailItem.cs create mode 100644 Wino.Core.Domain/Models/Menus/MailOperationMenuItem.cs create mode 100644 Wino.Core.Domain/Models/Menus/MenuOperationItemBase.cs create mode 100644 Wino.Core.Domain/Models/Navigation/NavigateMailFolderEventArgs.cs create mode 100644 Wino.Core.Domain/Models/Navigation/NavigationMode.cs create mode 100644 Wino.Core.Domain/Models/Navigation/NavigationTransitionType.cs create mode 100644 Wino.Core.Domain/Models/Personalization/AppThemeBase.cs create mode 100644 Wino.Core.Domain/Models/Personalization/CustomThemeMetadata.cs create mode 100644 Wino.Core.Domain/Models/Personalization/ElementThemeContainer.cs create mode 100644 Wino.Core.Domain/Models/Personalization/MailListPaneLengthPreferences.cs create mode 100644 Wino.Core.Domain/Models/Reader/EditorToolbarSection.cs create mode 100644 Wino.Core.Domain/Models/Reader/FilterOption.cs create mode 100644 Wino.Core.Domain/Models/Reader/MailRenderModel.cs create mode 100644 Wino.Core.Domain/Models/Reader/MailRenderingOptions.cs create mode 100644 Wino.Core.Domain/Models/Reader/ReaderFontModel.cs create mode 100644 Wino.Core.Domain/Models/Reader/SortingOption.cs create mode 100644 Wino.Core.Domain/Models/Requests/IUIMessage.cs create mode 100644 Wino.Core.Domain/Models/Requests/RequestBase.cs create mode 100644 Wino.Core.Domain/Models/Requests/ToggleRequestRule.cs create mode 100644 Wino.Core.Domain/Models/Store/StoreProductType.cs create mode 100644 Wino.Core.Domain/Models/Synchronization/SynchronizationOptions.cs create mode 100644 Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs create mode 100644 Wino.Core.Domain/Models/Translations/AppLanguageModel.cs create mode 100644 Wino.Core.Domain/Translations/WinoTranslationDictionary.cs create mode 100644 Wino.Core.Domain/Translations/ca_ES/resources.json create mode 100644 Wino.Core.Domain/Translations/cs_CZ/resources.json create mode 100644 Wino.Core.Domain/Translations/da_DK/resources.json create mode 100644 Wino.Core.Domain/Translations/de_DE/resources.json create mode 100644 Wino.Core.Domain/Translations/en_US/resources.json create mode 100644 Wino.Core.Domain/Translations/es_ES/resources.json create mode 100644 Wino.Core.Domain/Translations/fr_FR/resources.json create mode 100644 Wino.Core.Domain/Translations/it_IT/resources.json create mode 100644 Wino.Core.Domain/Translations/ja_JP/resources.json create mode 100644 Wino.Core.Domain/Translations/nl_NL/resources.json create mode 100644 Wino.Core.Domain/Translations/pl_PL/resources.json create mode 100644 Wino.Core.Domain/Translations/ru_RU/resources.json create mode 100644 Wino.Core.Domain/Translations/tr_TR/resources.json create mode 100644 Wino.Core.Domain/Translations/uk_UA/resources.json create mode 100644 Wino.Core.Domain/Translations/zh_CN/resources.json create mode 100644 Wino.Core.Domain/Translator.Designer.cs create mode 100644 Wino.Core.Domain/Translator.tt create mode 100644 Wino.Core.Domain/Wino.Core.Domain.csproj create mode 100644 Wino.Core.UWP/CoreUWPContainerSetup.cs create mode 100644 Wino.Core.UWP/Dispatcher.cs create mode 100644 Wino.Core.UWP/Extensions/ElementThemeExtensions.cs create mode 100644 Wino.Core.UWP/Models/Personalization/CustomAppTheme.cs create mode 100644 Wino.Core.UWP/Models/Personalization/PreDefinedAppTheme.cs create mode 100644 Wino.Core.UWP/Models/Personalization/SystemAppTheme.cs create mode 100644 Wino.Core.UWP/Properties/AssemblyInfo.cs create mode 100644 Wino.Core.UWP/Properties/Wino.Core.UWP.rd.xml create mode 100644 Wino.Core.UWP/Services/AppInitializerService.cs create mode 100644 Wino.Core.UWP/Services/BackgroundSynchronizer.cs create mode 100644 Wino.Core.UWP/Services/BackgroundTaskService.cs create mode 100644 Wino.Core.UWP/Services/ClipboardService.cs create mode 100644 Wino.Core.UWP/Services/ConfigurationService.cs create mode 100644 Wino.Core.UWP/Services/FileService.cs create mode 100644 Wino.Core.UWP/Services/KeyPressService.cs create mode 100644 Wino.Core.UWP/Services/NativeAppService.cs create mode 100644 Wino.Core.UWP/Services/NotificationBuilder.cs create mode 100644 Wino.Core.UWP/Services/StoreManagementService.cs create mode 100644 Wino.Core.UWP/Services/StoreRatingService.cs create mode 100644 Wino.Core.UWP/Services/ThemeService.cs create mode 100644 Wino.Core.UWP/Services/UnderlyingThemeService.cs create mode 100644 Wino.Core.UWP/Wino.Core.UWP.csproj create mode 100644 Wino.Core/Authenticators/BaseAuthenticator.cs create mode 100644 Wino.Core/Authenticators/CustomAuthenticator.cs create mode 100644 Wino.Core/Authenticators/GmailAuthenticator.cs create mode 100644 Wino.Core/Authenticators/Office365Authenticator.cs create mode 100644 Wino.Core/Authenticators/OutlookAuthenticator.cs create mode 100644 Wino.Core/Authenticators/YahooAuthenticator.cs create mode 100644 Wino.Core/CoreContainerSetup.cs create mode 100644 Wino.Core/Extensions/FolderTreeExtensions.cs create mode 100644 Wino.Core/Extensions/GoogleIntegratorExtensions.cs create mode 100644 Wino.Core/Extensions/HtmlAgilityPackExtensions.cs create mode 100644 Wino.Core/Extensions/ListExtensions.cs create mode 100644 Wino.Core/Extensions/LongExtensions.cs create mode 100644 Wino.Core/Extensions/MailkitClientExtensions.cs create mode 100644 Wino.Core/Extensions/MailkitExtensions.cs create mode 100644 Wino.Core/Extensions/MimeExtensions.cs create mode 100644 Wino.Core/Extensions/OutlookIntegratorExtensions.cs create mode 100644 Wino.Core/Extensions/SqlKataExtensions.cs create mode 100644 Wino.Core/Extensions/StringExtensions.cs create mode 100644 Wino.Core/Extensions/TokenizationExtensions.cs create mode 100644 Wino.Core/GlobalSuppressions.cs create mode 100644 Wino.Core/Http/GmailClientMessageHandler.cs create mode 100644 Wino.Core/Http/MicrosoftImmutableIdHandler.cs create mode 100644 Wino.Core/Http/MicrosoftJsonContractResolver.cs create mode 100644 Wino.Core/Http/MicrosoftTokenProvider.cs create mode 100644 Wino.Core/Integration/BaseMailIntegrator.cs create mode 100644 Wino.Core/Integration/ImapClientPool.cs create mode 100644 Wino.Core/Integration/Processors/DefaultChangeProcessor.cs create mode 100644 Wino.Core/Integration/Threading/APIThreadingStrategy.cs create mode 100644 Wino.Core/Integration/Threading/GmailThreadingStrategy.cs create mode 100644 Wino.Core/Integration/Threading/ImapThreadStrategy.cs create mode 100644 Wino.Core/Integration/Threading/OutlookThreadingStrategy.cs create mode 100644 Wino.Core/MenuItems/AccountMenuItem.cs create mode 100644 Wino.Core/MenuItems/FixAccountIssuesMenuItem.cs create mode 100644 Wino.Core/MenuItems/FolderMenuItem.cs create mode 100644 Wino.Core/MenuItems/ManageAccountsMenuItem.cs create mode 100644 Wino.Core/MenuItems/MenuItemBase.cs create mode 100644 Wino.Core/MenuItems/MenuItemCollection.cs create mode 100644 Wino.Core/MenuItems/MergedAccountFolderMenuItem.cs create mode 100644 Wino.Core/MenuItems/MergedAccountMenuItem.cs create mode 100644 Wino.Core/MenuItems/MergedAccountMoreFolderMenuItem.cs create mode 100644 Wino.Core/MenuItems/NewMailMenuItem.cs create mode 100644 Wino.Core/MenuItems/ObservableRangeCollection.cs create mode 100644 Wino.Core/MenuItems/RateMenuItem.cs create mode 100644 Wino.Core/MenuItems/SeperatorItem.cs create mode 100644 Wino.Core/MenuItems/SettingsItem.cs create mode 100644 Wino.Core/Messages/Accounts/AccountMenuItemExtended.cs create mode 100644 Wino.Core/Messages/Accounts/AccountsMenuRefreshRequested.cs create mode 100644 Wino.Core/Messages/Authorization/ProtocolAuthorizationCallbackReceived.cs create mode 100644 Wino.Core/Messages/Mails/CancelRenderingContentRequested.cs create mode 100644 Wino.Core/Messages/Mails/ClearMailSelectionsRequested.cs create mode 100644 Wino.Core/Messages/Mails/CreateNewComposeMailRequested.cs create mode 100644 Wino.Core/Messages/Mails/HtmlRenderingRequested.cs create mode 100644 Wino.Core/Messages/Mails/ImapSetupBackNavigationRequested.cs create mode 100644 Wino.Core/Messages/Mails/ImapSetupDismissRequested.cs create mode 100644 Wino.Core/Messages/Mails/ImapSetupNavigationRequested.cs create mode 100644 Wino.Core/Messages/Mails/MailItemNavigationRequested.cs create mode 100644 Wino.Core/Messages/Mails/NavigateMailFolderEvent.cs create mode 100644 Wino.Core/Messages/Mails/RefreshUnreadCountsMessage.cs create mode 100644 Wino.Core/Messages/Mails/SaveAsPDFRequested.cs create mode 100644 Wino.Core/Messages/Mails/SelectedMailItemsChanged.cs create mode 100644 Wino.Core/Messages/Navigation/BackBreadcrumNavigationRequested.cs create mode 100644 Wino.Core/Messages/Navigation/BreadcrumbNavigationRequested.cs create mode 100644 Wino.Core/Messages/Navigation/NavigateSettingsRequested.cs create mode 100644 Wino.Core/Messages/Shell/ApplicationThemeChanged.cs create mode 100644 Wino.Core/Messages/Shell/CreateNewMailWithMultipleAccountsRequested.cs create mode 100644 Wino.Core/Messages/Shell/InfoBarMessageRequested.cs create mode 100644 Wino.Core/Messages/Shell/LanguageChanged.cs create mode 100644 Wino.Core/Messages/Shell/MailtoProtocolMessageRequested.cs create mode 100644 Wino.Core/Messages/Shell/NavigationPaneModeChanged.cs create mode 100644 Wino.Core/Messages/Shell/ShellStateUpdated.cs create mode 100644 Wino.Core/Messages/Synchronization/AccountSynchronizationCompleted.cs create mode 100644 Wino.Core/Messages/Synchronization/AccountSynchronizerStateChanged.cs create mode 100644 Wino.Core/Messages/Synchronization/NewSynchronizationRequested.cs create mode 100644 Wino.Core/Mime/HtmlPreviewVisitor.cs create mode 100644 Wino.Core/Mime/ImapMessageCreationPackage.cs create mode 100644 Wino.Core/Misc/RequestComparer.cs create mode 100644 Wino.Core/Requests/AlwaysMoveToRequest.cs create mode 100644 Wino.Core/Requests/Bundles/RequestBundle.cs create mode 100644 Wino.Core/Requests/Bundles/TaskRequestBundle.cs create mode 100644 Wino.Core/Requests/ChangeFlagRequest.cs create mode 100644 Wino.Core/Requests/CreateDraftRequest.cs create mode 100644 Wino.Core/Requests/DeleteRequest.cs create mode 100644 Wino.Core/Requests/MarkReadRequest.cs create mode 100644 Wino.Core/Requests/MoveRequest.cs create mode 100644 Wino.Core/Requests/MoveToFocusedRequest.cs create mode 100644 Wino.Core/Requests/RenameFolderRequest.cs create mode 100644 Wino.Core/Requests/SendDraftRequest.cs create mode 100644 Wino.Core/Requests/UIMessages.cs create mode 100644 Wino.Core/Services/AccountService.cs create mode 100644 Wino.Core/Services/AuthenticationProvider.cs create mode 100644 Wino.Core/Services/AutoDiscoveryService.cs create mode 100644 Wino.Core/Services/BaseDatabaseService.cs create mode 100644 Wino.Core/Services/ContactService.cs create mode 100644 Wino.Core/Services/ContextMenuItemService.cs create mode 100644 Wino.Core/Services/DatabaseService.cs create mode 100644 Wino.Core/Services/FolderService.cs create mode 100644 Wino.Core/Services/FontService.cs create mode 100644 Wino.Core/Services/ImapTestService.cs create mode 100644 Wino.Core/Services/LogInitializer.cs create mode 100644 Wino.Core/Services/MailService.cs create mode 100644 Wino.Core/Services/MimeFileService.cs create mode 100644 Wino.Core/Services/ProviderService.cs create mode 100644 Wino.Core/Services/SignatureService.cs create mode 100644 Wino.Core/Services/ThreadingStrategyProvider.cs create mode 100644 Wino.Core/Services/ThumbnailService.cs create mode 100644 Wino.Core/Services/TokenService.cs create mode 100644 Wino.Core/Services/TranslationService.cs create mode 100644 Wino.Core/Services/WinoRequestDelegator.cs create mode 100644 Wino.Core/Services/WinoRequestProcessor.cs create mode 100644 Wino.Core/Synchronizers/BaseSynchronizer.cs create mode 100644 Wino.Core/Synchronizers/GmailSynchronizer.cs create mode 100644 Wino.Core/Synchronizers/ImapSynchronizer.cs create mode 100644 Wino.Core/Synchronizers/OutlookSynchronizer.cs create mode 100644 Wino.Core/Wino.Core.csproj create mode 100644 Wino.Core/WinoErrors.cs create mode 100644 Wino.Core/WinoSynchronizerFactory.cs create mode 100644 Wino.Mail.ViewModels/AboutPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/AccountManagementViewModel.cs create mode 100644 Wino.Mail.ViewModels/AppShellViewModel.cs create mode 100644 Wino.Mail.ViewModels/BaseViewModel.cs create mode 100644 Wino.Mail.ViewModels/Collections/WinoMailCollection.cs create mode 100644 Wino.Mail.ViewModels/ComposePageViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/AccountProviderDetailViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/AppColorViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/BreadcrumbNavigationItemViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/FolderPivotViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/MailAttachmentViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/MailItemContainer.cs create mode 100644 Wino.Mail.ViewModels/Data/MailItemViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/MergedAccountProviderDetailViewModel.cs create mode 100644 Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs create mode 100644 Wino.Mail.ViewModels/GlobalSuppressions.cs create mode 100644 Wino.Mail.ViewModels/IdlePageViewModel.cs create mode 100644 Wino.Mail.ViewModels/MailListPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/MailRenderingPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/MergedAccountDetailsPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/MessageListPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/Messages/ActiveMailFolderChangedEvent.cs create mode 100644 Wino.Mail.ViewModels/Messages/ActiveMailItemChangedEvent.cs create mode 100644 Wino.Mail.ViewModels/Messages/MailItemSelectedEvent.cs create mode 100644 Wino.Mail.ViewModels/Messages/MailItemSelectionRemovedEvent.cs create mode 100644 Wino.Mail.ViewModels/Messages/ResetSingleMailItemSelectionEvent.cs create mode 100644 Wino.Mail.ViewModels/Messages/SelectMailItemContainerEvent.cs create mode 100644 Wino.Mail.ViewModels/NewAccountManagementPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/PersonalizationPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/ReadingPanePageViewModel.cs create mode 100644 Wino.Mail.ViewModels/SettingOptionsPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/SettingsPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/SettingsViewModel.cs create mode 100644 Wino.Mail.ViewModels/SignatureManagementPageViewModel.cs create mode 100644 Wino.Mail.ViewModels/WelcomePageViewModel.cs create mode 100644 Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj create mode 100644 Wino.Mail/Activation/ActivationHandler.cs create mode 100644 Wino.Mail/Activation/BackgroundActivationHandler.cs create mode 100644 Wino.Mail/Activation/DefaultActivationHandler.cs create mode 100644 Wino.Mail/Activation/FileActivationHandler.cs create mode 100644 Wino.Mail/Activation/ProtocolActivationHandler.cs create mode 100644 Wino.Mail/Activation/ToastNotificationActivationHandler.cs create mode 100644 Wino.Mail/App.xaml create mode 100644 Wino.Mail/App.xaml.cs create mode 100644 Wino.Mail/AppShell.xaml create mode 100644 Wino.Mail/AppShell.xaml.cs create mode 100644 Wino.Mail/AppThemes/Acrylic.xaml create mode 100644 Wino.Mail/AppThemes/Clouds.xaml create mode 100644 Wino.Mail/AppThemes/Custom.xaml create mode 100644 Wino.Mail/AppThemes/Forest.xaml create mode 100644 Wino.Mail/AppThemes/Garden.xaml create mode 100644 Wino.Mail/AppThemes/Mica.xaml create mode 100644 Wino.Mail/AppThemes/Nighty.xaml create mode 100644 Wino.Mail/AppThemes/Snowflake.xaml create mode 100644 Wino.Mail/AppThemes/TestTheme.xaml create mode 100644 Wino.Mail/Assets/BadgeLogo.scale-100.png create mode 100644 Wino.Mail/Assets/BadgeLogo.scale-125.png create mode 100644 Wino.Mail/Assets/BadgeLogo.scale-150.png create mode 100644 Wino.Mail/Assets/BadgeLogo.scale-200.png create mode 100644 Wino.Mail/Assets/BadgeLogo.scale-400.png create mode 100644 Wino.Mail/Assets/EML/eml.png create mode 100644 Wino.Mail/Assets/FileTypes/type_archive.png create mode 100644 Wino.Mail/Assets/FileTypes/type_audio.png create mode 100644 Wino.Mail/Assets/FileTypes/type_executable.png create mode 100644 Wino.Mail/Assets/FileTypes/type_html.png create mode 100644 Wino.Mail/Assets/FileTypes/type_image.png create mode 100644 Wino.Mail/Assets/FileTypes/type_none.png create mode 100644 Wino.Mail/Assets/FileTypes/type_other.png create mode 100644 Wino.Mail/Assets/FileTypes/type_pdf.png create mode 100644 Wino.Mail/Assets/FileTypes/type_rar.png create mode 100644 Wino.Mail/Assets/FileTypes/type_video.png create mode 100644 Wino.Mail/Assets/LargeTile.scale-100.png create mode 100644 Wino.Mail/Assets/LargeTile.scale-125.png create mode 100644 Wino.Mail/Assets/LargeTile.scale-150.png create mode 100644 Wino.Mail/Assets/LargeTile.scale-200.png create mode 100644 Wino.Mail/Assets/LargeTile.scale-400.png create mode 100644 Wino.Mail/Assets/NotificationIcons/delete.png create mode 100644 Wino.Mail/Assets/NotificationIcons/dismiss.png create mode 100644 Wino.Mail/Assets/NotificationIcons/markread.png create mode 100644 Wino.Mail/Assets/NotificationIcons/profile-dark.png create mode 100644 Wino.Mail/Assets/NotificationIcons/profile-light.png create mode 100644 Wino.Mail/Assets/Providers/Gmail.png create mode 100644 Wino.Mail/Assets/Providers/IMAP4.png create mode 100644 Wino.Mail/Assets/Providers/Office 365.png create mode 100644 Wino.Mail/Assets/Providers/Outlook.png create mode 100644 Wino.Mail/Assets/Providers/Yahoo.png create mode 100644 Wino.Mail/Assets/ReleaseNotes/170.md create mode 100644 Wino.Mail/Assets/SmallTile.scale-100.png create mode 100644 Wino.Mail/Assets/SmallTile.scale-125.png create mode 100644 Wino.Mail/Assets/SmallTile.scale-150.png create mode 100644 Wino.Mail/Assets/SmallTile.scale-200.png create mode 100644 Wino.Mail/Assets/SmallTile.scale-400.png create mode 100644 Wino.Mail/Assets/SplashScreen.scale-100.png create mode 100644 Wino.Mail/Assets/SplashScreen.scale-125.png create mode 100644 Wino.Mail/Assets/SplashScreen.scale-150.png create mode 100644 Wino.Mail/Assets/SplashScreen.scale-200.png create mode 100644 Wino.Mail/Assets/SplashScreen.scale-400.png create mode 100644 Wino.Mail/Assets/Square150x150Logo.scale-100.png create mode 100644 Wino.Mail/Assets/Square150x150Logo.scale-125.png create mode 100644 Wino.Mail/Assets/Square150x150Logo.scale-150.png create mode 100644 Wino.Mail/Assets/Square150x150Logo.scale-200.png create mode 100644 Wino.Mail/Assets/Square150x150Logo.scale-400.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.scale-100.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.scale-125.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.scale-150.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.scale-200.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.scale-400.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.targetsize-16.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.targetsize-24.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.targetsize-256.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.targetsize-32.png create mode 100644 Wino.Mail/Assets/Square44x44Logo.targetsize-48.png create mode 100644 Wino.Mail/Assets/StoreLogo.backup.png create mode 100644 Wino.Mail/Assets/StoreLogo.scale-100.png create mode 100644 Wino.Mail/Assets/StoreLogo.scale-125.png create mode 100644 Wino.Mail/Assets/StoreLogo.scale-150.png create mode 100644 Wino.Mail/Assets/StoreLogo.scale-200.png create mode 100644 Wino.Mail/Assets/StoreLogo.scale-400.png create mode 100644 Wino.Mail/Assets/Thumbnails/airbnb.com.png create mode 100644 Wino.Mail/Assets/Thumbnails/apple.com.png create mode 100644 Wino.Mail/Assets/Thumbnails/google.com.png create mode 100644 Wino.Mail/Assets/Thumbnails/microsoft.com.png create mode 100644 Wino.Mail/Assets/Thumbnails/steampowered.com.png create mode 100644 Wino.Mail/Assets/Thumbnails/uber.com.png create mode 100644 Wino.Mail/Assets/Thumbnails/youtube.com.png create mode 100644 Wino.Mail/Assets/Wide310x150Logo.scale-100.png create mode 100644 Wino.Mail/Assets/Wide310x150Logo.scale-125.png create mode 100644 Wino.Mail/Assets/Wide310x150Logo.scale-150.png create mode 100644 Wino.Mail/Assets/Wide310x150Logo.scale-200.png create mode 100644 Wino.Mail/Assets/Wide310x150Logo.scale-400.png create mode 100644 Wino.Mail/Assets/WinoIcons.ttf create mode 100644 Wino.Mail/BackgroundImages/Acrylic.jpg create mode 100644 Wino.Mail/BackgroundImages/Clouds.jpg create mode 100644 Wino.Mail/BackgroundImages/Forest.jpg create mode 100644 Wino.Mail/BackgroundImages/Garden.jpg create mode 100644 Wino.Mail/BackgroundImages/Mica.jpg create mode 100644 Wino.Mail/BackgroundImages/Nighty.jpg create mode 100644 Wino.Mail/BackgroundImages/Snowflake.jpg create mode 100644 Wino.Mail/BasePage.cs create mode 100644 Wino.Mail/Behaviors/BindableCommandBarBehavior.cs create mode 100644 Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs create mode 100644 Wino.Mail/Controls/AccountNavigationItem.cs create mode 100644 Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml create mode 100644 Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs create mode 100644 Wino.Mail/Controls/Advanced/WinoListView.cs create mode 100644 Wino.Mail/Controls/ControlConstants.cs create mode 100644 Wino.Mail/Controls/ImagePreviewControl.cs create mode 100644 Wino.Mail/Controls/MailItemDisplayInformationControl.xaml create mode 100644 Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs create mode 100644 Wino.Mail/Controls/RendererCommandBar.cs create mode 100644 Wino.Mail/Controls/SettingsMenuItemControl.cs create mode 100644 Wino.Mail/Controls/WinoFontIcon.cs create mode 100644 Wino.Mail/Controls/WinoFontIconSource.cs create mode 100644 Wino.Mail/Controls/WinoInfoBar.cs create mode 100644 Wino.Mail/Controls/WinoNavigationViewItem.cs create mode 100644 Wino.Mail/Controls/WinoPivotControl.xaml create mode 100644 Wino.Mail/Controls/WinoPivotControl.xaml.cs create mode 100644 Wino.Mail/Controls/WinoSwipeControlItems.cs create mode 100644 Wino.Mail/Converters/ReverseBooleanConverter.cs create mode 100644 Wino.Mail/Converters/ReverseBooleanToVisibilityConverter.cs create mode 100644 Wino.Mail/Dialogs/AccountCreationDialog.xaml create mode 100644 Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/AccountEditDialog.xaml create mode 100644 Wino.Mail/Dialogs/AccountEditDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/AccountPickerDialog.xaml create mode 100644 Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/BaseAccountCreationDialog.cs create mode 100644 Wino.Mail/Dialogs/ConfirmationDialog.xaml create mode 100644 Wino.Mail/Dialogs/ConfirmationDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml create mode 100644 Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/MoveMailDialog.xaml create mode 100644 Wino.Mail/Dialogs/MoveMailDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/NewAccountDialog.xaml create mode 100644 Wino.Mail/Dialogs/NewAccountDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/NewImapSetupDialog.xaml create mode 100644 Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/StoreRatingDialog.xaml create mode 100644 Wino.Mail/Dialogs/StoreRatingDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml create mode 100644 Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/TextInputDialog.xaml create mode 100644 Wino.Mail/Dialogs/TextInputDialog.xaml.cs create mode 100644 Wino.Mail/Dialogs/WinoMessageDialog.xaml create mode 100644 Wino.Mail/Dialogs/WinoMessageDialog.xaml.cs create mode 100644 Wino.Mail/Extensions/AnimationExtensions.cs create mode 100644 Wino.Mail/Extensions/CompositionEnums.cs create mode 100644 Wino.Mail/Extensions/CompositionExtensions.Implicit.cs create mode 100644 Wino.Mail/Extensions/CompositionExtensions.Size.cs create mode 100644 Wino.Mail/Extensions/EnumerableExtensions.cs create mode 100644 Wino.Mail/Extensions/MimeKitExtensions.cs create mode 100644 Wino.Mail/Extensions/UIExtensions.cs create mode 100644 Wino.Mail/Extensions/UtilExtensions.cs create mode 100644 Wino.Mail/GlobalSuppressions.cs create mode 100644 Wino.Mail/Helpers/JsonHelpers.cs create mode 100644 Wino.Mail/Helpers/SettingsStorageExtensions.cs create mode 100644 Wino.Mail/Helpers/WinoVisualTreeHelper.cs create mode 100644 Wino.Mail/Helpers/XamlHelpers.cs create mode 100644 Wino.Mail/JS/Quill/Editor/full.html create mode 100644 Wino.Mail/JS/Quill/darkreader.js create mode 100644 Wino.Mail/JS/Quill/full.html create mode 100644 Wino.Mail/JS/Quill/highlight.min.js create mode 100644 Wino.Mail/JS/Quill/image-resize.min.js create mode 100644 Wino.Mail/JS/Quill/katex.min.css create mode 100644 Wino.Mail/JS/Quill/katex.min.js create mode 100644 Wino.Mail/JS/Quill/monokai-sublime.min.css create mode 100644 Wino.Mail/JS/Quill/quill.core.css create mode 100644 Wino.Mail/JS/Quill/quill.core.js create mode 100644 Wino.Mail/JS/Quill/quill.js create mode 100644 Wino.Mail/JS/Quill/quill.min.js create mode 100644 Wino.Mail/JS/Quill/quill.min.js.map create mode 100644 Wino.Mail/JS/Quill/quill.snow.css create mode 100644 Wino.Mail/JS/Quill/reader.css create mode 100644 Wino.Mail/JS/Quill/reader.html create mode 100644 Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs create mode 100644 Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs create mode 100644 Wino.Mail/MenuFlyouts/FolderOperationFlyout.cs create mode 100644 Wino.Mail/MenuFlyouts/FolderOperationMenuFlyoutItem.cs create mode 100644 Wino.Mail/MenuFlyouts/MailOperationFlyout.cs create mode 100644 Wino.Mail/MenuFlyouts/MailOperationMenuFlyoutItem.cs create mode 100644 Wino.Mail/MenuFlyouts/MoveButtonFlyout.cs create mode 100644 Wino.Mail/MenuFlyouts/RendererCommandBarItem.cs create mode 100644 Wino.Mail/MenuFlyouts/WinoOperationFlyout.cs create mode 100644 Wino.Mail/MenuFlyouts/WinoOperationFlyoutItem.cs create mode 100644 Wino.Mail/Package.appxmanifest create mode 100644 Wino.Mail/Properties/AssemblyInfo.cs create mode 100644 Wino.Mail/Properties/Default.rd.xml create mode 100644 Wino.Mail/Selectors/AccountProviderViewModelTemplateSelector.cs create mode 100644 Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs create mode 100644 Wino.Mail/Selectors/FileAttachmentTypeSelector.cs create mode 100644 Wino.Mail/Selectors/MailItemContainerStyleSelector.cs create mode 100644 Wino.Mail/Selectors/MailItemDisplayModePreviewTemplateSelector.cs create mode 100644 Wino.Mail/Selectors/MailItemDisplaySelector.cs create mode 100644 Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs create mode 100644 Wino.Mail/Selectors/RendererCommandBarItemTemplateSelector.cs create mode 100644 Wino.Mail/Services/ApplicationResourceManager.cs create mode 100644 Wino.Mail/Services/DialogService.cs create mode 100644 Wino.Mail/Services/LaunchProtocolService.cs create mode 100644 Wino.Mail/Services/PreferencesService.cs create mode 100644 Wino.Mail/Services/StatePersistenceService.cs create mode 100644 Wino.Mail/Services/ToastActivationService.cs create mode 100644 Wino.Mail/Services/WinoNavigationService.cs create mode 100644 Wino.Mail/Styles/Colors.xaml create mode 100644 Wino.Mail/Styles/CommandBarItems.xaml create mode 100644 Wino.Mail/Styles/CommandBarItems.xaml.cs create mode 100644 Wino.Mail/Styles/ContentPresenters.xaml create mode 100644 Wino.Mail/Styles/Converters.xaml create mode 100644 Wino.Mail/Styles/FontIcons.xaml create mode 100644 Wino.Mail/Styles/ImagePreviewControl.xaml create mode 100644 Wino.Mail/Styles/ItemContainerStyles.xaml create mode 100644 Wino.Mail/Styles/WinoInfoBar.xaml create mode 100644 Wino.Mail/Views/Abstract/AboutPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/AccountDetailsPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/AccountManagementPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/AppShellAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/ComposePageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/IdlePageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/MailListPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/MailRenderingPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/MergedAccountDetailsPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/MessageListPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/NewAccountManagementPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/PersonalizationPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/ReadingPanePageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/SettingOptionsPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/SettingsPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/SettingsPageBase.cs create mode 100644 Wino.Mail/Views/Abstract/SignatureManagementPageAbstract.cs create mode 100644 Wino.Mail/Views/Abstract/WelcomePageAbstract.cs create mode 100644 Wino.Mail/Views/Account/AccountDetailsPage.xaml create mode 100644 Wino.Mail/Views/Account/AccountDetailsPage.xaml.cs create mode 100644 Wino.Mail/Views/Account/AccountManagementPage.xaml create mode 100644 Wino.Mail/Views/Account/AccountManagementPage.xaml.cs create mode 100644 Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml create mode 100644 Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml.cs create mode 100644 Wino.Mail/Views/ComposePage.xaml create mode 100644 Wino.Mail/Views/ComposePage.xaml.cs create mode 100644 Wino.Mail/Views/IdlePage.xaml create mode 100644 Wino.Mail/Views/IdlePage.xaml.cs create mode 100644 Wino.Mail/Views/ImapSetup/AdvancedImapSetupPage.xaml create mode 100644 Wino.Mail/Views/ImapSetup/AdvancedImapSetupPage.xaml.cs create mode 100644 Wino.Mail/Views/ImapSetup/AutoDiscoveryPage.xaml create mode 100644 Wino.Mail/Views/ImapSetup/AutoDiscoveryPage.xaml.cs create mode 100644 Wino.Mail/Views/ImapSetup/PreparingImapFoldersPage.xaml create mode 100644 Wino.Mail/Views/ImapSetup/PreparingImapFoldersPage.xaml.cs create mode 100644 Wino.Mail/Views/ImapSetup/TestingImapConnectionPage.xaml create mode 100644 Wino.Mail/Views/ImapSetup/TestingImapConnectionPage.xaml.cs create mode 100644 Wino.Mail/Views/ImapSetup/WelcomeImapSetupPage.xaml create mode 100644 Wino.Mail/Views/ImapSetup/WelcomeImapSetupPage.xaml.cs create mode 100644 Wino.Mail/Views/MailListPage.xaml create mode 100644 Wino.Mail/Views/MailListPage.xaml.cs create mode 100644 Wino.Mail/Views/MailRenderingPage.xaml create mode 100644 Wino.Mail/Views/MailRenderingPage.xaml.cs create mode 100644 Wino.Mail/Views/NewAccountManagementPage.xaml create mode 100644 Wino.Mail/Views/NewAccountManagementPage.xaml.cs create mode 100644 Wino.Mail/Views/Settings/AboutPage.xaml create mode 100644 Wino.Mail/Views/Settings/AboutPage.xaml.cs create mode 100644 Wino.Mail/Views/Settings/MessageListPage.xaml create mode 100644 Wino.Mail/Views/Settings/MessageListPage.xaml.cs create mode 100644 Wino.Mail/Views/Settings/PersonalizationPage.xaml create mode 100644 Wino.Mail/Views/Settings/PersonalizationPage.xaml.cs create mode 100644 Wino.Mail/Views/Settings/ReadingPanePage.xaml create mode 100644 Wino.Mail/Views/Settings/ReadingPanePage.xaml.cs create mode 100644 Wino.Mail/Views/Settings/SettingOptionsPage.xaml create mode 100644 Wino.Mail/Views/Settings/SettingOptionsPage.xaml.cs create mode 100644 Wino.Mail/Views/Settings/SignatureManagementPage.xaml create mode 100644 Wino.Mail/Views/Settings/SignatureManagementPage.xaml.cs create mode 100644 Wino.Mail/Views/SettingsPage.xaml create mode 100644 Wino.Mail/Views/SettingsPage.xaml.cs create mode 100644 Wino.Mail/Views/WelcomePage.xaml create mode 100644 Wino.Mail/Views/WelcomePage.xaml.cs create mode 100644 Wino.Mail/Wino.Mail.csproj create mode 100644 Wino.Mail/Wino.sln create mode 100644 Wino.sln create mode 100644 crowdin.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..c686ec1f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,290 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +[*] +trim_trailing_whitespace = true +insert_final_newline = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +indent_size = 4 +end_of_line = crlf +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion +dotnet_style_namespace_match_folder = true:suggestion +dotnet_style_readonly_field = true:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent +dotnet_style_allow_multiple_blank_lines_experimental = true:silent +dotnet_style_allow_statement_immediately_after_block_experimental = true:silent +dotnet_code_quality_unused_parameters = all:suggestion +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_property = false:silent +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_method = false:silent + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# New line preferences +end_of_line = crlf + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# Expression-level preferences +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = true +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# Field preferences +dotnet_style_readonly_field = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +# New line preferences +dotnet_style_allow_multiple_blank_lines_experimental = true +dotnet_style_allow_statement_immediately_after_block_experimental = true + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false:silent +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = false:silent + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_extended_property_pattern = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async + +# Code-block preferences +csharp_prefer_braces = true:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_style_namespace_declarations = block_scoped:silent + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_local_over_anonymous_function = true:suggestion +csharp_style_prefer_null_check_over_type_check = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_prefer_tuple_swap = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:silent + +# New line preferences +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent +csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = true:none + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.private_or_internal_field_should_be__fieldname.severity = suggestion +dotnet_naming_rule.private_or_internal_field_should_be__fieldname.symbols = private_or_internal_field +dotnet_naming_rule.private_or_internal_field_should_be__fieldname.style = _fieldname + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_field.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style._fieldname.required_prefix = _ +dotnet_naming_style._fieldname.required_suffix = +dotnet_naming_style._fieldname.word_separator = +dotnet_naming_style._fieldname.capitalization = camel_case +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_prefer_readonly_struct = true:suggestion +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d33d9275 --- /dev/null +++ b/.gitignore @@ -0,0 +1,404 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Nuget personal access tokens and Credentials +nuget.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +.idea/ +*.sln.iml +.vs/Wino/v16/.suo +.vs/Wino/v16/.suo +*.v2 +Wino/obj/x86/Debug/App.g.cs +Wino/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache +Wino/obj/x86/Debug/XamlSaveStateFile.xml +.vs/Wino/v16/.suo +.vs/Wino/DesignTimeBuild/.dtbcache.v2 +.vs/Wino/v16/.suo +*.v2 +Wino/obj/x86/Debug/XamlSaveStateFile.xml +Wino/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache +Wino/obj/x86/Debug/XamlSaveStateFile.xml +Wino/obj/x86/Debug/XamlSaveStateFile.xml +*.cache +.vs/Wino/v16/.suo diff --git a/Wino.BackgroundTasks/AppUpdatedTask.cs b/Wino.BackgroundTasks/AppUpdatedTask.cs new file mode 100644 index 00000000..2818a6a2 --- /dev/null +++ b/Wino.BackgroundTasks/AppUpdatedTask.cs @@ -0,0 +1,34 @@ +using Microsoft.Toolkit.Uwp.Notifications; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Background; +using Wino.Core.Domain; + +namespace Wino.BackgroundTasks +{ + /// + /// Creates a toast notification to notify user when the Store update happens. + /// + public sealed class AppUpdatedTask : IBackgroundTask + { + public void Run(IBackgroundTaskInstance taskInstance) + { + var def = taskInstance.GetDeferral(); + + var builder = new ToastContentBuilder(); + builder.SetToastScenario(ToastScenario.Default); + + Package package = Package.Current; + PackageId packageId = package.Id; + PackageVersion version = packageId.Version; + + var versionText = string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision); + + builder.AddText(Translator.Notifications_WinoUpdatedTitle); + builder.AddText(string.Format(Translator.Notifications_WinoUpdatedMessage, versionText)); + + builder.Show(); + + def.Complete(); + } + } +} diff --git a/Wino.BackgroundTasks/Properties/AssemblyInfo.cs b/Wino.BackgroundTasks/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9887885d --- /dev/null +++ b/Wino.BackgroundTasks/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Wino.BackgroundTasks")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Wino.BackgroundTasks")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Wino.BackgroundTasks/SessionConnectedTask.cs b/Wino.BackgroundTasks/SessionConnectedTask.cs new file mode 100644 index 00000000..90db6769 --- /dev/null +++ b/Wino.BackgroundTasks/SessionConnectedTask.cs @@ -0,0 +1,48 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Serilog; +using Windows.ApplicationModel.Background; +using Windows.Storage; +using Wino.Core; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; +using Wino.Core.UWP; +using Wino.Services; + +namespace Wino.BackgroundTasks +{ + public sealed class SessionConnectedTask : IBackgroundTask + { + public async void Run(IBackgroundTaskInstance taskInstance) + { + var def = taskInstance.GetDeferral(); + + try + { + var services = new ServiceCollection(); + + services.RegisterCoreServices(); + services.RegisterCoreUWPServices(); + + var providere = services.BuildServiceProvider(); + + var backgroundTaskService = providere.GetService(); + var dbService = providere.GetService(); + var logInitializer = providere.GetService(); + + logInitializer.SetupLogger(ApplicationData.Current.LocalFolder.Path); + + await dbService.InitializeAsync(); + await backgroundTaskService.RunBackgroundSynchronizationAsync(Core.Domain.Enums.BackgroundSynchronizationReason.SessionConnected); + } + catch (Exception ex) + { + Log.Error(ex, "Background synchronization failed from background task."); + } + finally + { + def.Complete(); + } + } + } +} diff --git a/Wino.BackgroundTasks/Wino.BackgroundTasks.csproj b/Wino.BackgroundTasks/Wino.BackgroundTasks.csproj new file mode 100644 index 00000000..94ab7119 --- /dev/null +++ b/Wino.BackgroundTasks/Wino.BackgroundTasks.csproj @@ -0,0 +1,166 @@ + + + + + Debug + AnyCPU + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08} + winmdobj + Properties + Wino.BackgroundTasks + Wino.BackgroundTasks + en-US + UAP + 10.0.22621.0 + 10.0.17763.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + false + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + x86 + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + x86 + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + ARM + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + ARM + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + ARM64 + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + ARM64 + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + x64 + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + x64 + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + PackageReference + + + + + + + + + 6.2.14 + + + 7.1.3 + + + + + {CF3312E5-5DA0-4867-9945-49EA7598AF1F} + Wino.Core.Domain + + + {395f19ba-1e42-495c-9db5-1a6f537fccb8} + Wino.Core.UWP + + + {e6b1632a-8901-41e8-9ddf-6793c7698b0b} + Wino.Core + + + + + Windows Desktop Extensions for the UWP + + + + 14.0 + + + + \ No newline at end of file diff --git a/Wino.Calendar/App.xaml b/Wino.Calendar/App.xaml new file mode 100644 index 00000000..5707d1ac --- /dev/null +++ b/Wino.Calendar/App.xaml @@ -0,0 +1,7 @@ + + + diff --git a/Wino.Calendar/App.xaml.cs b/Wino.Calendar/App.xaml.cs new file mode 100644 index 00000000..971e694b --- /dev/null +++ b/Wino.Calendar/App.xaml.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +namespace Wino.Calendar +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + sealed partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs e) + { + Frame rootFrame = Window.Current.Content as Frame; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (rootFrame == null) + { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + rootFrame.NavigationFailed += OnNavigationFailed; + + if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) + { + //TODO: Load state from previously suspended application + } + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + + if (e.PrelaunchActivated == false) + { + if (rootFrame.Content == null) + { + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + rootFrame.Navigate(typeof(MainPage), e.Arguments); + } + // Ensure the current window is active + Window.Current.Activate(); + } + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + } +} diff --git a/Wino.Calendar/Assets/LockScreenLogo.scale-200.png b/Wino.Calendar/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735f57adb5dfc01886d137b4e493d7e97cf13af3 GIT binary patch literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SplashScreen.scale-200.png b/Wino.Calendar/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..023e7f1feda78d5100569825acedfd213a0d84e9 GIT binary patch literal 7700 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square150x150Logo.scale-200.png b/Wino.Calendar/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..af49fec1a5484db1d52a7f9b5ec90a27c7030186 GIT binary patch literal 2937 zcma)84OCO-8BSud5)jwMLRVKgX(S?$n?Ld|vrsm<$CF7)&zTbyy1FE5bU`Q17MRv`9ue$;R(@8kR;#vJ*IM0>cJIAOte!d7oRgdH zd%ySjdB6L9=gX^A6)VzH7p2l@v~3zJAMw|DFy#^)F@@F*`mqUn=Il>l)8_+ab;nOW{%+iPx z+s{Eu|&pIs)Z7{La9~?xKfyl z#43?gjEL15d4WbOZo#SiP%>DB^+BcnJ=7dHEe;r#G=tuw|ka z%q@}##Uh7;tc%L_64m(kHtw74ty%BJMb)_1)#S0j`)F8_1jF7vScpsnH=0V19bO8y zR`0SjIdCUo&=>JwMQF8KHA<{ODHTiQh}0^@5QRmCA?gOH6_H3K^-_sNB^RrdNuK-R zOO*vOrKCVvDwgUck`kF(E7j{I#iiN;b*ZdCt4m@HPA`EuEqGGf4%!K<;(=I=&Vyrw z%TwcWtxa}8mCZ%Cyf&ActJ6_$ox5z6-D!0-dvnRx6t7y3d+h6QYpKWO;8OdnvERo7 zuEf>ih5`wqY)~o@OeVt-wM?Q!>QzdGRj!bz6fzYrfw$hZfAKzr2-M+D+R>}~oT574c;_3zquHcElqKIsryILt3g8n3jcMb+j?i?-L3FpZJ z2WRVBRdDPc+G5aaYg#5hpE+6nQ|(VSoxT3|biF;BUq#==-27Xi=gihDPYP$7?=9cP zYKE$jeQ|3~_L0VG-(F~2ZPyD0=k{J4Q~h(t__{-mz_w8{JDY9{`1ouzz!Vr5!ECdE z6U~O1k8c}24V7~zzXWTV-Pe4)y}wQJS&q%H5`Fo_f_JvIU489aCX$;P`u#!I-=^4ijC2{&9!O&h>mi?9oYD=GC#%)6{GzN6nQYw+Fal50!#x^asjBBR50i`+mho*ttoqV)ubM2KD9S~k7+FR4>{29?6 z{!l6kDdyTN0YJ9LgkPWeXm|gyi@zM3?0@{&pXT12w|78&W-q!RRF)&iLCEZVH<|fR zN0fr2^t8H(>L?>K#>^+jWROLral(Qy-xoBq1U7A&DV||wClb)Otd9?(gZ|8znMF}D zf<1haWz^s0qgecz;RFGt0C-B4g`jNGHsFU+;{<%t65v^sjk^h$lmWn#B0#_)9ij&d z-~lc`A)YYExi^7sBuPM^Y|wA2g*5?`K?#7tzELQYNxGo$UB$4J8RJp1k(8Jj+~hMT zlN~>M@KTTh^--8y3PK_NZ@AC!{PT=CziBzGd+wTJ^@icH!Bd}%)g8V)%K?|c&WTUk zy}qv1C%(fjRoZ4ozC3{O%@5?)XzH35zHns$pgU*Q?fj4v?fp1Qbm+j;3l;9jam9Da zXVcKjPlQ73x78QPu|Ffm6x?`~e3oD=gl=4kYK?={kD5j~QCXU)`HSdduNNENzA*2$ zOm3PzF!lN5e*06-f1Uot67wY#{o-S1!KZ7E=!~7ynnk9_iJR#kFoNbAOT#^2Gd17F zMmvU6>lndZQGd|ax9kUoXXO+$N?|j@6qpsF&_j7YXvwo_C{JpmLw5&#e6k>atv%es z5)7r*Wvv_JkUpT}M!_o!nVlEk1Zbl=a*2hQ*<|%*K1Glj^FcF`6kTzGQ3lz~2tCc@ z&x|tj;aH&1&9HwcJBcT`;{?a+pnej;M1HO(6Z{#J!cZA04hnFl;NXA+&`=7bjW_^o zfC40u3LMG?NdPtwGl>Tq6u}*QG)}-y;)lu-_>ee3kibW(69n0$0Zy!}9rQz%*v1iO zT9_H>99yIrSPYVy6^);rR}7Yo=J_T@hi+qhTZXnVWyf;JDYm5#eYLTxr*?kiNn!+Y zQ+LUkBafNJ#rH#C(?d5^;gw9o#%daEI{mA*LHPIHPU`#|H$hD zwm>0&+kahQ)E#%~k>&5@&#Vg82H?s%71=)(soi@174pi9--2{w{1$}Sz4zGn3Du&x bht0Iza^2ykEt4(epJ78uh5nDlX8(TxzDYwP literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.scale-200.png b/Wino.Calendar/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..ce342a2ec8a61291ba76c54604aea7e9d20af11b GIT binary patch literal 1647 zcmaJ?eM}Q)7(e+G1Q(|`V9JhTI2>MkceK4;p;PR&$Pi?ejk3YQ_3o`S&|W_dsOZ8# zWPTt69g`t$ab`0cj-Y0yiBSOqmd)tG7G(}M5aP0_%&9TijB#&)I{zSE^4@#z^FF`l z`8{8`o%wlL(UI|y2!cdsuVamHH~H86F!*-15em4)NqUpCQM5?aoC_eCf@lV4wvF2a zjDQn1JBL69f&@2M3rvzJcfE!eZ8FZUBlFlC5RD)it33{mF9#B82AiyQE%w)`vlwa> zv{<1sm&kSKK$&%2jSFn7$t&P%%6Ue>R=EAnG8N7fqynWG8L3p!4801a;8{+nliO(qd(jNJ_?+9W3#hLIDLoT6~3fx9=`CC-D}-AMrpEO7HK zt3$GicGPc?GmDjy7K2P@La;eu4!$zWCZ`ym{Z$b zu-O6RM&K4JT|BIZB`E-gxqG%FzanI#+2FFmqHqXG7yxWB=w55RGOM)$xMb(>kSNR z2w=1AZi%z=AmG~yea~XaXJR!v7vLn(RUnELfiB1|6D84ICOS}^Zo2AdN}<&*h}G_u z{xZ!(%>tLT3J3<5XhWy-tg+6)0nmUUENLW8TWA{R6bgVd3X;anYFZ^IRis*_P-C-r z;i>%1^eL3UI2-{w8nuFFcs0e~7J{O2k^~Ce%+Ly4U?|=!0LH=t6()xi<^I-rs+9sF z*q{E-CxZbGPeu#a;XJwE;9S1?#R&uns>^0G3p`hEUF*v`M?@h%T%J%RChmD|EVydq zmHWh*_=S%emRC*mhxaVLzT@>Z2SX0u9v*DIJ@WC^kLVdlGV6LpK$KIrlJqc zpJ921)+3JJdTx|<`G&kXpKkjGJv=76R`yYIQ{#c-`%+`#V(7}Q;&@6U8!Td1`d;?N z_9mnI#?AA}4J!r)LN4!E-@H5eXauuB7TOawS>Y|{-P?NNx-lq+z1W-+y(;39P&&LP zL{N80?&=C*qKmdA^moMZRuPcD!B<*mq$ch=0Cnlitw#txRWhb3%TQvPqjkC`F69G4b! ze7z9MZ#+;_#l?H37UqUhDFb^l&s2{oM$3I0o^Q!yx;;V)QmCMo)Tb_ui|mit8MS?U zm##6$sZZ1$@|s%?l@>4Z<*Q}sRBSKMhb4I{e5LdEhsHIHTe8Bod5c>6QtT>$XgUBz z6MK`kO$=jmt@FqggOhJ5j~e@ygRbG;<{Vu)*+nn9aQeo0;$#j;|MS=S$&L?BeV25z xs3B`@=#`5TF{^6(A1rvdY@|-RtQ|iS5{tyX+wH?;n8E)G$kykv-D^wh{{!TZT%7;_ literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Wino.Calendar/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c02ce97e0a802b85f6021e822c89f8bf57d5cd GIT binary patch literal 1255 zcmaJ>TWs4@7*5+{G#S+&C!qC#> zf>5N3P6jO*Cz>ug*(_DmW=)kea&m$gZ^+nyiF`;j%w@}y8)>p*SH}C`m?DXeieF2U zyQHecc_L%Gh!7GMt+hG06y;+|p4>m~}PjA}rKViGiEnn7G0ZO<>G|7q;2?NwGCM3s?eued6%hd$B+ z*kQJ{#~$S=DFE(%=E+UkmlEI*%3llUf~8Ja9YU1Vui0IbGBkW_gHB%Rd&!!ioX zs40O?i9I{};kle7GMvE7(rk`la=gTI)47=>%?q@^iL-nUo3}h4S}N-KHn8t5mVP8w z&bSErwp+37 zNJJ8?a|{r5Q3R0Z5s-LB1WHOwYC@7pCHWND#cL1cZ?{kJ368_*(UDWUDyb<}0y@o# zfMF016iMWPCb6obAxT$JlB6(2DrlXDTB&!0`!m??4F(qWMhjVZo?JXQmz`1*58Z=& zcDmB|S-E@j?BoFGix0flckqdS4jsPNzhfWyWIM98GxcLs89C(~dw%$_t;JjX-SD}E zfiGV;{8Q%8r}w9x>EEigW81>`kvnU@pK)4+xk9@+bNj9L!AAZ@SZ@q|)&BmY3+HZx zul~BeG4|}-;L%cHViQGQX?^zFfO0&#cHwel=d`lH9sJ-@Sl@n*(8J2>%Ac`IxyY?Q z{=GhWvC#gu-~Ia7*n{=+;qM?Ul_wy1+u7ho;=`>EwP^g~R@{unBds`!#@}tluZQpS zm)M~nYEifJWJGx?_6DcTy>#uh%>!H9=hb^(v`=m3F1{L>db=<5_tm+_&knAQ2EU$s Mu9UqpbNZeC0BbUo^Z)<= literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/StoreLogo.png b/Wino.Calendar/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7385b56c0e4d3c6b0efe3324aa1194157d837826 GIT binary patch literal 1451 zcmaJ>eN5D57_Z|bH;{0+1#mbl)eTU3{h)Wf7EZV?;HD@XL@{B`Ui%(2aMxQ~xdXSv z5nzWi(LW)U2=Vc-cY@s7nPt{i0hc6!7xN4NNHI#EQl>YNBy8l4%x9gr_W-j zEZMQmmTIy(>;lblRfh`dIyTgc9W5d!VP$L4(kKrN1c5G~(O_#xG zAJCNTstD^5SeXFB+&$h=ToJP2H>xr$iqPs-#O*;4(!Fjw25-!gEb*)mU}=)J;Iu>w zxK(5XoD0wrPSKQ~rbL^Cw6O_03*l*}i=ydbu7adJ6y;%@tjFeXIXT+ms30pmbOP%Q zX}S;+LBh8Tea~TSkHzvX6$rYb)+n&{kSbIqh|c7hmlxmwSiq5iVhU#iEQ<>a18|O^Sln-8t&+t`*{qBWo5M?wFM(JuimAOb5!K#D}XbslM@#1ZVz_;!9U zpfEpLAOz=0g@bd6Xj_ILi-x^!M}73h^o@}hM$1jflTs|Yuj9AL@A3<-?MV4!^4q`e z)fO@A;{9K^?W?DbnesnPr6kK>$zaKo&;FhFd(GYFCIU^T+OIMb%Tqo+P%oq(IdX7S zf6+HLO?7o0m+p>~Tp5UrXWh!UH!wZ5kv!E`_w)PTpI(#Iw{AS`gH4^b(bm^ZCq^FZ zY9DD7bH}rq9mg88+KgA$Zp!iWncuU2n1AuIa@=sWvUR-s`Qb{R*kk(SPU^`$6BXz8 zn#7yaFOIK%qGxyi`dYtm#&qqox0$h=pNi#u=M8zUG@bpiZ=3sT=1}Trr}39cC)H|v zbL?W)=&s4zrh)7>L(|cc%$1#!zfL?HjpeP%T+x_a+jZ16b^iKOHxFEX$7d|8${H-* zIrOJ5w&i$>*D>AKaIoYg`;{L@jM((Kt?$N$5OnuPqVvq**Nm}(f0wwOF%iX_Pba;V z;m@wxX&NcV3?<1+u?A{y_DIj7#m3Af1rCE)o`D&Y3}0%7E;iX1yMDiS)sh0wKi!36 zL!Wmq?P^Ku&rK~HJd97KkLTRl>ScGFYZNlYytWnhmuu|)L&ND8_PmkayQb{HOY640 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Wide310x150Logo.scale-200.png b/Wino.Calendar/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..288995b397fdbef1fb7e85afd71445d5de1952c5 GIT binary patch literal 3204 zcmbVPeQXow8NYmBd90>}0NP?GhXW~VaeThm=a0tV#EwJMI!)6M3}|c4_Bl3=Kd>G0 z(GHx1wl<7(tP?FsOQkTilSo*iIvF%uArExJ73~P zSv1xEy!U(Wd4A9D`FQV@W3@F^qJ@PEF$@z`Z!*BbFsS(^?B zyiAzJ+q})bkgiQHWqEb*jJD-coHYr1^iocg)l!Qa{Xqs-l~6J}p-|##ZHYofskQ3$ zI0;xzXyhazBeXhIsg5A=%ufo@f)1yy&ScKS0;HF^!r_2UE^lpZEom(+@duma3awTv zCrCL-%D_SvYWIcdHkmI}#50(fkUi)Qgx!80ju>g1za^}ff>JI8Z@^-iCiaCgg@TgF z+vtE?Q9{VQUX&MW9SYYmGcxA14%N2@7FwBTD4N<(2{nWgV8$e3?-F=L^&FrtWn~(U_Q~~^uYiyeY6-KoTnfh9AWz@ zIKje0)u!_Lw)E}G!#kEfwKVdNt(UAf9*f>tEL_(=xco-T%jTi@7YlC3hs2ik%Le0H ztj}RTeCF(5mwvi3_56>-yB?l;J>-1%!9~=fs|QcNG3J~a@JCu`4SB460s0ZO+##4fFUSGLcj_ja^fL4&BKALfb#$6$O?>P@qx2Agl^x0i&ugt zsy5Pyu=()`7HRMG3IB7F1@`_ z+-!J%#i6e^U$e#+C%Q>_qVRzWRsG^W_n+@OcX@vzI&z;mzHNb!GQ?LWA(wtpqHqTM z1OFw_{Zn?fD)p)`c`kOgv{de=v@suGRqY{N^U7gI1VF3*F=obwaXI6ob5__Yn zVTguS!%(NI09J8x#AO_aW!9W7k*UvB;IWDFC3srwftr{kHj%g)fvnAm;&h_dnl~

MY- zf+K}sCe8qU6Ujs`3ua{U0Of$R_gVQBuUA za0v=mu#vIOqiiAZOr&h*$WyOw&k-xr$;G4Ixa!#TJNr>95(h>l%)PUy4p+^SgR(uR zta%k*?ny-+nAr8spEk1fo{J4i!b^Fia`N{_F6@zidA2ZTTrjl#^5Z-2KfB@Cu}l9s z(*|Z2jc?p~vn2f)3y9i*7zJV1L{$?|&q)4oaT;uXi6>1GkRXVTOzAz(RHEmr=eFIi z`}<>-Q?K0GN8!IYxeP1XKXO+jsJbp~o^);Bc;%b7Flpe7;1`Ny@3r7ZR;?R)aJt8C ziNlEC<@3f_lIV4TwV}&e;D!Ee5_|e#g0LUh=5vmYWYm7&2h*M>QPKvGh9-)wfMMW3 z8J9b%1k7dzPzO0_NGQy92BZ^FR6R~6;^6?lqO;-QUP4BY%cG%3vEhbm#>4vIhPBh3 z-+pZGjh$x%Hp{?=FHsMp0&wNPlj00us{&`1ZOZTqs8%4X&xH=UDr*xyBW(Zp&Em94 zf)ZSfn#yg0N)>!1kWdkqJ^S*z0FF5|fj&qcE#Na|%OY0$uO>!&hP+1ywfD_WXk@4J(?MBftK7>$Nvqh@tDuarN%PrTLQ2Uzysx>UV=V zk^RrDSvdQ?0;=hY67EgII-f4`t=+i*yS=Y~!XlqIy_4x&%+OdfbKOFPXS2X5%4R{N z$SQMX^AK6(fA + + + + + diff --git a/Wino.Calendar/MainPage.xaml.cs b/Wino.Calendar/MainPage.xaml.cs new file mode 100644 index 00000000..281f422f --- /dev/null +++ b/Wino.Calendar/MainPage.xaml.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 + +namespace Wino.Calendar +{ + ///

+ /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainPage : Page + { + public MainPage() + { + this.InitializeComponent(); + } + } +} diff --git a/Wino.Calendar/Package.appxmanifest b/Wino.Calendar/Package.appxmanifest new file mode 100644 index 00000000..6e261c84 --- /dev/null +++ b/Wino.Calendar/Package.appxmanifest @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + Wino Calendar + Burak KÖSE + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wino.Calendar/Properties/AssemblyInfo.cs b/Wino.Calendar/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..979badd3 --- /dev/null +++ b/Wino.Calendar/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Wino.Calendar")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Wino.Calendar")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Wino.Calendar/Properties/Default.rd.xml b/Wino.Calendar/Properties/Default.rd.xml new file mode 100644 index 00000000..af00722c --- /dev/null +++ b/Wino.Calendar/Properties/Default.rd.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wino.Calendar/Wino.Calendar.csproj b/Wino.Calendar/Wino.Calendar.csproj new file mode 100644 index 00000000..2a0e6530 --- /dev/null +++ b/Wino.Calendar/Wino.Calendar.csproj @@ -0,0 +1,172 @@ + + + + + Debug + x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35} + AppContainerExe + Properties + Wino.Calendar + Wino.Calendar + en-US + UAP + 10.0.22621.0 + 10.0.17763.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + True + 125A5273FCFE8D551C3FED87F67C87A663E98F1B + + True + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + 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\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM64 + false + prompt + true + true + + + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM64 + false + prompt + true + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + true + true + + + PackageReference + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + + + + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + + 6.2.14 + + + + 14.0 + + + + \ No newline at end of file diff --git a/Wino.Core.Domain/Constants.cs b/Wino.Core.Domain/Constants.cs new file mode 100644 index 00000000..10046f85 --- /dev/null +++ b/Wino.Core.Domain/Constants.cs @@ -0,0 +1,14 @@ +namespace Wino.Core.Domain +{ + public static class Constants + { + /// + /// MIME header that exists in all the drafts created from Wino. + /// + public const string WinoLocalDraftHeader = "X-Wino-Draft-Id"; + public const string LocalDraftStartPrefix = "localDraft_"; + + public const string ToastMailItemIdKey = nameof(ToastMailItemIdKey); + public const string ToastActionKey = nameof(ToastActionKey); + } +} diff --git a/Wino.Core.Domain/Entities/AccountSignature.cs b/Wino.Core.Domain/Entities/AccountSignature.cs new file mode 100644 index 00000000..6c3c6841 --- /dev/null +++ b/Wino.Core.Domain/Entities/AccountSignature.cs @@ -0,0 +1,13 @@ +using System; +using SQLite; + +namespace Wino.Core.Domain.Entities +{ + public class AccountSignature + { + [PrimaryKey] + public Guid Id { get; set; } + + public string HtmlBody { get; set; } + } +} diff --git a/Wino.Core.Domain/Entities/AddressInformation.cs b/Wino.Core.Domain/Entities/AddressInformation.cs new file mode 100644 index 00000000..de2bc308 --- /dev/null +++ b/Wino.Core.Domain/Entities/AddressInformation.cs @@ -0,0 +1,53 @@ +using SQLite; +using System; +using System.Collections.Generic; + +namespace Wino.Core.Domain.Entities +{ + /// + /// Back storage for simple name-address book. + /// These values will be inserted during MIME fetch. + /// + + + // TODO: This can easily evolve to Contact store, just like People app in Windows 10/11. + // Do it. + public class AddressInformation : IEquatable + { + [PrimaryKey] + public string Address { get; set; } + public string Name { get; set; } + + public string DisplayName => Address == Name ? Address : $"{Name} <{Address}>"; + + public override bool Equals(object obj) + { + return Equals(obj as AddressInformation); + } + + public bool Equals(AddressInformation other) + { + return !(other is null) && + Address == other.Address && + Name == other.Name; + } + + public override int GetHashCode() + { + int hashCode = -1717786383; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Address); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Name); + return hashCode; + } + + public static bool operator ==(AddressInformation left, AddressInformation right) + { + return EqualityComparer.Default.Equals(left, right); + } + + public static bool operator !=(AddressInformation left, AddressInformation right) + { + return !(left == right); + } + } +} diff --git a/Wino.Core.Domain/Entities/CustomServerInformation.cs b/Wino.Core.Domain/Entities/CustomServerInformation.cs new file mode 100644 index 00000000..3fc99b76 --- /dev/null +++ b/Wino.Core.Domain/Entities/CustomServerInformation.cs @@ -0,0 +1,49 @@ +using System; +using SQLite; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Entities +{ + public class CustomServerInformation + { + [PrimaryKey] + public Guid Id { get; set; } + + public Guid AccountId { get; set; } + + public string DisplayName { get; set; } + public string Address { get; set; } + public string IncomingServer { get; set; } + public string IncomingServerUsername { get; set; } + public string IncomingServerPassword { get; set; } + public string IncomingServerPort { get; set; } + + public CustomIncomingServerType IncomingServerType { get; set; } + + public string OutgoingServer { get; set; } + public string OutgoingServerPort { get; set; } + public string OutgoingServerUsername { get; set; } + public string OutgoingServerPassword { get; set; } + + /// + /// useSSL True: SslOnConnect + /// useSSL False: StartTlsWhenAvailable + /// + + public ImapConnectionSecurity IncomingServerSocketOption { get; set; } + public ImapAuthenticationMethod IncomingAuthenticationMethod { get; set; } + + + public ImapConnectionSecurity OutgoingServerSocketOption { get; set; } + public ImapAuthenticationMethod OutgoingAuthenticationMethod { get; set; } + + public string ProxyServer { get; set; } + public string ProxyServerPort { get; set; } + + [Obsolete("As 1.7.0")] + public bool IncomingRequiresSSL { get; set; } + + [Obsolete("As 1.7.0")] + public bool OutgoingRequresSSL { get; set; } + } +} diff --git a/Wino.Core.Domain/Entities/MailAccount.cs b/Wino.Core.Domain/Entities/MailAccount.cs new file mode 100644 index 00000000..2ca32057 --- /dev/null +++ b/Wino.Core.Domain/Entities/MailAccount.cs @@ -0,0 +1,78 @@ +using System; +using SQLite; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Entities +{ + public class MailAccount + { + [PrimaryKey] + public Guid Id { get; set; } + + /// + /// Given name of the account in Wino. + /// + public string Name { get; set; } + + /// + /// TODO: Display name of the authenticated user/account. + /// API integrations will query this value from the API. + /// IMAP is populated by user on setup dialog. + /// + + public string ProfileName { get; set; } + + /// + /// Account e-mail address. + /// + public string Address { get; set; } + + /// + /// Provider type of the account. Outlook,Gmail etc... + /// + public MailProviderType ProviderType { get; set; } + + /// + /// For tracking change delta. + /// Gmail : historyId + /// Outlook: deltaToken + /// + public string SynchronizationDeltaIdentifier { get; set; } + + /// + /// Gets or sets the signature to be used for this account. + /// Null if no signature should be used. + /// + public Guid? SignatureId { get; set; } + + /// + /// Gets or sets whether the account has any reason for an interactive user action to fix continue operating. + /// + public AccountAttentionReason AttentionReason { get; set; } + + /// + /// Gets or sets the id of the merged inbox this account belongs to. + /// + public Guid? MergedInboxId { get; set; } + + /// + /// Contains the merged inbox this account belongs to. + /// Ignored for all SQLite operations. + /// + [Ignore] + public MergedInbox MergedInbox { get; set; } + + /// + /// Populated only when account has custom server information. + /// + + [Ignore] + public CustomServerInformation ServerInformation { get; set; } + + /// + /// Account preferences. + /// + [Ignore] + public MailAccountPreferences Preferences { get; set; } + } +} diff --git a/Wino.Core.Domain/Entities/MailAccountPreferences.cs b/Wino.Core.Domain/Entities/MailAccountPreferences.cs new file mode 100644 index 00000000..3bcd23cd --- /dev/null +++ b/Wino.Core.Domain/Entities/MailAccountPreferences.cs @@ -0,0 +1,39 @@ +using System; +using SQLite; + +namespace Wino.Core.Domain.Entities +{ + public class MailAccountPreferences + { + [PrimaryKey] + public Guid Id { get; set; } + + /// + /// Id of the account in MailAccount table. + /// + public Guid AccountId { get; set; } + + /// + /// Gets or sets whether sent draft messages should be appended to the sent folder. + /// Some IMAP servers do this automatically, some don't. + /// It's disabled by default. + /// + public bool ShouldAppendMessagesToSentFolder { get; set; } + + /// + /// Gets or sets whether the notifications are enabled for the account. + /// + public bool IsNotificationsEnabled { get; set; } + + /// + /// Gets or sets the custom account identifier color in hex. + /// + public string AccountColorHex { get; set; } + + /// + /// Gets or sets whether the account has Focused inbox support. + /// Null if the account provider type doesn't support Focused inbox. + /// + public bool? IsFocusedInboxEnabled { get; set; } + } +} diff --git a/Wino.Core.Domain/Entities/MailCopy.cs b/Wino.Core.Domain/Entities/MailCopy.cs new file mode 100644 index 00000000..de56aa79 --- /dev/null +++ b/Wino.Core.Domain/Entities/MailCopy.cs @@ -0,0 +1,140 @@ +using System; +using SQLite; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Entities +{ + /// + /// Summary of the parsed MIME messages. + /// Wino will do non-network operations on this table and others from the original MIME. + /// + public class MailCopy : IMailItem + { + /// + /// Unique Id of the mail. + /// + [PrimaryKey] + public Guid UniqueId { get; set; } + + /// + /// Not unique id of the item. Some operations held on this Id, some on the UniqueId. + /// Same message can be in different folder. In that case UniqueId is used. + /// + public string Id { get; set; } + + /// + /// Folder that this mail belongs to. + /// + public Guid FolderId { get; set; } + + /// + /// Conversation id for the mail. + /// + public string ThreadId { get; set; } + + /// + /// MIME MessageId if exists. + /// + public string MessageId { get; set; } + + /// + /// References header from MIME + /// + public string References { get; set; } + + /// + /// In-Reply-To header from MIME + /// + public string InReplyTo { get; set; } + + /// + /// Name for the sender. + /// + public string FromName { get; set; } + + /// + /// Address of the sender. + /// + public string FromAddress { get; set; } + + /// + /// Subject of the mail. + /// + public string Subject { get; set; } + + /// + /// Short preview of the content. + /// + public string PreviewText { get; set; } + + /// + /// Date that represents this mail has been created in provider servers. + /// Stored always in UTC. + /// + public DateTime CreationDate { get; set; } + + /// + /// Importance of the mail. + /// + public MailImportance Importance { get; set; } + + /// + /// Read status for the mail. + /// + public bool IsRead { get; set; } + + /// + /// Flag status. + /// Flagged for Outlook. + /// Important for Gmail. + /// + public bool IsFlagged { get; set; } + + /// + /// To support Outlook. + /// Gmail doesn't use it. + /// + public bool IsFocused { get; set; } + + /// + /// Whether mail has attachments included or not. + /// + public bool HasAttachments { get; set; } + + /// + /// Assigned draft id. + /// + public string DraftId { get; set; } + + /// + /// Whether this copy is draft or not. + /// + public bool IsDraft { get; set; } + + /// + /// File id that this mail is assigned to. + /// This Id is immutable. It's used to find the file in the file system. + /// Even after mapping local draft to remote draft, it will not change. + /// + public Guid FileId { get; set; } + + /// + /// Folder that this mail is assigned to. + /// Warning: This field is not populated by queries. + /// Services or View Models are responsible for populating this field. + /// + [Ignore] + public MailItemFolder AssignedFolder { get; set; } + + /// + /// Account that this mail is assigned to. + /// Warning: This field is not populated by queries. + /// Services or View Models are responsible for populating this field. + /// + [Ignore] + public MailAccount AssignedAccount { get; set; } + + public override string ToString() => $"{Subject} <-> {Id}"; + } +} diff --git a/Wino.Core.Domain/Entities/MailItemFolder.cs b/Wino.Core.Domain/Entities/MailItemFolder.cs new file mode 100644 index 00000000..d33fbb15 --- /dev/null +++ b/Wino.Core.Domain/Entities/MailItemFolder.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using SQLite; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.Domain.Entities +{ + [DebuggerDisplay("{FolderName} - {SpecialFolderType}")] + public class MailItemFolder : IMailItemFolder + { + [PrimaryKey] + public Guid Id { get; set; } + + public string RemoteFolderId { get; set; } + public string ParentRemoteFolderId { get; set; } + + public Guid MailAccountId { get; set; } + public string FolderName { get; set; } + public SpecialFolderType SpecialFolderType { get; set; } + public bool IsSystemFolder { get; set; } + public bool IsSticky { get; set; } + public bool IsSynchronizationEnabled { get; set; } + public bool IsHidden { get; set; } + public bool ShowUnreadCount { get; set; } + public DateTime? LastSynchronizedDate { get; set; } + + // For IMAP + public uint UidValidity { get; set; } + public long HighestModeSeq { get; set; } + + /// + /// Outlook shares delta changes per-folder. Gmail is for per-account. + /// This is only used for Outlook provider. + /// + public string DeltaToken { get; set; } + + // For GMail Labels + public string TextColorHex { get; set; } + public string BackgroundColorHex { get; set; } + + [Ignore] + public List ChildFolders { get; set; } = []; + + // Category and Move type folders are not valid move targets. + // These folders are virtual. They don't exist on the server. + public bool IsMoveTarget => !(SpecialFolderType == SpecialFolderType.More || SpecialFolderType == SpecialFolderType.Category); + + public bool ContainsSpecialFolderType(SpecialFolderType type) + { + if (SpecialFolderType == type) + return true; + + foreach (var child in ChildFolders) + { + if (child.SpecialFolderType == type) + { + return true; + } + else + { + return child.ContainsSpecialFolderType(type); + } + } + + return false; + } + + public override string ToString() => FolderName; + } +} diff --git a/Wino.Core.Domain/Entities/MergedInbox.cs b/Wino.Core.Domain/Entities/MergedInbox.cs new file mode 100644 index 00000000..b9d0a58a --- /dev/null +++ b/Wino.Core.Domain/Entities/MergedInbox.cs @@ -0,0 +1,13 @@ +using System; +using SQLite; + +namespace Wino.Core.Domain.Entities +{ + public class MergedInbox + { + [PrimaryKey] + public Guid Id { get; set; } + + public string Name { get; set; } + } +} diff --git a/Wino.Core.Domain/Entities/SystemFolderConfiguration.cs b/Wino.Core.Domain/Entities/SystemFolderConfiguration.cs new file mode 100644 index 00000000..b4c532d1 --- /dev/null +++ b/Wino.Core.Domain/Entities/SystemFolderConfiguration.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Wino.Core.Domain.Entities +{ + public record SystemFolderConfiguration(MailItemFolder SentFolder, + MailItemFolder DraftFolder, + MailItemFolder ArchiveFolder, + MailItemFolder TrashFolder, + MailItemFolder JunkFolder); +} diff --git a/Wino.Core.Domain/Entities/TokenInformation.cs b/Wino.Core.Domain/Entities/TokenInformation.cs new file mode 100644 index 00000000..88bf292c --- /dev/null +++ b/Wino.Core.Domain/Entities/TokenInformation.cs @@ -0,0 +1,26 @@ +using System; +using SQLite; +using Wino.Core.Domain.Models.Authentication; + +namespace Wino.Core.Domain.Entities +{ + public class TokenInformation : TokenInformationBase + { + [PrimaryKey] + public Guid Id { get; set; } + + public Guid AccountId { get; set; } + + public string Address { get; set; } + + public void RefreshTokens(TokenInformationBase tokenInformationBase) + { + if (tokenInformationBase == null) + throw new ArgumentNullException(nameof(tokenInformationBase)); + + AccessToken = tokenInformationBase.AccessToken; + RefreshToken = tokenInformationBase.RefreshToken; + ExpiresAt = tokenInformationBase.ExpiresAt; + } + } +} diff --git a/Wino.Core.Domain/Enums/AccountAttentionReason.cs b/Wino.Core.Domain/Enums/AccountAttentionReason.cs new file mode 100644 index 00000000..b192e74f --- /dev/null +++ b/Wino.Core.Domain/Enums/AccountAttentionReason.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum AccountAttentionReason + { + None, + InvalidCredentials, + MissingSystemFolderConfiguration + } +} diff --git a/Wino.Core.Domain/Enums/AccountCreationDialogState.cs b/Wino.Core.Domain/Enums/AccountCreationDialogState.cs new file mode 100644 index 00000000..af724f47 --- /dev/null +++ b/Wino.Core.Domain/Enums/AccountCreationDialogState.cs @@ -0,0 +1,14 @@ +namespace Wino.Core.Domain.Enums +{ + public enum AccountCreationDialogState + { + Idle, + SigningIn, + PreparingFolders, + Completed, + ManuelSetupWaiting, + TestingConnection, + AutoDiscoverySetup, + AutoDiscoveryInProgress + } +} diff --git a/Wino.Core.Domain/Enums/AccountSynchronizerState.cs b/Wino.Core.Domain/Enums/AccountSynchronizerState.cs new file mode 100644 index 00000000..9a9e0810 --- /dev/null +++ b/Wino.Core.Domain/Enums/AccountSynchronizerState.cs @@ -0,0 +1,12 @@ +namespace Wino.Core.Domain.Enums +{ + /// + /// Indicates the state of synchronizer. + /// + public enum AccountSynchronizerState + { + Idle, + ExecutingRequests, + Synchronizing + } +} diff --git a/Wino.Core.Domain/Enums/AppLanguage.cs b/Wino.Core.Domain/Enums/AppLanguage.cs new file mode 100644 index 00000000..0f3a6b9f --- /dev/null +++ b/Wino.Core.Domain/Enums/AppLanguage.cs @@ -0,0 +1,16 @@ +namespace Wino.Core.Domain.Enums +{ + public enum AppLanguage + { + None, + English, + Deutsch, + Russian, + Turkish, + Polish, + Czech, + Chinese, + Spanish, + French + } +} diff --git a/Wino.Core.Domain/Enums/AppThemeType.cs b/Wino.Core.Domain/Enums/AppThemeType.cs new file mode 100644 index 00000000..138f499b --- /dev/null +++ b/Wino.Core.Domain/Enums/AppThemeType.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum AppThemeType + { + System, + PreDefined, + Custom, + } +} diff --git a/Wino.Core.Domain/Enums/ApplicationElementTheme.cs b/Wino.Core.Domain/Enums/ApplicationElementTheme.cs new file mode 100644 index 00000000..6c3e0bca --- /dev/null +++ b/Wino.Core.Domain/Enums/ApplicationElementTheme.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum ApplicationElementTheme + { + Default, + Light, + Dark + } +} diff --git a/Wino.Core.Domain/Enums/BackgroundSynchronizationReason.cs b/Wino.Core.Domain/Enums/BackgroundSynchronizationReason.cs new file mode 100644 index 00000000..eac0a746 --- /dev/null +++ b/Wino.Core.Domain/Enums/BackgroundSynchronizationReason.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Enums +{ + public enum BackgroundSynchronizationReason + { + SessionConnected, + Timer + } +} diff --git a/Wino.Core.Domain/Enums/ChangeRequestType.cs b/Wino.Core.Domain/Enums/ChangeRequestType.cs new file mode 100644 index 00000000..d0af1669 --- /dev/null +++ b/Wino.Core.Domain/Enums/ChangeRequestType.cs @@ -0,0 +1,24 @@ +namespace Wino.Core.Domain.Enums +{ + public enum ChangeRequestType + { + MailMarkAs, + MailChangeFlag, + MailHardDelete, + MailMove, + MailAlwaysMoveTo, + MailChangeFocused, + MailArchive, + MailUnarchive, + FolderMarkAsRead, + FolderDelete, + FolderEmpty, + FolderRename, + CreateNewDraft, + CreateReplyDraft, + CreateForwardDraft, + DiscardDraft, + SendDraft, + FetchSingleItem + } +} diff --git a/Wino.Core.Domain/Enums/CustomIncomingServerType.cs b/Wino.Core.Domain/Enums/CustomIncomingServerType.cs new file mode 100644 index 00000000..40312e4a --- /dev/null +++ b/Wino.Core.Domain/Enums/CustomIncomingServerType.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Enums +{ + public enum CustomIncomingServerType + { + POP3, + IMAP4 + } +} diff --git a/Wino.Core.Domain/Enums/DraftCreationReason.cs b/Wino.Core.Domain/Enums/DraftCreationReason.cs new file mode 100644 index 00000000..e988c03a --- /dev/null +++ b/Wino.Core.Domain/Enums/DraftCreationReason.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Enums +{ + public enum DraftCreationReason + { + Empty, + Reply, + ReplyAll, + Forward + } +} diff --git a/Wino.Core.Domain/Enums/EditorToolbarSectionType.cs b/Wino.Core.Domain/Enums/EditorToolbarSectionType.cs new file mode 100644 index 00000000..187c8cb2 --- /dev/null +++ b/Wino.Core.Domain/Enums/EditorToolbarSectionType.cs @@ -0,0 +1,11 @@ +namespace Wino.Core.Domain.Enums +{ + public enum EditorToolbarSectionType + { + None, + Format, + Insert, + Draw, + Options + } +} diff --git a/Wino.Core.Domain/Enums/FilterOptionType.cs b/Wino.Core.Domain/Enums/FilterOptionType.cs new file mode 100644 index 00000000..4882f76b --- /dev/null +++ b/Wino.Core.Domain/Enums/FilterOptionType.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Enums +{ + public enum FilterOptionType + { + All, + Unread, + Flagged, + Mentions + } +} diff --git a/Wino.Core.Domain/Enums/FolderOperation.cs b/Wino.Core.Domain/Enums/FolderOperation.cs new file mode 100644 index 00000000..2d33144f --- /dev/null +++ b/Wino.Core.Domain/Enums/FolderOperation.cs @@ -0,0 +1,23 @@ +namespace Wino.Core.Domain.Enums +{ + /// + /// Defines all possible folder operations that can be done. + /// Available values for each folder is returned by IContextMenuProvider + /// that integrators hold. + /// + public enum FolderOperation + { + None, + Pin, + Unpin, + MarkAllAsRead, + DontSync, + Empty, + Rename, + Delete, + Move, + TurnOffNotifications, + CreateSubFolder, + Seperator + } +} diff --git a/Wino.Core.Domain/Enums/ImapAuthenticationMethod.cs b/Wino.Core.Domain/Enums/ImapAuthenticationMethod.cs new file mode 100644 index 00000000..4390f247 --- /dev/null +++ b/Wino.Core.Domain/Enums/ImapAuthenticationMethod.cs @@ -0,0 +1,13 @@ +namespace Wino.Core.Domain.Enums +{ + public enum ImapAuthenticationMethod + { + Auto, + None, + NormalPassword, + EncryptedPassword, + Ntlm, + CramMd5, + DigestMd5 + } +} diff --git a/Wino.Core.Domain/Enums/ImapConnectionSecurity.cs b/Wino.Core.Domain/Enums/ImapConnectionSecurity.cs new file mode 100644 index 00000000..9a3e6e7b --- /dev/null +++ b/Wino.Core.Domain/Enums/ImapConnectionSecurity.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Enums +{ + public enum ImapConnectionSecurity + { + Auto, + None, + StartTls, + SslTls + } +} diff --git a/Wino.Core.Domain/Enums/InfoBarAnimationType.cs b/Wino.Core.Domain/Enums/InfoBarAnimationType.cs new file mode 100644 index 00000000..488b667b --- /dev/null +++ b/Wino.Core.Domain/Enums/InfoBarAnimationType.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Enums +{ + public enum InfoBarAnimationType + { + SlideFromRightToLeft, + SlideFromBottomToTop + } +} diff --git a/Wino.Core.Domain/Enums/InfoBarMessageType.cs b/Wino.Core.Domain/Enums/InfoBarMessageType.cs new file mode 100644 index 00000000..15df6dcf --- /dev/null +++ b/Wino.Core.Domain/Enums/InfoBarMessageType.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Enums +{ + public enum InfoBarMessageType + { + Information, + Success, + Warning, + Error + } +} diff --git a/Wino.Core.Domain/Enums/MailAttachmentType.cs b/Wino.Core.Domain/Enums/MailAttachmentType.cs new file mode 100644 index 00000000..b444b4c5 --- /dev/null +++ b/Wino.Core.Domain/Enums/MailAttachmentType.cs @@ -0,0 +1,16 @@ +namespace Wino.Core.Domain.Enums +{ + public enum MailAttachmentType + { + None, + Executable, + Image, + Audio, + Video, + PDF, + HTML, + RarArchive, + Archive, + Other + } +} diff --git a/Wino.Core.Domain/Enums/MailImportance.cs b/Wino.Core.Domain/Enums/MailImportance.cs new file mode 100644 index 00000000..22f2a6ab --- /dev/null +++ b/Wino.Core.Domain/Enums/MailImportance.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum MailImportance + { + Low, + Normal, + High + } +} diff --git a/Wino.Core.Domain/Enums/MailListDisplayMode.cs b/Wino.Core.Domain/Enums/MailListDisplayMode.cs new file mode 100644 index 00000000..d27278e7 --- /dev/null +++ b/Wino.Core.Domain/Enums/MailListDisplayMode.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum MailListDisplayMode + { + Spacious, + Medium, + Compact, + } +} diff --git a/Wino.Core.Domain/Enums/MailMarkAsOption.cs b/Wino.Core.Domain/Enums/MailMarkAsOption.cs new file mode 100644 index 00000000..e08ce803 --- /dev/null +++ b/Wino.Core.Domain/Enums/MailMarkAsOption.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum MailMarkAsOption + { + WhenSelected, + DontMark, + AfterDelay + } +} diff --git a/Wino.Core.Domain/Enums/MailOperation.cs b/Wino.Core.Domain/Enums/MailOperation.cs new file mode 100644 index 00000000..d221a090 --- /dev/null +++ b/Wino.Core.Domain/Enums/MailOperation.cs @@ -0,0 +1,49 @@ +namespace Wino.Core.Domain.Enums +{ + // Synchronizer requests. + public enum MailSynchronizerOperation + { + MarkRead, + Move, + Delete, // Hard delete. + CreateDraft, + Send, + ChangeFlag, + AlwaysMoveTo, + MoveToFocused, + RenameFolder + } + + // UI requests + public enum MailOperation + { + None, + Archive, + UnArchive, + SoftDelete, + HardDelete, + Move, + MoveToJunk, + MoveToFocused, + MoveToOther, + AlwaysMoveToOther, + AlwaysMoveToFocused, + SetFlag, + ClearFlag, + MarkAsRead, + MarkAsUnread, + MarkAsNotJunk, + Seperator, + Ignore, + Reply, + ReplyAll, + Zoom, + SaveAs, + Find, + Forward, + DarkEditor, + LightEditor, + Print, + Navigate // For toast activation + } +} diff --git a/Wino.Core.Domain/Enums/MailProviderType.cs b/Wino.Core.Domain/Enums/MailProviderType.cs new file mode 100644 index 00000000..a9156f68 --- /dev/null +++ b/Wino.Core.Domain/Enums/MailProviderType.cs @@ -0,0 +1,11 @@ +namespace Wino.Core.Domain.Enums +{ + public enum MailProviderType + { + Outlook, + Gmail, + Office365, + Yahoo, + IMAP4 + } +} diff --git a/Wino.Core.Domain/Enums/MenuPaneMode.cs b/Wino.Core.Domain/Enums/MenuPaneMode.cs new file mode 100644 index 00000000..3d6e77b8 --- /dev/null +++ b/Wino.Core.Domain/Enums/MenuPaneMode.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Enums +{ + public enum MenuPaneMode + { + Visible, + Hidden + } +} diff --git a/Wino.Core.Domain/Enums/NavigationReferenceFrame.cs b/Wino.Core.Domain/Enums/NavigationReferenceFrame.cs new file mode 100644 index 00000000..1d116fdb --- /dev/null +++ b/Wino.Core.Domain/Enums/NavigationReferenceFrame.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Enums +{ + public enum NavigationReferenceFrame + { + ShellFrame, + RenderingFrame + } +} diff --git a/Wino.Core.Domain/Enums/PickFolderReason.cs b/Wino.Core.Domain/Enums/PickFolderReason.cs new file mode 100644 index 00000000..99067066 --- /dev/null +++ b/Wino.Core.Domain/Enums/PickFolderReason.cs @@ -0,0 +1,12 @@ +namespace Wino.Core.Domain.Enums +{ + /// + /// Defines the potential reasons for picking folder in the folder picking dialog. + /// + public enum PickFolderReason + { + Move, + SpecialFolder, + Any + } +} diff --git a/Wino.Core.Domain/Enums/ReaderFont.cs b/Wino.Core.Domain/Enums/ReaderFont.cs new file mode 100644 index 00000000..53c0e39a --- /dev/null +++ b/Wino.Core.Domain/Enums/ReaderFont.cs @@ -0,0 +1,15 @@ +namespace Wino.Core.Domain.Enums +{ + public enum ReaderFont + { + Arial, + TimesNewRoman, + Verdana, + Tahoma, + CourierNew, + Georgia, + TrebuchetMS, + Calibri, + Helvetica + } +} diff --git a/Wino.Core.Domain/Enums/SortingOptionType.cs b/Wino.Core.Domain/Enums/SortingOptionType.cs new file mode 100644 index 00000000..4a88d2fd --- /dev/null +++ b/Wino.Core.Domain/Enums/SortingOptionType.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Enums +{ + public enum SortingOptionType + { + ReceiveDate, + Sender + } +} diff --git a/Wino.Core.Domain/Enums/SpecialFolderType.cs b/Wino.Core.Domain/Enums/SpecialFolderType.cs new file mode 100644 index 00000000..b26ae4c3 --- /dev/null +++ b/Wino.Core.Domain/Enums/SpecialFolderType.cs @@ -0,0 +1,24 @@ +namespace Wino.Core.Domain.Enums +{ + public enum SpecialFolderType + { + Inbox, + Starred, + Important, + Sent, + Draft, + Archive, + Deleted, + Junk, + Chat, + Category, + Unread, + Forums, + Updates, + Personal, + Promotions, + Social, + Other, + More + } +} diff --git a/Wino.Core.Domain/Enums/StorePurchaseResult.cs b/Wino.Core.Domain/Enums/StorePurchaseResult.cs new file mode 100644 index 00000000..8364b81a --- /dev/null +++ b/Wino.Core.Domain/Enums/StorePurchaseResult.cs @@ -0,0 +1,19 @@ +namespace Wino.Core.Domain.Enums +{ + // From the SDK. + public enum StorePurchaseResult + { + // + // Summary: + // The purchase request succeeded. + Succeeded, + // + // Summary: + // The current user has already purchased the specified app or add-on. + AlreadyPurchased, + // + // Summary: + // The purchase request did not succeed. + NotPurchased, + } +} diff --git a/Wino.Core.Domain/Enums/SynchronizationCompletedState.cs b/Wino.Core.Domain/Enums/SynchronizationCompletedState.cs new file mode 100644 index 00000000..b4376afe --- /dev/null +++ b/Wino.Core.Domain/Enums/SynchronizationCompletedState.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Enums +{ + public enum SynchronizationCompletedState + { + Success, // All succeeded. + Canceled, // Canceled by user or HTTP call. + Failed // Exception. + } +} diff --git a/Wino.Core.Domain/Enums/SynchronizationType.cs b/Wino.Core.Domain/Enums/SynchronizationType.cs new file mode 100644 index 00000000..c95b7d52 --- /dev/null +++ b/Wino.Core.Domain/Enums/SynchronizationType.cs @@ -0,0 +1,11 @@ +namespace Wino.Core.Domain.Enums +{ + public enum SynchronizationType + { + FoldersOnly, // Only synchronize folder metadata. + ExecuteRequests, // Run the queued requests, and then synchronize if needed. + Inbox, // Only Inbox + Custom, // Only sync folders that are specified in the options. + Full, // Synchronize everything + } +} diff --git a/Wino.Core.Domain/Enums/WinoPage.cs b/Wino.Core.Domain/Enums/WinoPage.cs new file mode 100644 index 00000000..69fbd7fa --- /dev/null +++ b/Wino.Core.Domain/Enums/WinoPage.cs @@ -0,0 +1,25 @@ +namespace Wino.Core.Domain.Enums +{ + /// + /// All registered views. + /// + public enum WinoPage + { + None, + IdlePage, + ComposePage, + SettingsPage, + MailRenderingPage, + WelcomePage, + AccountDetailsPage, + MergedAccountDetailsPage, + AccountManagementPage, + SignatureManagementPage, + AboutPage, + PersonalizationPage, + MessageListPage, + MailListPage, + ReadingPanePage, + SettingOptionsPage + } +} diff --git a/Wino.Core.Domain/Exceptions/AccountSetupCanceledException.cs b/Wino.Core.Domain/Exceptions/AccountSetupCanceledException.cs new file mode 100644 index 00000000..03819076 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/AccountSetupCanceledException.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Domain.Exceptions +{ + public class AccountSetupCanceledException : System.Exception + { + + } +} diff --git a/Wino.Core.Domain/Exceptions/AuthenticationAttentionException.cs b/Wino.Core.Domain/Exceptions/AuthenticationAttentionException.cs new file mode 100644 index 00000000..63b577f8 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/AuthenticationAttentionException.cs @@ -0,0 +1,19 @@ +using System; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Exceptions +{ + /// + /// Thrown when IAuthenticator requires user interaction to fix authentication issues. + /// It can be expired and can't restorable token, or some stuff that requires re-authentication. + /// + public class AuthenticationAttentionException : Exception + { + public AuthenticationAttentionException(MailAccount account) + { + Account = account; + } + + public MailAccount Account { get; } + } +} diff --git a/Wino.Core.Domain/Exceptions/AuthenticationException.cs b/Wino.Core.Domain/Exceptions/AuthenticationException.cs new file mode 100644 index 00000000..87e622df --- /dev/null +++ b/Wino.Core.Domain/Exceptions/AuthenticationException.cs @@ -0,0 +1,18 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + /// + /// All exceptions related to authentication. + /// + public class AuthenticationException : Exception + { + public AuthenticationException(string message) : base(message) + { + } + + public AuthenticationException(string message, Exception innerException) : base(message, innerException) + { + } + } +} diff --git a/Wino.Core.Domain/Exceptions/BackgroundTaskExecutionRequestDeniedException.cs b/Wino.Core.Domain/Exceptions/BackgroundTaskExecutionRequestDeniedException.cs new file mode 100644 index 00000000..532addbd --- /dev/null +++ b/Wino.Core.Domain/Exceptions/BackgroundTaskExecutionRequestDeniedException.cs @@ -0,0 +1,9 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + /// + /// An exception thrown when the background task execution policies are denied for some reason. + /// + public class BackgroundTaskExecutionRequestDeniedException : Exception { } +} diff --git a/Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs b/Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs new file mode 100644 index 00000000..50d3d40d --- /dev/null +++ b/Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs @@ -0,0 +1,9 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + /// + /// An exception thrown when the background task registration is failed. + /// + public class BackgroundTaskRegistrationFailedException : Exception { } +} diff --git a/Wino.Core.Domain/Exceptions/ComposerMimeNotFoundException.cs b/Wino.Core.Domain/Exceptions/ComposerMimeNotFoundException.cs new file mode 100644 index 00000000..2a82d580 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/ComposerMimeNotFoundException.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + /// + /// Thrown when composer cant find the mime to load. + /// + public class ComposerMimeNotFoundException : Exception + { + } +} diff --git a/Wino.Core.Domain/Exceptions/CustomThemeCreationFailedException.cs b/Wino.Core.Domain/Exceptions/CustomThemeCreationFailedException.cs new file mode 100644 index 00000000..8ffd3992 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/CustomThemeCreationFailedException.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + public class CustomThemeCreationFailedException : Exception + { + public CustomThemeCreationFailedException(string message) : base(message) + { + } + } +} diff --git a/Wino.Core.Domain/Exceptions/GoogleAuthenticationException.cs b/Wino.Core.Domain/Exceptions/GoogleAuthenticationException.cs new file mode 100644 index 00000000..71d244c1 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/GoogleAuthenticationException.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Domain.Exceptions +{ + public class GoogleAuthenticationException : System.Exception + { + public GoogleAuthenticationException(string message) : base(message) { } + } +} diff --git a/Wino.Core.Domain/Exceptions/ImapClientPoolException.cs b/Wino.Core.Domain/Exceptions/ImapClientPoolException.cs new file mode 100644 index 00000000..bd027024 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/ImapClientPoolException.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + public class ImapClientPoolException : Exception + { + public ImapClientPoolException(Exception innerException) : base(Translator.Exception_ImapClientPoolFailed, innerException) + { + } + } +} diff --git a/Wino.Core.Domain/Exceptions/InvalidMoveTargetException.cs b/Wino.Core.Domain/Exceptions/InvalidMoveTargetException.cs new file mode 100644 index 00000000..05f3e7b4 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/InvalidMoveTargetException.cs @@ -0,0 +1,6 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + public class InvalidMoveTargetException : Exception { } +} diff --git a/Wino.Core.Domain/Exceptions/SynchronizerEntityNotFoundException.cs b/Wino.Core.Domain/Exceptions/SynchronizerEntityNotFoundException.cs new file mode 100644 index 00000000..4d35aad6 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/SynchronizerEntityNotFoundException.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + public class SynchronizerEntityNotFoundException : Exception + { + public SynchronizerEntityNotFoundException(string message) : base(message) + { + } + } +} diff --git a/Wino.Core.Domain/Exceptions/SynchronizerException.cs b/Wino.Core.Domain/Exceptions/SynchronizerException.cs new file mode 100644 index 00000000..cd2960fb --- /dev/null +++ b/Wino.Core.Domain/Exceptions/SynchronizerException.cs @@ -0,0 +1,15 @@ +using System; + +namespace Wino.Core.Domain.Exceptions +{ + public class SynchronizerException : Exception + { + public SynchronizerException(string message) : base(message) + { + } + + public SynchronizerException(string message, Exception innerException) : base(message, innerException) + { + } + } +} diff --git a/Wino.Core.Domain/Exceptions/SystemFolderConfigurationMissingException.cs b/Wino.Core.Domain/Exceptions/SystemFolderConfigurationMissingException.cs new file mode 100644 index 00000000..918aa253 --- /dev/null +++ b/Wino.Core.Domain/Exceptions/SystemFolderConfigurationMissingException.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Domain.Exceptions +{ + /// + /// When IMAP account's system folder configuration setup is not done yet. + /// + public class SystemFolderConfigurationMissingException : System.Exception { } +} diff --git a/Wino.Core.Domain/Exceptions/UnavailableSpecialFolderException.cs b/Wino.Core.Domain/Exceptions/UnavailableSpecialFolderException.cs new file mode 100644 index 00000000..9153cbaa --- /dev/null +++ b/Wino.Core.Domain/Exceptions/UnavailableSpecialFolderException.cs @@ -0,0 +1,20 @@ +using System; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Exceptions +{ + /// + /// Emitted when special folder is needed for an operation but it couldn't be found. + /// + public class UnavailableSpecialFolderException : Exception + { + public UnavailableSpecialFolderException(SpecialFolderType specialFolderType, Guid accountId) + { + SpecialFolderType = specialFolderType; + AccountId = accountId; + } + + public SpecialFolderType SpecialFolderType { get; } + public Guid AccountId { get; set; } + } +} diff --git a/Wino.Core.Domain/Interfaces/AfterRequestExecutionSynchronizationInterfaces.cs b/Wino.Core.Domain/Interfaces/AfterRequestExecutionSynchronizationInterfaces.cs new file mode 100644 index 00000000..b1784d08 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/AfterRequestExecutionSynchronizationInterfaces.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Wino.Core.Domain.Interfaces +{ + /// + /// An interface that should force synchronizer to do synchronization for only given folder ids + /// after the execution is completed. + /// + public interface ICustomFolderSynchronizationRequest + { + /// + /// Which folders to sync after this operation? + /// + List SynchronizationFolderIds { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs b/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs new file mode 100644 index 00000000..c74a8413 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAccountCreationDialog.cs @@ -0,0 +1,11 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAccountCreationDialog + { + void ShowDialog(); + void Complete(); + AccountCreationDialogState State { get; set; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountMenuItem.cs b/Wino.Core.Domain/Interfaces/IAccountMenuItem.cs new file mode 100644 index 00000000..b3870e3e --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAccountMenuItem.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAccountMenuItem : IMenuItem + { + double SynchronizationProgress { get; set; } + int UnreadItemCount { get; set; } + IEnumerable HoldingAccounts { get; } + void UpdateAccount(MailAccount account); + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountPickerDialog.cs b/Wino.Core.Domain/Interfaces/IAccountPickerDialog.cs new file mode 100644 index 00000000..a43bbc26 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAccountPickerDialog.cs @@ -0,0 +1,6 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IAccountPickerDialog + { + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountProviderDetailViewModel.cs b/Wino.Core.Domain/Interfaces/IAccountProviderDetailViewModel.cs new file mode 100644 index 00000000..b535fea1 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAccountProviderDetailViewModel.cs @@ -0,0 +1,17 @@ +using System; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAccountProviderDetailViewModel + { + /// + /// Entity id that will help to identify the startup entity on launch. + /// + Guid StartupEntityId { get; } + + /// + /// Name representation of the view model that will be used to identify the startup entity on launch. + /// + string StartupEntityTitle { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountProviderDetails.cs b/Wino.Core.Domain/Interfaces/IAccountProviderDetails.cs new file mode 100644 index 00000000..65d0d5b7 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAccountProviderDetails.cs @@ -0,0 +1,11 @@ +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAccountProviderDetails + { + MailAccount Account { get; set; } + bool AutoExtend { get; set; } + IProviderDetail ProviderDetail { get; set; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IAccountService.cs b/Wino.Core.Domain/Interfaces/IAccountService.cs new file mode 100644 index 00000000..99190af3 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAccountService.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAccountService + { + /// + /// Current IAuthenticator that should receive external authentication process to continue with. + /// For example: Google auth will launch a browser authentication. After it completes, this is the IAuthenticator + /// to continue process for token exchange. + /// + IAuthenticator ExternalAuthenticationAuthenticator { get; set; } + + /// + /// Returns all local accounts. + /// + /// All local accounts + Task> GetAccountsAsync(); + + /// + /// Returns single MailAccount + /// + /// AccountId. + Task GetAccountAsync(Guid accountId); + + /// + /// Deletes all information about the account, including token information. + /// + /// MailAccount to be removed + Task DeleteAccountAsync(MailAccount account); + + /// + /// Returns the custom server information for the given account id. + /// + Task GetAccountCustomServerInformationAsync(Guid accountId); + + /// + /// Updates the given account properties. + /// + Task UpdateAccountAsync(MailAccount account); + + /// + /// Creates new account with the given server information if any. + /// Also sets the account as Startup account if there are no accounts. + /// + Task CreateAccountAsync(MailAccount account, TokenInformation tokenInformation, CustomServerInformation customServerInformation); + + /// + /// Fixed authentication errors for account by forcing interactive login. + /// + Task FixTokenIssuesAsync(Guid accountId); + + /// + /// Removed the attention from an account. + /// + /// Account id to remove from + Task ClearAccountAttentionAsync(Guid accountId); + + /// + /// Updates the account synchronization identifier. + /// For example: Gmail uses this identifier to keep track of the last synchronization. + /// Update is ignored for Gmail if the new identifier is older than the current one. + /// + /// Identifier to update + /// Current account synchronization modifier. + Task UpdateSynchronizationIdentifierAsync(Guid accountId, string newIdentifier); + + Task RenameMergedAccountAsync(Guid mergedInboxId, string newName); + + Task CreateMergeAccountsAsync(MergedInbox mergedInbox, IEnumerable accountsToMerge); + + Task UpdateMergedInboxAsync(Guid mergedInboxId, IEnumerable linkedAccountIds); + + Task UnlinkMergedInboxAsync(Guid mergedInboxId); + } +} diff --git a/Wino.Core.Domain/Interfaces/IAppInitializerService.cs b/Wino.Core.Domain/Interfaces/IAppInitializerService.cs new file mode 100644 index 00000000..ffc6945d --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAppInitializerService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAppInitializerService + { + string GetApplicationDataFolder(); + + Task MigrateAsync(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IApplicationResourceManager.cs b/Wino.Core.Domain/Interfaces/IApplicationResourceManager.cs new file mode 100644 index 00000000..a8e1b22c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IApplicationResourceManager.cs @@ -0,0 +1,11 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IApplicationResourceManager + { + void RemoveResource(T resource); + void AddResource(T resource); + bool ContainsResourceKey(string resourceKey); + void ReplaceResource(string resourceKey, object resource); + T GetLastResource(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IAuthenticationProvider.cs b/Wino.Core.Domain/Interfaces/IAuthenticationProvider.cs new file mode 100644 index 00000000..49390dcb --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAuthenticationProvider.cs @@ -0,0 +1,9 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAuthenticationProvider + { + IAuthenticator GetAuthenticator(MailProviderType providerType); + } +} diff --git a/Wino.Core.Domain/Interfaces/IAuthenticator.cs b/Wino.Core.Domain/Interfaces/IAuthenticator.cs new file mode 100644 index 00000000..ced495d6 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAuthenticator.cs @@ -0,0 +1,53 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IAuthenticator + { + /// + /// Type of the provider. + /// + MailProviderType ProviderType { get; } + + /// + /// Gets the token from the cache if exists. + /// If the token is expired, tries to refresh. + /// This can throw AuthenticationAttentionException if silent refresh fails. + /// + /// Account to get token for. + /// Valid token info to be used in integrators. + Task GetTokenAsync(MailAccount account); + + /// + /// Initial creation of token. Requires user interaction. + /// This will save token into database, but still returns for account creation + /// since account address is required. + /// + /// Token cache might ask for regeneration of token for specific + /// account address. If one is provided and re-generation native token doesn't belong to this address + /// token saving to database won't happen. + /// Freshly created TokenInformation.. + Task GenerateTokenAsync(MailAccount account, bool saveToken); + + /// + /// Required for external authorization on launched browser to continue. + /// Used for Gmail. + /// + /// Response's redirect uri. + void ContinueAuthorization(Uri authorizationResponseUri); + + /// + /// For external browser required authentications. + /// Canceling Gmail authentication dialog etc. + /// + void CancelAuthorization(); + + /// + /// ClientId in case of needed for authorization/authentication. + /// + string ClientId { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IAutoDiscoveryService.cs b/Wino.Core.Domain/Interfaces/IAutoDiscoveryService.cs new file mode 100644 index 00000000..6886022d --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IAutoDiscoveryService.cs @@ -0,0 +1,18 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Models.AutoDiscovery; + +namespace Wino.Core.Domain.Interfaces +{ + /// + /// Searches for Auto Discovery settings for custom mail accounts. + /// + public interface IAutoDiscoveryService + { + /// + /// Tries to return the best mail server settings using different techniques. + /// + /// Address to search settings for. + /// CustomServerInformation with only settings applied. + Task GetAutoDiscoverySettings(AutoDiscoveryMinimalSettings autoDiscoveryMinimalSettings); + } +} diff --git a/Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs b/Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs new file mode 100644 index 00000000..b6411b32 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IBackgroundTaskService + { + /// + /// Manages background task registrations, requests access if needed, checks the statusses of them etc. + /// + /// If the access request is denied for some reason. + /// If one of the requires background tasks are failed during registration. + Task HandleBackgroundTaskRegistrations(); + + /// + /// Unregisters all existing background tasks. Useful for migrations. + /// + void UnregisterAllBackgroundTask(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IClipboardService.cs b/Wino.Core.Domain/Interfaces/IClipboardService.cs new file mode 100644 index 00000000..f5bb4782 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IClipboardService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IClipboardService + { + Task CopyClipboardAsync(string text); + } +} diff --git a/Wino.Core.Domain/Interfaces/IConfigurationService.cs b/Wino.Core.Domain/Interfaces/IConfigurationService.cs new file mode 100644 index 00000000..c08c463c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IConfigurationService.cs @@ -0,0 +1,11 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IConfigurationService + { + void Set(string key, object value); + T Get(string key, T defaultValue = default); + + void SetRoaming(string key, object value); + T GetRoaming(string key, T defaultValue = default); + } +} diff --git a/Wino.Core.Domain/Interfaces/IConfirmationDialog.cs b/Wino.Core.Domain/Interfaces/IConfirmationDialog.cs new file mode 100644 index 00000000..34630448 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IConfirmationDialog.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IConfirmationDialog + { + Task ShowDialogAsync(string title, string message, string approveButtonTitle); + } +} diff --git a/Wino.Core.Domain/Interfaces/IContextMenuItemService.cs b/Wino.Core.Domain/Interfaces/IContextMenuItemService.cs new file mode 100644 index 00000000..06d91240 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IContextMenuItemService.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IContextMenuItemService + { + IEnumerable GetFolderContextMenuActions(IBaseFolderMenuItem folderInformation); + IEnumerable GetMailItemContextMenuActions(IEnumerable selectedMailItems); + IEnumerable GetMailItemRenderMenuActions(IMailItem mailItem, bool isDarkEditor); + } +} diff --git a/Wino.Core.Domain/Interfaces/IContextMenuProvider.cs b/Wino.Core.Domain/Interfaces/IContextMenuProvider.cs new file mode 100644 index 00000000..968b2c2c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IContextMenuProvider.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IContextMenuProvider + { + /// + /// Calculates and returns available folder operations for the given folder. + /// + /// Folder to get actions for. + IEnumerable GetFolderContextMenuActions(IMailItemFolder folderInformation); + + /// + /// Calculates and returns available context menu items for selected mail items. + /// + /// Current folder that asks for the menu items. + /// Selected menu items in the given folder. + IEnumerable GetMailItemContextMenuActions(IMailItemFolder folderInformation, IEnumerable selectedMailItems); + + /// + /// Calculates and returns available mail operations for mail rendering CommandBar. + /// + /// Rendered mail item. + /// Folder that mail item belongs to. + IEnumerable GetMailItemRenderMenuActions(IMailItem mailItem, IMailItemFolder activeFolder, bool isDarkEditor); + } +} diff --git a/Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs b/Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs new file mode 100644 index 00000000..ef3a81f1 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ICustomServerAccountCreationDialog.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Interfaces +{ + public interface ICustomServerAccountCreationDialog : IAccountCreationDialog + { + /// + /// Returns the custom server information from the dialog.. + /// + /// Null if canceled. + Task GetCustomServerInformationAsync(); + + /// + /// Displays preparing folders page. + /// + void ShowPreparingFolders(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IDialogService.cs b/Wino.Core.Domain/Interfaces/IDialogService.cs new file mode 100644 index 00000000..d1954e9c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IDialogService.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IDialogService + { + Task PickWindowsFolderAsync(); + Task PickWindowsFileContentAsync(params object[] typeFilters); + Task ShowConfirmationDialogAsync(string question, string title, string confirmationButtonTitle); + Task ShowHardDeleteConfirmationAsync(); + Task ShowRatingDialogAsync(); + Task HandleSystemFolderConfigurationDialogAsync(Guid accountId, IFolderService folderService); + Task ShowCustomThemeBuilderDialogAsync(); + + Task ShowMessageAsync(string message, string title); + void InfoBarMessage(string title, string message, InfoBarMessageType messageType); + void InfoBarMessage(string title, string message, InfoBarMessageType messageType, string actionButtonText, Action action); + + void ShowNotSupportedMessage(); + + // Custom dialogs + Task ShowMoveMailFolderDialogAsync(List availableFolders); + Task> ShowNewAccountMailProviderDialogAsync(List availableProviders); + IAccountCreationDialog GetAccountCreationDialog(MailProviderType type); + Task ShowTextInputDialogAsync(string currentInput, string dialogTitle, string dialogDescription); + Task ShowEditAccountDialogAsync(MailAccount account); + Task ShowAccountPickerDialogAsync(List availableAccounts); + + /// + /// Presents a dialog to the user for selecting folder. + /// + /// Account to get folders for. + /// The reason behind the picking operation + /// Selected folder structure. Null if none. + Task PickFolderAsync(Guid accountId, PickFolderReason reason, IFolderService folderService); + } +} diff --git a/Wino.Core.Domain/Interfaces/IDispatcher.cs b/Wino.Core.Domain/Interfaces/IDispatcher.cs new file mode 100644 index 00000000..0eb9f08b --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IDispatcher.cs @@ -0,0 +1,10 @@ +using System; +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IDispatcher + { + Task ExecuteOnUIThread(Action action); + } +} diff --git a/Wino.Core.Domain/Interfaces/IFileService.cs b/Wino.Core.Domain/Interfaces/IFileService.cs new file mode 100644 index 00000000..5500e2f9 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IFileService.cs @@ -0,0 +1,12 @@ +using System.IO; +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IFileService + { + Task CopyFileAsync(string sourceFilePath, string destinationFolderPath); + Task GetFileStreamAsync(string folderPath, string fileName); + Task GetFileContentByApplicationUriAsync(string resourcePath); + } +} diff --git a/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs b/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs new file mode 100644 index 00000000..a361144a --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IFolderMenuItem : IBaseFolderMenuItem + { + MailAccount ParentAccount { get; } + } + + public interface IMergedAccountFolderMenuItem : IBaseFolderMenuItem { } + + public interface IBaseFolderMenuItem : IMenuItem + { + string FolderName { get; } + bool IsSynchronizationEnabled { get; } + int UnreadItemCount { get; set; } + SpecialFolderType SpecialFolderType { get; } + IEnumerable HandlingFolders { get; } + bool IsMoveTarget { get; } + bool IsSticky { get; } + bool IsSystemFolder { get; } + bool ShowUnreadCount { get; } + string AssignedAccountName { get; } + + void UpdateFolder(IMailItemFolder folder); + } +} diff --git a/Wino.Core.Domain/Interfaces/IFolderService.cs b/Wino.Core.Domain/Interfaces/IFolderService.cs new file mode 100644 index 00000000..9b58ce11 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IFolderService.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Synchronization; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IFolderService + { + Task GetFolderStructureForAccountAsync(Guid accountId, bool includeHiddenFolders); + Task GetFolderAsync(Guid folderId); + Task GetFolderAsync(Guid accountId, string remoteFolderId); + Task> GetFoldersAsync(Guid accountId); + Task> GetUnreadUpdateFoldersAsync(Guid accountId); + Task SetSpecialFolderAsync(Guid folderId, SpecialFolderType type); + Task GetSpecialFolderByAccountIdAsync(Guid accountId, SpecialFolderType type); + Task GetCurrentItemCountForFolder(Guid folderId); + Task GetFolderNotificationBadgeAsync(Guid folderId); + Task ChangeStickyStatusAsync(Guid folderId, bool isSticky); + Task UpdateCustomServerMailListAsync(Guid accountId, List folders); + + Task UpdateSystemFolderConfigurationAsync(Guid accountId, SystemFolderConfiguration configuration); + Task ChangeFolderSynchronizationStateAsync(Guid folderId, bool isSynchronizationEnabled); + Task ChangeFolderShowUnreadCountStateAsync(Guid folderId, bool showUnreadCount); + + Task> GetSynchronizationFoldersAsync(SynchronizationOptions options); + + /// + /// Returns the folder - mail mapping for the given mail copy ids. + /// + Task> GetMailFolderPairMetadatasAsync(IEnumerable mailCopyIds); + + /// + /// Returns the folder - mail mapping for the given mail copy id. + /// + Task> GetMailFolderPairMetadatasAsync(string mailCopyId); + + // v2 + + /// + /// Performs bulk update for the given folders. + /// Used in Gmail. + /// + /// Account that folders belong to. + /// Folders to update. + Task BulkUpdateFolderStructureAsync(Guid accountId, List allFolders); + + /// + /// Updates Folder's delta synchronization identifier. + /// Only used in Outlook since it does per-folder sync. + /// + /// Folder id + /// New synchronization identifier. + /// New identifier if success. + Task UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string synchronizationIdentifier); + + /// + /// Deletes the folder for the given account by remote folder id. + /// + /// Account to remove from. + /// Remote folder id. + /// + Task DeleteFolderAsync(Guid accountId, string remoteFolderId); + + /// + /// Adds a new folder. + /// + /// Folder to add. + Task InsertFolderAsync(MailItemFolder folder); + + + /// + /// Returns the known uids for the given folder. + /// Only used for IMAP + /// + /// Folder to get uIds for + Task> GetKnownUidsForFolderAsync(Guid folderId); + + /// + /// Checks if Inbox special folder exists for an account. + /// + /// Account id to check for. + /// True if Inbox exists, False if not. + Task IsInboxAvailableForAccountAsync(Guid accountId); + + Task TestAsync(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IFontService.cs b/Wino.Core.Domain/Interfaces/IFontService.cs new file mode 100644 index 00000000..ff00cdab --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IFontService.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Reader; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IFontService + { + List GetReaderFonts(); + ReaderFontModel GetCurrentReaderFont(); + int GetCurrentReaderFontSize(); + + void ChangeReaderFont(ReaderFont font); + void ChangeReaderFontSize(int size); + } +} diff --git a/Wino.Core.Domain/Interfaces/IImapTestService.cs b/Wino.Core.Domain/Interfaces/IImapTestService.cs new file mode 100644 index 00000000..1288bc39 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IImapTestService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IImapTestService + { + Task TestImapConnectionAsync(CustomServerInformation serverInformation); + } +} diff --git a/Wino.Core.Domain/Interfaces/IInitializeAsync.cs b/Wino.Core.Domain/Interfaces/IInitializeAsync.cs new file mode 100644 index 00000000..1850a7c0 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IInitializeAsync.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + /// + /// An interface that all startup services must implement. + /// + public interface IInitializeAsync + { + Task InitializeAsync(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IKeyPressService.cs b/Wino.Core.Domain/Interfaces/IKeyPressService.cs new file mode 100644 index 00000000..724ad0c4 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IKeyPressService.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IKeyPressService + { + bool IsCtrlKeyPressed(); + bool IsShiftKeyPressed(); + } +} diff --git a/Wino.Core.Domain/Interfaces/ILaunchProtocolService.cs b/Wino.Core.Domain/Interfaces/ILaunchProtocolService.cs new file mode 100644 index 00000000..5c141d4b --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ILaunchProtocolService.cs @@ -0,0 +1,10 @@ +using System.Collections.Specialized; + +namespace Wino.Core.Domain.Interfaces +{ + public interface ILaunchProtocolService + { + object LaunchParameter { get; set; } + NameValueCollection MailtoParameters { get; set; } + } +} diff --git a/Wino.Core.Domain/Interfaces/ILogInitializer.cs b/Wino.Core.Domain/Interfaces/ILogInitializer.cs new file mode 100644 index 00000000..f5f7e97d --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ILogInitializer.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface ILogInitializer + { + void SetupLogger(string logFolderPath); + + void RefreshLoggingLevel(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IMailService.cs b/Wino.Core.Domain/Interfaces/IMailService.cs new file mode 100644 index 00000000..7b09dc51 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IMailService.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MimeKit; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IMailService + { + Task GetSingleMailItemAsync(string mailCopyId, string remoteFolderId); + Task GetSingleMailItemAsync(Guid uniqueMailId); + Task CreateDraftAsync(MailAccount composerAccount, MimeMessage generatedReplyMime, MimeMessage replyingMimeMessage = null, IMailItem replyingMailItem = null); + Task> FetchMailsAsync(MailListInitializationOptions options); + + Task> GetMailIdsByFolderIdAsync(Guid folderId); + + // v2 + + /// + /// Deletes all mail copies for all folders. + /// + /// Account to remove from + /// Mail copy id to remove. + Task DeleteMailAsync(Guid accountId, string mailCopyId); + + Task ChangeReadStatusAsync(string mailCopyId, bool isRead); + Task ChangeFlagStatusAsync(string mailCopyId, bool isFlagged); + + Task CreateAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId); + Task DeleteAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId); + + Task CreateMailAsync(Guid accountId, NewMailItemPackage package); + + /// + /// Maps new mail item with the existing local draft copy. + /// In case of failure, it returns false. + /// Then synchronizers must insert a new mail item. + /// + /// Id of the account. It's important to map to the account since if the user use the same account with different providers, this call must map the correct one. + /// UniqueId of the local draft copy. + /// New assigned remote mail item id. + /// New assigned draft id if exists. + /// New message's thread/conversation id. + /// True if mapping is done. False if local copy doesn't exists. + Task MapLocalDraftAsync(Guid accountId, Guid localDraftCopyUniqueId, string newMailCopyId, string newDraftId, string newThreadId); + + /// + /// Maps new mail item with the existing local draft copy. + /// + /// + /// + /// + /// + /// + Task MapLocalDraftAsync(string newMailCopyId, string newDraftId, string newThreadId); + + Task CreateDraftMimeMessageAsync(Guid accountId, DraftCreationOptions options); + Task UpdateMailAsync(MailCopy mailCopy); + + /// + /// Gets the new inserted unread mails after the synchronization. + /// + /// Account id. + /// + /// Mail ids that synchronizer tried to download. If there was an issue with the + /// Items that tried and actually downloaded may differ. This function will return only new inserted ones. + /// + /// Newly inserted unread mails inside the Inbox folder. + Task> GetDownloadedUnreadMailsAsync(Guid accountId, IEnumerable downloadedMailCopyIds); + + /// + /// Returns the account that this mail copy unique id is assigned. + /// Used in toast notification handler. + /// + /// Unique id of the mail item. + /// Account that mail belongs to. + Task GetMailAccountByUniqueIdAsync(Guid uniqueMailId); + } +} diff --git a/Wino.Core.Domain/Interfaces/IMenuItem.cs b/Wino.Core.Domain/Interfaces/IMenuItem.cs new file mode 100644 index 00000000..68997e3f --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IMenuItem.cs @@ -0,0 +1,41 @@ +using System; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IMenuItem + { + /// + /// An id that this menu item holds. + /// For an account, it's AccountId. + /// For folder, it's FolderId. + /// For merged account, it's MergedAccountId. + /// Null if it's a menu item that doesn't hold any valuable entity. + /// + Guid? EntityId { get; } + + /// + /// Is any of the sub items that this menu item contains selected. + /// + // bool IsChildSelected { get; } + + /// + /// Whether the menu item is expanded or not. + /// + bool IsExpanded { get; set; } + + /// + /// Whether the menu item is selected or not. + /// + bool IsSelected { get; set; } + + /// + /// Parent menu item that contains this menu item. + /// + IMenuItem ParentMenuItem { get; } + + /// + /// Recursively expand all parent menu items if parent exists, starting from parent. + /// + void Expand(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IMenuOperation.cs b/Wino.Core.Domain/Interfaces/IMenuOperation.cs new file mode 100644 index 00000000..48279547 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IMenuOperation.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IMenuOperation + { + bool IsEnabled { get; } + string Identifier { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/INativeAppService.cs b/Wino.Core.Domain/Interfaces/INativeAppService.cs new file mode 100644 index 00000000..4abd1dc6 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/INativeAppService.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Models.Authorization; + +namespace Wino.Core.Domain.Interfaces +{ + public interface INativeAppService + { + string GetWebAuthenticationBrokerUri(); + Task GetMimeMessageStoragePath(); + Task GetQuillEditorBundlePathAsync(); + Task LaunchFileAsync(string filePath); + Task LaunchUriAsync(Uri uri); + bool IsAppRunning(); + + string GetFullAppVersion(); + + Task PinAppToTaskbarAsync(); + + /// + /// Some cryptographic shit is needed for requesting Google authentication in UWP. + /// + GoogleAuthorizationRequest GetGoogleAuthorizationRequest(); + } +} diff --git a/Wino.Core.Domain/Interfaces/INavigationAware.cs b/Wino.Core.Domain/Interfaces/INavigationAware.cs new file mode 100644 index 00000000..222d7c31 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/INavigationAware.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Models.Navigation; + +namespace Wino.Core.Domain.Interfaces +{ + public interface INavigationAware + { + void OnNavigatedTo(NavigationMode mode, object parameters); + void OnNavigatedFrom(NavigationMode mode, object parameters); + } +} diff --git a/Wino.Core.Domain/Interfaces/INotificationBuilder.cs b/Wino.Core.Domain/Interfaces/INotificationBuilder.cs new file mode 100644 index 00000000..683bff44 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/INotificationBuilder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Interfaces +{ + public interface INotificationBuilder + { + /// + /// Creates toast notifications for new mails. + /// + Task CreateNotificationsAsync(Guid inboxFolderId, IEnumerable newMailItems); + + /// + /// Gets the unread Inbox messages for each account and updates the taskbar icon. + /// + /// + Task UpdateTaskbarIconBadgeAsync(); + + /// + /// Creates test notification for test purposes. + /// + Task CreateTestNotificationAsync(string title, string message); + } +} diff --git a/Wino.Core.Domain/Interfaces/IPreferencesService.cs b/Wino.Core.Domain/Interfaces/IPreferencesService.cs new file mode 100644 index 00000000..38474cdb --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IPreferencesService.cs @@ -0,0 +1,144 @@ +using System; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Reader; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IPreferencesService + { + /// + /// When any of the preferences are changed. + /// + event EventHandler PreferenceChanged; + + /// + /// Setting: For changing the mail display container mode. + /// + MailListDisplayMode MailItemDisplayMode { get; set; } + + /// + /// Setting: Marking the item as read preference mode. + /// + MailMarkAsOption MarkAsPreference { get; set; } + + /// + /// Setting: Preferred time format for mail display. + /// + bool Prefer24HourTimeFormat { get; set; } + + /// + /// Setting: How many seconds should be waited on rendering page to mark item as read. + /// + int MarkAsDelay { get; set; } + + /// + /// Setting: Ask comfirmation from the user during permanent delete. + /// + bool IsHardDeleteProtectionEnabled { get; set; } + + /// + /// Setting: Thread mails into conversations. + /// + bool IsThreadingEnabled { get; set; } + + /// + /// Setting: Show sender pictures in mail list. + /// + bool IsShowSenderPicturesEnabled { get; set; } + + /// + /// Setting: Show preview text in mail list. + /// + bool IsShowPreviewEnabled { get; set; } + + /// + /// Setting: Enable/disable semantic zoom on clicking date headers. + /// + bool IsSemanticZoomEnabled { get; set; } + + /// + /// Setting: Set whether 'img' tags in rendered HTMLs should be removed. + /// + bool RenderImages { get; set; } + + /// + /// Setting: Set whether 'style' tags in rendered HTMls should be removed. + /// + bool RenderStyles { get; set; } + + /// + /// Gets the preferred rendering options for HTML rendering. + /// + MailRenderingOptions GetRenderingOptions(); + + /// + /// Setting: Swipe mail operation when mails are swiped to right. + /// + MailOperation RightSwipeOperation { get; set; } + + /// + /// Setting: Swipe mail operation when mails are swiped to left. + /// + MailOperation LeftSwipeOperation { get; set; } + + /// + /// Setting: Whether hover actions on mail pointer hover is enabled or not. + /// + bool IsHoverActionsEnabled { get; set; } + + /// + /// Setting: Hover action on the left when the mail is hovered over. + /// + MailOperation LeftHoverAction { get; set; } + + /// + /// Setting: Hover action on the center when the mail is hovered over. + /// + MailOperation CenterHoverAction { get; set; } + + /// + /// Setting: Hover action on the right when the mail is hovered over. + /// + MailOperation RightHoverAction { get; set; } + + /// + /// Setting: Whether logs are enabled or not. + /// + bool IsLoggingEnabled { get; set; } + + /// + /// Setting: Whether Mailkit Protocol Logger is enabled for ImapTestService or not. + /// + bool IsMailkitProtocolLoggerEnabled { get; set; } + + /// + /// Setting: Which entity id (merged account or folder) should be expanded automatically on startup. + /// + Guid? StartupEntityId { get; set; } + + /// + /// Setting: Display language for the application. + /// + AppLanguage CurrentLanguage { get; set; } + + /// + /// Setting: Display font for the mail reader. Not composer. + /// + ReaderFont ReaderFont { get; set; } + + /// + /// Setting: Font size for the mail reader. Not composer. + /// + int ReaderFontSize { get; set; } + + /// + /// Setting: Whether the navigation pane is opened on the last session or not. + /// + bool IsNavigationPaneOpened { get; set; } + + /// + /// Setting: Whether the next item should be automatically selected once the current item is moved or removed. + /// + bool AutoSelectNextItem { get; set; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IProviderDetail.cs b/Wino.Core.Domain/Interfaces/IProviderDetail.cs new file mode 100644 index 00000000..e43c6044 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IProviderDetail.cs @@ -0,0 +1,13 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IProviderDetail + { + MailProviderType Type { get; } + string Name { get; } + string Description { get; } + string ProviderImage { get; } + bool IsSupported { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IProviderService.cs b/Wino.Core.Domain/Interfaces/IProviderService.cs new file mode 100644 index 00000000..f961b0ea --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IProviderService.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IProviderService + { + List GetProviderDetails(); + IProviderDetail GetProviderDetail(MailProviderType type); + } +} diff --git a/Wino.Core.Domain/Interfaces/IRequestBundle.cs b/Wino.Core.Domain/Interfaces/IRequestBundle.cs new file mode 100644 index 00000000..dca28129 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IRequestBundle.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + /// + /// Represents a group of requests. + /// + public interface IRequestBundle + { + string BundleId { get; set; } + IRequestBase Request { get; } + } + + /// + /// Represents a group of requests with their native response types. + /// + /// Native request type from each synchronizer to store. + public interface IRequestBundle : IRequestBundle + { + TRequest NativeRequest { get; } + } + + public interface IRequestBase + { + /// + /// Synchronizer option to perform. + /// + MailSynchronizerOperation Operation { get; } + + /// + /// UI changes to apply to the item before sending the request to the server. + /// Changes here only affect the UI, not the item itself. + /// Changes here are reverted if the request fails by calling . + /// + void ApplyUIChanges(); + + /// + /// Reverts the UI changes applied by if the request fails. + /// + void RevertUIChanges(); + } + + public interface IRequest : IRequestBase + { + MailCopy Item { get; } + IBatchChangeRequest CreateBatch(IEnumerable requests); + } + + public interface IFolderRequest : IRequestBase + { + MailItemFolder Folder { get; } + } + + public interface IBatchChangeRequest : IRequestBase + { + IEnumerable Items { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/ISignatureService.cs b/Wino.Core.Domain/Interfaces/ISignatureService.cs new file mode 100644 index 00000000..14f7f75c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ISignatureService.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Interfaces +{ + public interface ISignatureService + { + /// + /// Returns the assigned account signature for the account. + /// + /// + /// + Task GetAccountSignatureAsync(Guid accountId); + + /// + /// Creates the initial signature for new created accounts. + /// + /// + /// + Task CreateDefaultSignatureAsync(Guid accountId); + + /// + /// Updates account's existing signature with the given HTML signature. + /// + Task UpdateAccountSignatureAsync(Guid accountId, string htmlBody); + + /// + /// Disabled signature for the account and deletes existing signature. + /// + Task DeleteAccountSignatureAssignment(Guid accountId); + } +} diff --git a/Wino.Core.Domain/Interfaces/IStatePersistenceService.cs b/Wino.Core.Domain/Interfaces/IStatePersistenceService.cs new file mode 100644 index 00000000..f6a8cf73 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IStatePersistenceService.cs @@ -0,0 +1,47 @@ +using System; +using System.ComponentModel; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IStatePersistanceService : INotifyPropertyChanged + { + event EventHandler StatePropertyChanged; + + /// + /// True when there is an active renderer for selected mail. + /// + bool IsReadingMail { get; set; } + + /// + /// Shell's app bar title string. + /// + string CoreWindowTitle { get; set; } + + /// + /// When only reader page is visible in small sized window. + /// + bool IsReaderNarrowed { get; set; } + + /// + /// Should display back button on the shell title bar. + /// + bool IsBackButtonVisible { get; } + + + /// + /// Setting: Opened pane length for the navigation view. + /// + double OpenPaneLength { get; set; } + + /// + /// Whether the mail rendering page should be shifted from top to adjust the design + /// for standalone EML viewer or not. + /// + bool ShouldShiftMailRenderingDesign { get; set; } + + /// + /// Setting: Mail list pane length for listing mails. + /// + double MailListPaneLength { get; set; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IStoreManagementService.cs b/Wino.Core.Domain/Interfaces/IStoreManagementService.cs new file mode 100644 index 00000000..36e3ebc9 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IStoreManagementService.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Store; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IStoreManagementService + { + /// + /// Checks whether user has the type of an add-on purchased. + /// + Task HasProductAsync(StoreProductType productType); + + /// + /// Attempts to purchase the given add-on. + /// + Task PurchaseAsync(StoreProductType productType); + } +} diff --git a/Wino.Core.Domain/Interfaces/IStoreRatingDialog.cs b/Wino.Core.Domain/Interfaces/IStoreRatingDialog.cs new file mode 100644 index 00000000..c56ef4a4 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IStoreRatingDialog.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IStoreRatingDialog + { + bool DontAskAgain { get; } + bool RateWinoClicked { get; } + } +} diff --git a/Wino.Core.Domain/Interfaces/IStoreRatingService.cs b/Wino.Core.Domain/Interfaces/IStoreRatingService.cs new file mode 100644 index 00000000..7b1ba764 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IStoreRatingService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IStoreRatingService + { + Task PromptRatingDialogAsync(); + Task LaunchStorePageForReviewAsync(); + } +} diff --git a/Wino.Core.Domain/Interfaces/ISynchronizationProgress.cs b/Wino.Core.Domain/Interfaces/ISynchronizationProgress.cs new file mode 100644 index 00000000..eb952cf7 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ISynchronizationProgress.cs @@ -0,0 +1,19 @@ +using System; + +namespace Wino.Core.Domain.Interfaces +{ + /// + /// An interface for reporting progress of the synchronization. + /// Gmail does not support reporting folder progress. + /// For others, account progress is calculated based on the number of folders. + /// + public interface ISynchronizationProgress + { + /// + /// Reports account synchronization progress. + /// + /// Account id for the report. + /// Value. This is always between 0 - 100 + void AccountProgressUpdated(Guid accountId, int progress); + } +} diff --git a/Wino.Core.Domain/Interfaces/IThemeService.cs b/Wino.Core.Domain/Interfaces/IThemeService.cs new file mode 100644 index 00000000..57c3f471 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IThemeService.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Personalization; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IThemeService : IInitializeAsync + { + event EventHandler ElementThemeChanged; + event EventHandler AccentColorChangedBySystem; + event EventHandler AccentColorChanged; + + Task> GetAvailableThemesAsync(); + Task CreateNewCustomThemeAsync(string themeName, string accentColor, byte[] wallpaperData); + Task> GetCurrentCustomThemesAsync(); + + Task ApplyCustomThemeAsync(bool isInitializing); + + // Settings + ApplicationElementTheme RootTheme { get; set; } + Guid CurrentApplicationThemeId { get; set; } + string AccentColor { get; set; } + string GetSystemAccentColorHex(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IThreadingStrategy.cs b/Wino.Core.Domain/Interfaces/IThreadingStrategy.cs new file mode 100644 index 00000000..ed5d57f0 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IThreadingStrategy.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IThreadingStrategy + { + Task> ThreadItemsAsync(List items); + bool ShouldThreadWithItem(IMailItem originalItem, IMailItem targetItem); + } +} diff --git a/Wino.Core.Domain/Interfaces/IThreadingStrategyProvider.cs b/Wino.Core.Domain/Interfaces/IThreadingStrategyProvider.cs new file mode 100644 index 00000000..9e3fa87b --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IThreadingStrategyProvider.cs @@ -0,0 +1,13 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IThreadingStrategyProvider + { + /// + /// Returns corresponding threading strategy that applies to given provider type. + /// + /// Provider type. + IThreadingStrategy GetStrategy(MailProviderType mailProviderType); + } +} diff --git a/Wino.Core.Domain/Interfaces/ITranslationService.cs b/Wino.Core.Domain/Interfaces/ITranslationService.cs new file mode 100644 index 00000000..e756f3cd --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ITranslationService.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Translations; + +namespace Wino.Core.Domain.Interfaces +{ + public interface ITranslationService : IInitializeAsync + { + Task InitializeLanguageAsync(AppLanguage language, bool ignoreCurrentLanguageCheck = false); + List GetAvailableLanguages(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IUnderlyingThemeService.cs b/Wino.Core.Domain/Interfaces/IUnderlyingThemeService.cs new file mode 100644 index 00000000..5de11c78 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IUnderlyingThemeService.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Domain.Interfaces +{ + public interface IUnderlyingThemeService + { + bool IsUnderlyingThemeDark(); + } +} diff --git a/Wino.Core.Domain/Interfaces/IWinoNavigationService.cs b/Wino.Core.Domain/Interfaces/IWinoNavigationService.cs new file mode 100644 index 00000000..ba5cf026 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IWinoNavigationService.cs @@ -0,0 +1,18 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Navigation; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IWinoNavigationService + { + bool Navigate(WinoPage page, + object parameter = null, + NavigationReferenceFrame frame = NavigationReferenceFrame.ShellFrame, + NavigationTransitionType transition = NavigationTransitionType.None); + void NavigateCompose(IMailItem mailItem, NavigationTransitionType transition = NavigationTransitionType.None); + void NavigateRendering(IMailItem mailItem, NavigationTransitionType transition = NavigationTransitionType.None); + void NavigateRendering(MimeMessageInformation mimeMessageInformation, NavigationTransitionType transition = NavigationTransitionType.None); + void NavigateFolder(NavigateMailFolderEventArgs args); + } +} diff --git a/Wino.Core.Domain/Interfaces/IWinoRequestDelegator.cs b/Wino.Core.Domain/Interfaces/IWinoRequestDelegator.cs new file mode 100644 index 00000000..9782e4dd --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IWinoRequestDelegator.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IWinoRequestDelegator + { + /// + /// Prepares requires IRequest collection for mail actions and executes them via proper synchronizers. + /// + /// Preperation model that encapsulates action and mail items. + Task ExecuteAsync(MailOperationPreperationRequest prerperationRequest); + + /// + /// Queues new draft creation request for synchronizer. + /// + /// A class that holds the parameters for creating a draft. + Task ExecuteAsync(DraftPreperationRequest draftPreperationRequest); + + /// + /// Queues a new request for synchronizer to send a draft. + /// + /// Draft sending request. + Task ExecuteAsync(SendDraftPreparationRequest sendDraftPreperationRequest); + + /// + /// Prepares requires IRequest collection for folder actions and executes them via proper synchronizers. + /// + /// Folder operation to execute. + /// Target folder + Task ExecuteAsync(FolderOperation operation, IMailItemFolder folderStructure); + } +} diff --git a/Wino.Core.Domain/Interfaces/IWinoRequestProcessor.cs b/Wino.Core.Domain/Interfaces/IWinoRequestProcessor.cs new file mode 100644 index 00000000..c35b4e9c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IWinoRequestProcessor.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Domain.Interfaces +{ + public interface IWinoRequestProcessor + { + Task PrepareFolderRequestAsync(FolderOperation operation, IMailItemFolder mailItemFolder); + + /// + /// Prepares proper Wino requests for synchronizers to execute categorized by AccountId and FolderId. + /// + /// User action + /// Selected mails. + /// When required folder target is not available for account. + Task> PrepareRequestsAsync(MailOperationPreperationRequest request); + } +} diff --git a/Wino.Core.Domain/Models/Accounts/ImapAuthenticationMethodModel.cs b/Wino.Core.Domain/Models/Accounts/ImapAuthenticationMethodModel.cs new file mode 100644 index 00000000..f28b9d6e --- /dev/null +++ b/Wino.Core.Domain/Models/Accounts/ImapAuthenticationMethodModel.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Accounts +{ + public class ImapAuthenticationMethodModel(ImapAuthenticationMethod imapAuthenticationMethod, string displayName) + { + public ImapAuthenticationMethod ImapAuthenticationMethod { get; } = imapAuthenticationMethod; + public string DisplayName { get; } = displayName; + } +} diff --git a/Wino.Core.Domain/Models/Accounts/ImapConnectionSecurityModel.cs b/Wino.Core.Domain/Models/Accounts/ImapConnectionSecurityModel.cs new file mode 100644 index 00000000..a618a490 --- /dev/null +++ b/Wino.Core.Domain/Models/Accounts/ImapConnectionSecurityModel.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Accounts +{ + public class ImapConnectionSecurityModel(ImapConnectionSecurity imapConnectionSecurity, string displayName) + { + public ImapConnectionSecurity ImapConnectionSecurity { get; } = imapConnectionSecurity; + public string DisplayName { get; } = displayName; + } +} diff --git a/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs b/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs new file mode 100644 index 00000000..dc9a5824 --- /dev/null +++ b/Wino.Core.Domain/Models/Accounts/ProviderDetail.cs @@ -0,0 +1,47 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Domain.Models.Accounts +{ + public class ProviderDetail : IProviderDetail + { + public MailProviderType Type { get; } + + public string Name { get; } + + public string Description { get; } + + public string ProviderImage => $"ms-appx:///Assets/Providers/{Type}.png"; + + public bool IsSupported => Type == MailProviderType.Outlook || Type == MailProviderType.Gmail || Type == MailProviderType.IMAP4; + + public ProviderDetail(MailProviderType type) + { + Type = type; + + switch (Type) + { + case MailProviderType.Outlook: + 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; + break; + } + } + } +} diff --git a/Wino.Core.Domain/Models/Authentication/TokenInformationBase.cs b/Wino.Core.Domain/Models/Authentication/TokenInformationBase.cs new file mode 100644 index 00000000..27f69abf --- /dev/null +++ b/Wino.Core.Domain/Models/Authentication/TokenInformationBase.cs @@ -0,0 +1,20 @@ +using System; + +namespace Wino.Core.Domain.Models.Authentication +{ + public class TokenInformationBase + { + public string AccessToken { get; set; } + public string RefreshToken { get; set; } + + /// + /// UTC date for token expiration. + /// + public DateTime ExpiresAt { get; set; } + + /// + /// Gets the value indicating whether the token is expired or not. + /// + public bool IsExpired => DateTime.UtcNow >= ExpiresAt; + } +} diff --git a/Wino.Core.Domain/Models/Authorization/GoogleAuthorizationRequest.cs b/Wino.Core.Domain/Models/Authorization/GoogleAuthorizationRequest.cs new file mode 100644 index 00000000..455fff47 --- /dev/null +++ b/Wino.Core.Domain/Models/Authorization/GoogleAuthorizationRequest.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Wino.Core.Domain.Exceptions; + +namespace Wino.Core.Domain.Models.Authorization +{ + public class GoogleAuthorizationRequest + { + public const string RedirectUri = "google.pw.oauth2:/oauth2redirect"; + + const string authorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth"; + const string CodeChallangeMethod = "S256"; + + public GoogleAuthorizationRequest(string state, string codeVerifier, string codeChallange) + { + State = state; + CodeVerifier = codeVerifier; + CodeChallange = codeChallange; + } + + // Pre + public string State { get; set; } + public string CodeVerifier { get; set; } + public string CodeChallange { get; set; } + public string ClientId { get; set; } + + // Post + public string AuthorizationCode { get; set; } + + public string BuildRequest(string clientId) + { + ClientId = clientId; + + // Creates the OAuth 2.0 authorization request. + return string.Format("{0}?response_type=code&scope=https://mail.google.com/ https://www.googleapis.com/auth/gmail.labels&redirect_uri={1}&client_id={2}&state={3}&code_challenge={4}&code_challenge_method={5}", + authorizationEndpoint, + Uri.EscapeDataString(RedirectUri), + ClientId, + State, + CodeChallange, + CodeChallangeMethod); + } + + public void ValidateAuthorizationCode(Uri callbackUri) + { + if (callbackUri == null) + throw new GoogleAuthenticationException(Translator.Exception_GoogleAuthCallbackNull); + + string queryString = callbackUri.Query; + + Dictionary queryStringParams = queryString.Substring(1).Split('&').ToDictionary(c => c.Split('=')[0], c => Uri.UnescapeDataString(c.Split('=')[1])); + + if (queryStringParams.ContainsKey("error")) + throw new GoogleAuthenticationException(string.Format(Translator.Exception_GoogleAuthError, queryStringParams["error"])); + + if (!queryStringParams.ContainsKey("code") || !queryStringParams.ContainsKey("state")) + throw new GoogleAuthenticationException(Translator.Exception_GoogleAuthCorruptedCode + queryString); + + // Gets the Authorization code & state + string code = queryStringParams["code"]; + string incomingState = queryStringParams["state"]; + + // Compares the receieved state to the expected value, to ensure that + // this app made the request which resulted in authorization + if (incomingState != State) + throw new GoogleAuthenticationException(string.Format(Translator.Exception_GoogleAuthInvalidResponse, incomingState)); + + AuthorizationCode = code; + } + } +} diff --git a/Wino.Core.Domain/Models/Authorization/GoogleTokenizationRequest.cs b/Wino.Core.Domain/Models/Authorization/GoogleTokenizationRequest.cs new file mode 100644 index 00000000..0590df09 --- /dev/null +++ b/Wino.Core.Domain/Models/Authorization/GoogleTokenizationRequest.cs @@ -0,0 +1,27 @@ +using System; +using Wino.Core.Domain.Exceptions; + +namespace Wino.Core.Domain.Models.Authorization +{ + public class GoogleTokenizationRequest + { + public GoogleTokenizationRequest(GoogleAuthorizationRequest authorizationRequest) + { + if (authorizationRequest == null) + throw new GoogleAuthenticationException("Authorization request is empty."); + + AuthorizationRequest = authorizationRequest; + + if (string.IsNullOrEmpty(AuthorizationRequest.AuthorizationCode)) + throw new GoogleAuthenticationException("Authorization request has empty code."); + } + + public GoogleAuthorizationRequest AuthorizationRequest { get; set; } + + public string BuildRequest() + { + return string.Format("code={0}&redirect_uri={1}&client_id={2}&code_verifier={3}&scope=&grant_type=authorization_code", + AuthorizationRequest.AuthorizationCode, Uri.EscapeDataString(GoogleAuthorizationRequest.RedirectUri), AuthorizationRequest.ClientId, AuthorizationRequest.CodeVerifier); + } + } +} diff --git a/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryConnectionTestFailedPackage.cs b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryConnectionTestFailedPackage.cs new file mode 100644 index 00000000..b4668aac --- /dev/null +++ b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryConnectionTestFailedPackage.cs @@ -0,0 +1,21 @@ +using System; + +namespace Wino.Core.Domain.Models.AutoDiscovery +{ + public class AutoDiscoveryConnectionTestFailedPackage + { + public AutoDiscoveryConnectionTestFailedPackage(AutoDiscoverySettings settings, Exception error) + { + Settings = settings ?? throw new ArgumentNullException(nameof(settings)); + Error = error ?? throw new ArgumentNullException(nameof(error)); + } + + public AutoDiscoveryConnectionTestFailedPackage(Exception error) + { + Error = error ?? throw new ArgumentNullException(nameof(error)); + } + + public AutoDiscoverySettings Settings { get; set; } + public Exception Error { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryMinimalSettings.cs b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryMinimalSettings.cs new file mode 100644 index 00000000..b1135a5b --- /dev/null +++ b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryMinimalSettings.cs @@ -0,0 +1,9 @@ +namespace Wino.Core.Domain.Models.AutoDiscovery +{ + public class AutoDiscoveryMinimalSettings + { + public string DisplayName { get; set; } + public string Email { get; set; } + public string Password { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryProviderSetting.cs b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryProviderSetting.cs new file mode 100644 index 00000000..dca80eb0 --- /dev/null +++ b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoveryProviderSetting.cs @@ -0,0 +1,22 @@ +using Newtonsoft.Json; + +namespace Wino.Core.Domain.Models.AutoDiscovery +{ + public class AutoDiscoveryProviderSetting + { + [JsonProperty("protocol")] + public string Protocol { get; set; } + + [JsonProperty("address")] + public string Address { get; set; } + + [JsonProperty("port")] + public int Port { get; set; } + + [JsonProperty("secure")] + public string Secure { get; set; } + + [JsonProperty("username")] + public string Username { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoverySettings.cs b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoverySettings.cs new file mode 100644 index 00000000..74f4ae2e --- /dev/null +++ b/Wino.Core.Domain/Models/AutoDiscovery/AutoDiscoverySettings.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.AutoDiscovery +{ + public class AutoDiscoverySettings + { + [JsonProperty("domain")] + public string Domain { get; set; } + + [JsonProperty("password")] + public string Password { get; set; } + + [JsonProperty("settings")] + public List Settings { get; set; } + + /// + /// Gets whether this domain requires additional steps for password like app-specific password or sth. + /// + public bool IsPasswordSupportLinkAvailable => !string.IsNullOrEmpty(Password) && Uri.TryCreate(Password, UriKind.Absolute, out _); + + public AutoDiscoveryMinimalSettings UserMinimalSettings { get; set; } + + public CustomServerInformation ToServerInformation() + { + var imapSettings = GetImapSettings(); + var smtpSettings = GetSmptpSettings(); + + if (imapSettings == null || smtpSettings == null) return null; + + bool imapRequiresSSL = imapSettings.Secure == "SSL"; + bool smtpRequiresSSL = smtpSettings.Secure == "SSL"; + + string imapUrl = imapSettings.Address; + string smtpUrl = smtpSettings.Address; + + string imapUsername = imapSettings.Username; + string smtpUsername = smtpSettings.Username; + + int imapPort = imapSettings.Port; + int smtpPort = smtpSettings.Port; + + var serverInfo = new CustomServerInformation + { + Id = Guid.NewGuid(), + DisplayName = UserMinimalSettings.DisplayName, + Address = UserMinimalSettings.Email, + IncomingServerPassword = UserMinimalSettings.Password, + OutgoingServerPassword = UserMinimalSettings.Password, + IncomingRequiresSSL = imapRequiresSSL, + OutgoingRequresSSL = smtpRequiresSSL, + IncomingServer = imapUrl, + OutgoingServer = smtpUrl, + IncomingServerPort = imapPort.ToString(), + OutgoingServerPort = smtpPort.ToString(), + IncomingServerType = Enums.CustomIncomingServerType.IMAP4, + IncomingServerUsername = imapUsername, + OutgoingServerUsername = smtpUsername + }; + + return serverInfo; + } + + public AutoDiscoveryProviderSetting GetImapSettings() + => Settings?.Find(a => a.Protocol == "IMAP"); + + public AutoDiscoveryProviderSetting GetSmptpSettings() + => Settings?.Find(a => a.Protocol == "SMTP"); + } +} diff --git a/Wino.Core.Domain/Models/Comparers/DateComparer.cs b/Wino.Core.Domain/Models/Comparers/DateComparer.cs new file mode 100644 index 00000000..c739ec9e --- /dev/null +++ b/Wino.Core.Domain/Models/Comparers/DateComparer.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Models.Comparers +{ + public class DateComparer : IComparer, IEqualityComparer + { + public int Compare(IMailItem x, IMailItem y) + { + return DateTime.Compare(y.CreationDate, x.CreationDate); + } + + public new bool Equals(object x, object y) + { + if (x is IMailItem firstItem && y is IMailItem secondItem) + { + return firstItem.Equals(secondItem); + } + + return false; + } + + public int GetHashCode(object obj) => (obj as IMailItem).GetHashCode(); + + public DateComparer() + { + + } + } +} diff --git a/Wino.Core.Domain/Models/Comparers/DateTimeComparer.cs b/Wino.Core.Domain/Models/Comparers/DateTimeComparer.cs new file mode 100644 index 00000000..eab8185e --- /dev/null +++ b/Wino.Core.Domain/Models/Comparers/DateTimeComparer.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace Wino.Core.Domain.Models.Comparers +{ + /// + /// Used to insert date grouping into proper place in Reader page. + /// + public class DateTimeComparer : IComparer + { + public int Compare(DateTime x, DateTime y) + { + return DateTime.Compare(y, x); + } + } +} diff --git a/Wino.Core.Domain/Models/Comparers/FolderNameComparer.cs b/Wino.Core.Domain/Models/Comparers/FolderNameComparer.cs new file mode 100644 index 00000000..8f7e0928 --- /dev/null +++ b/Wino.Core.Domain/Models/Comparers/FolderNameComparer.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.Comparers +{ + public class FolderNameComparer : IComparer + { + public int Compare(MailItemFolder x, MailItemFolder y) + { + return x.FolderName.CompareTo(y.FolderName); + } + } +} diff --git a/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs b/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs new file mode 100644 index 00000000..d73ca190 --- /dev/null +++ b/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Models.Comparers +{ + public class ListItemComparer : IComparer + { + public bool SortByName { get; set; } + + public DateComparer DateComparer = new DateComparer(); + public readonly NameComparer NameComparer = new NameComparer(); + + public int Compare(object x, object y) + { + if (x is IMailItem xMail && y is IMailItem yMail) + { + var itemComparer = GetItemComparer(); + + return itemComparer.Compare(xMail, yMail); + } + else if (x is DateTime dateX && y is DateTime dateY) + return DateTime.Compare(dateY, dateX); + else if (x is string stringX && y is string stringY) + return stringY.CompareTo(stringX); + + return 0; + } + + public IComparer GetItemComparer() + { + if (SortByName) + return NameComparer; + else + return DateComparer; + } + } +} diff --git a/Wino.Core.Domain/Models/Comparers/NameComparer.cs b/Wino.Core.Domain/Models/Comparers/NameComparer.cs new file mode 100644 index 00000000..86b5c10f --- /dev/null +++ b/Wino.Core.Domain/Models/Comparers/NameComparer.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Models.Comparers +{ + public class NameComparer : IComparer + { + public int Compare(IMailItem x, IMailItem y) + { + return string.Compare(x.FromName, y.FromName); + } + } +} diff --git a/Wino.Core.Domain/Models/Folders/AccountFolderTree.cs b/Wino.Core.Domain/Models/Folders/AccountFolderTree.cs new file mode 100644 index 00000000..7fb13dc9 --- /dev/null +++ b/Wino.Core.Domain/Models/Folders/AccountFolderTree.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Folders +{ + /// + /// Grouped folder information for the menu for given account. + /// + public class AccountFolderTree + { + public MailAccount Account { get; } + public List Folders { get; set; } = new List(); + + public AccountFolderTree(MailAccount account) + { + Account = account; + } + + public bool HasSpecialTypeFolder(SpecialFolderType type) + { + foreach (var folderStructure in Folders) + { + bool hasSpecialFolder = folderStructure.ContainsSpecialFolderType(type); + + if (hasSpecialFolder) + return true; + } + + return false; + } + } +} diff --git a/Wino.Core.Domain/Models/Folders/FolderOperationMenuItem.cs b/Wino.Core.Domain/Models/Folders/FolderOperationMenuItem.cs new file mode 100644 index 00000000..e54afa7f --- /dev/null +++ b/Wino.Core.Domain/Models/Folders/FolderOperationMenuItem.cs @@ -0,0 +1,14 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.Core.Domain.Models.Folders +{ + public class FolderOperationMenuItem : MenuOperationItemBase, IMenuOperation + { + protected FolderOperationMenuItem(FolderOperation operation, bool isEnabled) : base(operation, isEnabled) { } + + public static FolderOperationMenuItem Create(FolderOperation operation, bool isEnabled = true) + => new FolderOperationMenuItem(operation, isEnabled); + } +} diff --git a/Wino.Core.Domain/Models/Folders/IMailItemFolder.cs b/Wino.Core.Domain/Models/Folders/IMailItemFolder.cs new file mode 100644 index 00000000..8853cbf7 --- /dev/null +++ b/Wino.Core.Domain/Models/Folders/IMailItemFolder.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Folders +{ + public interface IMailItemFolder + { + string BackgroundColorHex { get; set; } + string DeltaToken { get; set; } + string FolderName { get; set; } + long HighestModeSeq { get; set; } + Guid Id { get; set; } + bool IsHidden { get; set; } + bool IsSticky { get; set; } + bool IsSynchronizationEnabled { get; set; } + bool IsSystemFolder { get; set; } + DateTime? LastSynchronizedDate { get; set; } + Guid MailAccountId { get; set; } + string ParentRemoteFolderId { get; set; } + string RemoteFolderId { get; set; } + SpecialFolderType SpecialFolderType { get; set; } + string TextColorHex { get; set; } + uint UidValidity { get; set; } + List ChildFolders { get; set; } + bool IsMoveTarget { get; } + bool ShowUnreadCount { get; set; } + + bool ContainsSpecialFolderType(SpecialFolderType type); + } +} diff --git a/Wino.Core.Domain/Models/MailItem/DraftCreationOptions.cs b/Wino.Core.Domain/Models/MailItem/DraftCreationOptions.cs new file mode 100644 index 00000000..aff9b515 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/DraftCreationOptions.cs @@ -0,0 +1,40 @@ +using System.Collections.Specialized; +using System.Linq; +using MimeKit; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.MailItem +{ + public class DraftCreationOptions + { + public MimeMessage ReferenceMimeMessage { get; set; } + public MailCopy ReferenceMailCopy { get; set; } + public DraftCreationReason Reason { get; set; } + + #region Mailto Protocol Related Stuff + + public const string MailtoSubjectParameterKey = "subject"; + public const string MailtoBodyParameterKey = "body"; + public const string MailtoToParameterKey = "mailto"; + public const string MailtoCCParameterKey = "cc"; + public const string MailtoBCCParameterKey = "bcc"; + + public NameValueCollection MailtoParameters { get; set; } + + private bool IsMailtoParameterExists(string parameterKey) + => MailtoParameters != null + && MailtoParameters.AllKeys.Contains(parameterKey); + + public bool TryGetMailtoValue(string key, out string value) + { + bool valueExists = IsMailtoParameterExists(key); + + value = valueExists ? MailtoParameters[key] : string.Empty; + + return valueExists; + } + + #endregion + } +} diff --git a/Wino.Core.Domain/Models/MailItem/DraftPreperationRequest.cs b/Wino.Core.Domain/Models/MailItem/DraftPreperationRequest.cs new file mode 100644 index 00000000..2be737f4 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/DraftPreperationRequest.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using MimeKit; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.MailItem +{ + public class DraftPreperationRequest : DraftCreationOptions + { + public DraftPreperationRequest(MailAccount account, MailCopy createdLocalDraftCopy, MimeMessage createdLocalDraftMimeMessage) + { + Account = account ?? throw new ArgumentNullException(nameof(account)); + + CreatedLocalDraftCopy = createdLocalDraftCopy ?? throw new ArgumentNullException(nameof(createdLocalDraftCopy)); + CreatedLocalDraftMimeMessage = createdLocalDraftMimeMessage ?? throw new ArgumentNullException(nameof(createdLocalDraftMimeMessage)); + } + + public MailCopy CreatedLocalDraftCopy { get; set; } + public MimeMessage CreatedLocalDraftMimeMessage { get; set; } + public MailAccount Account { get; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/IMailItem.cs b/Wino.Core.Domain/Models/MailItem/IMailItem.cs new file mode 100644 index 00000000..b75c24af --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/IMailItem.cs @@ -0,0 +1,33 @@ +using System; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Interface of simplest representation of a MailCopy. + /// + public interface IMailItem + { + Guid UniqueId { get; } + string Id { get; } + string Subject { get; } + string ThreadId { get; } + string MessageId { get; } + string References { get; } + string InReplyTo { get; } + string PreviewText { get; } + string FromName { get; } + DateTime CreationDate { get; } + string FromAddress { get; } + bool HasAttachments { get; } + bool IsFlagged { get; } + bool IsFocused { get; } + bool IsRead { get; } + string DraftId { get; } + bool IsDraft { get; } + Guid FileId { get; } + + MailItemFolder AssignedFolder { get; } + MailAccount AssignedAccount { get; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/IMailItemThread.cs b/Wino.Core.Domain/Models/MailItem/IMailItemThread.cs new file mode 100644 index 00000000..22fd0699 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/IMailItemThread.cs @@ -0,0 +1,16 @@ +using System.Collections.ObjectModel; + +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Interface that represents conversation threads. + /// Even though this type has 1 single UI representation most of the time, + /// it can contain multiple IMailItem. + /// + public interface IMailItemThread : IMailItem + { + ObservableCollection ThreadItems { get; } + IMailItem LatestMailItem { get; } + IMailItem FirstMailItem { get; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/MailDetailInformation.cs b/Wino.Core.Domain/Models/MailItem/MailDetailInformation.cs new file mode 100644 index 00000000..c79f1039 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MailDetailInformation.cs @@ -0,0 +1,18 @@ +using System; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.MailItem +{ + public class MailDetailInformation + { + public string Id { get; set; } + + public Guid AccountId { get; set; } + public Guid FolderId { get; set; } + public string RemoteFolderId { get; set; } + public SpecialFolderType SpecialFolderType { get; set; } + public bool IsRead { get; set; } + public bool IsFlagged { get; set; } + public bool IsDraft { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/MailDragPackage.cs b/Wino.Core.Domain/Models/MailItem/MailDragPackage.cs new file mode 100644 index 00000000..2f47a267 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MailDragPackage.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Class that holds information when the drag/drop of mails are performed. + /// + public class MailDragPackage + { + public MailDragPackage(IEnumerable draggingMails) + { + DraggingMails = draggingMails; + } + + public MailDragPackage(IMailItem draggingMail) + { + DraggingMails = + [ + draggingMail + ]; + } + + public IEnumerable DraggingMails { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/MailFolderPairMetadata.cs b/Wino.Core.Domain/Models/MailItem/MailFolderPairMetadata.cs new file mode 100644 index 00000000..158425c8 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MailFolderPairMetadata.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Domain.Models.MailItem +{ + public class MailFolderPairMetadata + { + public Guid FolderId { get; set; } + public string RemoteFolderId { get; set; } + public string MailCopyId { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/MailInsertPackage.cs b/Wino.Core.Domain/Models/MailItem/MailInsertPackage.cs new file mode 100644 index 00000000..5d8a3a65 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MailInsertPackage.cs @@ -0,0 +1,7 @@ +using MimeKit; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.MailItem +{ + public record NewMailItemPackage(MailCopy Copy, MimeMessage Mime, string AssignedRemoteFolderId); +} diff --git a/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs b/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs new file mode 100644 index 00000000..170adcf6 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.Domain.Models.MailItem +{ + public record MailListInitializationOptions(IEnumerable Folders, + FilterOptionType FilterType, + SortingOptionType SortingOptionType, + bool CreateThreads, + bool? IsFocusedOnly, + string SearchQuery, + IEnumerable ExistingUniqueIds); +} diff --git a/Wino.Core.Domain/Models/MailItem/MailOperationPreperationRequest.cs b/Wino.Core.Domain/Models/MailItem/MailOperationPreperationRequest.cs new file mode 100644 index 00000000..a12ac267 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MailOperationPreperationRequest.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Encapsulates the options for preparing requests to execute mail operations for mail items like Move, Delete, MarkAsRead, etc. + /// + public class MailOperationPreperationRequest + { + public MailOperationPreperationRequest(MailOperation action, + IEnumerable mailItems, + bool toggleExecution = false, + IMailItemFolder moveTargetFolder = null, + bool ignoreHardDeleteProtection = false) + { + Action = action; + MailItems = mailItems ?? throw new ArgumentNullException(nameof(mailItems)); + ToggleExecution = toggleExecution; + MoveTargetFolder = moveTargetFolder; + IgnoreHardDeleteProtection = ignoreHardDeleteProtection; + } + + public MailOperationPreperationRequest(MailOperation action, + MailCopy singleMailItem, + bool toggleExecution = false, + IMailItemFolder moveTargetFolder = null, + bool ignoreHardDeleteProtection = false) + { + Action = action; + MailItems = new List() { singleMailItem }; + ToggleExecution = toggleExecution; + MoveTargetFolder = moveTargetFolder; + IgnoreHardDeleteProtection = ignoreHardDeleteProtection; + } + + /// + /// Action to execute. + /// + public MailOperation Action { get; set; } + + /// + /// Mail copies execute the action on. + /// + public IEnumerable MailItems { get; set; } + + /// + /// Whether the operation can be reverted if needed. + /// eg. MarkAsRead on already read item will set the action to MarkAsUnread. + /// This is used in hover actions for example. + /// + public bool ToggleExecution { get; set; } + + /// + /// Whether hard delete protection should be ignored. + /// Discard draft requests for example should ignore hard delete protection. + /// + public bool IgnoreHardDeleteProtection { get; set; } + + /// + /// Moving folder for the Move operation. + /// If null and the action is Move, the user will be prompted to select a folder. + /// + public IMailItemFolder MoveTargetFolder { get; } + } +} diff --git a/Wino.Core.Domain/Models/MailItem/MimeMessageInformation.cs b/Wino.Core.Domain/Models/MailItem/MimeMessageInformation.cs new file mode 100644 index 00000000..ce8b4404 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/MimeMessageInformation.cs @@ -0,0 +1,9 @@ +using MimeKit; + +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Encapsulates MimeMessage and the path to the file. + /// + public record MimeMessageInformation(MimeMessage MimeMessage, string Path); +} diff --git a/Wino.Core.Domain/Models/MailItem/OutlookSpecialFolderIdInformation.cs b/Wino.Core.Domain/Models/MailItem/OutlookSpecialFolderIdInformation.cs new file mode 100644 index 00000000..9eadd52a --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/OutlookSpecialFolderIdInformation.cs @@ -0,0 +1,13 @@ +namespace Wino.Core.Domain.Models.MailItem +{ + /// + /// Class that holds immutable information about special folders in Outlook. + /// + /// + /// + /// + /// + /// + /// + public record OutlookSpecialFolderIdInformation(string InboxId, string TrashId, string JunkId, string DraftId, string SentId, string ArchiveId); +} diff --git a/Wino.Core.Domain/Models/MailItem/SendDraftPreparationRequest.cs b/Wino.Core.Domain/Models/MailItem/SendDraftPreparationRequest.cs new file mode 100644 index 00000000..f1159931 --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/SendDraftPreparationRequest.cs @@ -0,0 +1,7 @@ +using MimeKit; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.MailItem +{ + public record SendDraftPreparationRequest(MailCopy MailItem, MimeMessage Mime, MailItemFolder DraftFolder, MailItemFolder SentFolder, MailAccountPreferences AccountPreferences); +} diff --git a/Wino.Core.Domain/Models/MailItem/ThreadMailItem.cs b/Wino.Core.Domain/Models/MailItem/ThreadMailItem.cs new file mode 100644 index 00000000..8eb8085e --- /dev/null +++ b/Wino.Core.Domain/Models/MailItem/ThreadMailItem.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Domain.Models.MailItem +{ + public class ThreadMailItem : IMailItemThread + { + // TODO: Ideally this should be SortedList. + public ObservableCollection ThreadItems { get; } = new ObservableCollection(); + + public IMailItem LatestMailItem => ThreadItems.LastOrDefault(); + public IMailItem FirstMailItem => ThreadItems.FirstOrDefault(); + + public void AddThreadItem(IMailItem item) + { + if (item == null) return; + + if (ThreadItems.Any(a => a.Id == item.Id)) + { + return; + } + + if (item != null && item.IsDraft) + { + ThreadItems.Insert(0, item); + return; + } + + var insertItem = ThreadItems.FirstOrDefault(a => !a.IsDraft && a.CreationDate < item.CreationDate); + + if (insertItem == null) + ThreadItems.Insert(ThreadItems.Count, item); + else + { + var index = ThreadItems.IndexOf(insertItem); + + ThreadItems.Insert(index, item); + } + } + + #region IMailItem + + public Guid UniqueId => LatestMailItem?.UniqueId ?? Guid.Empty; + public string Id => LatestMailItem?.Id ?? string.Empty; + + // Show subject from last item. + public string Subject => LatestMailItem?.Subject ?? string.Empty; + + public string ThreadId => LatestMailItem?.ThreadId ?? string.Empty; + + public string PreviewText => FirstMailItem?.PreviewText ?? string.Empty; + + public string FromName => LatestMailItem?.FromName ?? string.Empty; + + public string FromAddress => LatestMailItem?.FromAddress ?? string.Empty; + + public bool HasAttachments => ThreadItems.Any(a => a.HasAttachments); + + public bool IsFlagged => ThreadItems.Any(a => a.IsFlagged); + + public bool IsFocused => LatestMailItem?.IsFocused ?? false; + + public bool IsRead => ThreadItems.All(a => a.IsRead); + + public DateTime CreationDate => FirstMailItem?.CreationDate ?? DateTime.MinValue; + + public bool IsDraft => ThreadItems.Any(a => a.IsDraft); + + public string DraftId => string.Empty; + + public string MessageId => LatestMailItem?.MessageId; + + public string References => LatestMailItem?.References ?? string.Empty; + + public string InReplyTo => LatestMailItem?.InReplyTo ?? string.Empty; + + public MailItemFolder AssignedFolder => LatestMailItem?.AssignedFolder; + + public MailAccount AssignedAccount => LatestMailItem?.AssignedAccount; + + public Guid FileId => LatestMailItem?.FileId ?? Guid.Empty; + + #endregion + } +} diff --git a/Wino.Core.Domain/Models/Menus/MailOperationMenuItem.cs b/Wino.Core.Domain/Models/Menus/MailOperationMenuItem.cs new file mode 100644 index 00000000..c14d7604 --- /dev/null +++ b/Wino.Core.Domain/Models/Menus/MailOperationMenuItem.cs @@ -0,0 +1,21 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Domain.Models.Menus +{ + public class MailOperationMenuItem : MenuOperationItemBase, IMenuOperation + { + /// + /// Gets or sets whether this menu item should be placed in SecondaryCommands if used in CommandBar. + /// + public bool IsSecondaryMenuPreferred { get; set; } + + protected MailOperationMenuItem(MailOperation operation, bool isEnabled, bool isSecondaryMenuItem = false) : base(operation, isEnabled) + { + IsSecondaryMenuPreferred = isSecondaryMenuItem; + } + + public static MailOperationMenuItem Create(MailOperation operation, bool isEnabled = true, bool isSecondaryMenuItem = false) + => new MailOperationMenuItem(operation, isEnabled, isSecondaryMenuItem); + } +} diff --git a/Wino.Core.Domain/Models/Menus/MenuOperationItemBase.cs b/Wino.Core.Domain/Models/Menus/MenuOperationItemBase.cs new file mode 100644 index 00000000..462cfe14 --- /dev/null +++ b/Wino.Core.Domain/Models/Menus/MenuOperationItemBase.cs @@ -0,0 +1,18 @@ +using System; + +namespace Wino.Core.Domain.Models.Menus +{ + public class MenuOperationItemBase where TOperation : Enum + { + public MenuOperationItemBase(TOperation operation, bool isEnabled) + { + Operation = operation; + IsEnabled = isEnabled; + Identifier = operation.ToString(); + } + + public TOperation Operation { get; set; } + public string Identifier { get; set; } + public bool IsEnabled { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/Navigation/NavigateMailFolderEventArgs.cs b/Wino.Core.Domain/Models/Navigation/NavigateMailFolderEventArgs.cs new file mode 100644 index 00000000..de6a38ea --- /dev/null +++ b/Wino.Core.Domain/Models/Navigation/NavigateMailFolderEventArgs.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Domain.Models.Navigation +{ + public class NavigateMailFolderEventArgs + { + public NavigateMailFolderEventArgs(IBaseFolderMenuItem baseFolderMenuItem, TaskCompletionSource folderInitLoadAwaitTask = null) + { + BaseFolderMenuItem = baseFolderMenuItem; + FolderInitLoadAwaitTask = folderInitLoadAwaitTask; + } + + /// + /// Base folder menu item. + /// + public IBaseFolderMenuItem BaseFolderMenuItem { get; set; } + + /// + /// Completion source for waiting folder's mail initialization. + /// + public TaskCompletionSource FolderInitLoadAwaitTask { get; } + } +} diff --git a/Wino.Core.Domain/Models/Navigation/NavigationMode.cs b/Wino.Core.Domain/Models/Navigation/NavigationMode.cs new file mode 100644 index 00000000..fbeb0fdd --- /dev/null +++ b/Wino.Core.Domain/Models/Navigation/NavigationMode.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Models.Navigation +{ + public enum NavigationMode + { + New, + Back, + Forward, + Refresh + } +} diff --git a/Wino.Core.Domain/Models/Navigation/NavigationTransitionType.cs b/Wino.Core.Domain/Models/Navigation/NavigationTransitionType.cs new file mode 100644 index 00000000..fba63741 --- /dev/null +++ b/Wino.Core.Domain/Models/Navigation/NavigationTransitionType.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Domain.Models.Navigation +{ + public enum NavigationTransitionType + { + None, // Supress + DrillIn, + } +} diff --git a/Wino.Core.Domain/Models/Personalization/AppThemeBase.cs b/Wino.Core.Domain/Models/Personalization/AppThemeBase.cs new file mode 100644 index 00000000..f9b74a40 --- /dev/null +++ b/Wino.Core.Domain/Models/Personalization/AppThemeBase.cs @@ -0,0 +1,29 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Personalization +{ + /// + /// Base class for all app themes. + /// + public abstract class AppThemeBase + { + public Guid Id { get; set; } + public string ThemeName { get; set; } + public ApplicationElementTheme ForceElementTheme { get; set; } + public string AccentColor { get; set; } + public bool IsAccentColorAssigned => !string.IsNullOrEmpty(AccentColor); + public string BackgroundPreviewImage => GetBackgroundPreviewImagePath(); + public abstract AppThemeType AppThemeType { get; } + + protected AppThemeBase(string themeName, Guid id) + { + ThemeName = themeName; + Id = id; + } + + public abstract Task GetThemeResourceDictionaryContentAsync(); + public abstract string GetBackgroundPreviewImagePath(); + } +} diff --git a/Wino.Core.Domain/Models/Personalization/CustomThemeMetadata.cs b/Wino.Core.Domain/Models/Personalization/CustomThemeMetadata.cs new file mode 100644 index 00000000..e6206725 --- /dev/null +++ b/Wino.Core.Domain/Models/Personalization/CustomThemeMetadata.cs @@ -0,0 +1,12 @@ +using System; + +namespace Wino.Core.Domain.Models.Personalization +{ + public class CustomThemeMetadata + { + public Guid Id { get; set; } + public string Name { get; set; } + public string AccentColorHex { get; set; } + public bool HasCustomAccentColor => !string.IsNullOrEmpty(AccentColorHex); + } +} diff --git a/Wino.Core.Domain/Models/Personalization/ElementThemeContainer.cs b/Wino.Core.Domain/Models/Personalization/ElementThemeContainer.cs new file mode 100644 index 00000000..42f79fc5 --- /dev/null +++ b/Wino.Core.Domain/Models/Personalization/ElementThemeContainer.cs @@ -0,0 +1,16 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Personalization +{ + public class ElementThemeContainer + { + public ElementThemeContainer(ApplicationElementTheme nativeTheme, string title) + { + NativeTheme = nativeTheme; + Title = title; + } + + public ApplicationElementTheme NativeTheme { get; set; } + public string Title { get; set; } + } +} diff --git a/Wino.Core.Domain/Models/Personalization/MailListPaneLengthPreferences.cs b/Wino.Core.Domain/Models/Personalization/MailListPaneLengthPreferences.cs new file mode 100644 index 00000000..23841893 --- /dev/null +++ b/Wino.Core.Domain/Models/Personalization/MailListPaneLengthPreferences.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.Domain.Models.Personalization +{ + public record MailListPaneLengthPreferences(string Title, double Length); +} diff --git a/Wino.Core.Domain/Models/Reader/EditorToolbarSection.cs b/Wino.Core.Domain/Models/Reader/EditorToolbarSection.cs new file mode 100644 index 00000000..e52fdea1 --- /dev/null +++ b/Wino.Core.Domain/Models/Reader/EditorToolbarSection.cs @@ -0,0 +1,30 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Reader +{ + public class EditorToolbarSection + { + public EditorToolbarSectionType SectionType { get; set; } + public string Title + { + get + { + switch (SectionType) + { + case EditorToolbarSectionType.None: + return Translator.EditorToolbarOption_None; + case EditorToolbarSectionType.Format: + return Translator.EditorToolbarOption_Format; + case EditorToolbarSectionType.Insert: + return Translator.EditorToolbarOption_Insert; + case EditorToolbarSectionType.Draw: + return Translator.EditorToolbarOption_Draw; + case EditorToolbarSectionType.Options: + return Translator.EditorToolbarOption_Options; + default: + return "Unknown Editor Option"; + } + } + } + } +} diff --git a/Wino.Core.Domain/Models/Reader/FilterOption.cs b/Wino.Core.Domain/Models/Reader/FilterOption.cs new file mode 100644 index 00000000..883a8174 --- /dev/null +++ b/Wino.Core.Domain/Models/Reader/FilterOption.cs @@ -0,0 +1,16 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Reader +{ + public class FilterOption + { + public FilterOptionType Type { get; set; } + public string Title { get; set; } + + public FilterOption(string title, FilterOptionType type) + { + Title = title; + Type = type; + } + } +} diff --git a/Wino.Core.Domain/Models/Reader/MailRenderModel.cs b/Wino.Core.Domain/Models/Reader/MailRenderModel.cs new file mode 100644 index 00000000..0f1c47f3 --- /dev/null +++ b/Wino.Core.Domain/Models/Reader/MailRenderModel.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using MimeKit; + +namespace Wino.Core.Domain.Models.Reader +{ + /// + /// Final model to be passed to renderer page. + /// Data here are created based on rendering settings. + /// + public class MailRenderModel + { + public string RenderHtml { get; } + public MailRenderingOptions MailRenderingOptions { get; } + public List Attachments { get; set; } = new List(); + + public string UnsubscribeLink { get; set; } + public bool CanUnsubscribe => !string.IsNullOrEmpty(UnsubscribeLink); + + public MailRenderModel(string renderHtml, MailRenderingOptions mailRenderingOptions = null) + { + RenderHtml = renderHtml; + MailRenderingOptions = mailRenderingOptions; + } + } +} diff --git a/Wino.Core.Domain/Models/Reader/MailRenderingOptions.cs b/Wino.Core.Domain/Models/Reader/MailRenderingOptions.cs new file mode 100644 index 00000000..739592aa --- /dev/null +++ b/Wino.Core.Domain/Models/Reader/MailRenderingOptions.cs @@ -0,0 +1,19 @@ +namespace Wino.Core.Domain.Models.Reader +{ + /// + /// Rendering options for mail. + /// + public class MailRenderingOptions + { + private const bool DefaultLoadImageValue = true; + private const bool DefaultLoadStylesValue = true; + + public bool LoadImages { get; set; } = DefaultLoadImageValue; + public bool LoadStyles { get; set; } = DefaultLoadStylesValue; + + // HtmlDocument.Load call is redundant if all the settings are in default values. + // Therefore we will purify the HTML only if needed. + + public bool IsPurifyingNeeded() => LoadImages != DefaultLoadImageValue || LoadStyles != DefaultLoadStylesValue; + } +} diff --git a/Wino.Core.Domain/Models/Reader/ReaderFontModel.cs b/Wino.Core.Domain/Models/Reader/ReaderFontModel.cs new file mode 100644 index 00000000..7530e92a --- /dev/null +++ b/Wino.Core.Domain/Models/Reader/ReaderFontModel.cs @@ -0,0 +1,6 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Reader +{ + public record ReaderFontModel(ReaderFont Font, string FontFamilyName); +} diff --git a/Wino.Core.Domain/Models/Reader/SortingOption.cs b/Wino.Core.Domain/Models/Reader/SortingOption.cs new file mode 100644 index 00000000..3d253453 --- /dev/null +++ b/Wino.Core.Domain/Models/Reader/SortingOption.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Comparers; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Models.Reader +{ + public class SortingOption + { + public SortingOptionType Type { get; set; } + public string Title { get; set; } + public IComparer Comparer + { + get + { + if (Type == SortingOptionType.ReceiveDate) + return new DateComparer(); + else + return new NameComparer(); + } + } + + public SortingOption(string title, SortingOptionType type) + { + Title = title; + Type = type; + } + } +} diff --git a/Wino.Core.Domain/Models/Requests/IUIMessage.cs b/Wino.Core.Domain/Models/Requests/IUIMessage.cs new file mode 100644 index 00000000..44b74525 --- /dev/null +++ b/Wino.Core.Domain/Models/Requests/IUIMessage.cs @@ -0,0 +1,10 @@ +namespace Wino.Core.Domain.Models.Requests +{ + /// + /// Interface for all messages to report UI changes from synchronizers to UI. + /// None of these messages can't run a code that manipulates database. + /// They are sent either from processor or view models to signal some other + /// parts of the application. + /// + public interface IUIMessage; +} diff --git a/Wino.Core.Domain/Models/Requests/RequestBase.cs b/Wino.Core.Domain/Models/Requests/RequestBase.cs new file mode 100644 index 00000000..8aa3459b --- /dev/null +++ b/Wino.Core.Domain/Models/Requests/RequestBase.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Domain.Models.Requests +{ + public abstract record RequestBase(MailCopy Item, MailSynchronizerOperation Operation) : IRequest + where TBatchRequestType : IBatchChangeRequest + { + public abstract IBatchChangeRequest CreateBatch(IEnumerable requests); + public abstract void ApplyUIChanges(); + public abstract void RevertUIChanges(); + } + + public abstract record FolderRequestBase(MailItemFolder Folder, MailSynchronizerOperation Operation) : IFolderRequest + { + public abstract void ApplyUIChanges(); + public abstract void RevertUIChanges(); + } + + public abstract record BatchRequestBase(IEnumerable Items, MailSynchronizerOperation Operation) : IBatchChangeRequest + { + public abstract void ApplyUIChanges(); + public abstract void RevertUIChanges(); + } +} diff --git a/Wino.Core.Domain/Models/Requests/ToggleRequestRule.cs b/Wino.Core.Domain/Models/Requests/ToggleRequestRule.cs new file mode 100644 index 00000000..b69db903 --- /dev/null +++ b/Wino.Core.Domain/Models/Requests/ToggleRequestRule.cs @@ -0,0 +1,15 @@ +using System; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Models.Requests +{ + /// + /// Defines a single rule for toggling user actions if needed. + /// For example: If user wants to mark a mail as read, but it's already read, then it should be marked as unread. + /// + /// + /// + /// + public record ToggleRequestRule(MailOperation SourceAction, MailOperation TargetAction, Func Condition); +} diff --git a/Wino.Core.Domain/Models/Store/StoreProductType.cs b/Wino.Core.Domain/Models/Store/StoreProductType.cs new file mode 100644 index 00000000..5c82003e --- /dev/null +++ b/Wino.Core.Domain/Models/Store/StoreProductType.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Domain.Models.Store +{ + public enum StoreProductType + { + UnlimitedAccounts + } +} diff --git a/Wino.Core.Domain/Models/Synchronization/SynchronizationOptions.cs b/Wino.Core.Domain/Models/Synchronization/SynchronizationOptions.cs new file mode 100644 index 00000000..31ced1de --- /dev/null +++ b/Wino.Core.Domain/Models/Synchronization/SynchronizationOptions.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Domain.Models.Synchronization +{ + public class SynchronizationOptions + { + /// + /// Unique id of synchronization. + /// + public Guid Id { get; } = Guid.NewGuid(); + + /// + /// Account to execute synchronization for. + /// + public Guid AccountId { get; set; } + + /// + /// Type of the synchronization to be performed. + /// + public SynchronizationType Type { get; set; } + + /// + /// Collection of FolderId to perform SynchronizationType.Custom type sync. + /// + public List SynchronizationFolderIds { get; set; } + + /// + /// A listener to be notified about the progress of the synchronization. + /// + public ISynchronizationProgress ProgressListener { 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 + /// inside the same linked inbox sync. + /// + public Guid? GroupedSynchronizationTrackingId { get; set; } + + public override string ToString() => $"Type: {Type}, Folders: {(SynchronizationFolderIds == null ? "None" : string.Join(",", SynchronizationFolderIds))}"; + } +} diff --git a/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs b/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs new file mode 100644 index 00000000..c10a7b96 --- /dev/null +++ b/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Domain.Models.Synchronization +{ + public class SynchronizationResult + { + protected SynchronizationResult() { } + + public IEnumerable DownloadedMessages { get; set; } = new List(); + public SynchronizationCompletedState CompletedState { get; set; } + + public static SynchronizationResult Empty => new() { CompletedState = SynchronizationCompletedState.Success }; + + public static SynchronizationResult Completed(IEnumerable downloadedMessages) + => new() { DownloadedMessages = downloadedMessages, CompletedState = SynchronizationCompletedState.Success }; + + public static SynchronizationResult Canceled => new() { CompletedState = SynchronizationCompletedState.Canceled }; + } +} diff --git a/Wino.Core.Domain/Models/Translations/AppLanguageModel.cs b/Wino.Core.Domain/Models/Translations/AppLanguageModel.cs new file mode 100644 index 00000000..65032c61 --- /dev/null +++ b/Wino.Core.Domain/Models/Translations/AppLanguageModel.cs @@ -0,0 +1,6 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Models.Translations +{ + public record AppLanguageModel(AppLanguage Language, string DisplayName); +} diff --git a/Wino.Core.Domain/Translations/WinoTranslationDictionary.cs b/Wino.Core.Domain/Translations/WinoTranslationDictionary.cs new file mode 100644 index 00000000..087f95b8 --- /dev/null +++ b/Wino.Core.Domain/Translations/WinoTranslationDictionary.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Domain.Translations +{ + public class WinoTranslationDictionary : Dictionary + { + // Return the key itself in case of translation is not found. + public string GetTranslatedString(string key) => TryGetValue(key, out string keyValue) ? keyValue : key; + + public Stream GetLanguageStream(AppLanguage language) + { + var path = GetLanguageFileNameRelativePath(language); + var executingAssembly = Assembly.GetExecutingAssembly(); + + string languageResourcePath = $"{executingAssembly.ManifestModule.Name.Replace(".dll", ".")}Translations.{path}.resources.json"; + return executingAssembly.GetManifestResourceStream(languageResourcePath); + } + + /// + /// Returns the relative path of the language file. + /// All translations are under Translations\{langCode}\resources.json + /// + /// Language + /// Relative folder for the language + private string GetLanguageFileNameRelativePath(AppLanguage language) + { + return language switch + { + AppLanguage.English => "en_US", + AppLanguage.Turkish => "tr_TR", + AppLanguage.Deutsch => "de_DE", + AppLanguage.Russian => "ru_RU", + AppLanguage.Polish => "pl_PL", + AppLanguage.Czech => "cs_CZ", + AppLanguage.French => "fr_FR", + AppLanguage.Chinese => "zh_CH", + AppLanguage.Spanish => "es_ES", + _ => "en_US", + }; + } + } +} diff --git a/Wino.Core.Domain/Translations/ca_ES/resources.json b/Wino.Core.Domain/Translations/ca_ES/resources.json new file mode 100644 index 00000000..54ddd05d --- /dev/null +++ b/Wino.Core.Domain/Translations/ca_ES/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "all done", + "AccountCreationDialog_Initializing": "initializing", + "AccountCreationDialog_PreparingFolders": "We are getting folder information at the moment.", + "AccountCreationDialog_SigninIn": "Account information is being saved.", + "AccountEditDialog_Message": "Account Name", + "AccountEditDialog_Title": "Edit Account", + "AccountPickerDialog_Title": "Pick an account", + "AddHyperlink": "Add", + "AutoDiscoveryProgressMessage": "Searching for mail settings...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Advanced Configuration", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Your credentials will only be stored locally on your computer.", + "BasicIMAPSetupDialog_Description": "Some accounts require additional steps to sign in", + "BasicIMAPSetupDialog_DisplayName": "Display Name", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "BasicIMAPSetupDialog_LearnMore": "Learn more", + "BasicIMAPSetupDialog_MailAddress": "E-Mail Address", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Password", + "BasicIMAPSetupDialog_Title": "IMAP Account", + "Buttons_AddAccount": "Add Account", + "Buttons_ApplyTheme": "Apply Theme", + "Buttons_Browse": "Browse", + "Buttons_Cancel": "Cancel", + "Buttons_Close": "Close", + "Buttons_Create": "Create", + "Buttons_CreateAccount": "Create Account", + "Buttons_Delete": "Delete", + "Buttons_Discard": "Discard", + "Buttons_EnableImageRendering": "Enable", + "Buttons_No": "No", + "Buttons_Open": "Open", + "Buttons_Purchase": "Purchase", + "Buttons_RateWino": "Rate Wino", + "Buttons_Save": "Save", + "Buttons_SaveConfiguration": "Save Configuration", + "Buttons_Share": "Share", + "Buttons_SignIn": "Sign In", + "Buttons_Yes": "Yes", + "Center": "Center", + "ComingSoon": "Coming soon...", + "ComposerFrom": "From: ", + "ComposerSubject": "Subject: ", + "ComposerTo": "To: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "click enter to input addresses", + "CustomThemeBuilder_AccentColorDescription": "Set custom accent color if you wish. Not selecting a color will use your Windows accent color.", + "CustomThemeBuilder_AccentColorTitle": "Accent color", + "CustomThemeBuilder_PickColor": "Pick", + "CustomThemeBuilder_ThemeNameDescription": "Unique name for your custom theme.", + "CustomThemeBuilder_ThemeNameTitle": "Theme name", + "CustomThemeBuilder_Title": "Custom Theme Builder", + "CustomThemeBuilder_WallpaperDescription": "Set a custom wallpaper for Wino", + "CustomThemeBuilder_WallpaperTitle": "Set custom wallpaper", + "DialogMessage_AccountLimitMessage": "You have reached the account creation limit.\nWould you like to purchase 'Unlimited Account' add-on to continue?", + "DialogMessage_AccountLimitTitle": "Account Limit Reached", + "DialogMessage_CleanupFolderMessage": "Do you want to permanently delete all the mails in this folder?", + "DialogMessage_CleanupFolderTitle": "Cleanup Folder", + "DialogMessage_ComposerMissingRecipientMessage": "Message has no recipient.", + "DialogMessage_ComposerValidationFailedTitle": "Validation Failed", + "DialogMessage_CreateLinkedAccountMessage": "Give this new link a name. Accounts will be merged under this name.", + "DialogMessage_CreateLinkedAccountTitle": "Account Link Name", + "DialogMessage_DeleteAccountConfirmationMessage": "Delete {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "All data associated with this account will be deleted from disk permanently.", + "DialogMessage_DiscardDraftConfirmationMessage": "This draft will be discarded. Do you want to continue?", + "DialogMessage_DiscardDraftConfirmationTitle": "Discard Draft", + "DialogMessage_HardDeleteConfirmationMessage": "Permanent Delete", + "DialogMessage_HardDeleteConfirmationTitle": "Message(s) will be permanently deleted. Do you want to continue?", + "DialogMessage_NoAccountsForCreateMailMessage": "You don't have any accounts to create message from.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account Missing", + "DialogMessage_RenameLinkedAccountsMessage": "Enter new name for linked account", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Unlink Accounts", + "DialogMessage_EmptySubjectConfirmation": "Missin Subject", + "DialogMessage_EmptySubjectConfirmationMessage": "Message has no subject. Do you want to continue?", + "Dialog_DontAskAgain": "Don't ask again", + "DiscordChannelDisclaimerMessage": "Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server.\nTo get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects'\n\nYou will be directed to server URL since Discord doesn't support channel invites.", + "DiscordChannelDisclaimerTitle": "Important Discord Information", + "Draft": "Draft", + "EditorToolbarOption_Draw": "Draw", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insert", + "EditorToolbarOption_None": "None", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Dark mode", + "ElementTheme_Default": "Use system setting", + "ElementTheme_Light": "Light mode", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool failed.", + "Exception_AuthenticationCanceled": "Authentication canceled", + "Exception_CustomThemeExists": "This theme already exists.", + "Exception_CustomThemeMissingName": "You must provide a name.", + "Exception_CustomThemeMissingWallpaper": "You must provide a custom background image.", + "Exception_FailedToSynchronizeFolders": "Failed to synchronize folders", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Corrupted authorization response.", + "Exception_GoogleAuthError": "OAuth authorization error: {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "System folder configuration is not valid. Check configuration and try again.", + "Exception_NullAssignedAccount": "Assigned account is null", + "Exception_NullAssignedFolder": "Assigned folder is null", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Token generation failed", + "Exception_TokenInfoRetrivalFailed": "Failed to get token information.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "This provider is not supported.", + "Exception_UnsupportedSynchronizerOperation": "This operation is not supported for {0}", + "Exception_UserCancelSystemFolderSetupDialog": "User canceled system folder config dialog.", + "Files": "Files", + "FilteringOption_All": "All", + "FilteringOption_Flagged": "Flagged", + "FilteringOption_Unread": "Unread", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Create sub folder", + "FolderOperation_Delete": "Delete", + "FolderOperation_DontSync": "Don't sync this folder", + "FolderOperation_Empty": "Empty this folder", + "FolderOperation_MarkAllAsRead": "Mark all as read", + "FolderOperation_Move": "Move", + "DragMoveToFolderCaption": "Move to {0}", + "FolderOperation_None": "None", + "FolderOperation_Pin": "Pin", + "FolderOperation_Rename": "Rename", + "FolderOperation_Unpin": "Unpin", + "HoverActionOption_Archive": "Archive", + "HoverActionOption_Delete": "Delete", + "HoverActionOption_MoveJunk": "Move to Junk", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Outgoing (SMTP) mail server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Outgoing server password", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Outgoing server requires authentication", + "IMAPSetupDialog_OutgoingMailServerUsername": "Outgoing server user name", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Network Issue", + "Info_ReviewNewMessage": "All feedbacks are appreciated. Thank you for the review!", + "Info_ReviewSuccessTitle": "Thank you", + "Info_ReviewUnknownErrorMessage": "There was an unknown issue with your review. ({0})", + "Info_ReviewUnknownErrorTitle": "Unknown Error", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Synchronization Failed", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Unsupported", + "Info_UnsubscribeLinkInvalidTitle": "Invalid Unsubscribe Uri", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Connection security", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "No authentication", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/cs_CZ/resources.json b/Wino.Core.Domain/Translations/cs_CZ/resources.json new file mode 100644 index 00000000..69a9d222 --- /dev/null +++ b/Wino.Core.Domain/Translations/cs_CZ/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "hotovo", + "AccountCreationDialog_Initializing": "inicializace", + "AccountCreationDialog_PreparingFolders": "Stahování informací o složkách.", + "AccountCreationDialog_SigninIn": "Probíhá ukládání informací o účtu.", + "AccountEditDialog_Message": "Název účtu", + "AccountEditDialog_Title": "Upravit účet", + "AccountPickerDialog_Title": "Vybrat účet", + "AddHyperlink": "Přidat", + "AutoDiscoveryProgressMessage": "Vyhledávání v nastaveních mailu...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Pokročilá nastavení", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Vaše nastavení budou uložena pouze lokálně na vašem počítači.", + "BasicIMAPSetupDialog_Description": "Některé účty vyžadují další kroky k přihlášení", + "BasicIMAPSetupDialog_DisplayName": "Zobrazované jméno", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "např. Jan Novák", + "BasicIMAPSetupDialog_LearnMore": "Zjistit více", + "BasicIMAPSetupDialog_MailAddress": "Emailová adresa", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "jan.novak@seznam.cz", + "BasicIMAPSetupDialog_Password": "Heslo", + "BasicIMAPSetupDialog_Title": "IMAP účet", + "Buttons_AddAccount": "Přidat účet", + "Buttons_ApplyTheme": "Použít motiv", + "Buttons_Browse": "Procházet", + "Buttons_Cancel": "Zrušit", + "Buttons_Close": "Zavřít", + "Buttons_Create": "Vytvořit", + "Buttons_CreateAccount": "Vytvořit účet", + "Buttons_Delete": "Smazat", + "Buttons_Discard": "Zahodit", + "Buttons_EnableImageRendering": "Povolit", + "Buttons_No": "Ne", + "Buttons_Open": "Otevřít", + "Buttons_Purchase": "Koupit", + "Buttons_RateWino": "Ohodnotit Wino", + "Buttons_Save": "Uložit", + "Buttons_SaveConfiguration": "Uložit nastavení", + "Buttons_Share": "Sdílet", + "Buttons_SignIn": "Přihlásit se", + "Buttons_Yes": "Ano", + "Center": "Nastřed", + "ComingSoon": "Již brzy...", + "ComposerFrom": "Od: ", + "ComposerSubject": "Předmět: ", + "ComposerTo": "Komu: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "pro vložení adresy zmáčkni Enter", + "CustomThemeBuilder_AccentColorDescription": "Pokud chcete, můžete si nastavit barevný tón. Jinak se použije se výchozí barevný tón Windows.", + "CustomThemeBuilder_AccentColorTitle": "Barevný tón", + "CustomThemeBuilder_PickColor": "Vybrat", + "CustomThemeBuilder_ThemeNameDescription": "Unikátní název pro váš motiv.", + "CustomThemeBuilder_ThemeNameTitle": "Název motivu", + "CustomThemeBuilder_Title": "Nástroj na vytvoření vlastního motivu", + "CustomThemeBuilder_WallpaperDescription": "Nastav vlastní pozadí pro Wino", + "CustomThemeBuilder_WallpaperTitle": "Nastav vlastní pozadí", + "DialogMessage_AccountLimitMessage": "Dosáhli jste limitu vytvořených účtů. Chcete si zakoupit doplněk \"Neomezený účet\", aby jste mohli pokračovat?", + "DialogMessage_AccountLimitTitle": "Dosažen limit počtu účtú", + "DialogMessage_CleanupFolderMessage": "Přejete si trvale smazat všechny maily v této složce?", + "DialogMessage_CleanupFolderTitle": "Vyprázdnit složku", + "DialogMessage_ComposerMissingRecipientMessage": "Zpráva nemá žádného příjemce.", + "DialogMessage_ComposerValidationFailedTitle": "Ověření se nezdařilo", + "DialogMessage_CreateLinkedAccountMessage": "Dejte tomuto novému propojení název. Účty budou propojeny pod tímto názvem.", + "DialogMessage_CreateLinkedAccountTitle": "Název propojeného účtu", + "DialogMessage_DeleteAccountConfirmationMessage": "Odstranit {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "Všechna data spojená s tímto účtem budou trvale smazána z disku.", + "DialogMessage_DiscardDraftConfirmationMessage": "Tento koncept bude zahozen. Chcete pokračovat?", + "DialogMessage_DiscardDraftConfirmationTitle": "Zahodit koncept", + "DialogMessage_HardDeleteConfirmationMessage": "Trvalé smazání", + "DialogMessage_HardDeleteConfirmationTitle": "Zpráva(y) bude trvale odstraněna. Chcete pokračovat?", + "DialogMessage_NoAccountsForCreateMailMessage": "Nemáte žádný účet pro vytvoření zprávy.", + "DialogMessage_NoAccountsForCreateMailTitle": "Chybějící účet", + "DialogMessage_RenameLinkedAccountsMessage": "Zadejte nový název pro propojený účet", + "DialogMessage_RenameLinkedAccountsTitle": "Přejmenovat propojený účet", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Tato operace neodstraní vaše mailové účty, ale pouze zruší jejich propojení. Chcete pokračovat?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Rozpojit účty", + "DialogMessage_EmptySubjectConfirmation": "Chybějící Předmět", + "DialogMessage_EmptySubjectConfirmationMessage": "Zpráva nemá Předmět. Chcete pokračovat?", + "Dialog_DontAskAgain": "Příště se neptat", + "DiscordChannelDisclaimerMessage": "Wino nemá vlastní Discord server, ale speciální kanál 'wino-mail' je hostován na serveru 'Developer Sanctuary'.\nChcete-li získat informace o Winu, připojte se k vývojářskému serveru a sledujte 'wino-mail' kanál v rámci 'Community Projects'. \n\nBudete přesměrováni na stránku serveru 'Developer Sanctuary', protože Discord nepodporuje pozvánky přímo do kanálů.", + "DiscordChannelDisclaimerTitle": "Důležité Discord informace", + "Draft": "Koncept", + "EditorToolbarOption_Draw": "Nakreslit", + "EditorToolbarOption_Format": "Formátovat", + "EditorToolbarOption_Insert": "Vložit", + "EditorToolbarOption_None": "Žádné", + "EditorToolbarOption_Options": "Možnosti", + "ElementTheme_Dark": "Tmavý režim", + "ElementTheme_Default": "Použít nastavení systému", + "ElementTheme_Light": "Světlý režim", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool selhal.", + "Exception_AuthenticationCanceled": "Ověřování bylo zrušeno", + "Exception_CustomThemeExists": "Tento motiv už existuje.", + "Exception_CustomThemeMissingName": "Musíte zadat název.", + "Exception_CustomThemeMissingWallpaper": "Musíte zadat vlastní obrázek pozadí.", + "Exception_FailedToSynchronizeFolders": "Synchronizace složek se nezdařila", + "Exception_GoogleAuthCallbackNull": "Callback uri je při aktivaci null.", + "Exception_GoogleAuthCorruptedCode": "Odpověď z autorizačního serveru je chybná.", + "Exception_GoogleAuthError": "Chyba autorizace OAuth: {0}", + "Exception_GoogleAuthInvalidResponse": "Přijata chybová odpověď ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Ověření autorizačního kódu selhalo.", + "Exception_InvalidSystemFolderConfiguration": "Konfigurace systémové složky není správná. Zkontrolujte konfiguraci a zkuste to znovu.", + "Exception_NullAssignedAccount": "Přiřazený účet je \"null\"", + "Exception_NullAssignedFolder": "Přiřazená složka je \"null\"", + "Exception_SynchronizerFailureHTTP": "Zpracování odpovědi se nezdařilo. HTTP kód chyby: {0}", + "Exception_TokenGenerationFailed": "Generování tokenu selhalo", + "Exception_TokenInfoRetrivalFailed": "Nepodařilo se získat informace o tokenu.", + "Exception_UnknowErrorDuringAuthentication": "Při ověřování došlo k neznámé chybě", + "Exception_UnsupportedAction": "Akce {0} není podporována", + "Exception_UnsupportedProvider": "Tento poskytovatel není podporován.", + "Exception_UnsupportedSynchronizerOperation": "Tato operace není podporována pro {0}", + "Exception_UserCancelSystemFolderSetupDialog": "Uživatel zrušil dialogové okno s konfigurací systémové složky.", + "Files": "Soubory", + "FilteringOption_All": "Všechny", + "FilteringOption_Flagged": "Označené", + "FilteringOption_Unread": "Nepřečtené", + "Focused": "Důležité", + "FolderOperation_CreateSubFolder": "Vytvořit podsložku", + "FolderOperation_Delete": "Odstranit", + "FolderOperation_DontSync": "Nesynchronizovat tuto složku", + "FolderOperation_Empty": "Vyprázdnit tuto složku", + "FolderOperation_MarkAllAsRead": "Označit vše jako přečtené", + "FolderOperation_Move": "Přesunout", + "DragMoveToFolderCaption": "Přesunout do {0}", + "FolderOperation_None": "Žádné", + "FolderOperation_Pin": "Připnout", + "FolderOperation_Rename": "Přejmenovat", + "FolderOperation_Unpin": "Odepnout", + "HoverActionOption_Archive": "Archivovat", + "HoverActionOption_Delete": "Smazat", + "HoverActionOption_MoveJunk": "Přesunout do Koše", + "HoverActionOption_ToggleFlag": "Označit / Zrušit označení", + "HoverActionOption_ToggleRead": "Přečtené / Nepřečtené", + "MergedAccountCommonFolderInbox": "Doručená pošta", + "MergedAccountCommonFolderSent": "Odesláno", + "MergedAccountCommonFolderDraft": "Koncepty", + "MergedAccountCommonFolderJunk": "Nevyžádaná pošta", + "MergedAccountCommonFolderTrash": "Koš", + "MergedAccountCommonFolderArchive": "Archív", + "IMAPSetupDialog_AccountType": "Typ účtu", + "IMAPSetupDialog_DisplayName": "Zobrazované jméno", + "IMAPSetupDialog_DisplayNamePlaceholder": "např. Jan Novák", + "IMAPSetupDialog_IncomingMailServer": "Server příchozí pošty", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "E-mailová adresa", + "IMAPSetupDialog_MailAddressPlaceholder": "jan.novák@seznam.cz", + "IMAPSetupDialog_OutgoingMailServer": "Server odchozí pošty (SMTP)", + "IMAPSetupDialog_OutgoingMailServerPassword": "Heslo odchozího serveru", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Odchozí server vyžaduje ověření", + "IMAPSetupDialog_OutgoingMailServerUsername": "Uživatelské jméno odchozího serveru", + "IMAPSetupDialog_Password": "Heslo", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Vyžadovat SSL pro příchozí e-mail", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Vyžadovat SSL pro odchozí e-mail", + "IMAPSetupDialog_Title": "Pokročilé nastavení IMAP", + "IMAPSetupDialog_UseSameConfig": "Použít stejné uživatelské jméno a heslo pro odesílání e-mailu", + "IMAPSetupDialog_Username": "Uživatelské jméno", + "IMAPSetupDialog_UsernamePlaceholder": "jan.novak, jan.novak@seznam.cz", + "ImageRenderingDisabled": "Vykreslování obrázků je pro tuto zprávu zakázáno.", + "InfoBarAction_Enable": "Zapnout", + "InfoBarMessage_SynchronizationDisabledFolder": "Synchronizace této složky je vypnuta.", + "InfoBarTitle_SynchronizationDisabledFolder": "Synchronizace složky vypnuta", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} je vytvořen", + "Info_AccountCreatedTitle": "Vytvoření účtu", + "Info_AccountCreationFailedTitle": "Vytvoření účtu selhalo", + "Info_AccountDeletedMessage": "{0} byl úspěšně smazán.", + "Info_AccountDeletedTitle": "Účet byl smazán", + "Info_AccountIssueFixFailedTitle": "Oprava účtu selhala", + "Info_AccountIssueFixSuccessMessage": "Opraveny všechny problémy s účtem.", + "Info_AccountIssueFixSuccessTitle": "Úspěšně dokončeno", + "Info_AttachmentOpenFailedMessage": "Tuto přílohu nelze otevřít.", + "Info_AttachmentOpenFailedTitle": "Chyba", + "Info_AttachmentSaveFailedMessage": "Tuto přílohu nelze uložit.", + "Info_AttachmentSaveFailedTitle": "Chyba", + "Info_AttachmentSaveSuccessMessage": "Příloha byla uložena.", + "Info_AttachmentSaveSuccessTitle": "Hotovo", + "Info_BackgroundExecutionDeniedMessage": "Spuštění aplikace na pozadí je zakázáno. To může mít vliv na synchronizaci na pozadí a oznámení.", + "Info_BackgroundExecutionDeniedTitle": "Zakázané spuštění na pozadí", + "Info_BackgroundExecutionUnknownErrorMessage": "Při registraci procesu synchronizace na pozadí došlo k neznámé výjimce.", + "Info_BackgroundExecutionUnknownErrorTitle": "Chyba procesu na pozadí", + "Info_ComposerMissingMIMEMessage": "Nelze zjistit MIME typ souboru. Synchronizace může pomoci.", + "Info_ComposerMissingMIMETitle": "Chyba", + "Info_ContactExistsMessage": "Tento kontakt je již v seznamu příjemců.", + "Info_ContactExistsTitle": "Kontakt existuje", + "Info_DraftFolderMissingMessage": "Složka Koncepty pro tento účet chybí. Zkontrolujte prosím nastavení účtu.", + "Info_DraftFolderMissingTitle": "Chybí složka Koncepty", + "Info_FileLaunchFailedTitle": "Spuštění souboru se nezdařilo", + "Info_InvalidAddressMessage": "'{0}' není platná e-mailová adresa.", + "Info_InvalidAddressTitle": "Neplatná adresa", + "Info_InvalidMoveTargetMessage": "Do této složky nelze přesunout vybrané e-maily.", + "Info_InvalidMoveTargetTitle": "Neplatná složka pro přesun", + "Info_LogsNotFoundMessage": "Neexistují žádné logy ke sdílení.", + "Info_LogsNotFoundTitle": "Logy nenalezeny", + "Info_LogsSavedMessage": "{0} je uložen do vybrané složky.", + "Info_LogsSavedTitle": "Uloženo", + "Info_MailRenderingFailedMessage": "Tento e-mail je poškozený nebo nelze otevřít.\n{0}", + "Info_MailRenderingFailedTitle": "Vykreslení selhalo", + "Info_MessageCorruptedMessage": "Tato zpráva je poškozena.", + "Info_MessageCorruptedTitle": "Chyba", + "Info_MissingFolderMessage": "{0} neexistuje pro tento účet.", + "Info_MissingFolderTitle": "Chybějící složka", + "Info_PurchaseExistsMessage": "Vypadá to, že tento produkt byl již zakoupen.", + "Info_PurchaseExistsTitle": "Stávající produkt", + "Info_PurchaseThankYouMessage": "Děkujeme", + "Info_PurchaseThankYouTitle": "Úspěšný nákup", + "Info_RequestCreationFailedTitle": "Nepodařilo se vytvořit požadavky", + "Info_ReviewNetworkErrorMessage": "Došlo k problému se sítí, při odesílání vaší recenze.", + "Info_ReviewNetworkErrorTitle": "Problém se sítí", + "Info_ReviewNewMessage": "Veškeré zpětné vazby si ceníme. Děkujeme za recenzi!", + "Info_ReviewSuccessTitle": "Děkujeme", + "Info_ReviewUnknownErrorMessage": "Došlo k neznámému problému s vaší recenzí ({0})", + "Info_ReviewUnknownErrorTitle": "Neznámá chyba", + "Info_ReviewUpdatedMessage": "Děkujeme za aktualizaci recenze.", + "Info_SignatureDisabledMessage": "Podpis pro tento účet vypnut", + "Info_SignatureDisabledTitle": "Hotovo", + "Info_SignatureSavedMessage": "Nový podpis byl uložen", + "Info_SignatureSavedTitle": "Hotovo", + "Info_SyncCanceledMessage": "Zrušeno", + "Info_SyncCanceledTitle": "Synchronizace", + "Info_SyncFailedTitle": "Synchronizace se nezdařila", + "Info_UnsupportedFunctionalityDescription": "Tato funkce zatím není implementována.", + "Info_UnsupportedFunctionalityTitle": "Nepodporováno", + "Info_UnsubscribeLinkInvalidTitle": "Neplatná URI pro odhlášení mailu", + "Info_UnsubscribeLinkInvalidMessage": "Tento odkaz pro odhlášení je neplatný. Nepodařilo se odhlásit automatizované zasílání e-mailu.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Způsob ověření", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Zabezpečení připojení", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Žádné ověření", + "ImapAuthenticationMethod_Plain": "Normální heslo", + "ImapAuthenticationMethod_EncryptedPassword": "Zašifrované heslo", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Žádné", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Do bloku", + "Left": "Zleva", + "Link": "Odkaz", + "LinkedAccountsCreatePolicyMessage": "musíte mít alespoň 2 účty, abyste vytvořili propojení\npropojení bude odstraněno po uložení", + "LinkedAccountsTitle": "Propojené účty", + "MailOperation_AlwaysMoveFocused": "Vždy přesunout do složky \"Důležité\"", + "MailOperation_AlwaysMoveOther": "Vždy se přesunout do složky \"Ostatní\"", + "MailOperation_Archive": "Archivovat", + "MailOperation_ClearFlag": "Zrušit označení", + "MailOperation_DarkEditor": "Tmavý", + "MailOperation_Delete": "Smazat", + "MailOperation_ExportPDF": "Exportovat do PDF", + "MailOperation_Find": "Vyhledat", + "MailOperation_Forward": "Přeposlat", + "MailOperation_Ignore": "Ignorovat", + "MailOperation_LightEditor": "Světlý", + "MailOperation_MarkAsJunk": "Označit jako nevyžádané", + "MailOperation_MarkAsRead": "Označit jako přečtené", + "MailOperation_MarkAsUnread": "Označit jako nepřečtené", + "MailOperation_MarkNotJunk": "Zrušit označení jako Nevyžádané", + "MailOperation_Move": "Přesunout", + "MailOperation_MoveFocused": "Přesunout do \"Důležité\"", + "MailOperation_MoveJunk": "Přesunout do \"Koš\"", + "MailOperation_MoveOther": "Přesunout do \"Ostatní\"", + "MailOperation_Navigate": "Přejděte", + "MailOperation_Print": "Vytisknout", + "MailOperation_Reply": "Odpovědět", + "MailOperation_ReplyAll": "Odpovědět všem", + "MailOperation_SaveAs": "Uložit jako…", + "MailOperation_SetFlag": "Označit vlajkou", + "MailOperation_Unarchive": "Odarchivovat", + "MailOperation_Zoom": "Přiblížit", + "MailsSelected": "Vybráno {0} položek", + "MarkFlagUnflag": "Označit / Zrušit označení vlajkou", + "MarkReadUnread": "Označit jako přečtené/nepřečtené", + "MenuManageAccounts": "Nastavení účtů", + "MenuNewMail": "Nový e-mail", + "MenuMergedAccountItemAccountsSuffix": " účty", + "MenuRate": "Ohodnotit Wino", + "MenuSettings": "Nastavení", + "MergedAccountsAvailableAccountsTitle": "Dostupné účty", + "More": "Více", + "MoveMailDialog_InvalidFolderMessage": "{0} není platná složka pro tento e-mail.", + "MoveMailDialog_Title": "Vyberte složku", + "NewAccountDialog_AccountName": "Název účtu", + "NewAccountDialog_AccountNameDefaultValue": "Osobní", + "NewAccountDialog_AccountNamePlaceholder": "např. Osobní účet", + "NewAccountDialog_Title": "Přidat nový účet", + "NoMailSelected": "nebyly vybrány žádné zprávy", + "NoMessageCrieteria": "žádná zpráva neodpovídá kritériím vyhledávání.", + "NoMessageEmptyFolder": "Tato složka je prázdná.", + "Notifications_MultipleNotificationsMessage": "Máš {0} nových zpráv.", + "Notifications_MultipleNotificationsTitle": "Nová pošta", + "Notifications_WinoUpdatedMessage": "Vyzkoušejte novou verzi {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail byl aktualizován.", + "Other": "Ostatní", + "PaneLengthOption_Default": "Výchozí", + "PaneLengthOption_ExtraLarge": "Extra velké", + "PaneLengthOption_Large": "Velké", + "PaneLengthOption_Medium": "Střední", + "PaneLengthOption_Micro": "Mikro", + "PaneLengthOption_Small": "Malé", + "Photos": "Fotky", + "PreparingFoldersMessage": "Připravování složek", + "ProviderDetail_Gmail_Description": "Google účet", + "ProviderDetail_IMAP_Description": "Vlastní IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP server", + "Results": "Výsledky", + "Right": "Vpravo", + "SynchronizationFolderReport_Success": "Aktuální", + "SynchronizationFolderReport_Failed": "Synchronizace se nezdařila.", + "SearchBarPlaceholder": "vyhledávaný výraz", + "SearchingIn": "Vyhledávání v", + "SettingsAboutGithub_Description": "Přejít na seznam chyb na GitHub.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Přidat zprávy do složky Odeslané", + "SettingsAccountManagementAppendMessage_Description": "Vytvořit kopii zprávy ve složce \"Odeslané\" po odeslání konceptu. Povolte tuto možnost, pokud nevidíte své e-maily po odeslání ve složky \"Odeslané\".", + "SettingsEditLinkedInbox_Title": "Upravit propojený účet", + "SettingsEditLinkedInbox_Description": "Přidat / odebrat účty, přejmenovat nebo zrušit propojení mezi účty.", + "SettingsAboutVersion": "Verze ", + "SettingsAboutWinoDescription": "Lehký e-mailový klient pro systém Windows.", + "SettingsAbout_Description": "Zjistěte více o Wino.", + "SettingsAbout_Title": "O aplikaci", + "SettingsAccentColor_Description": "Změna barevného tónu aplikace", + "SettingsAccentColor_Title": "Barevný tón", + "SettingsAccentColor_UseWindowsAccentColor": "Použít barevný tón mých Windows", + "SettingsAccountName_Description": "Změnit název účtu", + "SettingsAccountName_Title": "Název účtu", + "SettingsApplicationTheme_Description": "Přizpůsobte si Wino různými motivy dle vaší libosti.", + "SettingsApplicationTheme_Title": "Motiv aplikace", + "SettingsAvailableThemes_Description": "Vyberte si šablonu ze sbírky Wino dle vaší libosti nebo použijte vlastní motiv.", + "SettingsAvailableThemes_Title": "Dostupné motivy", + "SettingsCustomTheme_Description": "Vytvořte si vlastní motiv s vlastním pozadím a barevným tónem.", + "SettingsCustomTheme_Title": "Vlastní motiv", + "SettingsDeleteAccount_Description": "Odstranit všechny e-maily a přihlašovací údaje spojené s tímto účtem.", + "SettingsDeleteAccount_Title": "Smazat tento účet", + "SettingsDeleteProtection_Description": "Měl by vás Wino požádat o potvrzení pokaždé, když se pokoušíte trvale smazat e-mail pomocí kláves Shift + Del?", + "SettingsDeleteProtection_Title": "Ochrana proti trvalému smazání", + "SettingsDiagnostics_Description": "Pro vývojáře", + "SettingsDiagnostics_Title": "Diagnostika", + "SettingsDiscord_Description": "Získejte pravidelné aktualizace z vývoje, připojte se k diskusím o rozvoji aplikace a poskytněte zpětnou vazbu.", + "SettingsDiscord_Title": "Discord kanál", + "SettingsElementThemeSelectionDisabled": "Výběr motivu prvku je zakázán, pokud je vybrán jiný motiv aplikace než výchozí.", + "SettingsElementTheme_Description": "Vyberte motiv Windows pro Wino", + "SettingsElementTheme_Title": "Motiv prvku", + "SettingsEnableHoverActions_Title": "Povolit akce při přejetí myší", + "SettingsEnableIMAPLogs_Description": "Povolte pro poskytnutí podrobností o problémech s připojením IMAP, které jste měli během nastavení serveru IMAP.", + "SettingsEnableIMAPLogs_Title": "Povolit logy protokolu IMAP", + "SettingsEnableLogs_Description": "Možná budu potřebovat protokol o pádech pro diagnostiku problémů, které jste vytvořili na GitHubu. Protokoly jsou anonymizované - žádný protokol neukáže vaše přihlašovací údaje nebo citlivé informace.", + "SettingsEnableLogs_Title": "Povolit logy", + "SettingsEnableSignature": "Zapnout podpis", + "SettingsExpandOnStartup_Description": "Nastavte, zda by měl Wino zobrazit složky tohoto účtu při spuštění rozbalené.", + "SettingsExpandOnStartup_Title": "Zobrazit menu při spuštění", + "SettingsExternalContent_Description": "Správa nastavení vykreslování externích e-mailů.", + "SettingsExternalContent_Title": "Externí obsah", + "SettingsFocusedInbox_Description": "Nastavte, zda by měla být doručená pošta rozdělena do dvou jako \"Důležité\" - \"Ostatní\".", + "SettingsFocusedInbox_Title": "Doporučené", + "SettingsFolderSync_Description": "Povolit nebo zakázat konkrétní složky pro synchronizaci.", + "SettingsFolderSync_Title": "Synchronizace složek", + "SettingsFolderOptions_Title": "Nastavení složky", + "SettingsFolderOptions_Description": "Změnit nastavení jednotlivých složek, například povolit/zakázat synchronizaci, nebo zobrazit/skrýt počet nepřečtených e-mailů.", + "SettingsHoverActionCenter": "Prostřední akce", + "SettingsHoverActionLeft": "Levá akce", + "SettingsHoverActionRight": "Pravá akce", + "SettingsHoverActions_Description": "Vyberte 3 akce, které se zobrazí při přejetí pošty kurzorem.", + "SettingsHoverActions_Title": "Akce při přejetí myší", + "SettingsLanguage_Description": "Změnit jazyk aplikace pro Wino.", + "SettingsLanguage_Title": "Jazyk aplikace", + "CategoriesFolderNameOverride": "Kategorie", + "MoreFolderNameOverride": "Více", + "SettingsOptions_Title": "Nastavení", + "SettingsLinkAccounts_Description": "Sloučit více účtů do jednoho. Podívejte se na e-maily v jedné složce \"Doručená pošta\" společně.", + "SettingsLinkAccounts_Title": "Vytvořit propojené účty", + "SettingsLinkedAccountsSave_Description": "Změnit aktuální propojení s novými účty.", + "SettingsLinkedAccountsSave_Title": "Uložit změny", + "SettingsLoadImages_Title": "Automaticky načítat obrázky", + "SettingsLoadStyles_Title": "Automaticky načítat styly", + "SettingsMailSpacing_Description": "Přizpůsobit rozestupy položek v seznamu e-mailů.", + "SettingsMailSpacing_Title": "Rozestupy e-mailů", + "SettingsFolderMenuStyle_Title": "Zapnout vnořené složky", + "SettingsFolderMenuStyle_Description": "Změnit, zda by složky účtu měly být vnořeny uvnitř nabídky účtu či nikoli. Vypněte tento režim, pokud se vám líbí starý systém menu Windows Mail", + "SettingsManageAccountSettings_Description": "Oznámení, podpisy, synchronizace a další nastavení pro jednotlivé účty.", + "SettingsManageAccountSettings_Title": "Správa nastavení účtů", + "SettingsManageLink_Description": "Přesunout položky pro přidání nového propojení účtů nebo odstranění již existujícího.", + "SettingsManageLink_Title": "Spravovat propojení", + "SettingsMarkAsRead_Description": "Změnit, co by se mělo stát s vybranou položkou.", + "SettingsMarkAsRead_DontChange": "Neoznačovat položku automaticky jako přečtenou", + "SettingsMarkAsRead_SecondsToWait": "Sekund k čekání: ", + "SettingsMarkAsRead_Timer": "Při zobrazení v panelu pro čtení", + "SettingsMarkAsRead_Title": "Označit položku jako přečtenou", + "SettingsMarkAsRead_WhenSelected": "Při výběru", + "SettingsMessageList_Description": "Změňte způsob, jakým by měly být zprávy uspořádány v seznamu e-mailů.", + "SettingsMessageList_Title": "Seznam zpráv", + "SettingsNoAccountSetupMessage": "Zatím jste nenastavili žádný účet.", + "SettingsNotifications_Description": "Zapnout nebo vypnout oznámení pro tento účet.", + "SettingsNotifications_Title": "Oznámení", + "SettingsPaneLength_Description": "Změnit šířku seznamu e-mailů.", + "SettingsPaneLength_Title": "Délka panelu e-mailů", + "SettingsPaypal_Description": "Ukažte mnohem více lásky ❤️ Všechny dary jsou vítany.", + "SettingsPaypal_Title": "Přispět přes PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Kompaktní režim", + "SettingsPersonalizationMailDisplayMediumMode": "Střední režim", + "SettingsPersonalizationMailDisplaySpaciousMode": "Prostorový režim", + "SettingsPersonalization_Description": "Změňte vzhled Wino, jak se vám líbí.", + "SettingsPersonalization_Title": "Přizpůsobení", + "SettingsPrivacyPolicy_Description": "Zkontrolujte zásady ochrany osobních údajů.", + "SettingsPrivacyPolicy_Title": "Zásady ochrany osobních údajů", + "SettingsReadingPane_Description": "Možnosti vykreslování e-mailů.", + "SettingsReadingPane_Title": "Panel s vykreskeným e-mailem", + "SettingsReaderFont_Title": "Výchozí font pro vykreslení e-mailu", + "SettingsReaderFontFamily_Description": "Změna výchozího fontu a jeho velikosti pro vykreslení e-mailu", + "SettingsFontFamily_Title": "Font", + "SettingsFontSize_Title": "Velikost", + "SettingsFontPreview_Title": "Náhled", + "SettingsComposerFont_Title": "Výchozí písmo editoru", + "SettingsComposerFontFamily_Description": "Změna výchozího fontu a jeho velikosti pro editor e-mailu", + "SettingsRenameMergeAccount_Description": "Změnit zobrazený název propojených účtů.", + "SettingsRenameMergeAccount_Title": "Přejmenovat", + "SettingsSemanticZoom_Description": "Toto vám umožní kliknout na hlavičky v seznamu zpráv a přejít na konkrétní datum", + "SettingsSemanticZoom_Title": "Sémanické přiblížení pro záhlaví data", + "SettingsShowPreviewText_Description": "Skrýt/zobrazit náhled textu.", + "SettingsShowPreviewText_Title": "Zobrazit náhled textu", + "SettingsShowSenderPictures_Description": "Skrýt/zobrazit náhled obrázku odesílatele.", + "SettingsShowSenderPictures_Title": "Zobrazit avatary odesílatele", + "SettingsPrefer24HourClock_Title": "Zobrazit 24-hodinový formát času", + "SettingsPrefer24HourClock_Description": "Čas přijetí pošty bude zobrazen ve 24-hodinovém formátu času, namísto 12-hodinového (AM/PM)", + "SettingsSignature_Description": "Upravit nebo odebrat podpis účtu", + "SettingsSignature_Title": "Podpis", + "SettingsStartupItem_Description": "Primární účet zobrazený po startu", + "SettingsStartupItem_Title": "Primární účet", + "SettingsStore_Description": "Ukaž trochu lásky ❤️", + "SettingsStore_Title": "Ohodnotit v obchodě", + "SettingsThreads_Description": "Uspořádat zprávy do konverzačních vláken.", + "SettingsThreads_Title": "Vlákna konverzací", + "SettingsUnlinkAccounts_Description": "Odebrat propojení mezi účty. Toto nesmaže vaše účty.", + "SettingsUnlinkAccounts_Title": "Rozpojit účty", + "SortingOption_Date": "podle data", + "SortingOption_Name": "podle jména", + "StoreRatingDialog_MessageFirstLine": "Veškerá zpětná vazba se cení a v bude mít vliv na zlepšení aplikace Wino. Chcete Wino ohodnotit v Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Chcete ohodnotit Wino Mail v Microsoft Store?", + "StoreRatingDialog_Title": "Líbí se vám Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archivované zprávy budou přesunuty do zde.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "složka \"Archív\"", + "SystemFolderConfigDialog_DeletedFolderDescription": "Smazané zprávy budou přesunuty zde.", + "SystemFolderConfigDialog_DeletedFolderHeader": "složka \"Koš\"", + "SystemFolderConfigDialog_DraftFolderDescription": "Zde budou vytvořeny nové zprávy/odpovědi.", + "SystemFolderConfigDialog_DraftFolderHeader": "složka \"Koncepty\"", + "SystemFolderConfigDialog_JunkFolderDescription": "Veškerá nevyžádaná pošta skončí zde.", + "SystemFolderConfigDialog_JunkFolderHeader": "složka \"Spam\"", + "SystemFolderConfigDialog_MessageFirstLine": "Tento IMAP server nepodporuje rozšíření SPECIAL-USE, proto Wino nemohla správně nastavit systémové složky.", + "SystemFolderConfigDialog_MessageSecondLine": "Vyberte prosím příslušné složky pro konkrétní funkce.", + "SystemFolderConfigDialog_SentFolderDescription": "Zprávy, které byly odeslány, skončí zde. ", + "SystemFolderConfigDialog_SentFolderHeader": "složka \"Odeslané\"", + "SystemFolderConfigDialog_Title": "Nastavit systémové složky", + "TestingImapConnectionMessage": "Testuji připojení k serveru...", + "Today": "Dnes", + "UnknownAddress": "neznámá adresa", + "UnknownDateHeader": "Neznámé datum", + "UnknownGroupAddress": "neznámá adresa skupiny e-mailů", + "UnknownSender": "Neznámý odesílatel", + "Unsubscribe": "Odhlásit se", + "ViewContactDetails": "Zobrazit podrobnosti", + "WinoUpgradeDescription": "Wino nabízí 3 účty zdarma. Pokud potřebujete více než 3 účty, upgradujte prosím.", + "WinoUpgradeMessage": "Přejít na neomezený počet účtů", + "WinoUpgradeRemainingAccountsMessage": "{0} z {1} použitých bezplatných účtů.", + "Yesterday": "Včera" +} diff --git a/Wino.Core.Domain/Translations/da_DK/resources.json b/Wino.Core.Domain/Translations/da_DK/resources.json new file mode 100644 index 00000000..54ddd05d --- /dev/null +++ b/Wino.Core.Domain/Translations/da_DK/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "all done", + "AccountCreationDialog_Initializing": "initializing", + "AccountCreationDialog_PreparingFolders": "We are getting folder information at the moment.", + "AccountCreationDialog_SigninIn": "Account information is being saved.", + "AccountEditDialog_Message": "Account Name", + "AccountEditDialog_Title": "Edit Account", + "AccountPickerDialog_Title": "Pick an account", + "AddHyperlink": "Add", + "AutoDiscoveryProgressMessage": "Searching for mail settings...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Advanced Configuration", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Your credentials will only be stored locally on your computer.", + "BasicIMAPSetupDialog_Description": "Some accounts require additional steps to sign in", + "BasicIMAPSetupDialog_DisplayName": "Display Name", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "BasicIMAPSetupDialog_LearnMore": "Learn more", + "BasicIMAPSetupDialog_MailAddress": "E-Mail Address", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Password", + "BasicIMAPSetupDialog_Title": "IMAP Account", + "Buttons_AddAccount": "Add Account", + "Buttons_ApplyTheme": "Apply Theme", + "Buttons_Browse": "Browse", + "Buttons_Cancel": "Cancel", + "Buttons_Close": "Close", + "Buttons_Create": "Create", + "Buttons_CreateAccount": "Create Account", + "Buttons_Delete": "Delete", + "Buttons_Discard": "Discard", + "Buttons_EnableImageRendering": "Enable", + "Buttons_No": "No", + "Buttons_Open": "Open", + "Buttons_Purchase": "Purchase", + "Buttons_RateWino": "Rate Wino", + "Buttons_Save": "Save", + "Buttons_SaveConfiguration": "Save Configuration", + "Buttons_Share": "Share", + "Buttons_SignIn": "Sign In", + "Buttons_Yes": "Yes", + "Center": "Center", + "ComingSoon": "Coming soon...", + "ComposerFrom": "From: ", + "ComposerSubject": "Subject: ", + "ComposerTo": "To: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "click enter to input addresses", + "CustomThemeBuilder_AccentColorDescription": "Set custom accent color if you wish. Not selecting a color will use your Windows accent color.", + "CustomThemeBuilder_AccentColorTitle": "Accent color", + "CustomThemeBuilder_PickColor": "Pick", + "CustomThemeBuilder_ThemeNameDescription": "Unique name for your custom theme.", + "CustomThemeBuilder_ThemeNameTitle": "Theme name", + "CustomThemeBuilder_Title": "Custom Theme Builder", + "CustomThemeBuilder_WallpaperDescription": "Set a custom wallpaper for Wino", + "CustomThemeBuilder_WallpaperTitle": "Set custom wallpaper", + "DialogMessage_AccountLimitMessage": "You have reached the account creation limit.\nWould you like to purchase 'Unlimited Account' add-on to continue?", + "DialogMessage_AccountLimitTitle": "Account Limit Reached", + "DialogMessage_CleanupFolderMessage": "Do you want to permanently delete all the mails in this folder?", + "DialogMessage_CleanupFolderTitle": "Cleanup Folder", + "DialogMessage_ComposerMissingRecipientMessage": "Message has no recipient.", + "DialogMessage_ComposerValidationFailedTitle": "Validation Failed", + "DialogMessage_CreateLinkedAccountMessage": "Give this new link a name. Accounts will be merged under this name.", + "DialogMessage_CreateLinkedAccountTitle": "Account Link Name", + "DialogMessage_DeleteAccountConfirmationMessage": "Delete {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "All data associated with this account will be deleted from disk permanently.", + "DialogMessage_DiscardDraftConfirmationMessage": "This draft will be discarded. Do you want to continue?", + "DialogMessage_DiscardDraftConfirmationTitle": "Discard Draft", + "DialogMessage_HardDeleteConfirmationMessage": "Permanent Delete", + "DialogMessage_HardDeleteConfirmationTitle": "Message(s) will be permanently deleted. Do you want to continue?", + "DialogMessage_NoAccountsForCreateMailMessage": "You don't have any accounts to create message from.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account Missing", + "DialogMessage_RenameLinkedAccountsMessage": "Enter new name for linked account", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Unlink Accounts", + "DialogMessage_EmptySubjectConfirmation": "Missin Subject", + "DialogMessage_EmptySubjectConfirmationMessage": "Message has no subject. Do you want to continue?", + "Dialog_DontAskAgain": "Don't ask again", + "DiscordChannelDisclaimerMessage": "Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server.\nTo get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects'\n\nYou will be directed to server URL since Discord doesn't support channel invites.", + "DiscordChannelDisclaimerTitle": "Important Discord Information", + "Draft": "Draft", + "EditorToolbarOption_Draw": "Draw", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insert", + "EditorToolbarOption_None": "None", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Dark mode", + "ElementTheme_Default": "Use system setting", + "ElementTheme_Light": "Light mode", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool failed.", + "Exception_AuthenticationCanceled": "Authentication canceled", + "Exception_CustomThemeExists": "This theme already exists.", + "Exception_CustomThemeMissingName": "You must provide a name.", + "Exception_CustomThemeMissingWallpaper": "You must provide a custom background image.", + "Exception_FailedToSynchronizeFolders": "Failed to synchronize folders", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Corrupted authorization response.", + "Exception_GoogleAuthError": "OAuth authorization error: {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "System folder configuration is not valid. Check configuration and try again.", + "Exception_NullAssignedAccount": "Assigned account is null", + "Exception_NullAssignedFolder": "Assigned folder is null", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Token generation failed", + "Exception_TokenInfoRetrivalFailed": "Failed to get token information.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "This provider is not supported.", + "Exception_UnsupportedSynchronizerOperation": "This operation is not supported for {0}", + "Exception_UserCancelSystemFolderSetupDialog": "User canceled system folder config dialog.", + "Files": "Files", + "FilteringOption_All": "All", + "FilteringOption_Flagged": "Flagged", + "FilteringOption_Unread": "Unread", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Create sub folder", + "FolderOperation_Delete": "Delete", + "FolderOperation_DontSync": "Don't sync this folder", + "FolderOperation_Empty": "Empty this folder", + "FolderOperation_MarkAllAsRead": "Mark all as read", + "FolderOperation_Move": "Move", + "DragMoveToFolderCaption": "Move to {0}", + "FolderOperation_None": "None", + "FolderOperation_Pin": "Pin", + "FolderOperation_Rename": "Rename", + "FolderOperation_Unpin": "Unpin", + "HoverActionOption_Archive": "Archive", + "HoverActionOption_Delete": "Delete", + "HoverActionOption_MoveJunk": "Move to Junk", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Outgoing (SMTP) mail server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Outgoing server password", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Outgoing server requires authentication", + "IMAPSetupDialog_OutgoingMailServerUsername": "Outgoing server user name", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Network Issue", + "Info_ReviewNewMessage": "All feedbacks are appreciated. Thank you for the review!", + "Info_ReviewSuccessTitle": "Thank you", + "Info_ReviewUnknownErrorMessage": "There was an unknown issue with your review. ({0})", + "Info_ReviewUnknownErrorTitle": "Unknown Error", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Synchronization Failed", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Unsupported", + "Info_UnsubscribeLinkInvalidTitle": "Invalid Unsubscribe Uri", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Connection security", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "No authentication", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/de_DE/resources.json b/Wino.Core.Domain/Translations/de_DE/resources.json new file mode 100644 index 00000000..7102c813 --- /dev/null +++ b/Wino.Core.Domain/Translations/de_DE/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "alles erledigt", + "AccountCreationDialog_Initializing": "initialisiere", + "AccountCreationDialog_PreparingFolders": "Es werden Ordner-Informationen gesammelt.", + "AccountCreationDialog_SigninIn": "Kontoinformationen wurden gespeichert.", + "AccountEditDialog_Message": "Konto-Name", + "AccountEditDialog_Title": "Konto bearbeiten", + "AccountPickerDialog_Title": "Konto auswählen", + "AddHyperlink": "Hinzufügen", + "AutoDiscoveryProgressMessage": "Es wird nach Mail-Einstellungen gesucht...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Erweiterte Konfiguration", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Die Zugangsdaten werden nur lokal auf Ihrem Computer gespeichert.", + "BasicIMAPSetupDialog_Description": "Einige Konten benötigen zusätzliche Schritte zum Anmelden", + "BasicIMAPSetupDialog_DisplayName": "Anzeigename", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "z.B. John Doe", + "BasicIMAPSetupDialog_LearnMore": "Mehr erfahren", + "BasicIMAPSetupDialog_MailAddress": "E-Mail Adresse", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Passwort", + "BasicIMAPSetupDialog_Title": "IMAP-Konto", + "Buttons_AddAccount": "Konto hinzufügen", + "Buttons_ApplyTheme": "Thema anwenden", + "Buttons_Browse": "Durchsuchen", + "Buttons_Cancel": "Abbrechen", + "Buttons_Close": "Schließen", + "Buttons_Create": "Erstellen", + "Buttons_CreateAccount": "Konto erstellen", + "Buttons_Delete": "Löschen", + "Buttons_Discard": "Verwerfen", + "Buttons_EnableImageRendering": "An", + "Buttons_No": "Nein", + "Buttons_Open": "Öffnen", + "Buttons_Purchase": "Kaufen", + "Buttons_RateWino": "Wino bewerten", + "Buttons_Save": "Speichern", + "Buttons_SaveConfiguration": "Einstellungen speichern", + "Buttons_Share": "Teilen", + "Buttons_SignIn": "Anmelden", + "Buttons_Yes": "Ja", + "Center": "Zentriert", + "ComingSoon": "Bald verfügbar...", + "ComposerFrom": "Von: ", + "ComposerSubject": "Betreff: ", + "ComposerTo": "An: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "klicke Enter, um Adressen einzugeben", + "CustomThemeBuilder_AccentColorDescription": "Legen Sie eine benutzerdefinierte Akzentfarbe fest. Wenn Sie keine Farbe wählen, wird die Akzentfarbe von Windows verwendet.", + "CustomThemeBuilder_AccentColorTitle": "Akzentfarbe", + "CustomThemeBuilder_PickColor": "Auswählen", + "CustomThemeBuilder_ThemeNameDescription": "Eindeutiger Name für Ihr benutzerdefiniertes Thema.", + "CustomThemeBuilder_ThemeNameTitle": "Name des Designs", + "CustomThemeBuilder_Title": "Benutzerdefinierter Theme-Generator", + "CustomThemeBuilder_WallpaperDescription": "Eigenen Hintergrund für Wino festlegen", + "CustomThemeBuilder_WallpaperTitle": "Eigenen Hintergrund festlegen", + "DialogMessage_AccountLimitMessage": "Sie haben das Limit für die Kontenanzahl erreicht.\nMöchten Sie die Option \"Unbegrenzte Konten\" kaufen, um fortzufahren?", + "DialogMessage_AccountLimitTitle": "Kontolimit erreicht", + "DialogMessage_CleanupFolderMessage": "Möchten Sie alle Mails in diesem Ordner dauerhaft löschen?", + "DialogMessage_CleanupFolderTitle": "Bereinigungs-Ordner", + "DialogMessage_ComposerMissingRecipientMessage": "Nachricht hat keinen Empfänger.", + "DialogMessage_ComposerValidationFailedTitle": "Validierung fehlgeschlagen", + "DialogMessage_CreateLinkedAccountMessage": "Geben Sie diesem neuen Link einen Namen. Konten werden unter diesem Namen zusammengeführt.", + "DialogMessage_CreateLinkedAccountTitle": "Name des Konto-Links", + "DialogMessage_DeleteAccountConfirmationMessage": "{0} löschen?", + "DialogMessage_DeleteAccountConfirmationTitle": "Alle mit diesem Konto verknüpften Daten werden dauerhaft von der Festplatte gelöscht.", + "DialogMessage_DiscardDraftConfirmationMessage": "Dieser Entwurf wird verworfen. Möchten Sie fortfahren?", + "DialogMessage_DiscardDraftConfirmationTitle": "Entwurf verwerfen", + "DialogMessage_HardDeleteConfirmationMessage": "Dauerhaft löschen", + "DialogMessage_HardDeleteConfirmationTitle": "Nachricht(en) werden dauerhaft gelöscht. Möchten Sie fortfahren?", + "DialogMessage_NoAccountsForCreateMailMessage": "Sie haben keine Konten zum Erstellen von Nachrichten.", + "DialogMessage_NoAccountsForCreateMailTitle": "Konto fehlt", + "DialogMessage_RenameLinkedAccountsMessage": "Neuen Namen für verknüpftes Konto eingeben", + "DialogMessage_RenameLinkedAccountsTitle": "Verknüpftes Konto umbenennen", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Dieser Vorgang wird Ihre Konten nicht löschen, sondern nur den Link für freigegebene Ordnerverbindungen zerstören. Möchten Sie fortfahren?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Konten trennen", + "DialogMessage_EmptySubjectConfirmation": "Betreff fehlt", + "DialogMessage_EmptySubjectConfirmationMessage": "Nachricht hat keinen Betreff. Möchten Sie fortfahren?", + "Dialog_DontAskAgain": "Nicht mehr fragen", + "DiscordChannelDisclaimerMessage": "Wino hat keinen eigenen Discord Server, aber der spezielle 'wino-mail'-Kanal wird auf dem 'Developer Sanctuary' Server gehostet (englisch).\nUm Updates über Wino zu erhalten, treten Sie gerne dem 'Developer Sactuary'-Server bei und folgen dem 'wino-mail'-Kanal unter 'Community Projects'.\n\nSie werden zur Server-URL weitergeleitet, da Discord keine Kanal-Einladungen unterstützt.", + "DiscordChannelDisclaimerTitle": "Wichtige Discord-Informationen", + "Draft": "Entwurf", + "EditorToolbarOption_Draw": "Zeichnen", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Einfügen", + "EditorToolbarOption_None": "Keine", + "EditorToolbarOption_Options": "Optionen", + "ElementTheme_Dark": "Dunkler Modus", + "ElementTheme_Default": "Systemeinstellung verwenden", + "ElementTheme_Light": "Heller Modus", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client-Pool fehlgeschlagen.", + "Exception_AuthenticationCanceled": "Authentifizierung abgebrochen", + "Exception_CustomThemeExists": "Dieses Thema existiert bereits.", + "Exception_CustomThemeMissingName": "Sie müssen einen Namen angeben.", + "Exception_CustomThemeMissingWallpaper": "Sie müssen ein eigenes Hintergrundbild angeben.", + "Exception_FailedToSynchronizeFolders": "Fehler beim Synchronisieren der Ordner", + "Exception_GoogleAuthCallbackNull": "'Callback uri ist 'null' bei der Aktivierung.", + "Exception_GoogleAuthCorruptedCode": "Korrupte Autorisierungsantwort.", + "Exception_GoogleAuthError": "OAuth Autorisierungsfehler: {0}", + "Exception_GoogleAuthInvalidResponse": "Anfrage mit ungültigem Status ({0}) erhalten", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Autorisierungscode-Austausch fehlgeschlagen.", + "Exception_InvalidSystemFolderConfiguration": "Die Konfiguration des Systemordners ist nicht gültig. Überprüfen Sie die Konfiguration und versuchen Sie es erneut.", + "Exception_NullAssignedAccount": "Zugewiesenes Konto ist 'null'", + "Exception_NullAssignedFolder": "Zugewiesener Ordner ist 'null'", + "Exception_SynchronizerFailureHTTP": "Antwortbehandlung fehlgeschlagen mit Fehler HTTP-Code {0}", + "Exception_TokenGenerationFailed": "Tokengenerierung fehlgeschlagen", + "Exception_TokenInfoRetrivalFailed": "Fehler beim Abrufen der Token-Informationen.", + "Exception_UnknowErrorDuringAuthentication": "Unbekannter Fehler bei der Authentifizierung", + "Exception_UnsupportedAction": "Aktion {0} ist nicht im Anfrageprozessor implementiert", + "Exception_UnsupportedProvider": "Dieser Anbieter wird nicht unterstützt.", + "Exception_UnsupportedSynchronizerOperation": "Diese Operation wird für {0} nicht unterstützt", + "Exception_UserCancelSystemFolderSetupDialog": "Benutzer hat den Konfigurationsdialog für den Systemordner abgebrochen.", + "Files": "Dateien", + "FilteringOption_All": "Alle", + "FilteringOption_Flagged": "Markiert", + "FilteringOption_Unread": "Ungelesen", + "Focused": "Fokussiert", + "FolderOperation_CreateSubFolder": "Unterordner erstellen", + "FolderOperation_Delete": "Löschen", + "FolderOperation_DontSync": "Ordner nicht synchronisieren", + "FolderOperation_Empty": "Ordner leeren", + "FolderOperation_MarkAllAsRead": "Alle als gelesen markieren", + "FolderOperation_Move": "Verschieben", + "DragMoveToFolderCaption": "Nach {0} verschieben", + "FolderOperation_None": "Keine", + "FolderOperation_Pin": "Anheften", + "FolderOperation_Rename": "Umbenennen", + "FolderOperation_Unpin": "Lösen", + "HoverActionOption_Archive": "Archivieren", + "HoverActionOption_Delete": "Löschen", + "HoverActionOption_MoveJunk": "In den Papierkorb verschieben", + "HoverActionOption_ToggleFlag": "Markieren / Markierung entfernen", + "HoverActionOption_ToggleRead": "Lesen / Ungelesen", + "MergedAccountCommonFolderInbox": "Posteingang", + "MergedAccountCommonFolderSent": "Gesendet", + "MergedAccountCommonFolderDraft": "Entwürfe", + "MergedAccountCommonFolderJunk": "Papierkorb", + "MergedAccountCommonFolderTrash": "Gelöscht", + "MergedAccountCommonFolderArchive": "Archiv", + "IMAPSetupDialog_AccountType": "Kontotyp", + "IMAPSetupDialog_DisplayName": "Anzeigename", + "IMAPSetupDialog_DisplayNamePlaceholder": "z.B. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Eingehender Mail-Server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "E-Mail Adresse", + "IMAPSetupDialog_MailAddressPlaceholder": "jemand@beispiel.de", + "IMAPSetupDialog_OutgoingMailServer": "Ausgehender (SMTP) Mail-Server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Ausgehendes Server-Passwort", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Ausgehender Server erfordert Authentifizierung", + "IMAPSetupDialog_OutgoingMailServerUsername": "Benutzername für ausgehenden Server", + "IMAPSetupDialog_Password": "Passwort", + "IMAPSetupDialog_RequireSSLForIncomingMail": "SSL für eingehende E-Mails erforderlich machen", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "SSL für ausgehende E-Mails erforderlich machen", + "IMAPSetupDialog_Title": "Erweiterte IMAP-Konfiguration", + "IMAPSetupDialog_UseSameConfig": "Den gleichen Benutzernamen und das gleiche Passwort für das Senden von E-Mails verwenden", + "IMAPSetupDialog_Username": "Benutzername", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Bilddarstellung ist für diese Nachricht deaktiviert.", + "InfoBarAction_Enable": "Aktivieren", + "InfoBarMessage_SynchronizationDisabledFolder": "Dieser Ordner wird nicht synchronisiert.", + "InfoBarTitle_SynchronizationDisabledFolder": "Deaktivierter Ordner", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} wurde erstellt", + "Info_AccountCreatedTitle": "Konto-Erstellung", + "Info_AccountCreationFailedTitle": "Konto-Erstellung fehlgeschlagen", + "Info_AccountDeletedMessage": "{0} wurde erfolgreich gelöscht.", + "Info_AccountDeletedTitle": "Konto gelöscht", + "Info_AccountIssueFixFailedTitle": "Fehlschlagen", + "Info_AccountIssueFixSuccessMessage": "Alle Konto-Probleme wurden behoben.", + "Info_AccountIssueFixSuccessTitle": "Erfolg", + "Info_AttachmentOpenFailedMessage": "Anhang kann nicht geöffnet werden.", + "Info_AttachmentOpenFailedTitle": "Fehlschlagen", + "Info_AttachmentSaveFailedMessage": "Anhang kann nicht gespeichert werden.", + "Info_AttachmentSaveFailedTitle": "Fehlschlagen", + "Info_AttachmentSaveSuccessMessage": "Anhang wird gespeichert.", + "Info_AttachmentSaveSuccessTitle": "Anhang gespeichert", + "Info_BackgroundExecutionDeniedMessage": "Hintergrundausführung der App wird verweigert. Dies kann sich auf die Hintergrundsynchronisierung und Live-Benachrichtigungen auswirken.", + "Info_BackgroundExecutionDeniedTitle": "Hintergrundausführung verweigert", + "Info_BackgroundExecutionUnknownErrorMessage": "Unbekannter Fehler beim Registrieren des Hintergrundsynchronisators.", + "Info_BackgroundExecutionUnknownErrorTitle": "Fehler bei der Hintergrundausführung", + "Info_ComposerMissingMIMEMessage": "Die MIME-Datei konnte nicht gefunden werden. Synchronisierung kann helfen.", + "Info_ComposerMissingMIMETitle": "Fehlschlagen", + "Info_ContactExistsMessage": "Dieser Kontakt ist bereits in der Empfängerliste.", + "Info_ContactExistsTitle": "Kontakt existiert", + "Info_DraftFolderMissingMessage": "Entwürfe-Ordner fehlt für dieses Konto. Bitte überprüfen Sie Ihre Konto-Einstellungen.", + "Info_DraftFolderMissingTitle": "Entwürfe-Ordner fehlt", + "Info_FileLaunchFailedTitle": "Fehler beim Starten der Datei", + "Info_InvalidAddressMessage": "'{0}' ist keine gültige E-Mail-Adresse.", + "Info_InvalidAddressTitle": "Ungültige Adresse", + "Info_InvalidMoveTargetMessage": "Sie können die ausgewählten Mails nicht in diesen Ordner verschieben.", + "Info_InvalidMoveTargetTitle": "Ungültiges Verschiebungsziel", + "Info_LogsNotFoundMessage": "Keine Logs zum Teilen vorhanden.", + "Info_LogsNotFoundTitle": "Logs nicht gefunden", + "Info_LogsSavedMessage": "{0} wird im ausgewählten Ordner gespeichert.", + "Info_LogsSavedTitle": "Gespeichert", + "Info_MailRenderingFailedMessage": "Diese Mail ist beschädigt oder kann nicht geöffnet werden.\n{0}", + "Info_MailRenderingFailedTitle": "Darstellen fehlgeschlagen", + "Info_MessageCorruptedMessage": "Diese Nachricht ist beschädigt.", + "Info_MessageCorruptedTitle": "Fehler", + "Info_MissingFolderMessage": "{0} existiert für dieses Konto nicht.", + "Info_MissingFolderTitle": "Fehlender Ordner", + "Info_PurchaseExistsMessage": "Es sieht so aus, als ob dieses Produkt bereits gekauft wurde.", + "Info_PurchaseExistsTitle": "Vorhandenes Produkt", + "Info_PurchaseThankYouMessage": "Vielen Dank", + "Info_PurchaseThankYouTitle": "Kauf abgeschlossen", + "Info_RequestCreationFailedTitle": "Fehler beim Erstellen von Anfragen", + "Info_ReviewNetworkErrorMessage": "Es gab ein Netzwerkproblem bei Ihrer Bewertung.", + "Info_ReviewNetworkErrorTitle": "Netzwerkfehler", + "Info_ReviewNewMessage": "Alle Rückmeldungen werden geschätzt. Vielen Dank für die Bewertung!", + "Info_ReviewSuccessTitle": "Vielen Dank", + "Info_ReviewUnknownErrorMessage": "Es gab ein unbekanntes Problem mit Ihrer Bewertung. ({0})", + "Info_ReviewUnknownErrorTitle": "Unbekannter Fehler", + "Info_ReviewUpdatedMessage": "Vielen Dank für die aktualisierte Bewertung.", + "Info_SignatureDisabledMessage": "Signatur für dieses Konto deaktiviert", + "Info_SignatureDisabledTitle": "Erfolg", + "Info_SignatureSavedMessage": "Neue Signatur gespeichert", + "Info_SignatureSavedTitle": "Erfolg", + "Info_SyncCanceledMessage": "Abgebrochen", + "Info_SyncCanceledTitle": "Synchronisierung", + "Info_SyncFailedTitle": "Synchronisierung fehlgeschlagen", + "Info_UnsupportedFunctionalityDescription": "Diese Funktionalität ist noch nicht implementiert.", + "Info_UnsupportedFunctionalityTitle": "Nicht unterstützt", + "Info_UnsubscribeLinkInvalidTitle": "Ungültige Abmelde-Uri", + "Info_UnsubscribeLinkInvalidMessage": "Dieser Abmeldelink ist ungültig. Fehler beim Abmelden der Liste.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentifizierungsmethode", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Verbindungssicherheit", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Keine Authentifizierung", + "ImapAuthenticationMethod_Plain": "Normales Passwort", + "ImapAuthenticationMethod_EncryptedPassword": "Verschlüsseltes Passwort", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Keine", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Block", + "Left": "Links", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "Sie müssen mindestens 2 Konten haben, um Link zu erstellen\nLink wird beim Speichern entfernt", + "LinkedAccountsTitle": "Verknüpfte Konten", + "MailOperation_AlwaysMoveFocused": "Immer in Fokussiert", + "MailOperation_AlwaysMoveOther": "Immer in Andere verschieben", + "MailOperation_Archive": "Archiv", + "MailOperation_ClearFlag": "Markierung aufheben", + "MailOperation_DarkEditor": "Dunkel", + "MailOperation_Delete": "Löschen", + "MailOperation_ExportPDF": "Als PDF exportieren", + "MailOperation_Find": "Suchen", + "MailOperation_Forward": "Weiterleiten", + "MailOperation_Ignore": "Ignorieren", + "MailOperation_LightEditor": "Hell", + "MailOperation_MarkAsJunk": "Als Spam markieren", + "MailOperation_MarkAsRead": "Als gelesen markieren", + "MailOperation_MarkAsUnread": "Als ungelesen markieren", + "MailOperation_MarkNotJunk": "Nicht mehr als Spam markieren", + "MailOperation_Move": "Verschieben", + "MailOperation_MoveFocused": "Nach Fokussiert verschieben", + "MailOperation_MoveJunk": "In den Spam verschieben", + "MailOperation_MoveOther": "In Andere verschieben", + "MailOperation_Navigate": "Navigieren", + "MailOperation_Print": "Drucken", + "MailOperation_Reply": "Antworten", + "MailOperation_ReplyAll": "Allen antworten", + "MailOperation_SaveAs": "Speichern als", + "MailOperation_SetFlag": "Markierung setzen", + "MailOperation_Unarchive": "Archivierung aufheben", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} Element(e) ausgewählt", + "MarkFlagUnflag": "Als markiert/nicht markiert setzen", + "MarkReadUnread": "Als gelesen/ungelesen markieren", + "MenuManageAccounts": "Konten verwalten", + "MenuNewMail": "Neue Mail", + "MenuMergedAccountItemAccountsSuffix": " Konten", + "MenuRate": "Wino bewerten", + "MenuSettings": "Einstellungen", + "MergedAccountsAvailableAccountsTitle": "Verfügbare Konten", + "More": "Mehr", + "MoveMailDialog_InvalidFolderMessage": "{0} ist kein gültiger Ordner für diese Mail.", + "MoveMailDialog_Title": "Ordner wählen", + "NewAccountDialog_AccountName": "Konto-Name", + "NewAccountDialog_AccountNameDefaultValue": "Persönlich", + "NewAccountDialog_AccountNamePlaceholder": "z.B. Persönliche Mails", + "NewAccountDialog_Title": "Neues Konto hinzufügen", + "NoMailSelected": "keine Nachricht ausgewählt", + "NoMessageCrieteria": "Keine Nachrichten entsprechen Ihren Suchkriterien.", + "NoMessageEmptyFolder": "Dieser Ordner ist leer.", + "Notifications_MultipleNotificationsMessage": "Sie haben {0} neue Mails", + "Notifications_MultipleNotificationsTitle": "Neue Mails", + "Notifications_WinoUpdatedMessage": "Neue Version {0} herunterladen", + "Notifications_WinoUpdatedTitle": "Wino Mail wurde aktualisiert.", + "Other": "Andere", + "PaneLengthOption_Default": "Standard", + "PaneLengthOption_ExtraLarge": "Extra Groß", + "PaneLengthOption_Large": "Groß", + "PaneLengthOption_Medium": "Mittel", + "PaneLengthOption_Micro": "Mikro", + "PaneLengthOption_Small": "Klein", + "Photos": "Fotos", + "PreparingFoldersMessage": "Ordnervorbereitung", + "ProviderDetail_Gmail_Description": "Google-Konto", + "ProviderDetail_IMAP_Description": "Eigener IMAP/SMTP Server", + "ProviderDetail_IMAP_Title": "IMAP-Server", + "Results": "Ergebnisse", + "Right": "Rechts", + "SynchronizationFolderReport_Success": "aktuell", + "SynchronizationFolderReport_Failed": "Synchronisierung fehlgeschlagen", + "SearchBarPlaceholder": "Suche", + "SearchingIn": "suche in", + "SettingsAboutGithub_Description": "Gehen Sie zum Problem-Tracker GitHub-Repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Nachrichten an Gesendete Ordner anhängen", + "SettingsAccountManagementAppendMessage_Description": "Erstellen Sie eine Kopie der Nachricht im Gesendete Ordner, nachdem der Entwurf gesendet wurde. Aktivieren Sie dies, wenn Sie Ihre Mails nicht sehen, nachdem Sie in den Ordner Gesendete verschoben wurden.", + "SettingsEditLinkedInbox_Title": "Verlinkten Posteingang bearbeiten", + "SettingsEditLinkedInbox_Description": "Konten hinzufügen/entfernen, umbenennen oder die Verbindung zwischen Konten unterbrechen.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Leichte Mail-Anwendung für Windows-Geräte.", + "SettingsAbout_Description": "Erfahren Sie mehr über Wino.", + "SettingsAbout_Title": "Über", + "SettingsAccentColor_Description": "Akzentfarbe der Anwendung ändern", + "SettingsAccentColor_Title": "Akzentfarbe", + "SettingsAccentColor_UseWindowsAccentColor": "Windows-Akzentfarbe benutzen", + "SettingsAccountName_Description": "Name des Kontos ändern.", + "SettingsAccountName_Title": "Konto-Name", + "SettingsApplicationTheme_Description": "Passen Sie Wino mit verschiedenen benutzerdefinierten Anwendungs-Themen Ihrem Geschmack an.", + "SettingsApplicationTheme_Title": "Anwendungs-Thema", + "SettingsAvailableThemes_Description": "Wählen Sie ein Thema aus der Sammlung von Wino oder verwenden Sie Ihre eigenen Themen.", + "SettingsAvailableThemes_Title": "Verfügbare Themen", + "SettingsCustomTheme_Description": "Erstellen Sie Ihr eigenes Thema mit individuellem Hintergrundbild und Akzentfarbe.", + "SettingsCustomTheme_Title": "Eigenes Thema", + "SettingsDeleteAccount_Description": "Alle E-Mails und Anmeldeinformationen dieses Kontos löschen.", + "SettingsDeleteAccount_Title": "Dieses Konto löschen", + "SettingsDeleteProtection_Description": "Sollte Wino jedes Mal nachfragen, wenn Sie eine Mail mit Umschalten + Entfernen permanent löschen möchten?", + "SettingsDeleteProtection_Title": "Schutz vor permanenter Löschung", + "SettingsDiagnostics_Description": "Für Entwickler", + "SettingsDiagnostics_Title": "Diagnostik", + "SettingsDiscord_Description": "Bekommen Sie reguläre Entwicklungs-Updates, treten Sie Zeitplan-Diskussionen bei und geben Sie Feedback.", + "SettingsDiscord_Title": "Discord Kanal", + "SettingsElementThemeSelectionDisabled": "Auswahl des Element-Themas ist deaktiviert, wenn das Anwendungs-Thema nicht als Standard festgelegt ist.", + "SettingsElementTheme_Description": "Wählen Sie ein Windows-Thema für Wino", + "SettingsElementTheme_Title": "Element-Thema", + "SettingsEnableHoverActions_Title": "Hover-Aktionen aktivieren", + "SettingsEnableIMAPLogs_Description": "Aktivieren Sie dies, um Probleme bei der IMAP-Konnektivität zu übermitteln, die Sie während der Einrichtung des IMAP-Servers hatten.", + "SettingsEnableIMAPLogs_Title": "IMAP-Protokoll-Logs aktivieren", + "SettingsEnableLogs_Description": "Ich benötige möglicherweise Logs über Abstürze, um Probleme zu diagnostizieren, die du auf GitHub gemeldet hast. Keiner der Logs wird Ihre Zugangsdaten oder sensiblen Informationen öffentlich zugänglich machen.", + "SettingsEnableLogs_Title": "Logs aktivieren", + "SettingsEnableSignature": "Signatur aktivieren", + "SettingsExpandOnStartup_Description": "Legen Sie fest, ob Wino die Ordner dieses Kontos beim Start erweitern soll.", + "SettingsExpandOnStartup_Title": "Menü beim Start erweitern", + "SettingsExternalContent_Description": "Stellen Sie die Darstellung externer Inhalte innerhalb von E-Mails ein.", + "SettingsExternalContent_Title": "Externe Inhalte", + "SettingsFocusedInbox_Description": "Legen Sie fest, ob der Posteingang in Fokussiert - Andere aufgeteilt werden soll.", + "SettingsFocusedInbox_Title": "Fokussierter Posteingang", + "SettingsFolderSync_Description": "Bestimmte Ordner für die Synchronisierung aktivieren oder deaktivieren.", + "SettingsFolderSync_Title": "Ordner-Synchronisierung", + "SettingsFolderOptions_Title": "Ordnerkonfiguration", + "SettingsFolderOptions_Description": "Ändern Sie einzelne Ordnereinstellungen, wie z. B. das Ein-/Ausblenden des \"Ungelesen\"-Symbols oder das (De-)Aktivieren der Synchronisierung.", + "SettingsHoverActionCenter": "Zentrierte Aktion", + "SettingsHoverActionLeft": "Linke Aktion", + "SettingsHoverActionRight": "Rechte Aktion", + "SettingsHoverActions_Description": "Wählen Sie 3 Aktionen aus, die angezeigt werden sollen, wenn Sie mit dem Cursor über Mails hovern.", + "SettingsHoverActions_Title": "Hover-Aktionen", + "SettingsLanguage_Description": "Anzeigesprache für Wino ändern.", + "SettingsLanguage_Title": "Anzeigesprache", + "CategoriesFolderNameOverride": "Kategorien", + "MoreFolderNameOverride": "Mehr", + "SettingsOptions_Title": "Einstellungen", + "SettingsLinkAccounts_Description": "Mehrere Konten zu einem zusammenführen. Sehen Sie E-Mails in einem kombinierten Posteingang.", + "SettingsLinkAccounts_Title": "Verknüpftes Konto erstellen", + "SettingsLinkedAccountsSave_Description": "Ändern Sie den aktuellen Link mit den neuen Konten.", + "SettingsLinkedAccountsSave_Title": "Änderungen speichern", + "SettingsLoadImages_Title": "Bilder automatisch laden", + "SettingsLoadStyles_Title": "Stile automatisch laden", + "SettingsMailSpacing_Description": "Den Abstand für die Auflistung von Mails anpassen.", + "SettingsMailSpacing_Title": "Mail-Abstand", + "SettingsFolderMenuStyle_Title": "Verschachtelte Ordner erstellen", + "SettingsFolderMenuStyle_Description": "Ändern Sie, ob Kontoordner in einem Konten-Menüpunkt verschachtelt werden sollen oder nicht. Schalten Sie dies aus, wenn Sie das alte Menüsystem in Windows Mail mögen.", + "SettingsManageAccountSettings_Description": "Benachrichtigungen, Signaturen, Synchronisierung und andere Einstellungen pro Konto.", + "SettingsManageAccountSettings_Title": "Kontoeinstellungen verwalten", + "SettingsManageLink_Description": "Elemente verschieben, um neuen Link hinzuzufügen oder bestehenden Link zu entfernen.", + "SettingsManageLink_Title": "Link verwalten", + "SettingsMarkAsRead_Description": "Ändern Sie, was mit dem ausgewählten Element passieren soll.", + "SettingsMarkAsRead_DontChange": "Element nicht automatisch als gelesen markieren", + "SettingsMarkAsRead_SecondsToWait": "Wartezeit in Sekunden: ", + "SettingsMarkAsRead_Timer": "Beim Betrachten im Lesefenster", + "SettingsMarkAsRead_Title": "Element als gelesen markieren", + "SettingsMarkAsRead_WhenSelected": "Wenn ausgewählt", + "SettingsMessageList_Description": "Ändern Sie die Organisation Ihrer Nachrichten in der Mailliste.", + "SettingsMessageList_Title": "Nachrichten-Liste", + "SettingsNoAccountSetupMessage": "Sie haben noch keine Konten eingerichtet.", + "SettingsNotifications_Description": "Benachrichtigungen für dieses Konto ein- oder ausschalten.", + "SettingsNotifications_Title": "Benachrichtigungen", + "SettingsPaneLength_Description": "Ändern Sie die Breite der Mail-Liste.", + "SettingsPaneLength_Title": "Länge des Maillisten-Fensters", + "SettingsPaypal_Description": "Zeigen Sie viel mehr Liebe ❤️ Alle Spenden werden wertgeschätzt.", + "SettingsPaypal_Title": "Über PayPal spenden", + "SettingsPersonalizationMailDisplayCompactMode": "Kompakter Modus", + "SettingsPersonalizationMailDisplayMediumMode": "Mittlerer Modus", + "SettingsPersonalizationMailDisplaySpaciousMode": "Geräumiger Modus", + "SettingsPersonalization_Description": "Ändern Sie das Aussehen von Wino nach Ihren Belieben.", + "SettingsPersonalization_Title": "Personalisierung", + "SettingsPrivacyPolicy_Description": "Datenschutzrichtlinie ansehen.", + "SettingsPrivacyPolicy_Title": "Datenschutzerklärung", + "SettingsReadingPane_Description": "Mail-Darstellungs-Optionen.", + "SettingsReadingPane_Title": "Lesefenster", + "SettingsReaderFont_Title": "Standard Lese-Schriftart", + "SettingsReaderFontFamily_Description": "Ändern Sie die Standardschriftart und Schriftgröße für das Lesen von Mails.", + "SettingsFontFamily_Title": "Schriftart", + "SettingsFontSize_Title": "Schriftgröße", + "SettingsFontPreview_Title": "Vorschau", + "SettingsComposerFont_Title": "Standard Verfasser-Schriftart", + "SettingsComposerFontFamily_Description": "Ändern Sie die Standardschriftart und Schriftgröße für das Verfassen von Mails.", + "SettingsRenameMergeAccount_Description": "Den Anzeigenamen der verknüpften Konten ändern.", + "SettingsRenameMergeAccount_Title": "Umbenennen", + "SettingsSemanticZoom_Description": "Dadurch können Sie auf die Kopfzeilen in der Nachrichtenliste klicken und zu einem bestimmten Datum springen", + "SettingsSemanticZoom_Title": "Semantischer Zoom für Datumsüberschriften", + "SettingsShowPreviewText_Description": "Vorschautext ausblenden/anzeigen.", + "SettingsShowPreviewText_Title": "Vorschautext anzeigen", + "SettingsShowSenderPictures_Description": "Absender-Profilbilder ausblenden/anzeigen.", + "SettingsShowSenderPictures_Title": "Absender-Profilbilder anzeigen", + "SettingsPrefer24HourClock_Title": "Uhr-Format in 24 Stunden anzeigen", + "SettingsPrefer24HourClock_Description": "Empfangszeiten für Mails werden im 24-Stunden-Format statt 12 (AM/PM) angezeigt", + "SettingsSignature_Description": "Kontosignatur bearbeiten oder entfernen", + "SettingsSignature_Title": "Signatur", + "SettingsStartupItem_Description": "Primäres Konto zum Laden des Posteingangs beim Starten.", + "SettingsStartupItem_Title": "Startelement", + "SettingsStore_Description": "Zeigen Sie etwas Liebe ❤️", + "SettingsStore_Title": "Im Store bewerten", + "SettingsThreads_Description": "Nachrichten in Unterhaltungsthreads organisieren.", + "SettingsThreads_Title": "Unterhaltungsthreading", + "SettingsUnlinkAccounts_Description": "Entfernen Sie den Link zwischen den Konten. Dies wird Ihre Konten nicht löschen.", + "SettingsUnlinkAccounts_Title": "Konten trennen", + "SortingOption_Date": "nach Datum", + "SortingOption_Name": "nach Name", + "StoreRatingDialog_MessageFirstLine": "Jedes Feedback ist willkommen und wird Wino besser machen. Möchten Sie Wino im Microsoft Store bewerten?", + "StoreRatingDialog_MessageSecondLine": "Möchten Sie Wino Mail im Microsoft Store bewerten?", + "StoreRatingDialog_Title": "Gefällt Ihnen Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archivierte Nachrichten werden hierher verschoben.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archivordner", + "SystemFolderConfigDialog_DeletedFolderDescription": "Gelöschte Nachrichten werden hierher verschoben.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Gelöscht-Ordner", + "SystemFolderConfigDialog_DraftFolderDescription": "Neue Nachrichten/Antworten werden hier erstellt.", + "SystemFolderConfigDialog_DraftFolderHeader": "Entwürfe-Ordner", + "SystemFolderConfigDialog_JunkFolderDescription": "Alle Spam-Mails werden hier sein.", + "SystemFolderConfigDialog_JunkFolderHeader": "Müll-/Spam-Ordner", + "SystemFolderConfigDialog_MessageFirstLine": "Dieser IMAP-Server unterstützt keine SPECIAL-USE-Erweiterung, deshalb konnte Wino die Systemordner nicht richtig einrichten.", + "SystemFolderConfigDialog_MessageSecondLine": "Bitte wählen Sie die passenden Ordner für bestimmte Funktionalitäten.", + "SystemFolderConfigDialog_SentFolderDescription": "Ordner, in dem gesendete Nachrichten gespeichert werden sollen.", + "SystemFolderConfigDialog_SentFolderHeader": "Gesendete-Ordner", + "SystemFolderConfigDialog_Title": "Systemordner konfigurieren", + "TestingImapConnectionMessage": "Serververbindung wird getestet...", + "Today": "Heute", + "UnknownAddress": "unbekannte Adresse", + "UnknownDateHeader": "Unbekanntes Datum", + "UnknownGroupAddress": "unbekannte Mail-Gruppenadresse", + "UnknownSender": "Unbekannter Absender", + "Unsubscribe": "Abbestellen", + "ViewContactDetails": "Details anzeigen", + "WinoUpgradeDescription": "Wino bietet 3 Accounts zum kostenlosen Start an. Wenn Sie mehr als 3 Accounts benötigen, upgraden Sie bitte.", + "WinoUpgradeMessage": "Auf unbegrenzte Konten upgraden", + "WinoUpgradeRemainingAccountsMessage": "{0} von {1} kostenlosen Konten verwendet.", + "Yesterday": "Gestern" +} diff --git a/Wino.Core.Domain/Translations/en_US/resources.json b/Wino.Core.Domain/Translations/en_US/resources.json new file mode 100644 index 00000000..01b67ae0 --- /dev/null +++ b/Wino.Core.Domain/Translations/en_US/resources.json @@ -0,0 +1,482 @@ +{ + "AccountCreationDialog_Completed": "all done", + "AccountCreationDialog_Initializing": "initializing", + "AccountCreationDialog_PreparingFolders": "We are getting folder information at the moment.", + "AccountCreationDialog_SigninIn": "Account information is being saved.", + "AccountEditDialog_Message": "Account Name", + "AccountEditDialog_Title": "Edit Account", + "AccountPickerDialog_Title": "Pick an account", + "AddHyperlink": "Add", + "AutoDiscoveryProgressMessage": "Searching for mail settings...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Advanced Configuration", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Your credentials will only be stored locally on your computer.", + "BasicIMAPSetupDialog_Description": "Some accounts require additional steps to sign in", + "BasicIMAPSetupDialog_DisplayName": "Display Name", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "BasicIMAPSetupDialog_LearnMore": "Learn more", + "BasicIMAPSetupDialog_MailAddress": "E-Mail Address", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Password", + "BasicIMAPSetupDialog_Title": "IMAP Account", + "Buttons_AddAccount": "Add Account", + "Buttons_ApplyTheme": "Apply Theme", + "Buttons_Browse": "Browse", + "Buttons_Cancel": "Cancel", + "Buttons_Close": "Close", + "Buttons_Create": "Create", + "Buttons_CreateAccount": "Create Account", + "Buttons_Delete": "Delete", + "Buttons_Discard": "Discard", + "Buttons_EnableImageRendering": "Enable", + "Buttons_No": "No", + "Buttons_Open": "Open", + "Buttons_Purchase": "Purchase", + "Buttons_RateWino": "Rate Wino", + "Buttons_Save": "Save", + "Buttons_SaveConfiguration": "Save Configuration", + "Buttons_Share": "Share", + "Buttons_SignIn": "Sign In", + "Buttons_Yes": "Yes", + "Center": "Center", + "ComingSoon": "Coming soon...", + "ComposerFrom": "From: ", + "ComposerSubject": "Subject: ", + "ComposerTo": "To: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "click enter to input addresses", + "CustomThemeBuilder_AccentColorDescription": "Set custom accent color if you wish. Not selecting a color will use your Windows accent color.", + "CustomThemeBuilder_AccentColorTitle": "Accent color", + "CustomThemeBuilder_PickColor": "Pick", + "CustomThemeBuilder_ThemeNameDescription": "Unique name for your custom theme.", + "CustomThemeBuilder_ThemeNameTitle": "Theme name", + "CustomThemeBuilder_Title": "Custom Theme Builder", + "CustomThemeBuilder_WallpaperDescription": "Set a custom wallpaper for Wino", + "CustomThemeBuilder_WallpaperTitle": "Set custom wallpaper", + "DialogMessage_AccountLimitMessage": "You have reached the account creation limit.\nWould you like to purchase 'Unlimited Account' add-on to continue?", + "DialogMessage_AccountLimitTitle": "Account Limit Reached", + "DialogMessage_CleanupFolderMessage": "Do you want to permanently delete all the mails in this folder?", + "DialogMessage_CleanupFolderTitle": "Cleanup Folder", + "DialogMessage_ComposerMissingRecipientMessage": "Message has no recipient.", + "DialogMessage_ComposerValidationFailedTitle": "Validation Failed", + "DialogMessage_CreateLinkedAccountMessage": "Give this new link a name. Accounts will be merged under this name.", + "DialogMessage_CreateLinkedAccountTitle": "Account Link Name", + "DialogMessage_DeleteAccountConfirmationMessage": "Delete {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "All data associated with this account will be deleted from disk permanently.", + "DialogMessage_DiscardDraftConfirmationMessage": "This draft will be discarded. Do you want to continue?", + "DialogMessage_DiscardDraftConfirmationTitle": "Discard Draft", + "DialogMessage_HardDeleteConfirmationMessage": "Permanent Delete", + "DialogMessage_HardDeleteConfirmationTitle": "Message(s) will be permanently deleted. Do you want to continue?", + "DialogMessage_NoAccountsForCreateMailMessage": "You don't have any accounts to create message from.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account Missing", + "DialogMessage_RenameLinkedAccountsMessage": "Enter new name for linked account", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Unlink Accounts", + "DialogMessage_EmptySubjectConfirmation": "Missin Subject", + "DialogMessage_EmptySubjectConfirmationMessage": "Message has no subject. Do you want to continue?", + "Dialog_DontAskAgain": "Don't ask again", + "DiscordChannelDisclaimerMessage": "Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server.\nTo get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects'\n\nYou will be directed to server URL since Discord doesn't support channel invites.", + "DiscordChannelDisclaimerTitle": "Important Discord Information", + "Draft": "Draft", + "EditorToolbarOption_Draw": "Draw", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insert", + "EditorToolbarOption_None": "None", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Dark mode", + "ElementTheme_Default": "Use system setting", + "ElementTheme_Light": "Light mode", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool failed.", + "Exception_AuthenticationCanceled": "Authentication canceled", + "Exception_CustomThemeExists": "This theme already exists.", + "Exception_CustomThemeMissingName": "You must provide a name.", + "Exception_CustomThemeMissingWallpaper": "You must provide a custom background image.", + "Exception_FailedToSynchronizeFolders": "Failed to synchronize folders", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Corrupted authorization response.", + "Exception_GoogleAuthError": "OAuth authorization error: {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "System folder configuration is not valid. Check configuration and try again.", + "Exception_NullAssignedAccount": "Assigned account is null", + "Exception_NullAssignedFolder": "Assigned folder is null", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Token generation failed", + "Exception_TokenInfoRetrivalFailed": "Failed to get token information.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "This provider is not supported.", + "Exception_UnsupportedSynchronizerOperation": "This operation is not supported for {0}", + "Exception_UserCancelSystemFolderSetupDialog": "User canceled system folder config dialog.", + "Exception_InboxNotAvailable": "Couldn't setup account folders.", + "Files": "Files", + "FilteringOption_All": "All", + "FilteringOption_Flagged": "Flagged", + "FilteringOption_Unread": "Unread", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Create sub folder", + "FolderOperation_Delete": "Delete", + "FolderOperation_DontSync": "Don't sync this folder", + "FolderOperation_Empty": "Empty this folder", + "FolderOperation_MarkAllAsRead": "Mark all as read", + "FolderOperation_Move": "Move", + "DragMoveToFolderCaption": "Move to {0}", + "FolderOperation_None": "None", + "FolderOperation_Pin": "Pin", + "FolderOperation_Rename": "Rename", + "FolderOperation_Unpin": "Unpin", + "HoverActionOption_Archive": "Archive", + "HoverActionOption_Delete": "Delete", + "HoverActionOption_MoveJunk": "Move to Junk", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Outgoing (SMTP) mail server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Outgoing server password", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Outgoing server requires authentication", + "IMAPSetupDialog_OutgoingMailServerUsername": "Outgoing server user name", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PDFSaveSuccessTitle": "Success", + "Info_PDFSaveFailedTitle": "Failed to save PDF file", + "Info_PDFSaveSuccessMessage": "PDF file is saved to {0}", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Network Issue", + "Info_ReviewNewMessage": "All feedbacks are appreciated. Thank you for the review!", + "Info_ReviewSuccessTitle": "Thank you", + "Info_ReviewUnknownErrorMessage": "There was an unknown issue with your review. ({0})", + "Info_ReviewUnknownErrorTitle": "Unknown Error", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Synchronization Failed", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Unsupported", + "Info_UnsubscribeLinkInvalidTitle": "Invalid Unsubscribe Uri", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Connection security", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "No authentication", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsAutoSelectNextItem_Title": "Auto select next item", + "SettingsAutoSelectNextItem_Description": "Select the next item after you delete or move a mail.", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsConfigureSpecialFolders_Title": "Configure System Folders", + "SettingsConfigureSpecialFolders_Description": "Set folders with special functions. Folders such as Archive, Inbox, and Drafts are essential for Wino to function properly.", + "SettingConfigureSpecialFolders_Button": "Configure", + "Error_FailedToSetupSystemFolders_Title": "Failed to setup system folders", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "SystemFolderConfigDialogValidation_InboxSelected": "You can't assign Inbox folder to any other system folder.", + "SystemFolderConfigDialogValidation_DuplicateSystemFolders": "Some of the system folders are used more than once in the configuration.", + "SystemFolderConfigSetupSuccess_Title": "System Folders Setup", + "SystemFolderConfigSetupSuccess_Message": "System folders are successfully configured.", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/es_ES/resources.json b/Wino.Core.Domain/Translations/es_ES/resources.json new file mode 100644 index 00000000..00905e2d --- /dev/null +++ b/Wino.Core.Domain/Translations/es_ES/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "todo listo", + "AccountCreationDialog_Initializing": "inicializando", + "AccountCreationDialog_PreparingFolders": "Estamos obteniendo información de la carpeta en este momento.", + "AccountCreationDialog_SigninIn": "La información de la cuenta se está guardando.", + "AccountEditDialog_Message": "Nombre de la Cuenta", + "AccountEditDialog_Title": "Editar cuenta", + "AccountPickerDialog_Title": "Elija una cuenta", + "AddHyperlink": "Añadir", + "AutoDiscoveryProgressMessage": "Buscando ajustes de correo...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Configuración avanzada", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Sus credenciales sólo se almacenarán localmente en su ordenador.", + "BasicIMAPSetupDialog_Description": "Algunas cuentas necesitan pasos adicionales para iniciar sesión", + "BasicIMAPSetupDialog_DisplayName": "Nombre a mostrar", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "por ejemplo, Fulano Mengano", + "BasicIMAPSetupDialog_LearnMore": "Aprender más", + "BasicIMAPSetupDialog_MailAddress": "Correo Electrónico", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Contraseña", + "BasicIMAPSetupDialog_Title": "Cuenta IMAP", + "Buttons_AddAccount": "Añadir Cuenta", + "Buttons_ApplyTheme": "Aplicar Tema", + "Buttons_Browse": "Buscar", + "Buttons_Cancel": "Cancelar", + "Buttons_Close": "Cerrar", + "Buttons_Create": "Crear", + "Buttons_CreateAccount": "Crear Cuenta", + "Buttons_Delete": "Eliminar", + "Buttons_Discard": "Descartar", + "Buttons_EnableImageRendering": "Activar", + "Buttons_No": "No", + "Buttons_Open": "Abrir", + "Buttons_Purchase": "Comprar", + "Buttons_RateWino": "Califica a Wino", + "Buttons_Save": "Guardar", + "Buttons_SaveConfiguration": "Guardar Configuración", + "Buttons_Share": "Compartir", + "Buttons_SignIn": "Iniciar Sesión", + "Buttons_Yes": "Sí", + "Center": "Centrar", + "ComingSoon": "Próximamente...", + "ComposerFrom": "De: ", + "ComposerSubject": "Asunto: ", + "ComposerTo": "Para: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "presiona enter para ingresar direcciones", + "CustomThemeBuilder_AccentColorDescription": "Establece un color de acento si lo deseas. Si no seleccionas uno se usará tu color de acento de Windows.", + "CustomThemeBuilder_AccentColorTitle": "Color de acento", + "CustomThemeBuilder_PickColor": "Elegir", + "CustomThemeBuilder_ThemeNameDescription": "Nombre único para su tema personalizado.", + "CustomThemeBuilder_ThemeNameTitle": "Nombre del tema", + "CustomThemeBuilder_Title": "Creador de Temas Personalizados", + "CustomThemeBuilder_WallpaperDescription": "Establecer una imagen de fondo personalizada para Wino", + "CustomThemeBuilder_WallpaperTitle": "Establecer imagen de fondo personalizada", + "DialogMessage_AccountLimitMessage": "Has alcanzado el límite para crear cuentas.\n¿Te gustaría comprar el add-on 'Cuentas Ilimitadas' para continuar?", + "DialogMessage_AccountLimitTitle": "Límite de Cuentas Alcanzado", + "DialogMessage_CleanupFolderMessage": "¿Quieres borrar permanentemente todos los correos en esta carpeta?", + "DialogMessage_CleanupFolderTitle": "Carpeta de Limpieza", + "DialogMessage_ComposerMissingRecipientMessage": "El mensaje no tiene destinatario.", + "DialogMessage_ComposerValidationFailedTitle": "Validación Fallida", + "DialogMessage_CreateLinkedAccountMessage": "Dar un nombre a este nuevo enlace. Las cuentas se combinarán con este nombre.", + "DialogMessage_CreateLinkedAccountTitle": "Nombre del enlace de cuenta", + "DialogMessage_DeleteAccountConfirmationMessage": "¿Eliminar {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "Todos los datos asociados a esta cuenta se eliminarán del disco permanentemente.", + "DialogMessage_DiscardDraftConfirmationMessage": "Este borrador se descartará. ¿Desea continuar?", + "DialogMessage_DiscardDraftConfirmationTitle": "Descartar borrador", + "DialogMessage_HardDeleteConfirmationMessage": "Eliminar Permanentemente", + "DialogMessage_HardDeleteConfirmationTitle": "Mensaje(s) se eliminarán permanentemente. ¿Desea continuar?", + "DialogMessage_NoAccountsForCreateMailMessage": "No tienes ninguna cuenta desde la que crear mensaje.", + "DialogMessage_NoAccountsForCreateMailTitle": "Falta cuenta", + "DialogMessage_RenameLinkedAccountsMessage": "Introduzca un nuevo nombre para la cuenta vinculada", + "DialogMessage_RenameLinkedAccountsTitle": "Renombrar cuenta vinculada", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Esta operación no eliminará sus cuentas pero sólo romperá el enlace para conexiones de carpetas compartidas. ¿Desea continuar?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Desvincular Cuentas", + "DialogMessage_EmptySubjectConfirmation": "Sin Asunto", + "DialogMessage_EmptySubjectConfirmationMessage": "El mensaje no tiene asunto. ¿Desea continuar?", + "Dialog_DontAskAgain": "No preguntar de nuevo", + "DiscordChannelDisclaimerMessage": "Wino no tiene un servidor de Discordia propio, pero el canal especial 'wino-mail' está hospedado en servidor 'Developer Sanctuary'.\nPara obtener actualizaciones acerca de Wino únase al Santuario servidor de Desarrolladores y siga el canal 'wino-mail' en 'Community Projects'\n\nSerás redirigido a la URL del servidor cuando la Discordia no soporta canales invitados.", + "DiscordChannelDisclaimerTitle": "Información de Discord importante", + "Draft": "Borrador", + "EditorToolbarOption_Draw": "Dibujar", + "EditorToolbarOption_Format": "Formato", + "EditorToolbarOption_Insert": "Insertar", + "EditorToolbarOption_None": "Ninguno", + "EditorToolbarOption_Options": "Opciones", + "ElementTheme_Dark": "Modo oscuro", + "ElementTheme_Default": "Usar configuración del sistema", + "ElementTheme_Light": "Modo claro", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "Cola Cliente IMAP falló.", + "Exception_AuthenticationCanceled": "Autenticación cancelada", + "Exception_CustomThemeExists": "Este tema ya existe.", + "Exception_CustomThemeMissingName": "Debe proporcionar un nombre.", + "Exception_CustomThemeMissingWallpaper": "Debe proporcionar una imagen de fondo personalizada.", + "Exception_FailedToSynchronizeFolders": "Error al sincronizar carpetas", + "Exception_GoogleAuthCallbackNull": "Callback uri nulo al activarse.", + "Exception_GoogleAuthCorruptedCode": "Respuesta de autorización corrupta.", + "Exception_GoogleAuthError": "Error de autorización de OAuth: {0}", + "Exception_GoogleAuthInvalidResponse": "Solicitud recibida con estado no válido ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "El intercambio del código de autorización ha fallado.", + "Exception_InvalidSystemFolderConfiguration": "La configuración de la carpeta del sistema no es válida. Verifica la configuración y vuelve a intentar.", + "Exception_NullAssignedAccount": "La cuenta asignada es nula", + "Exception_NullAssignedFolder": "La carpeta asignada es nula", + "Exception_SynchronizerFailureHTTP": "Manejo de la respuesta ha fallado con código de error HTTP {0}", + "Exception_TokenGenerationFailed": "Falló la generación del token", + "Exception_TokenInfoRetrivalFailed": "Fallo al recuperar la información del token.", + "Exception_UnknowErrorDuringAuthentication": "Sucedió un error desconocido durante la autenticación", + "Exception_UnsupportedAction": "La acción {0} no está implementada en el procesador solicitado", + "Exception_UnsupportedProvider": "Este proveedor no está soportado.", + "Exception_UnsupportedSynchronizerOperation": "Esta operación no es compatible con {0}", + "Exception_UserCancelSystemFolderSetupDialog": "El usuario canceló la ventana de configuración de la carpeta del sistema.", + "Files": "Archivos", + "FilteringOption_All": "Todos", + "FilteringOption_Flagged": "Marcado", + "FilteringOption_Unread": "Sin leer", + "Focused": "Importante", + "FolderOperation_CreateSubFolder": "Crear sub carpeta", + "FolderOperation_Delete": "Eliminar", + "FolderOperation_DontSync": "No sincronizar esta carpeta", + "FolderOperation_Empty": "Vaciar esta carpeta", + "FolderOperation_MarkAllAsRead": "Marcar todo como leído", + "FolderOperation_Move": "Mover", + "DragMoveToFolderCaption": "Mover a {0}", + "FolderOperation_None": "Ninguno", + "FolderOperation_Pin": "Fijar", + "FolderOperation_Rename": "Renombrar", + "FolderOperation_Unpin": "Desfijar", + "HoverActionOption_Archive": "Archivar", + "HoverActionOption_Delete": "Eliminar", + "HoverActionOption_MoveJunk": "Mover a Correo no deseado", + "HoverActionOption_ToggleFlag": "Marcar / Desmarcar", + "HoverActionOption_ToggleRead": "Leídos / Sin leer", + "MergedAccountCommonFolderInbox": "Bandeja de Entrada", + "MergedAccountCommonFolderSent": "Enviados", + "MergedAccountCommonFolderDraft": "Borradores", + "MergedAccountCommonFolderJunk": "Correo no deseado", + "MergedAccountCommonFolderTrash": "Eliminados", + "MergedAccountCommonFolderArchive": "Archivo", + "IMAPSetupDialog_AccountType": "Tipo de cuenta", + "IMAPSetupDialog_DisplayName": "Nombre para mostrar", + "IMAPSetupDialog_DisplayNamePlaceholder": "por ejemplo. Fulano Mengano", + "IMAPSetupDialog_IncomingMailServer": "Servidor de correo entrante", + "IMAPSetupDialog_IncomingMailServerPort": "Puerto", + "IMAPSetupDialog_MailAddress": "Dirección de correo", + "IMAPSetupDialog_MailAddressPlaceholder": "alguien@ejemplo.com", + "IMAPSetupDialog_OutgoingMailServer": "Servidor de correo saliente (SMTP)", + "IMAPSetupDialog_OutgoingMailServerPassword": "Contraseña del servidor de salida", + "IMAPSetupDialog_OutgoingMailServerPort": "Puerto", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "El servidor de salida requiere autenticación", + "IMAPSetupDialog_OutgoingMailServerUsername": "Usuario del servidor de salida", + "IMAPSetupDialog_Password": "Contraseña", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Requerir SSL para los correos entrantes", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Requerir SSL para los correos salientes", + "IMAPSetupDialog_Title": "Configuración IMAP Avanzada", + "IMAPSetupDialog_UseSameConfig": "Usar el mismo correo y contraseña para enviar correos", + "IMAPSetupDialog_Username": "Nombre de usuario", + "IMAPSetupDialog_UsernamePlaceholder": "fulanomengano, fulanomengano@fabrikam.com, dominio/fulanomengano", + "ImageRenderingDisabled": "El procesamiento de imágenes está desactivado para este mensaje.", + "InfoBarAction_Enable": "Activar", + "InfoBarMessage_SynchronizationDisabledFolder": "Esta carpeta está desactivada para la sincronización.", + "InfoBarTitle_SynchronizationDisabledFolder": "Carpeta desactivada", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} se ha creado", + "Info_AccountCreatedTitle": "Creación de una cuenta", + "Info_AccountCreationFailedTitle": "Ocurrió un error al crear la cuenta", + "Info_AccountDeletedMessage": "{0} eliminado correctamente.", + "Info_AccountDeletedTitle": "Cuenta eliminada", + "Info_AccountIssueFixFailedTitle": "Fallido", + "Info_AccountIssueFixSuccessMessage": "Se han corregido todos los problemas de la cuenta.", + "Info_AccountIssueFixSuccessTitle": "Correcto", + "Info_AttachmentOpenFailedMessage": "No se puede abrir este adjunto.", + "Info_AttachmentOpenFailedTitle": "Fallido", + "Info_AttachmentSaveFailedMessage": "No se puede guardar este adjunto.", + "Info_AttachmentSaveFailedTitle": "Fallido", + "Info_AttachmentSaveSuccessMessage": "El adjunto ha sido guardado.", + "Info_AttachmentSaveSuccessTitle": "Adjunto guardado", + "Info_BackgroundExecutionDeniedMessage": "Se ha denegado la ejecución en segundo plano para la aplicación. Esto puede afectar a la sincronización en segundo plano y a las notificaciones en directo.", + "Info_BackgroundExecutionDeniedTitle": "Ejecución de fondo denegada", + "Info_BackgroundExecutionUnknownErrorMessage": "Se produjo una excepción desconocida al registrar el sincronizador en segundo plano.", + "Info_BackgroundExecutionUnknownErrorTitle": "Error de ejecución en segundo plano", + "Info_ComposerMissingMIMEMessage": "No se pudo localizar el archivo MIME. La sincronización puede ayudar.", + "Info_ComposerMissingMIMETitle": "Fallido", + "Info_ContactExistsMessage": "Este contacto ya está en la lista de destinatarios.", + "Info_ContactExistsTitle": "Contacto existente", + "Info_DraftFolderMissingMessage": "No existe la carpeta de borradores en esta cuenta. Por favor, comprueba los ajustes de la cuenta.", + "Info_DraftFolderMissingTitle": "Falta la carpeta borrador", + "Info_FileLaunchFailedTitle": "Error al iniciar archivo", + "Info_InvalidAddressMessage": "La dirección: {0} no es un e-mail válido.", + "Info_InvalidAddressTitle": "Dirección no válida", + "Info_InvalidMoveTargetMessage": "No puede mover los correos seleccionados a esta carpeta.", + "Info_InvalidMoveTargetTitle": "Objetivo mover no válido", + "Info_LogsNotFoundMessage": "No hay registros que compartir.", + "Info_LogsNotFoundTitle": "Registros No Encontrados", + "Info_LogsSavedMessage": "{0} se ha guardado en la carpeta seleccionada.", + "Info_LogsSavedTitle": "Guardado", + "Info_MailRenderingFailedMessage": "Este correo está dañado o no puede abrirse.\n{0}", + "Info_MailRenderingFailedTitle": "Error al renderizar", + "Info_MessageCorruptedMessage": "Este mensaje está dañado.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} no existe para esta cuenta.", + "Info_MissingFolderTitle": "Falta carpeta", + "Info_PurchaseExistsMessage": "Parece que este producto ya ha sido comprado antes.", + "Info_PurchaseExistsTitle": "Producto existente", + "Info_PurchaseThankYouMessage": "Gracias", + "Info_PurchaseThankYouTitle": "Compra correcta", + "Info_RequestCreationFailedTitle": "Hubo una falla al Crear Solicitudes", + "Info_ReviewNetworkErrorMessage": "Hubo un error desconocido con tu opinión.", + "Info_ReviewNetworkErrorTitle": "Problema de red", + "Info_ReviewNewMessage": "Todas las opiniones se agradecen. ¡Gracias por dejar la tuya!", + "Info_ReviewSuccessTitle": "Gracias", + "Info_ReviewUnknownErrorMessage": "Hubo un error desconocido con tu opinión. ({0})", + "Info_ReviewUnknownErrorTitle": "Error Desconocido", + "Info_ReviewUpdatedMessage": "Gracias por tus comentarios actualizados.", + "Info_SignatureDisabledMessage": "Firma desactivada para esta cuenta", + "Info_SignatureDisabledTitle": "Éxito", + "Info_SignatureSavedMessage": "Se guardó la nueva firma", + "Info_SignatureSavedTitle": "Éxito", + "Info_SyncCanceledMessage": "Cancelado", + "Info_SyncCanceledTitle": "Sincronización", + "Info_SyncFailedTitle": "Falló la Sincronización", + "Info_UnsupportedFunctionalityDescription": "Esta funcionalidad aún no está implementada.", + "Info_UnsupportedFunctionalityTitle": "No soportado", + "Info_UnsubscribeLinkInvalidTitle": "Url de baja no válida", + "Info_UnsubscribeLinkInvalidMessage": "Este enlace de baja suscripción no es válido. Error al darse de baja de la lista.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Método de autenticación", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Seguridad de la conexión", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Sin autenticación", + "ImapAuthenticationMethod_Plain": "Contraseña normal", + "ImapAuthenticationMethod_EncryptedPassword": "Contraseña encriptada", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Ninguno", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justificar", + "Left": "Izquierda", + "Link": "Enlace", + "LinkedAccountsCreatePolicyMessage": "debes tener al menos 2 cuentas para crear el enlace\nenlace se eliminará al guardar", + "LinkedAccountsTitle": "Cuentas Vinculadas", + "MailOperation_AlwaysMoveFocused": "Siempre Mover a Importantes", + "MailOperation_AlwaysMoveOther": "Siempre Mover a Otros", + "MailOperation_Archive": "Archivar", + "MailOperation_ClearFlag": "Quitar marca", + "MailOperation_DarkEditor": "Oscuro", + "MailOperation_Delete": "Eliminar", + "MailOperation_ExportPDF": "Exportar a PDF", + "MailOperation_Find": "Buscar", + "MailOperation_Forward": "Reenviar", + "MailOperation_Ignore": "Ignorar", + "MailOperation_LightEditor": "Claro", + "MailOperation_MarkAsJunk": "Marcar como Correo no deseado", + "MailOperation_MarkAsRead": "Marcar como leído", + "MailOperation_MarkAsUnread": "Marcar como no leído", + "MailOperation_MarkNotJunk": "Marcar como Correo deseado", + "MailOperation_Move": "Mover", + "MailOperation_MoveFocused": "Mover a Importantes", + "MailOperation_MoveJunk": "Mover a Correo no deseado", + "MailOperation_MoveOther": "Mover a Otros", + "MailOperation_Navigate": "Navegar", + "MailOperation_Print": "Imprimir", + "MailOperation_Reply": "Responder", + "MailOperation_ReplyAll": "Responder a todos", + "MailOperation_SaveAs": "Guardar Como", + "MailOperation_SetFlag": "Establecer marca", + "MailOperation_Unarchive": "Desarchivar", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} artículo(s) seleccionado(s)", + "MarkFlagUnflag": "Marcar como marcado/desmarcado", + "MarkReadUnread": "Marcar como leído/no leído", + "MenuManageAccounts": "Administrar Cuentas", + "MenuNewMail": "Nuevo Correo", + "MenuMergedAccountItemAccountsSuffix": " cuentas", + "MenuRate": "Valorar Wino", + "MenuSettings": "Ajustes", + "MergedAccountsAvailableAccountsTitle": "Cuentas Disponibles", + "More": "Más", + "MoveMailDialog_InvalidFolderMessage": "La carpeta {0} no es válida para este correo.", + "MoveMailDialog_Title": "Elija una carpeta", + "NewAccountDialog_AccountName": "Nombre de la Cuenta", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "p.ej. Correo Personal", + "NewAccountDialog_Title": "Agregar nueva cuenta", + "NoMailSelected": "ningún mensaje seleccionado", + "NoMessageCrieteria": "ningún mensaje coincide con sus criterios de búsqueda.", + "NoMessageEmptyFolder": "esta carpeta está vacía.", + "Notifications_MultipleNotificationsMessage": "Tienes {0} correos nuevos", + "Notifications_MultipleNotificationsTitle": "Nuevos correos", + "Notifications_WinoUpdatedMessage": "Comprobar nueva versión {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail ha sido actualizado.", + "Other": "Otro", + "PaneLengthOption_Default": "Por defecto", + "PaneLengthOption_ExtraLarge": "Extra grande", + "PaneLengthOption_Large": "Grande", + "PaneLengthOption_Medium": "Mediano", + "PaneLengthOption_Micro": "Mini", + "PaneLengthOption_Small": "Pequeño", + "Photos": "Fotos", + "PreparingFoldersMessage": "Preparando carpetas", + "ProviderDetail_Gmail_Description": "Cuenta de Google", + "ProviderDetail_IMAP_Description": "Servidor IMAP/SMTP personalizado", + "ProviderDetail_IMAP_Title": "Servidor IMAP", + "Results": "Resultados", + "Right": "Derecha", + "SynchronizationFolderReport_Success": "actualizado", + "SynchronizationFolderReport_Failed": "sincronización fallida", + "SearchBarPlaceholder": "buscar", + "SearchingIn": "buscando en", + "SettingsAboutGithub_Description": "Ir al rastreador de problemas en el repositorio de GitHub.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Añadir mensajes a la carpeta Enviada", + "SettingsAccountManagementAppendMessage_Description": "Crear una copia del mensaje en la carpeta Enviados luego de que el borrador se envíe. Activa esto si no ves tus correos en la carpeta Enviados después que los enviaste.", + "SettingsEditLinkedInbox_Title": "Editar bandeja de entrada vinculada", + "SettingsEditLinkedInbox_Description": "Añadir / quitar cuentas, renombrar o quitar vínculos entre cuentas.", + "SettingsAboutVersion": "Versión ", + "SettingsAboutWinoDescription": "Cliente de correo ligero para la familia de dispositivos Windows.", + "SettingsAbout_Description": "Conoce más sobre Wino.", + "SettingsAbout_Title": "Acerca de", + "SettingsAccentColor_Description": "Cambiar el color de acento de la aplicación", + "SettingsAccentColor_Title": "Color de Acento", + "SettingsAccentColor_UseWindowsAccentColor": "Usar mi color de acento de Windows", + "SettingsAccountName_Description": "Cambiar el nombre de la cuenta.", + "SettingsAccountName_Title": "Nombre de la Cuenta", + "SettingsApplicationTheme_Description": "Personaliza Wino con distintos temas personalizados a tu gusto.", + "SettingsApplicationTheme_Title": "Tema de la Aplicación", + "SettingsAvailableThemes_Description": "Escoge un tema que te agrade desde la colección de Wino o aplica tus propios temas.", + "SettingsAvailableThemes_Title": "Temas Disponibles", + "SettingsCustomTheme_Description": "Crea tu propio tema personalizado con una imagen de fondo y colores de acento personalizados.", + "SettingsCustomTheme_Title": "Tema Personalizado", + "SettingsDeleteAccount_Description": "Eliminar todos los correos y credenciales asociadas a esta cuenta.", + "SettingsDeleteAccount_Title": "Eliminar esta cuenta", + "SettingsDeleteProtection_Description": "¿Debería Wino pedirte confirmación cada vez que intentas eliminar un correo usando las teclas Shift + Supr?", + "SettingsDeleteProtection_Title": "Protección de Eliminación Permanente", + "SettingsDiagnostics_Description": "Para desarrolladores", + "SettingsDiagnostics_Title": "Diagnósticos", + "SettingsDiscord_Description": "Recibe actualizaciones regulares sobre el desarrollo, únete a las discusiones sobre los avances y proporciona comentarios.", + "SettingsDiscord_Title": "Canal de Discord", + "SettingsElementThemeSelectionDisabled": "La selección de elementos del tema se desactiva cuando el tema de la aplicación se selecciona de forma predeterminada.", + "SettingsElementTheme_Description": "Escoge un tema de Windows para Wino", + "SettingsElementTheme_Title": "Tema de elemento", + "SettingsEnableHoverActions_Title": "Activar acciones al mantener", + "SettingsEnableIMAPLogs_Description": "Habilite esto para proporcionar detalles sobre los errores de conectividad IMAP que tuvo durante la configuración del servidor IMAP.", + "SettingsEnableIMAPLogs_Title": "Habilitar registros de protocolo IMAP", + "SettingsEnableLogs_Description": "Podría necesitar registros para problemas diagnósticos que has abierto en GitHub. Ninguno de los registros expondrá sus credenciales o información sensible a la opinión pública.", + "SettingsEnableLogs_Title": "Activar registros", + "SettingsEnableSignature": "Habilitar firma", + "SettingsExpandOnStartup_Description": "Establezca si Wino debería expandir las carpetas de esta cuenta al inicio.", + "SettingsExpandOnStartup_Title": "Expandir Menú al Inicio", + "SettingsExternalContent_Description": "Administrar la configuración de contenido externo al renderizar los correos.", + "SettingsExternalContent_Title": "Contenido externo", + "SettingsFocusedInbox_Description": "Establezca si la Bandeja de Entrada debe dividirse en dos como Enfocada - Otro.", + "SettingsFocusedInbox_Title": "Bandeja de entrada concentrada", + "SettingsFolderSync_Description": "Activar o desactivar carpetas específicas para la sincronización.", + "SettingsFolderSync_Title": "Sincronización de carpetas", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Centro de Acción", + "SettingsHoverActionLeft": "Acción Izquierda", + "SettingsHoverActionRight": "Acción Derecha", + "SettingsHoverActions_Description": "Seleccione 3 acciones a mostrar cuando pase el cursor sobre los correos.", + "SettingsHoverActions_Title": "Acciones de Cursor", + "SettingsLanguage_Description": "Cambiar el idioma de visualización para Wino.", + "SettingsLanguage_Title": "Idioma de pantalla", + "CategoriesFolderNameOverride": "Categorías", + "MoreFolderNameOverride": "Más", + "SettingsOptions_Title": "Ajustes", + "SettingsLinkAccounts_Description": "Fusionar múltiples cuentas en una. Ver correos en una bandeja de entrada común.", + "SettingsLinkAccounts_Title": "Crear Cuentas Vinculadas", + "SettingsLinkedAccountsSave_Description": "Modificar el enlace actual con las nuevas cuentas.", + "SettingsLinkedAccountsSave_Title": "Guardar Cambios", + "SettingsLoadImages_Title": "Cargar imágenes automáticamente", + "SettingsLoadStyles_Title": "Cargar estilos automáticamente", + "SettingsMailSpacing_Description": "Ajustar el espacio para listar los correos.", + "SettingsMailSpacing_Title": "Espacio de Correo", + "SettingsFolderMenuStyle_Title": "Crear Carpetas Anidadas", + "SettingsFolderMenuStyle_Description": "Cambia si las carpetas de la cuenta deben anidarse dentro de un elemento de menú de la cuenta o no. Desactiva esto si te gusta el antiguo sistema de menú de Windows Mail", + "SettingsManageAccountSettings_Description": "Notificaciones, firmas, sincronización y otros ajustes por cuenta.", + "SettingsManageAccountSettings_Title": "Administrar ajustes de cuenta", + "SettingsManageLink_Description": "Mover elementos para añadir un nuevo enlace o eliminar el enlace existente.", + "SettingsManageLink_Title": "Administrar enlaces", + "SettingsMarkAsRead_Description": "Cambiar lo que debería pasar con el elemento seleccionado.", + "SettingsMarkAsRead_DontChange": "No marcar automáticamente el elemento como leído", + "SettingsMarkAsRead_SecondsToWait": "Segundos de espera: ", + "SettingsMarkAsRead_Timer": "Cuando se visualiza en el panel de lectura", + "SettingsMarkAsRead_Title": "Marcar artículo como leído", + "SettingsMarkAsRead_WhenSelected": "Al seleccionar", + "SettingsMessageList_Description": "Cambie cómo deben organizarse sus mensajes en la lista de correo.", + "SettingsMessageList_Title": "Lista de mensajes", + "SettingsNoAccountSetupMessage": "Aún no has configurado ninguna cuenta.", + "SettingsNotifications_Description": "Activar o desactivar notificaciones para esta cuenta.", + "SettingsNotifications_Title": "Notificaciones", + "SettingsPaneLength_Description": "Cambiar el ancho de la lista de correo.", + "SettingsPaneLength_Title": "Longitud del panel de la lista de correo", + "SettingsPaypal_Description": "Muestre mucho más amor ❤️ Todas las donaciones se agradecen.", + "SettingsPaypal_Title": "Dona vía PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Modo Compacto", + "SettingsPersonalizationMailDisplayMediumMode": "Modo Mediano", + "SettingsPersonalizationMailDisplaySpaciousMode": "Modo Espacioso", + "SettingsPersonalization_Description": "Cambia la apariencia de Wino a tu gusto.", + "SettingsPersonalization_Title": "Personalización", + "SettingsPrivacyPolicy_Description": "Revisar la Política de Privacidad.", + "SettingsPrivacyPolicy_Title": "Políticas de privacidad", + "SettingsReadingPane_Description": "Opciones de renderizado de correo.", + "SettingsReadingPane_Title": "Panel de lectura", + "SettingsReaderFont_Title": "Fuente por defecto del Lector", + "SettingsReaderFontFamily_Description": "Cambie el tamaño por defecto de la familia de fuentes y del tipo de letra para escribir correos.", + "SettingsFontFamily_Title": "Familia tipográfica", + "SettingsFontSize_Title": "Tamaño de la fuente", + "SettingsFontPreview_Title": "Vista previa", + "SettingsComposerFont_Title": "Fuente por defecto para Escribir", + "SettingsComposerFontFamily_Description": "Cambie el tamaño por defecto de la familia de fuentes y del tipo de letra para escribir correos.", + "SettingsRenameMergeAccount_Description": "Cambiar el nombre mostrado de las cuentas vinculadas.", + "SettingsRenameMergeAccount_Title": "Renombrar", + "SettingsSemanticZoom_Description": "Esto le permitirá hacer clic en los encabezados de la lista de mensajes e ir a una fecha específica", + "SettingsSemanticZoom_Title": "Zoom semántico para los encabezados de fechas", + "SettingsShowPreviewText_Description": "Ocultar/mostrar texto de la vista previa.", + "SettingsShowPreviewText_Title": "Mostrar texto de vista previa", + "SettingsShowSenderPictures_Description": "Ocultar/mostrar imágenes del remitente en miniatura.", + "SettingsShowSenderPictures_Title": "Mostrar Avatares de Remitente", + "SettingsPrefer24HourClock_Title": "Mostrar formato de reloj en 24 horas", + "SettingsPrefer24HourClock_Description": "Las horas de recepción de correos se mostrarán en formato de 24 horas en lugar de 12 (AM/PM)", + "SettingsSignature_Description": "Editar o eliminar firma de cuenta", + "SettingsSignature_Title": "Firma", + "SettingsStartupItem_Description": "Elemento principal de la cuenta para cargar la Bandeja de entrada al inicio.", + "SettingsStartupItem_Title": "Elemento de Inicio", + "SettingsStore_Description": "Mostrar un poco de amor ❤️", + "SettingsStore_Title": "Valorar en la tienda", + "SettingsThreads_Description": "Organizar mensajes en hilos de conversación.", + "SettingsThreads_Title": "Hilos de conversación", + "SettingsUnlinkAccounts_Description": "Eliminar el enlace entre cuentas. Esto no eliminará sus cuentas.", + "SettingsUnlinkAccounts_Title": "Desvincular Cuentas", + "SortingOption_Date": "por fecha", + "SortingOption_Name": "por nombre", + "StoreRatingDialog_MessageFirstLine": "Todos los comentarios son apreciados y harán mucho mejor Wino en el futuro. ¿Te gustaría calificar Wino en Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "¿Quieres calificar Wino Mail en Microsoft Store?", + "StoreRatingDialog_Title": "¿Te gusta Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Los mensajes borrados se moverán a aquí.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Carpeta eliminados", + "SystemFolderConfigDialog_DraftFolderDescription": "Aquí se elaborarán nuevos correos/respuestas.", + "SystemFolderConfigDialog_DraftFolderHeader": "Carpeta de borrador", + "SystemFolderConfigDialog_JunkFolderDescription": "Todos los correos basura o spam estarán aquí.", + "SystemFolderConfigDialog_JunkFolderHeader": "Carpeta Basura/Spam", + "SystemFolderConfigDialog_MessageFirstLine": "Este servidor IMAP no soporta la extensión SPECIAL-USE, por lo que Wino no pudo configurar las carpetas del sistema correctamente.", + "SystemFolderConfigDialog_MessageSecondLine": "Por favor, seleccione las carpetas apropiadas para funciones específicas.", + "SystemFolderConfigDialog_SentFolderDescription": "Carpeta que los mensajes enviados serán almacenados.", + "SystemFolderConfigDialog_SentFolderHeader": "Carpeta Enviados", + "SystemFolderConfigDialog_Title": "Configurar Carpetas del Sistema", + "TestingImapConnectionMessage": "Probando conexión con el servidor...", + "Today": "Hoy", + "UnknownAddress": "dirección desconocida", + "UnknownDateHeader": "Fecha desconocida", + "UnknownGroupAddress": "dirección de grupo de correo desconocida", + "UnknownSender": "Remitente desconocido", + "Unsubscribe": "Darse de baja", + "ViewContactDetails": "Ver Detalles", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Actualizar a Cuentas Ilimitadas", + "WinoUpgradeRemainingAccountsMessage": "{0} de {1} cuentas gratuitas usadas.", + "Yesterday": "Ayer" +} diff --git a/Wino.Core.Domain/Translations/fr_FR/resources.json b/Wino.Core.Domain/Translations/fr_FR/resources.json new file mode 100644 index 00000000..38bab5eb --- /dev/null +++ b/Wino.Core.Domain/Translations/fr_FR/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "tout est prêt", + "AccountCreationDialog_Initializing": "initialisation", + "AccountCreationDialog_PreparingFolders": "Réception des informations du dossier.", + "AccountCreationDialog_SigninIn": "Enregistrement des informations du compte.", + "AccountEditDialog_Message": "Nom du compte", + "AccountEditDialog_Title": "Modifier le compte", + "AccountPickerDialog_Title": "Choisir un compte", + "AddHyperlink": "Ajouter", + "AutoDiscoveryProgressMessage": "Recherche des paramètres de messagerie...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Paramètres avancés", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Vos identifiants seront uniquement stockés sur votre ordinateur.", + "BasicIMAPSetupDialog_Description": "Certains comptes requièrent des étapes supplémentaires pour se connecter", + "BasicIMAPSetupDialog_DisplayName": "Nom d'affichage", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "ex. Jean Dupont", + "BasicIMAPSetupDialog_LearnMore": "En savoir plus", + "BasicIMAPSetupDialog_MailAddress": "Adresse électronique", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "jeandupont@exemple.fr", + "BasicIMAPSetupDialog_Password": "Mot de passe", + "BasicIMAPSetupDialog_Title": "Compte IMAP", + "Buttons_AddAccount": "Ajouter un compte", + "Buttons_ApplyTheme": "Appliquer le thème", + "Buttons_Browse": "Parcourir", + "Buttons_Cancel": "Annuler", + "Buttons_Close": "Fermer", + "Buttons_Create": "Créer", + "Buttons_CreateAccount": "Créer un compte", + "Buttons_Delete": "Supprimer", + "Buttons_Discard": "Ignorer", + "Buttons_EnableImageRendering": "Activer", + "Buttons_No": "Non", + "Buttons_Open": "Ouvrir", + "Buttons_Purchase": "Acheter", + "Buttons_RateWino": "Évaluer Wino", + "Buttons_Save": "Enregistrer", + "Buttons_SaveConfiguration": "Enregistrer la configuration", + "Buttons_Share": "Partager", + "Buttons_SignIn": "Connexion", + "Buttons_Yes": "Oui", + "Center": "Centrer", + "ComingSoon": "Bientôt disponible...", + "ComposerFrom": "De : ", + "ComposerSubject": "Objet : ", + "ComposerTo": "À : ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "click enter to input addresses", + "CustomThemeBuilder_AccentColorDescription": "Définir une couleur d'accentuation personnalisée si vous le souhaitez. Ne pas sélectionner une couleur utilisera votre couleur d'accentuation Windows.", + "CustomThemeBuilder_AccentColorTitle": "Couleur d'accentuation", + "CustomThemeBuilder_PickColor": "Choisir", + "CustomThemeBuilder_ThemeNameDescription": "Nom unique pour votre thème personnalisé.", + "CustomThemeBuilder_ThemeNameTitle": "Nom du thème", + "CustomThemeBuilder_Title": "Générateur de Thèmes personnalisés", + "CustomThemeBuilder_WallpaperDescription": "Définir un fond d'écran personnalisé pour Wino", + "CustomThemeBuilder_WallpaperTitle": "Définir un fond d'écran personnalisé", + "DialogMessage_AccountLimitMessage": "Vous avez atteint la limite de création de compte.\nVoulez-vous acheter le module 'Compte illimité' pour continuer ?", + "DialogMessage_AccountLimitTitle": "Limite de compte atteinte", + "DialogMessage_CleanupFolderMessage": "Voulez-vous supprimer définitivement tous les messages de ce dossier ?", + "DialogMessage_CleanupFolderTitle": "Nettoyer le dossier", + "DialogMessage_ComposerMissingRecipientMessage": "Le message n'a pas de destinataire.", + "DialogMessage_ComposerValidationFailedTitle": "Validation échouée", + "DialogMessage_CreateLinkedAccountMessage": "Give this new link a name. Accounts will be merged under this name.", + "DialogMessage_CreateLinkedAccountTitle": "Account Link Name", + "DialogMessage_DeleteAccountConfirmationMessage": "Supprimer {0} ?", + "DialogMessage_DeleteAccountConfirmationTitle": "Toutes les données associées à ce compte seront définitivement supprimées du disque.", + "DialogMessage_DiscardDraftConfirmationMessage": "Ce brouillon sera supprimé. Voulez-vous continuer ?", + "DialogMessage_DiscardDraftConfirmationTitle": "Supprimer le brouillon", + "DialogMessage_HardDeleteConfirmationMessage": "Supprimer définitivement", + "DialogMessage_HardDeleteConfirmationTitle": "Le ou les messages seront supprimés définitivement. Voulez-vous continuer ?", + "DialogMessage_NoAccountsForCreateMailMessage": "Vous n'avez aucun compte pour créer un message.", + "DialogMessage_NoAccountsForCreateMailTitle": "Compte manquant", + "DialogMessage_RenameLinkedAccountsMessage": "Entrez un nouveau nom pour le compte lié", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Cette opération ne supprimera pas vos comptes mais ne supprimera que le lien pour les connexions de dossiers partagés. Voulez-vous continuer?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Dissocier les comptes", + "DialogMessage_EmptySubjectConfirmation": "Sujet manquant", + "DialogMessage_EmptySubjectConfirmationMessage": "Le message n'a pas d'objet. Voulez-vous continuer ?", + "Dialog_DontAskAgain": "Ne plus demander", + "DiscordChannelDisclaimerMessage": "Wino n'a pas son propre serveur Discord, mais un canal spécial « wino-mail » est hébergé sur le serveur « Developer Sanctuary ».\nPour obtenir les mises à jour sur Wino, veuillez rejoindre le serveur Developer Sanctuary et suivre le canal « wino-mail » sous « Projets communautaires ».\n\nVous serez dirigé vers l'URL du serveur car Discord ne prend pas en charge les invitations à des chaînes.", + "DiscordChannelDisclaimerTitle": "Informations importantes sur Discord", + "Draft": "Brouillon", + "EditorToolbarOption_Draw": "Dessiner", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insérer", + "EditorToolbarOption_None": "Aucun", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Mode sombre", + "ElementTheme_Default": "Utiliser les paramètres du système", + "ElementTheme_Light": "Mode clair", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "Échec du groupement de clients IMAP.", + "Exception_AuthenticationCanceled": "Authentification annulée", + "Exception_CustomThemeExists": "Ce thème existe déjà.", + "Exception_CustomThemeMissingName": "Vous devez indiquer un nom.", + "Exception_CustomThemeMissingWallpaper": "Vous devez fournir une image d'arrière-plan personnalisée.", + "Exception_FailedToSynchronizeFolders": "Échec de la synchronisation des dossiers", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Réponse d’autorisation corrompue.", + "Exception_GoogleAuthError": "Erreur d'autorisation OAuth : {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "La configuration du dossier système n’est pas valide. Vérifiez la configuration et réessayez.", + "Exception_NullAssignedAccount": "Assigned account is null", + "Exception_NullAssignedFolder": "Assigned folder is null", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Échec de la génération du jeton", + "Exception_TokenInfoRetrivalFailed": "Impossible de récupérer les informations de l'utilisateur.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "Ce fournisseur n'est pas pris en charge.", + "Exception_UnsupportedSynchronizerOperation": "Cette opération n'est pas supportée pour {0}", + "Exception_UserCancelSystemFolderSetupDialog": "L'utilisateur a annulé la boîte de dialogue de configuration du dossier système.", + "Files": "Fichiers", + "FilteringOption_All": "Tout", + "FilteringOption_Flagged": "Marqué", + "FilteringOption_Unread": "Non lus", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Créer un sous-dossier", + "FolderOperation_Delete": "Supprimer", + "FolderOperation_DontSync": "Ne pas synchroniser ce dossier", + "FolderOperation_Empty": "Vider ce dossier", + "FolderOperation_MarkAllAsRead": "Marquer tout comme lu", + "FolderOperation_Move": "Déplacer", + "DragMoveToFolderCaption": "Déplacer vers {0}", + "FolderOperation_None": "Aucun", + "FolderOperation_Pin": "Épingler", + "FolderOperation_Rename": "Renommer", + "FolderOperation_Unpin": "Désépingler", + "HoverActionOption_Archive": "Archiver", + "HoverActionOption_Delete": "Supprimer", + "HoverActionOption_MoveJunk": "Déplacer vers courriers indésirables", + "HoverActionOption_ToggleFlag": "Marquer / Démarquer", + "HoverActionOption_ToggleRead": "Lu / Non lu", + "MergedAccountCommonFolderInbox": "Boîte de réception", + "MergedAccountCommonFolderSent": "Envoyé", + "MergedAccountCommonFolderDraft": "Brouillon", + "MergedAccountCommonFolderJunk": "Indésirables", + "MergedAccountCommonFolderTrash": "Supprimé", + "MergedAccountCommonFolderArchive": "Archives", + "IMAPSetupDialog_AccountType": "Type de compte", + "IMAPSetupDialog_DisplayName": "Nom d'affichage", + "IMAPSetupDialog_DisplayNamePlaceholder": "ex. Jean Dupont", + "IMAPSetupDialog_IncomingMailServer": "Serveur de courrier entrant", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Adresse e-mail", + "IMAPSetupDialog_MailAddressPlaceholder": "personne@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Serveur de courrier sortant (SMTP)", + "IMAPSetupDialog_OutgoingMailServerPassword": "Mot de passe du serveur sortant", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Le serveur sortant nécessite une authentification", + "IMAPSetupDialog_OutgoingMailServerUsername": "Nom d'utilisateur du serveur sortant", + "IMAPSetupDialog_Password": "Mot de passe", + "IMAPSetupDialog_RequireSSLForIncomingMail": "SSL requis pour les courriers entrants", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "SSL requis pour les courriers sortants", + "IMAPSetupDialog_Title": "Configuration IMAP avancée", + "IMAPSetupDialog_UseSameConfig": "Utilisez le même nom d'utilisateur et mot de passe pour envoyer un e-mail", + "IMAPSetupDialog_Username": "Nom d’utilisateur", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domaine/johndoe", + "ImageRenderingDisabled": "L'affichage d'image est désactivé pour ce message.", + "InfoBarAction_Enable": "Activer", + "InfoBarMessage_SynchronizationDisabledFolder": "Ce dossier est désactivé pour la synchronisation.", + "InfoBarTitle_SynchronizationDisabledFolder": "Dossier désactivé", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} est créé", + "Info_AccountCreatedTitle": "Création de compte", + "Info_AccountCreationFailedTitle": "Échec de la création du compte", + "Info_AccountDeletedMessage": "{0} a été supprimé avec succès.", + "Info_AccountDeletedTitle": "Compte supprimé", + "Info_AccountIssueFixFailedTitle": "Échec", + "Info_AccountIssueFixSuccessMessage": "Correction de tous les problèmes de compte.", + "Info_AccountIssueFixSuccessTitle": "Réussi", + "Info_AttachmentOpenFailedMessage": "Impossible d'ouvrir la pièce-jointe.", + "Info_AttachmentOpenFailedTitle": "Échec", + "Info_AttachmentSaveFailedMessage": "Impossible d'enregistrer cette pièce-jointe.", + "Info_AttachmentSaveFailedTitle": "Échec", + "Info_AttachmentSaveSuccessMessage": "La pièce jointe est enregistrée.", + "Info_AttachmentSaveSuccessTitle": "Pièce jointe enregistrée", + "Info_BackgroundExecutionDeniedMessage": "L'exécution en arrière-plan de l'application est refusée. Cela peut affecter la synchronisation en arrière-plan et les notifications en direct.", + "Info_BackgroundExecutionDeniedTitle": "Exécution en arrière-plan refusée", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Échec de l'exécution en arrière-plan", + "Info_ComposerMissingMIMEMessage": "Impossible de trouver le fichier MIME. La synchronisation peut aider.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "Ce contact est déjà dans la liste des destinataires.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Le dossier Brouillon est manquant pour ce compte. Veuillez vérifier vos paramètres de compte.", + "Info_DraftFolderMissingTitle": "Dossier brouillon manquant", + "Info_FileLaunchFailedTitle": "Échec du lancement du fichier", + "Info_InvalidAddressMessage": "{0} n'est pas une adresse e-mail valide.", + "Info_InvalidAddressTitle": "Addresse invalide", + "Info_InvalidMoveTargetMessage": "Vous ne pouvez pas déplacer les messages sélectionnés dans ce dossier.", + "Info_InvalidMoveTargetTitle": "Cible non valide", + "Info_LogsNotFoundMessage": "Il n'y a pas de journaux à partager.", + "Info_LogsNotFoundTitle": "Journaux introuvables", + "Info_LogsSavedMessage": "{0} est sauvegardé dans le dossier sélectionné.", + "Info_LogsSavedTitle": "Enregistré", + "Info_MailRenderingFailedMessage": "Ce courrier est corrompu ou ne peut pas être ouvert.\n{0}", + "Info_MailRenderingFailedTitle": "Le rendu a échoué", + "Info_MessageCorruptedMessage": "Ce message est corrompu.", + "Info_MessageCorruptedTitle": "Erreur", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Dossier manquant", + "Info_PurchaseExistsMessage": "Il semble que ce produit ait déjà été acheté auparavant.", + "Info_PurchaseExistsTitle": "Produit existant", + "Info_PurchaseThankYouMessage": "Merci", + "Info_PurchaseThankYouTitle": "Achat réussi", + "Info_RequestCreationFailedTitle": "Échec de la création de demandes", + "Info_ReviewNetworkErrorMessage": "Il y a eu un problème de réseau avec votre avis.", + "Info_ReviewNetworkErrorTitle": "Problème de réseau", + "Info_ReviewNewMessage": "Tous les commentaires sont appréciés. Merci pour votre avis !", + "Info_ReviewSuccessTitle": "Merci", + "Info_ReviewUnknownErrorMessage": "Il y a eu un problème inconnu avec votre avis. ({0})", + "Info_ReviewUnknownErrorTitle": "Erreur inconnue", + "Info_ReviewUpdatedMessage": "Merci pour la mise à jour de votre avis.", + "Info_SignatureDisabledMessage": "La signature pour ce compte est désactivée", + "Info_SignatureDisabledTitle": "Réussi", + "Info_SignatureSavedMessage": "La nouvelle signature est enregistrée", + "Info_SignatureSavedTitle": "Réussi", + "Info_SyncCanceledMessage": "Annulé", + "Info_SyncCanceledTitle": "Synchronisation", + "Info_SyncFailedTitle": "Synchronisation échouée", + "Info_UnsupportedFunctionalityDescription": "Cette fonctionnalité n’est pas encore implémentée.", + "Info_UnsupportedFunctionalityTitle": "Non supporté", + "Info_UnsubscribeLinkInvalidTitle": "Url de désinscription non valide", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Méthode d’authentification", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Sécurité de la connexion", + "ImapAuthenticationMethod_Auto": "Automatique", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Pas d'authentification", + "ImapAuthenticationMethod_Plain": "Mot de passe normal", + "ImapAuthenticationMethod_EncryptedPassword": "Mot de passe chiffré", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Aucun", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Automatique", + "Justify": "Justifier", + "Left": "Gauche", + "Link": "Lien", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Comptes liés", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archiver", + "MailOperation_ClearFlag": "Enlever la balise", + "MailOperation_DarkEditor": "Sombre", + "MailOperation_Delete": "Supprimer", + "MailOperation_ExportPDF": "Exporter en PDF", + "MailOperation_Find": "Rechercher", + "MailOperation_Forward": "Transférer", + "MailOperation_Ignore": "Ignorer", + "MailOperation_LightEditor": "Clair", + "MailOperation_MarkAsJunk": "Marquer comme indésirable", + "MailOperation_MarkAsRead": "Marquer comme lu", + "MailOperation_MarkAsUnread": "Marquer comme non lu", + "MailOperation_MarkNotJunk": "Marquer comme non indésirable", + "MailOperation_Move": "Déplacer", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Déplacer vers indésirables", + "MailOperation_MoveOther": "Déplacer vers autres", + "MailOperation_Navigate": "Naviguer", + "MailOperation_Print": "Imprimer", + "MailOperation_Reply": "Répondre", + "MailOperation_ReplyAll": "Répondre à tous", + "MailOperation_SaveAs": "Enregistrer sous", + "MailOperation_SetFlag": "Définir drapeau", + "MailOperation_Unarchive": "Désarchiver", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Marquer ou Démarquer ce message", + "MarkReadUnread": "Marquer comme lu/non lu", + "MenuManageAccounts": "Gérer les comptes", + "MenuNewMail": "Nouveau message", + "MenuMergedAccountItemAccountsSuffix": " Comptes", + "MenuRate": "Évaluer Wino", + "MenuSettings": "Paramètres", + "MergedAccountsAvailableAccountsTitle": "Comptes disponibles", + "More": "Plus", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Choisissez un dossier", + "NewAccountDialog_AccountName": "Nom du compte", + "NewAccountDialog_AccountNameDefaultValue": "Personnel", + "NewAccountDialog_AccountNamePlaceholder": "Ex. courrier personnel", + "NewAccountDialog_Title": "Ajouter un nouveau compte", + "NoMailSelected": "aucun message sélectionné", + "NoMessageCrieteria": "aucuns messages ne correspond à vos critères de recherche.", + "NoMessageEmptyFolder": "ce dossier est vide.", + "Notifications_MultipleNotificationsMessage": "Vous avez {0} nouveaux messages", + "Notifications_MultipleNotificationsTitle": "Nouveaux courriers", + "Notifications_WinoUpdatedMessage": "Vérifier la nouvelle version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail a été mis à jour.", + "Other": "Autre", + "PaneLengthOption_Default": "Défaut", + "PaneLengthOption_ExtraLarge": "Très grand", + "PaneLengthOption_Large": "Grand", + "PaneLengthOption_Medium": "Moyen", + "PaneLengthOption_Micro": "Très petit", + "PaneLengthOption_Small": "Petit", + "Photos": "Images", + "PreparingFoldersMessage": "Préparation des dossiers", + "ProviderDetail_Gmail_Description": "Compte Google", + "ProviderDetail_IMAP_Description": "Serveur IMAP/SMTP personnalisé", + "ProviderDetail_IMAP_Title": "Serveur IMAP", + "Results": "Résultats", + "Right": "Droite", + "SynchronizationFolderReport_Success": "À jour", + "SynchronizationFolderReport_Failed": "la synchronisation a échouée", + "SearchBarPlaceholder": "Rechercher", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Allez au dépôt GitHub du gestionnaire de tickets.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Créer une copie du message dans le dossier Envoyé après l'envoi du brouillon. Activez cette option si vous ne voyez pas vos e-mails après les avoir envoyés dans le dossier Envoyés.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Client de messagerie léger pour les périphériques Windows.", + "SettingsAbout_Description": "En savoir plus sur Wino.", + "SettingsAbout_Title": "À propos", + "SettingsAccentColor_Description": "Changer la couleur d'accentuation de l'application", + "SettingsAccentColor_Title": "Couleur d'accentuation", + "SettingsAccentColor_UseWindowsAccentColor": "Utiliser ma couleur d'accentuation Windows", + "SettingsAccountName_Description": "Changer le nom du compte.", + "SettingsAccountName_Title": "Nom du compte", + "SettingsApplicationTheme_Description": "Personnalisez Wino avec différents thèmes d'application personnalisés pour vous.", + "SettingsApplicationTheme_Title": "Thème de l'application", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Thèmes disponibles", + "SettingsCustomTheme_Description": "Créez votre propre thème personnalisé avec un fond d'écran personnalisé et une couleur d'accentuation.", + "SettingsCustomTheme_Title": "Thème personnalisé", + "SettingsDeleteAccount_Description": "Supprimer tous les e-mails et identifiants associés à ce compte.", + "SettingsDeleteAccount_Title": "Supprimer ce compte", + "SettingsDeleteProtection_Description": "Wino devrait-il vous demander une comfirmation chaque fois que vous essayez de supprimer définitivement un mail en utilisant les touches Maj + Supprimer?", + "SettingsDeleteProtection_Title": "Protection contre la suppression permanente", + "SettingsDiagnostics_Description": "Pour les développeurs", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Canal Discord", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Thème de l'élément", + "SettingsEnableHoverActions_Title": "Activer les actions de survol", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Activer les journaux de protocole IMAP", + "SettingsEnableLogs_Description": "Je pourrais avoir besoin de Logs pour que les tickets ouverts sur GitHub puissent être diagnostiqués. Aucun de ces journaux n'exposera vos identifiants ou vos informations sensées.", + "SettingsEnableLogs_Title": "Activer les journaux", + "SettingsEnableSignature": "Activer la signature", + "SettingsExpandOnStartup_Description": "Définissez si Wino doit étendre les dossiers de ce compte au démarrage.", + "SettingsExpandOnStartup_Title": "Développer le menu au démarrage", + "SettingsExternalContent_Description": "Gérer les paramètres de contenu externe lors du rendu des messages.", + "SettingsExternalContent_Title": "Contenu externe", + "SettingsFocusedInbox_Description": "Définit si la boîte de réception doit être divisée en deux en Prioritaire - Autre.", + "SettingsFocusedInbox_Title": "Boîte de réception Prioritaire", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Action de gauche", + "SettingsHoverActionRight": "Action de droite", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Actions de survol", + "SettingsLanguage_Description": "Changer la langue d'affichage de Wino.", + "SettingsLanguage_Title": "Langue d'affichage", + "CategoriesFolderNameOverride": "Catégories", + "MoreFolderNameOverride": "Plus", + "SettingsOptions_Title": "Paramètres", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Enregistrer les modifications", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Espacement du courrier", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronisation et autres paramètres par compte.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Secondes à attendre : ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Marquer l'élément comme lu", + "SettingsMarkAsRead_WhenSelected": "Lorsque sélectionné", + "SettingsMessageList_Description": "Modifiez la façon dont vos messages doivent être organisés dans la liste de courriels.", + "SettingsMessageList_Title": "Liste des messages", + "SettingsNoAccountSetupMessage": "Vous n'avez pas encore configuré de comptes.", + "SettingsNotifications_Description": "Activer ou désactiver les notifications pour ce compte.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Modifie la largeur de la liste de courriels.", + "SettingsPaneLength_Title": "Longueur du panneau de la liste d'emails", + "SettingsPaypal_Description": "Montrez-nous plus d'amour ❤️ Tous les dons sont appréciés.", + "SettingsPaypal_Title": "Faire un don via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Mode compact", + "SettingsPersonalizationMailDisplayMediumMode": "Mode moyen", + "SettingsPersonalizationMailDisplaySpaciousMode": "Mode spacieux", + "SettingsPersonalization_Description": "Changez l’apparence de Wino comme vous le souhaitez.", + "SettingsPersonalization_Title": "Personnalisation", + "SettingsPrivacyPolicy_Description": "Examinez la politique de confidentialité.", + "SettingsPrivacyPolicy_Title": "Politique de confidentialité", + "SettingsReadingPane_Description": "Options de rendu du courriel.", + "SettingsReadingPane_Title": "Panneau de lecture", + "SettingsReaderFont_Title": "Police par défaut du lecteur", + "SettingsReaderFontFamily_Description": "Modifier la police par défaut et la taille de police pour la lecture des messages.", + "SettingsFontFamily_Title": "Famille de polices", + "SettingsFontSize_Title": "Taille de la police", + "SettingsFontPreview_Title": "Aperçu", + "SettingsComposerFont_Title": "Police par défaut du compositeur", + "SettingsComposerFontFamily_Description": "Modifier la police et la taille par défaut lors de la composition des mails.", + "SettingsRenameMergeAccount_Description": "Changer le nom d'affichage des comptes liés.", + "SettingsRenameMergeAccount_Title": "Renommer", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Masquer/afficher les vignettes des images de l'expéditeur.", + "SettingsShowSenderPictures_Title": "Afficher l'avatar de l'expéditeur", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Les heures de réception du courrier seront affichées au format 24 heures au lieu de 12 (AM/PM)", + "SettingsSignature_Description": "Éditer ou supprimer la signature du compte", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Montrer nous un peu d'amour ❤️", + "SettingsStore_Title": "Évaluez l'application sur le store", + "SettingsThreads_Description": "Organiser les messages en fils de conversation.", + "SettingsThreads_Title": "Affichage en mode conversation", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Dissocier les comptes", + "SortingOption_Date": "Par date", + "SortingOption_Name": "Par nom", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Vous aimez Wino ?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Dossier supprimé", + "SystemFolderConfigDialog_DraftFolderDescription": "Les nouveaux courriels/réponses seront créés ici.", + "SystemFolderConfigDialog_DraftFolderHeader": "Dossier de brouillon", + "SystemFolderConfigDialog_JunkFolderDescription": "Tous les courriers indésirables et spam/spam seront ici.", + "SystemFolderConfigDialog_JunkFolderHeader": "Dossier indésirable/spam", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Le dossier contenant les messages envoyés sera stocké.", + "SystemFolderConfigDialog_SentFolderHeader": "Dossier envoyé", + "SystemFolderConfigDialog_Title": "Configurer les dossiers système", + "TestingImapConnectionMessage": "Test de la connexion au serveur...", + "Today": "Aujourd'hui", + "UnknownAddress": "Adresse inconnue", + "UnknownDateHeader": "Date inconnue", + "UnknownGroupAddress": "Adresse du groupe de messagerie inconnue", + "UnknownSender": "Expéditeur inconnu", + "Unsubscribe": "Se désabonner", + "ViewContactDetails": "Voir les détails", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Mettre à niveau vers des comptes illimités", + "WinoUpgradeRemainingAccountsMessage": "{0} comptes gratuits utilisés sur {1}.", + "Yesterday": "Hier" +} diff --git a/Wino.Core.Domain/Translations/it_IT/resources.json b/Wino.Core.Domain/Translations/it_IT/resources.json new file mode 100644 index 00000000..c2f36e60 --- /dev/null +++ b/Wino.Core.Domain/Translations/it_IT/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "tutto fatto", + "AccountCreationDialog_Initializing": "inizializzazione", + "AccountCreationDialog_PreparingFolders": "Stiamo ricevendo informazioni sulle cartelle al momento.", + "AccountCreationDialog_SigninIn": "Le informazioni dell'account sono in fase di salvataggio.", + "AccountEditDialog_Message": "Nome account", + "AccountEditDialog_Title": "Modifica account", + "AccountPickerDialog_Title": "Scegli un account", + "AddHyperlink": "Aggiungi", + "AutoDiscoveryProgressMessage": "Ricerca delle impostazioni di posta...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Configurazione avanzata", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Le tue credenziali verranno memorizzate solo localmente sul tuo computer.", + "BasicIMAPSetupDialog_Description": "Alcuni account richiedono passaggi aggiuntivi per accedere", + "BasicIMAPSetupDialog_DisplayName": "Mostra nome", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "ad esempio Mario Rossi", + "BasicIMAPSetupDialog_LearnMore": "Per saperne di più", + "BasicIMAPSetupDialog_MailAddress": "Indirizzo E-Mail", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Password", + "BasicIMAPSetupDialog_Title": "Account IMAP", + "Buttons_AddAccount": "Aggiungi account", + "Buttons_ApplyTheme": "Applica tema", + "Buttons_Browse": "Sfoglia", + "Buttons_Cancel": "Annulla", + "Buttons_Close": "Chiudi", + "Buttons_Create": "Crea", + "Buttons_CreateAccount": "Crea account", + "Buttons_Delete": "Elimina", + "Buttons_Discard": "Scarta", + "Buttons_EnableImageRendering": "Attiva", + "Buttons_No": "No", + "Buttons_Open": "Apri", + "Buttons_Purchase": "Acquista", + "Buttons_RateWino": "Valuta Wino", + "Buttons_Save": "Salva", + "Buttons_SaveConfiguration": "Salva configurazione", + "Buttons_Share": "Condividi", + "Buttons_SignIn": "Accedi", + "Buttons_Yes": "Sì", + "Center": "Centra", + "ComingSoon": "Prossimamente...", + "ComposerFrom": "Da: ", + "ComposerSubject": "Oggetto: ", + "ComposerTo": "A: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "clicca Invio per inserire gli indirizzi", + "CustomThemeBuilder_AccentColorDescription": "Imposta un colore principale personalizzato, se vuoi. Non selezionare un colore userà il colore principale di Windows.", + "CustomThemeBuilder_AccentColorTitle": "Colore principale", + "CustomThemeBuilder_PickColor": "Scegli", + "CustomThemeBuilder_ThemeNameDescription": "Nome unico del tuo tema personalizzato.", + "CustomThemeBuilder_ThemeNameTitle": "Nome del tema", + "CustomThemeBuilder_Title": "Creatore di Temi personalizzati", + "CustomThemeBuilder_WallpaperDescription": "Imposta uno sfondo personalizzato per Wino", + "CustomThemeBuilder_WallpaperTitle": "Imposta uno sfondo personalizzato", + "DialogMessage_AccountLimitMessage": "Hai raggiunto il limite di creazione degli account.\nVuoi acquistare il componente aggiuntivo 'Account Illimitati' per continuare?", + "DialogMessage_AccountLimitTitle": "Raggiunto il limite degli account", + "DialogMessage_CleanupFolderMessage": "Vuoi eliminare definitivamente tutte le email in questa cartella?", + "DialogMessage_CleanupFolderTitle": "Svuota cartella", + "DialogMessage_ComposerMissingRecipientMessage": "Il messaggio non ha alcun destinatario.", + "DialogMessage_ComposerValidationFailedTitle": "Convalida non riuscita", + "DialogMessage_CreateLinkedAccountMessage": "Dai un nome a questo nuovo collegamento. Gli account saranno uniti sotto questo nome.", + "DialogMessage_CreateLinkedAccountTitle": "Nome dell'account collegato", + "DialogMessage_DeleteAccountConfirmationMessage": "Eliminare {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "Tutti i dati associati a questo account verranno eliminati dal disco in modo permanente.", + "DialogMessage_DiscardDraftConfirmationMessage": "Questa bozza verrà scartata. Vuoi continuare?", + "DialogMessage_DiscardDraftConfirmationTitle": "Scarta bozza", + "DialogMessage_HardDeleteConfirmationMessage": "Elimina definitivamente", + "DialogMessage_HardDeleteConfirmationTitle": "I messaggi verranno eliminati definitivamente. Vuoi continuare?", + "DialogMessage_NoAccountsForCreateMailMessage": "Non hai alcun account da cui creare un messaggio.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account mancante", + "DialogMessage_RenameLinkedAccountsMessage": "Inserisci un nuovo nome per l'account collegato", + "DialogMessage_RenameLinkedAccountsTitle": "Rinomina l'account collegato", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Questa operazione non eliminerà i tuoi account, ma interromperà solo il collegamento verso le connessioni alla cartella condivisa. Vuoi continuare?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Scollega account", + "DialogMessage_EmptySubjectConfirmation": "Oggetto mancante", + "DialogMessage_EmptySubjectConfirmationMessage": "Il messaggio non ha oggetto. Vuoi continuare?", + "Dialog_DontAskAgain": "Non chiedermelo più", + "DiscordChannelDisclaimerMessage": "Wino non ha il proprio server Discord, ma il canale speciale 'wino-mail' è ospitato presso il server 'Developer Sanctuary'.\nPer ottenere gli aggiornamenti di Wino per favore unisciti al server Developer Sanctuary e segui il canale 'wino-mail' sotto 'Community Projects'.\n\nSarai reindirizzato all'URL del server poiché Discord non supporta gli inviti del canale.", + "DiscordChannelDisclaimerTitle": "Informazioni importanti su Discord", + "Draft": "Bozza", + "EditorToolbarOption_Draw": "Disegna", + "EditorToolbarOption_Format": "Formato", + "EditorToolbarOption_Insert": "Inserisci", + "EditorToolbarOption_None": "Vuoto", + "EditorToolbarOption_Options": "Opzioni", + "ElementTheme_Dark": "Tema scuro", + "ElementTheme_Default": "Usa le impostazioni di sistema", + "ElementTheme_Light": "Tema chiaro", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool fallito.", + "Exception_AuthenticationCanceled": "Autenticazione annullata", + "Exception_CustomThemeExists": "Questo tema esiste già.", + "Exception_CustomThemeMissingName": "È necessario fornire un nome.", + "Exception_CustomThemeMissingWallpaper": "È necessario fornire un'immagine di sfondo personalizzata.", + "Exception_FailedToSynchronizeFolders": "Sincronizzazione delle cartelle non riuscita", + "Exception_GoogleAuthCallbackNull": "Il Callback uri è nullo all'attivazione.", + "Exception_GoogleAuthCorruptedCode": "Risposta all'autorizzazione corrotta.", + "Exception_GoogleAuthError": "Errore di autorizzazione OAuth: {0}", + "Exception_GoogleAuthInvalidResponse": "Ricevuta richiesta con stato non valido ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Scambio del codice di autorizzazione non riuscito.", + "Exception_InvalidSystemFolderConfiguration": "La configurazione della cartella di sistema non è valida. Controlla la configurazione e riprova.", + "Exception_NullAssignedAccount": "L'account assegnato è nullo", + "Exception_NullAssignedFolder": "La cartella assegnata è nulla", + "Exception_SynchronizerFailureHTTP": "Gestione della risposta non riuscita con errore codice HTTP {0}", + "Exception_TokenGenerationFailed": "La generazione del token non è riuscita", + "Exception_TokenInfoRetrivalFailed": "Impossibile ottenere informazioni sul token.", + "Exception_UnknowErrorDuringAuthentication": "Errore sconosciuto durante l'autenticazione", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "Questo provider non è supportato.", + "Exception_UnsupportedSynchronizerOperation": "Questa operazione non è supportata per {0}", + "Exception_UserCancelSystemFolderSetupDialog": "Finestra di configurazione della cartella di sistema annullata dall'utente.", + "Files": "File", + "FilteringOption_All": "Tutti", + "FilteringOption_Flagged": "Speciali", + "FilteringOption_Unread": "Non letti", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Crea sottocartella", + "FolderOperation_Delete": "Elimina", + "FolderOperation_DontSync": "Non sincronizzare questa cartella", + "FolderOperation_Empty": "Svuota questa cartella", + "FolderOperation_MarkAllAsRead": "Segna tutti come letti", + "FolderOperation_Move": "Sposta", + "DragMoveToFolderCaption": "Sposta in {0}", + "FolderOperation_None": "Nessuno", + "FolderOperation_Pin": "Fissa", + "FolderOperation_Rename": "Rinomina", + "FolderOperation_Unpin": "Sgancia", + "HoverActionOption_Archive": "Archivia", + "HoverActionOption_Delete": "Elimina", + "HoverActionOption_MoveJunk": "Sposta in Indesiderata", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "es. Mario Rossi", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Porta", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Server di posta in uscita (SMTP)", + "IMAPSetupDialog_OutgoingMailServerPassword": "Password server di posta in uscita", + "IMAPSetupDialog_OutgoingMailServerPort": "Porta", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Il server di posta in uscita richiede l'autenticazione", + "IMAPSetupDialog_OutgoingMailServerUsername": "Nome utente server di posta in uscita", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Problema di rete", + "Info_ReviewNewMessage": "Tutti i commenti sono apprezzati. Grazie per la recensione!", + "Info_ReviewSuccessTitle": "Grazie", + "Info_ReviewUnknownErrorMessage": "Si è verificato un problema sconosciuto con la tua recensione ({0})", + "Info_ReviewUnknownErrorTitle": "Errore sconosciuto", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Sincronizzazione non riuscita", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Non supportato", + "Info_UnsubscribeLinkInvalidTitle": "Uri Di Cancellazione Non Valido", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Sicurezza della connessione", + "ImapAuthenticationMethod_Auto": "Automatico", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Nessuna autenticazione", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/ja_JP/resources.json b/Wino.Core.Domain/Translations/ja_JP/resources.json new file mode 100644 index 00000000..4fc52dd0 --- /dev/null +++ b/Wino.Core.Domain/Translations/ja_JP/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "完了", + "AccountCreationDialog_Initializing": "初期化中", + "AccountCreationDialog_PreparingFolders": "現在フォルダ情報を取得中です。", + "AccountCreationDialog_SigninIn": "アカウント情報を保存しています。", + "AccountEditDialog_Message": "アカウント名", + "AccountEditDialog_Title": "アカウントの編集", + "AccountPickerDialog_Title": "アカウントを選択", + "AddHyperlink": "追加", + "AutoDiscoveryProgressMessage": "メール設定を検索中...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "詳細設定", + "BasicIMAPSetupDialog_CredentialLocalMessage": "認証情報はローカルにのみ保存されます。", + "BasicIMAPSetupDialog_Description": "一部のアカウントではサインインするために追加の手順が必要です。", + "BasicIMAPSetupDialog_DisplayName": "表示名", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "例: 田中太郎", + "BasicIMAPSetupDialog_LearnMore": "詳細はこちら", + "BasicIMAPSetupDialog_MailAddress": "メールアドレス", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "パスワード", + "BasicIMAPSetupDialog_Title": "IMAPアカウント", + "Buttons_AddAccount": "アカウントを追加", + "Buttons_ApplyTheme": "テーマを適用", + "Buttons_Browse": "閲覧", + "Buttons_Cancel": "キャンセル", + "Buttons_Close": "閉じる", + "Buttons_Create": "作成", + "Buttons_CreateAccount": "アカウント作成", + "Buttons_Delete": "削除", + "Buttons_Discard": "破棄", + "Buttons_EnableImageRendering": "有効化", + "Buttons_No": "いいえ", + "Buttons_Open": "開く", + "Buttons_Purchase": "購入", + "Buttons_RateWino": "Winoを評価", + "Buttons_Save": "保存", + "Buttons_SaveConfiguration": "設定を保存", + "Buttons_Share": "シェアする", + "Buttons_SignIn": "サインイン", + "Buttons_Yes": "はい", + "Center": "中央", + "ComingSoon": "近日公開", + "ComposerFrom": "差出人: ", + "ComposerSubject": "件名: ", + "ComposerTo": "宛先: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "アドレスを入力するにはエンターをクリックしてください", + "CustomThemeBuilder_AccentColorDescription": "必要に応じてカスタムアクセントカラーを設定します。選択しない場合、Windowsアクセントカラーが使用されます。", + "CustomThemeBuilder_AccentColorTitle": "アクセントカラー", + "CustomThemeBuilder_PickColor": "選択", + "CustomThemeBuilder_ThemeNameDescription": "カスタムテーマの名前を設定する。", + "CustomThemeBuilder_ThemeNameTitle": "テーマ名", + "CustomThemeBuilder_Title": "カスタムテーマビルダー", + "CustomThemeBuilder_WallpaperDescription": "Winoのカスタム壁紙を設定", + "CustomThemeBuilder_WallpaperTitle": "カスタム壁紙を設定", + "DialogMessage_AccountLimitMessage": "アカウントの作成上限に達しました。\n「無制限アカウント」アドオンを購入して続行しますか?", + "DialogMessage_AccountLimitTitle": "アカウントの上限に達しました", + "DialogMessage_CleanupFolderMessage": "このフォルダ内のすべてのメールを完全に削除しますか?", + "DialogMessage_CleanupFolderTitle": "フォルダのクリーンアップ", + "DialogMessage_ComposerMissingRecipientMessage": "メッセージに宛先がありません。", + "DialogMessage_ComposerValidationFailedTitle": "検証に失敗しました", + "DialogMessage_CreateLinkedAccountMessage": "この新しいリンクに名前を付けてください。アカウントはこの名前でマージされます。", + "DialogMessage_CreateLinkedAccountTitle": "アカウントリンク名", + "DialogMessage_DeleteAccountConfirmationMessage": "{0} を削除しますか?", + "DialogMessage_DeleteAccountConfirmationTitle": "このアカウントに関連付けられたすべてのデータは永久にディスクから削除されます。", + "DialogMessage_DiscardDraftConfirmationMessage": "この下書きは破棄されます。続行しますか?", + "DialogMessage_DiscardDraftConfirmationTitle": "下書きを破棄", + "DialogMessage_HardDeleteConfirmationMessage": "完全に削除", + "DialogMessage_HardDeleteConfirmationTitle": "Message(s) will be permanently deleted. Do you want to continue?", + "DialogMessage_NoAccountsForCreateMailMessage": "You don't have any accounts to create message from.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account Missing", + "DialogMessage_RenameLinkedAccountsMessage": "Enter new name for linked account", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Unlink Accounts", + "DialogMessage_EmptySubjectConfirmation": "Missin Subject", + "DialogMessage_EmptySubjectConfirmationMessage": "Message has no subject. Do you want to continue?", + "Dialog_DontAskAgain": "Don't ask again", + "DiscordChannelDisclaimerMessage": "Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server.\nTo get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects'\n\nYou will be directed to server URL since Discord doesn't support channel invites.", + "DiscordChannelDisclaimerTitle": "Important Discord Information", + "Draft": "Draft", + "EditorToolbarOption_Draw": "Draw", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insert", + "EditorToolbarOption_None": "None", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Dark mode", + "ElementTheme_Default": "Use system setting", + "ElementTheme_Light": "Light mode", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool failed.", + "Exception_AuthenticationCanceled": "Authentication canceled", + "Exception_CustomThemeExists": "This theme already exists.", + "Exception_CustomThemeMissingName": "You must provide a name.", + "Exception_CustomThemeMissingWallpaper": "You must provide a custom background image.", + "Exception_FailedToSynchronizeFolders": "Failed to synchronize folders", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Corrupted authorization response.", + "Exception_GoogleAuthError": "OAuth authorization error: {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "System folder configuration is not valid. Check configuration and try again.", + "Exception_NullAssignedAccount": "割り当てられたアカウントがありません", + "Exception_NullAssignedFolder": "割り当てられたフォルダがありません", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Token generation failed", + "Exception_TokenInfoRetrivalFailed": "Failed to get token information.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "This provider is not supported.", + "Exception_UnsupportedSynchronizerOperation": "This operation is not supported for {0}", + "Exception_UserCancelSystemFolderSetupDialog": "User canceled system folder config dialog.", + "Files": "Files", + "FilteringOption_All": "All", + "FilteringOption_Flagged": "Flagged", + "FilteringOption_Unread": "Unread", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Create sub folder", + "FolderOperation_Delete": "Delete", + "FolderOperation_DontSync": "Don't sync this folder", + "FolderOperation_Empty": "Empty this folder", + "FolderOperation_MarkAllAsRead": "Mark all as read", + "FolderOperation_Move": "Move", + "DragMoveToFolderCaption": "Move to {0}", + "FolderOperation_None": "None", + "FolderOperation_Pin": "Pin", + "FolderOperation_Rename": "Rename", + "FolderOperation_Unpin": "Unpin", + "HoverActionOption_Archive": "Archive", + "HoverActionOption_Delete": "Delete", + "HoverActionOption_MoveJunk": "Move to Junk", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Outgoing (SMTP) mail server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Outgoing server password", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Outgoing server requires authentication", + "IMAPSetupDialog_OutgoingMailServerUsername": "Outgoing server user name", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Network Issue", + "Info_ReviewNewMessage": "All feedbacks are appreciated. Thank you for the review!", + "Info_ReviewSuccessTitle": "Thank you", + "Info_ReviewUnknownErrorMessage": "There was an unknown issue with your review. ({0})", + "Info_ReviewUnknownErrorTitle": "Unknown Error", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Synchronization Failed", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Unsupported", + "Info_UnsubscribeLinkInvalidTitle": "Invalid Unsubscribe Uri", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Connection security", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "No authentication", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/nl_NL/resources.json b/Wino.Core.Domain/Translations/nl_NL/resources.json new file mode 100644 index 00000000..86426587 --- /dev/null +++ b/Wino.Core.Domain/Translations/nl_NL/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "klaar", + "AccountCreationDialog_Initializing": "bezig met initialiseren", + "AccountCreationDialog_PreparingFolders": "Bezig met ontvangen van mapgegevens.", + "AccountCreationDialog_SigninIn": "Accountinformatie wordt opgeslagen.", + "AccountEditDialog_Message": "Accountnaam", + "AccountEditDialog_Title": "Bewerk account", + "AccountPickerDialog_Title": "Kies een account", + "AddHyperlink": "Toevoegen", + "AutoDiscoveryProgressMessage": "Zoeken naar mailinstellingen...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Geavanceerde configuratie", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Uw inloggegevens worden alleen lokaal opgeslagen op uw computer.", + "BasicIMAPSetupDialog_Description": "Sommige accounts vereisen aanvullende stappen om in te loggen", + "BasicIMAPSetupDialog_DisplayName": "Weergavenaam", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "bijv. Jan Smit", + "BasicIMAPSetupDialog_LearnMore": "Lees meer", + "BasicIMAPSetupDialog_MailAddress": "E-mailadres", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "fritsbarend@voorbeeld.nl", + "BasicIMAPSetupDialog_Password": "Wachtwoord", + "BasicIMAPSetupDialog_Title": "IMAP account", + "Buttons_AddAccount": "Account toevoegen", + "Buttons_ApplyTheme": "Thema toepassen", + "Buttons_Browse": "Bladeren", + "Buttons_Cancel": "Annuleren", + "Buttons_Close": "Sluiten", + "Buttons_Create": "Aanmaken", + "Buttons_CreateAccount": "Account aanmaken", + "Buttons_Delete": "Verwijderen", + "Buttons_Discard": "Weggooien", + "Buttons_EnableImageRendering": "Inschakelen", + "Buttons_No": "Nee", + "Buttons_Open": "Open", + "Buttons_Purchase": "Aanschaffen", + "Buttons_RateWino": "Wino beoordelen", + "Buttons_Save": "Opslaan", + "Buttons_SaveConfiguration": "Configuratie opslaan", + "Buttons_Share": "Delen", + "Buttons_SignIn": "Aanmelden", + "Buttons_Yes": "Ja", + "Center": "Centreren", + "ComingSoon": "Binnenkort beschikbaar...", + "ComposerFrom": "Van: ", + "ComposerSubject": "Onderwerp: ", + "ComposerTo": "Aan: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "klik op enter om adressen in te voeren", + "CustomThemeBuilder_AccentColorDescription": "Stel aan aangepaste accentkleur in. Maak geen keuze om de Windows-accentkleur te gebruiken.", + "CustomThemeBuilder_AccentColorTitle": "Accentkleur", + "CustomThemeBuilder_PickColor": "Kies", + "CustomThemeBuilder_ThemeNameDescription": "Unieke naam voor uw aangepaste thema.", + "CustomThemeBuilder_ThemeNameTitle": "Themanaam", + "CustomThemeBuilder_Title": "Aangepaste Thema Bouwer", + "CustomThemeBuilder_WallpaperDescription": "Stel een eigen achtergrond in voor Wino", + "CustomThemeBuilder_WallpaperTitle": "Aangepaste achtergrond instellen", + "DialogMessage_AccountLimitMessage": "U hebt de limiet voor het aanmaken van accounts bereikt.\nWilt u de 'Onbeperkt aantal accounts' add-on kopen om door te gaan?", + "DialogMessage_AccountLimitTitle": "Limiet accounts bereikt", + "DialogMessage_CleanupFolderMessage": "Wilt u alle e-mails in deze map permanent verwijderen?", + "DialogMessage_CleanupFolderTitle": "Opschonen map", + "DialogMessage_ComposerMissingRecipientMessage": "Bericht heeft geen ontvanger.", + "DialogMessage_ComposerValidationFailedTitle": "Validatie mislukt", + "DialogMessage_CreateLinkedAccountMessage": "Geef deze koppeling een naam. Accounts worden samengevoegd onder deze naam.", + "DialogMessage_CreateLinkedAccountTitle": "Naam van koppeling", + "DialogMessage_DeleteAccountConfirmationMessage": "Verwijder {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "Alle gegevens die gekoppeld zijn aan dit account worden permanent verwijderd.", + "DialogMessage_DiscardDraftConfirmationMessage": "Dit concept zal worden verwijderd. Wilt u doorgaan?", + "DialogMessage_DiscardDraftConfirmationTitle": "Concept verwijderen", + "DialogMessage_HardDeleteConfirmationMessage": "Permanent verwijderen", + "DialogMessage_HardDeleteConfirmationTitle": "Bericht(en) zullen permanent verwijderd worden. Wilt u doorgaan?", + "DialogMessage_NoAccountsForCreateMailMessage": "U heeft geen accounts om een bericht van te maken.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account ontbreekt", + "DialogMessage_RenameLinkedAccountsMessage": "Voer een nieuwe naam in voor gekoppeld account", + "DialogMessage_RenameLinkedAccountsTitle": "Gekoppeld account hernoemen", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Deze handeling zal je accounts niet verwijderen, maar alleen de koppeling van gedeelde mappen verbreken. Wil je doorgaan?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Ontkoppel accounts", + "DialogMessage_EmptySubjectConfirmation": "Onderwerp ontbreekt", + "DialogMessage_EmptySubjectConfirmationMessage": "Het bericht heeft geen onderwerp. Wilt u doorgaan?", + "Dialog_DontAskAgain": "Niet opnieuw vragen", + "DiscordChannelDisclaimerMessage": "Wino heeft geen eigen Discord server, maar het speciale 'wino-mail' kanaal is gehost op de 'Developer Sanctuary' server.\nOm updates over Wino te krijgen, sluit je je aan bij de Developer Sanctuary server en volg je 'wino-mail' kanaal onder 'Community Projects'\n\nJe wordt doorgestuurd naar de server-URL omdat Discord geen kanaaluitnodigingen ondersteunt.", + "DiscordChannelDisclaimerTitle": "Belangrijke informatie over Discord", + "Draft": "Concept", + "EditorToolbarOption_Draw": "Tekenen", + "EditorToolbarOption_Format": "Opmaak", + "EditorToolbarOption_Insert": "Invoegen", + "EditorToolbarOption_None": "Geen", + "EditorToolbarOption_Options": "Instellingen", + "ElementTheme_Dark": "Donkere modus", + "ElementTheme_Default": "Systeeminstellingen gebruiken", + "ElementTheme_Light": "Lichte modus", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool is mislukt.", + "Exception_AuthenticationCanceled": "Authenticatie geannuleerd", + "Exception_CustomThemeExists": "Dit thema bestaat al.", + "Exception_CustomThemeMissingName": "U moet een naam invullen.", + "Exception_CustomThemeMissingWallpaper": "U moet een aangepaste achtergrondafbeelding invoeren.", + "Exception_FailedToSynchronizeFolders": "Synchroniseren van mappen mislukt", + "Exception_GoogleAuthCallbackNull": "Callback uri is null bij het activeren.", + "Exception_GoogleAuthCorruptedCode": "Beschadigd autorisatieantwoord.", + "Exception_GoogleAuthError": "OAuth autorisatiefout: {0}", + "Exception_GoogleAuthInvalidResponse": "Verzoek ontvangen met ongeldige status ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Uitwisselen van autorisatiecode is mislukt.", + "Exception_InvalidSystemFolderConfiguration": "De systeemmapconfiguratie is niet geldig. Controleer de configuratie en probeer het opnieuw.", + "Exception_NullAssignedAccount": "Toegewezen account is ongeldig", + "Exception_NullAssignedFolder": "Toegewezen map is ongeldig", + "Exception_SynchronizerFailureHTTP": "Reactieverwerking mislukt met de HTTP-code {0}", + "Exception_TokenGenerationFailed": "Token genereren mislukt", + "Exception_TokenInfoRetrivalFailed": "Fout bij het ophalen van tokeninformatie.", + "Exception_UnknowErrorDuringAuthentication": "Onbekende fout opgetreden tijdens authenticatie", + "Exception_UnsupportedAction": "Actie {0} is niet geïmplementeerd in de aanvraagverwerker", + "Exception_UnsupportedProvider": "Deze aanbieder wordt niet ondersteund.", + "Exception_UnsupportedSynchronizerOperation": "Deze bewerking wordt niet ondersteund voor {0}", + "Exception_UserCancelSystemFolderSetupDialog": "Gebruiker heeft het dialoogvenster configureren systeemmappen geannuleerd.", + "Files": "Bestanden", + "FilteringOption_All": "Alle", + "FilteringOption_Flagged": "Gemarkeerd", + "FilteringOption_Unread": "Ongelezen", + "Focused": "Gefocust", + "FolderOperation_CreateSubFolder": "Maak submap", + "FolderOperation_Delete": "Verwijderen", + "FolderOperation_DontSync": "Deze map niet synchroniseren", + "FolderOperation_Empty": "Map legen", + "FolderOperation_MarkAllAsRead": "Alles als gelezen markeren", + "FolderOperation_Move": "Verplaatsen", + "DragMoveToFolderCaption": "Verplaatsen naar {0}", + "FolderOperation_None": "Geen", + "FolderOperation_Pin": "Vastzetten", + "FolderOperation_Rename": "Hernoemen", + "FolderOperation_Unpin": "Losmaken", + "HoverActionOption_Archive": "Archiveren", + "HoverActionOption_Delete": "Verwijderen", + "HoverActionOption_MoveJunk": "Verplaats naar Ongewenst", + "HoverActionOption_ToggleFlag": "Vlag aan / uit", + "HoverActionOption_ToggleRead": "Gelezen / Ongelezen", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Verzonden", + "MergedAccountCommonFolderDraft": "Concept", + "MergedAccountCommonFolderJunk": "Ongewenst", + "MergedAccountCommonFolderTrash": "Verwijderd", + "MergedAccountCommonFolderArchive": "Archief", + "IMAPSetupDialog_AccountType": "Accounttype", + "IMAPSetupDialog_DisplayName": "Weergavenaam", + "IMAPSetupDialog_DisplayNamePlaceholder": "bijv. Jan Smit", + "IMAPSetupDialog_IncomingMailServer": "Inkomende (IMAP) e-mailserver", + "IMAPSetupDialog_IncomingMailServerPort": "Poort", + "IMAPSetupDialog_MailAddress": "E-mailadres", + "IMAPSetupDialog_MailAddressPlaceholder": "iemand@voorbeeld.nl", + "IMAPSetupDialog_OutgoingMailServer": "Uitgaande (SMTP) e-mailserver", + "IMAPSetupDialog_OutgoingMailServerPassword": "Uitgaande server-wachtwoord", + "IMAPSetupDialog_OutgoingMailServerPort": "Poort", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Uitgaande server vereist authenticatie", + "IMAPSetupDialog_OutgoingMailServerUsername": "Uitgaande server gebruikersnaam", + "IMAPSetupDialog_Password": "Wachtwoord", + "IMAPSetupDialog_RequireSSLForIncomingMail": "SSL verplichten voor inkomende e-mail", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "SSL verplichten voor uitgaande e-mail", + "IMAPSetupDialog_Title": "Geavanceerde IMAP-instellingen", + "IMAPSetupDialog_UseSameConfig": "Dezelfde gebruikersnaam en wachtwoord gebruiken voor het verzenden van e-mail", + "IMAPSetupDialog_Username": "Gebruikersnaam", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domein/johndoe", + "ImageRenderingDisabled": "Afbeeldingsweergave is voor dit bericht uitgeschakeld.", + "InfoBarAction_Enable": "Inschakelen", + "InfoBarMessage_SynchronizationDisabledFolder": "Synchronisatie is uitgeschakeld voor deze map.", + "InfoBarTitle_SynchronizationDisabledFolder": "Uitgeschakelde map", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is aangemaakt", + "Info_AccountCreatedTitle": "Account aanmaken", + "Info_AccountCreationFailedTitle": "Aanmaken van account is mislukt", + "Info_AccountDeletedMessage": "{0} is succesvol verwijderd.", + "Info_AccountDeletedTitle": "Account verwijderd", + "Info_AccountIssueFixFailedTitle": "Mislukt", + "Info_AccountIssueFixSuccessMessage": "Alle accountproblemen zijn opgelost.", + "Info_AccountIssueFixSuccessTitle": "Succesvol", + "Info_AttachmentOpenFailedMessage": "Deze bijlage kan niet geopend worden.", + "Info_AttachmentOpenFailedTitle": "Mislukt", + "Info_AttachmentSaveFailedMessage": "Deze bijlage kan niet opgeslagen worden.", + "Info_AttachmentSaveFailedTitle": "Mislukt", + "Info_AttachmentSaveSuccessMessage": "Bijlage is opgeslagen.", + "Info_AttachmentSaveSuccessTitle": "Bijlage is opgeslagen", + "Info_BackgroundExecutionDeniedMessage": "Uitvoering in de achtergrond voor de app is geweigerd. Dit kan invloed hebben op synchronisatie op de achtergrond en live meldingen.", + "Info_BackgroundExecutionDeniedTitle": "Achtergronduitvoering geweigerd", + "Info_BackgroundExecutionUnknownErrorMessage": "Onbekende fout opgetreden bij het registreren van achtergrondsynchronisatie.", + "Info_BackgroundExecutionUnknownErrorTitle": "Fout bij uitvoeren in achtergrond", + "Info_ComposerMissingMIMEMessage": "Kan het MIME-bestand niet vinden. Synchroniseren kan helpen.", + "Info_ComposerMissingMIMETitle": "Mislukt", + "Info_ContactExistsMessage": "Dit contact staat al in het lijst met ontvangers.", + "Info_ContactExistsTitle": "Contact bestaat", + "Info_DraftFolderMissingMessage": "Conceptmap ontbreekt voor dit account. Controleer uw accountinstellingen.", + "Info_DraftFolderMissingTitle": "Conceptmap ontbreekt", + "Info_FileLaunchFailedTitle": "Kan bestand niet starten", + "Info_InvalidAddressMessage": "{0} is geen geldig e-mailadres.", + "Info_InvalidAddressTitle": "Ongeldig adres", + "Info_InvalidMoveTargetMessage": "Geselecteerde e-mails kunnen niet verplaatst worden naar deze map.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "Er zijn geen logs om te delen.", + "Info_LogsNotFoundTitle": "Logs niet gevonden", + "Info_LogsSavedMessage": "{0} is opgeslagen in de geselecteerde map.", + "Info_LogsSavedTitle": "Opgeslagen", + "Info_MailRenderingFailedMessage": "Deze e-mail is beschadigd of kan niet worden geopend.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Het lijkt erop dat dit product al eerder is gekocht.", + "Info_PurchaseExistsTitle": "Bestaand product", + "Info_PurchaseThankYouMessage": "Hartelijk bedankt!", + "Info_PurchaseThankYouTitle": "Aankoop geslaagd", + "Info_RequestCreationFailedTitle": "Aanvraag aanmaken is mislukt", + "Info_ReviewNetworkErrorMessage": "Er was een netwerkprobleem met uw beoordeling.", + "Info_ReviewNetworkErrorTitle": "Netwerkprobleem", + "Info_ReviewNewMessage": "Alle feedback wordt gewaardeerd. Bedankt voor uw beoordeling!", + "Info_ReviewSuccessTitle": "Bedankt", + "Info_ReviewUnknownErrorMessage": "Er is een onbekend probleem met uw beoordeling. ({0})", + "Info_ReviewUnknownErrorTitle": "Onbekende fout", + "Info_ReviewUpdatedMessage": "Hartelijk dank voor de bijgewerkte beoordeling.", + "Info_SignatureDisabledMessage": "Handtekening voor dit account uitschakelen", + "Info_SignatureDisabledTitle": "Gelukt", + "Info_SignatureSavedMessage": "Nieuwe handtekening is opgeslagen", + "Info_SignatureSavedTitle": "Gelukt", + "Info_SyncCanceledMessage": "Geannuleerd", + "Info_SyncCanceledTitle": "Synchronisatie", + "Info_SyncFailedTitle": "Synchronisatie is mislukt", + "Info_UnsupportedFunctionalityDescription": "Deze functionaliteit is nog niet geïmplementeerd.", + "Info_UnsupportedFunctionalityTitle": "Niet ondersteund", + "Info_UnsubscribeLinkInvalidTitle": "Ongeldige uitschrijf-URI", + "Info_UnsubscribeLinkInvalidMessage": "Deze afmeldlink is ongeldig. Afmelden van de lijst is mislukt.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authenticatiemethode", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Beveiliging van verbinding", + "ImapAuthenticationMethod_Auto": "Automatisch", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Geen authenticatie", + "ImapAuthenticationMethod_Plain": "Normaal wachtwoord", + "ImapAuthenticationMethod_EncryptedPassword": "Versleuteld wachtwoord", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Geen", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Automatisch", + "Justify": "Uitvullen", + "Left": "Links", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "Je moet ten minste 2 accounts hebben om een koppeling te maken.\nDe koppeling zal verwijderd worden bij het opslaan.", + "LinkedAccountsTitle": "Gekoppelde accounts", + "MailOperation_AlwaysMoveFocused": "Altijd verplaatsen naar focus", + "MailOperation_AlwaysMoveOther": "Altijd verplaatsen naar andere", + "MailOperation_Archive": "Archiveren", + "MailOperation_ClearFlag": "Markering wissen", + "MailOperation_DarkEditor": "Donker", + "MailOperation_Delete": "Verwijderen", + "MailOperation_ExportPDF": "Exporteren naar PDF", + "MailOperation_Find": "Zoeken", + "MailOperation_Forward": "Doorsturen", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Groot", + "PaneLengthOption_Medium": "Gemiddeld", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Klein", + "Photos": "Foto’s", + "PreparingFoldersMessage": "Mappen voorbereiden", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Aangepaste IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP-server", + "Results": "Resultaten", + "Right": "Rechts", + "SynchronizationFolderReport_Success": "Up-to-date", + "SynchronizationFolderReport_Failed": "Synchronisatie is mislukt", + "SearchBarPlaceholder": "zoeken", + "SearchingIn": "Zoeken in", + "SettingsAboutGithub_Description": "Ga naar de Issue Tracker in de GitHub-repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Berichten toevoegen aan map Verzonden", + "SettingsAccountManagementAppendMessage_Description": "Maak een kopie van het bericht in de map Verzonden nadat het concept is verzonden. Schakel dit in als u uw e-mails niet ziet nadat u ze hebt verzonden in de map 'Verzonden'.", + "SettingsEditLinkedInbox_Title": "Gekoppelde inbox bewerken", + "SettingsEditLinkedInbox_Description": "Accounts toevoegen, verwijderen, hernoemen of koppeling bewerken.", + "SettingsAboutVersion": "Versie ", + "SettingsAboutWinoDescription": "Lichtgewicht e-mail client voor Windows-apparaten.", + "SettingsAbout_Description": "Meer informatie over Wino.", + "SettingsAbout_Title": "Over", + "SettingsAccentColor_Description": "Wijzig accentkleur van applicatie", + "SettingsAccentColor_Title": "Accentkleur", + "SettingsAccentColor_UseWindowsAccentColor": "Mijn Windows-accentkleur gebruiken", + "SettingsAccountName_Description": "Verander de naam van het account.", + "SettingsAccountName_Title": "Accountnaam", + "SettingsApplicationTheme_Description": "Personaliseer Wino met aangepaste thema's.", + "SettingsApplicationTheme_Title": "Applicatie thema", + "SettingsAvailableThemes_Description": "Selecteer een thema uit Wino’s collectie of pas uw eigen thema's toe.", + "SettingsAvailableThemes_Title": "Beschikbare thema's", + "SettingsCustomTheme_Description": "Maak uw eigen aangepaste thema met aangepaste achtergrond en accentkleur.", + "SettingsCustomTheme_Title": "Aangepast Thema", + "SettingsDeleteAccount_Description": "Verwijder alle e-mails en referenties die aan dit account zijn gekoppeld.", + "SettingsDeleteAccount_Title": "Verwijder dit account", + "SettingsDeleteProtection_Description": "Moet Wino u om bevestiging vragen elke keer dat u een e-mail met Shift + Del verwijderd?", + "SettingsDeleteProtection_Title": "Permanente verwijder-bescherming", + "SettingsDiagnostics_Description": "Voor ontwikkelaars", + "SettingsDiagnostics_Title": "Diagnose", + "SettingsDiscord_Description": "Krijg regelmatige ontwikkelingsupdates, neem deel aan roadmap discussies en geef feedback.", + "SettingsDiscord_Title": "Discord-kanaal", + "SettingsElementThemeSelectionDisabled": "Element themaselectie is uitgeschakeld wanneer een niet-standaard thema is geselecteerd.", + "SettingsElementTheme_Description": "Selecteer een Windows-thema voor Wino", + "SettingsElementTheme_Title": "Element thema", + "SettingsEnableHoverActions_Title": "Inschakelen van aanwijsacties", + "SettingsEnableIMAPLogs_Description": "Schakel dit in om gegevens over IMAP-connectiviteit te verstrekken die je had tijdens de IMAP-server installatie.", + "SettingsEnableIMAPLogs_Title": "IMAP Protocol Logs inschakelen", + "SettingsEnableLogs_Description": "Mogelijk heb ik de logs nodig om de door jou geopende problemen op GitHub te kunnen analyseren. Geen van de logs zal uw inloggegevens of gevoelige informatie bevatten.", + "SettingsEnableLogs_Title": "Logs inschakelen", + "SettingsEnableSignature": "Handtekening inschakelen", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/pl_PL/resources.json b/Wino.Core.Domain/Translations/pl_PL/resources.json new file mode 100644 index 00000000..580cc40f --- /dev/null +++ b/Wino.Core.Domain/Translations/pl_PL/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "gotowe", + "AccountCreationDialog_Initializing": "inicjowanie", + "AccountCreationDialog_PreparingFolders": "Trwa pobieranie informacji o folderach.", + "AccountCreationDialog_SigninIn": "Zapisywanie danych konta.", + "AccountEditDialog_Message": "Nazwa konta", + "AccountEditDialog_Title": "Edytuj konto", + "AccountPickerDialog_Title": "Wybierz konto", + "AddHyperlink": "Dodaj", + "AutoDiscoveryProgressMessage": "Wyszukiwanie ustawień poczty...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Konfiguracja zaawansowana", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Twoje dane logowania będą przechowywane lokalnie tylko na Twoim komputerze.", + "BasicIMAPSetupDialog_Description": "Niektóre konta wymagają dodatkowych kroków do zalogowania", + "BasicIMAPSetupDialog_DisplayName": "Wyświetlana nazwa", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "np. Jan Kowalski", + "BasicIMAPSetupDialog_LearnMore": "Dowiedz się więcej", + "BasicIMAPSetupDialog_MailAddress": "Adres e-mail", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "jankowalski@jakasdomena.pl", + "BasicIMAPSetupDialog_Password": "Hasło", + "BasicIMAPSetupDialog_Title": "Konto IMAP", + "Buttons_AddAccount": "Dodaj konto", + "Buttons_ApplyTheme": "Zastosuj motyw", + "Buttons_Browse": "Przeglądaj", + "Buttons_Cancel": "Anuluj", + "Buttons_Close": "Zamknij", + "Buttons_Create": "Utwórz", + "Buttons_CreateAccount": "Utwórz konto", + "Buttons_Delete": "Usuń", + "Buttons_Discard": "Odrzuć", + "Buttons_EnableImageRendering": "Włącz", + "Buttons_No": "Nie", + "Buttons_Open": "Otwórz", + "Buttons_Purchase": "Kup", + "Buttons_RateWino": "Oceń Wino", + "Buttons_Save": "Zapisz", + "Buttons_SaveConfiguration": "Zapisz konfigurację", + "Buttons_Share": "Udostępnij", + "Buttons_SignIn": "Zaloguj się", + "Buttons_Yes": "Tak", + "Center": "Wyśrodkuj", + "ComingSoon": "Już wkrótce...", + "ComposerFrom": "Od: ", + "ComposerSubject": "Temat: ", + "ComposerTo": "Do: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "kliknij Enter, aby wprowadzić adresy", + "CustomThemeBuilder_AccentColorDescription": "Ustaw niestandardowy kolor akcentu, jeśli chcesz. Nie wybierając koloru, zostanie użyty kolor akcentu Windows.", + "CustomThemeBuilder_AccentColorTitle": "Kolor akcentów", + "CustomThemeBuilder_PickColor": "Wybierz", + "CustomThemeBuilder_ThemeNameDescription": "Unikalna nazwa dla Twojego motywu.", + "CustomThemeBuilder_ThemeNameTitle": "Nazwa motywu", + "CustomThemeBuilder_Title": "Kreator niestandardowych motywów", + "CustomThemeBuilder_WallpaperDescription": "Ustaw niestandardową tapetę dla Wino", + "CustomThemeBuilder_WallpaperTitle": "Ustaw niestandardową tapetę", + "DialogMessage_AccountLimitMessage": "Osiągnąłeś limit utworzonych kont.\nCzy chcesz kupić dodatek \"Nielimitowane konto\", aby kontynuować?", + "DialogMessage_AccountLimitTitle": "Osiągnięto limit konta", + "DialogMessage_CleanupFolderMessage": "Czy chcesz trwale usunąć wszystkie wiadomości z tego folderu?", + "DialogMessage_CleanupFolderTitle": "Opróżnianie folderu", + "DialogMessage_ComposerMissingRecipientMessage": "Wiadomość nie ma odbiorcy.", + "DialogMessage_ComposerValidationFailedTitle": "Walidacja nie powiodła się", + "DialogMessage_CreateLinkedAccountMessage": "Nadaj nowemu połączeniu nazwę. Konta zostaną scalone pod tą nazwą.", + "DialogMessage_CreateLinkedAccountTitle": "Nazwa połączonego konta", + "DialogMessage_DeleteAccountConfirmationMessage": "Usunąć {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "Wszystkie dane powiązane z tym kontem zostaną trwale usunięte z dysku.", + "DialogMessage_DiscardDraftConfirmationMessage": "Ta wersja robocza zostanie odrzucona. Czy chcesz kontynuować?", + "DialogMessage_DiscardDraftConfirmationTitle": "Porzuć wersje roboczą", + "DialogMessage_HardDeleteConfirmationMessage": "Usuń trwale", + "DialogMessage_HardDeleteConfirmationTitle": "Wiadomość(ci) zostaną trwale usunięte. Czy chcesz kontynuować?", + "DialogMessage_NoAccountsForCreateMailMessage": "Nie masz żadnych kont z których możesz utworzyć wiadomość.", + "DialogMessage_NoAccountsForCreateMailTitle": "Brak konta", + "DialogMessage_RenameLinkedAccountsMessage": "Wprowadź nową nazwę dla połączonego konta", + "DialogMessage_RenameLinkedAccountsTitle": "Zmień nazwę połączonego konta", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Ta operacja nie usunie Twoich kont, tylko przerwie połączenie dla wspólnych folderów. Czy chcesz kontynuować?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Odłącz konto", + "DialogMessage_EmptySubjectConfirmation": "Brak tematu", + "DialogMessage_EmptySubjectConfirmationMessage": "Wiadomość nie ma tematu. Czy chcesz kontynuować?", + "Dialog_DontAskAgain": "Nie pytaj ponownie", + "DiscordChannelDisclaimerMessage": "Wino nie ma własnego serwera Discorda, ale specjalny kanał \"wino-mail\" który jest hostowany na serwerze \"Developer Sanctuary\".\nAby otrzymywać najświeższe informacje o Wino dołącz do serwera Developer Sanctuary i obserwuj kanał 'wino-mail' pod 'Community Projects'\n\nZostaniesz przekierowany na adres URL serwera, ponieważ Discord nie obsługuje kanałów zaproszeń.", + "DiscordChannelDisclaimerTitle": "Ważne informacje o kanale na Discordzie", + "Draft": "Wersja robocza", + "EditorToolbarOption_Draw": "Rysowanie", + "EditorToolbarOption_Format": "Formatowanie", + "EditorToolbarOption_Insert": "Wstawianie", + "EditorToolbarOption_None": "Żadne", + "EditorToolbarOption_Options": "Opcje", + "ElementTheme_Dark": "Tryb ciemny", + "ElementTheme_Default": "Użyj ustawień systemowych", + "ElementTheme_Light": "Tryb jasny", + "Emoji": "Emotikony", + "Exception_ImapClientPoolFailed": "Pula klienta IMAP nie powiodła się.", + "Exception_AuthenticationCanceled": "Anulowano uwierzytelnianie", + "Exception_CustomThemeExists": "Ten motyw już istnieje.", + "Exception_CustomThemeMissingName": "Musisz podać nazwę.", + "Exception_CustomThemeMissingWallpaper": "Musisz podać niestandardowy obraz tła.", + "Exception_FailedToSynchronizeFolders": "Nie udało się zsynchronizować folderów", + "Exception_GoogleAuthCallbackNull": "Adres uri wywołania zwrotnego jest pusty przy aktywacji.", + "Exception_GoogleAuthCorruptedCode": "Uszkodzona odpowiedź autoryzacji.", + "Exception_GoogleAuthError": "Błąd autoryzacji OAuth: {0}", + "Exception_GoogleAuthInvalidResponse": "Otrzymano żądanie z nieprawidłowym stanem ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Wymiana kodu autoryzacji nie powiodła się.", + "Exception_InvalidSystemFolderConfiguration": "Konfiguracja folderu systemowego jest nieprawidłowa. Sprawdź konfigurację i spróbuj ponownie.", + "Exception_NullAssignedAccount": "Przypisane konto jest puste", + "Exception_NullAssignedFolder": "Przypisany folder jest pusty", + "Exception_SynchronizerFailureHTTP": "Obsługa odpowiedzi nie powiodła się. Kod błędu HTTP: {0}", + "Exception_TokenGenerationFailed": "Generowanie tokenu nie powiodło się", + "Exception_TokenInfoRetrivalFailed": "Nie udało się uzyskać informacji o tokenie.", + "Exception_UnknowErrorDuringAuthentication": "Wystąpił nieznany błąd podczas uwierzytelniania", + "Exception_UnsupportedAction": "Akcja {0} nie jest zaimplementowana w procesorze żądania", + "Exception_UnsupportedProvider": "Ten dostawca nie jest obsługiwany.", + "Exception_UnsupportedSynchronizerOperation": "Ta operacja nie jest obsługiwana dla {0}", + "Exception_UserCancelSystemFolderSetupDialog": "Użytkownik anulował okno dialogowe konfiguracji folderów systemowych.", + "Files": "Pliki", + "FilteringOption_All": "Wszystkie", + "FilteringOption_Flagged": "Oflagowane", + "FilteringOption_Unread": "Nieprzeczytane", + "Focused": "Priorytetowe", + "FolderOperation_CreateSubFolder": "Utwórz podfolder", + "FolderOperation_Delete": "Usuń", + "FolderOperation_DontSync": "Nie synchronizuj tego folderu", + "FolderOperation_Empty": "Opróżnij ten folder", + "FolderOperation_MarkAllAsRead": "Oznacz wszystkie jako przeczytane", + "FolderOperation_Move": "Przenieś", + "DragMoveToFolderCaption": "Przenieś do {0}", + "FolderOperation_None": "Żadne", + "FolderOperation_Pin": "Przypnij", + "FolderOperation_Rename": "Zmień nazwę", + "FolderOperation_Unpin": "Odepnij", + "HoverActionOption_Archive": "Archiwizuj", + "HoverActionOption_Delete": "Usuń", + "HoverActionOption_MoveJunk": "Przenieś do wiadomości-śmieci", + "HoverActionOption_ToggleFlag": "Oflaguj / Usuń flagę", + "HoverActionOption_ToggleRead": "Przeczytane / Nieprzeczytane", + "MergedAccountCommonFolderInbox": "Skrzynka odbiorcza", + "MergedAccountCommonFolderSent": "Wysłane", + "MergedAccountCommonFolderDraft": "Wersje robocze", + "MergedAccountCommonFolderJunk": "Wiadomości-śmieci", + "MergedAccountCommonFolderTrash": "Usunięte", + "MergedAccountCommonFolderArchive": "Archiwum", + "IMAPSetupDialog_AccountType": "Typ konta", + "IMAPSetupDialog_DisplayName": "Wyświetlana nazwa", + "IMAPSetupDialog_DisplayNamePlaceholder": "np. Jan Kowalski", + "IMAPSetupDialog_IncomingMailServer": "Serwer poczty przychodzącej", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Adres e-mail", + "IMAPSetupDialog_MailAddressPlaceholder": "ktoś@przykład.com", + "IMAPSetupDialog_OutgoingMailServer": "Serwer poczty wychodzącej (SMTP)", + "IMAPSetupDialog_OutgoingMailServerPassword": "Hasło serwera wychodzącego", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Serwer wychodzący wymaga uwierzytelnienia", + "IMAPSetupDialog_OutgoingMailServerUsername": "Nazwa użytkownika serwera wychodzącego", + "IMAPSetupDialog_Password": "Hasło", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Wymagaj SSL dla poczty przychodzącej", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Wymagaj SSL dla poczty wychodzącej", + "IMAPSetupDialog_Title": "Zaawansowana konfiguracja IMAP", + "IMAPSetupDialog_UseSameConfig": "Użyj tej samej nazwy użytkownika i hasła dla poczty wychodzącej", + "IMAPSetupDialog_Username": "Nazwa użytkownika", + "IMAPSetupDialog_UsernamePlaceholder": "jankowalski, jankowalski@jakasdomena.com, domena/jankowalski", + "ImageRenderingDisabled": "Wyświetlanie obrazów jest wyłączone dla tej wiadomości.", + "InfoBarAction_Enable": "Włącz", + "InfoBarMessage_SynchronizationDisabledFolder": "Ten folder jest wyłączony z synchronizacji.", + "InfoBarTitle_SynchronizationDisabledFolder": "Katalog niesynchronizowany", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "Utworzono {0}", + "Info_AccountCreatedTitle": "Tworzenie konta", + "Info_AccountCreationFailedTitle": "Tworzenie konta nie powiodło się", + "Info_AccountDeletedMessage": "Usunięto {0}.", + "Info_AccountDeletedTitle": "Konto usunięte", + "Info_AccountIssueFixFailedTitle": "Nie powiodło się", + "Info_AccountIssueFixSuccessMessage": "Naprawiono wszystkie problemy z kontem.", + "Info_AccountIssueFixSuccessTitle": "Zakończono pomyślnie", + "Info_AttachmentOpenFailedMessage": "Nie można otworzyć tego załącznika.", + "Info_AttachmentOpenFailedTitle": "Nie powiodło się", + "Info_AttachmentSaveFailedMessage": "Nie można zapisać tego załącznika.", + "Info_AttachmentSaveFailedTitle": "Nie powiodło się", + "Info_AttachmentSaveSuccessMessage": "Załącznik został zapisany.", + "Info_AttachmentSaveSuccessTitle": "Zapisano załącznik", + "Info_BackgroundExecutionDeniedMessage": "Odmowa działania aplikacji w tle. Może to mieć wpływ na synchronizację w tle i powiadomienia na żywo.", + "Info_BackgroundExecutionDeniedTitle": "Odmowa działania w tle", + "Info_BackgroundExecutionUnknownErrorMessage": "Wystąpił nieznany błąd podczas rejestracji synchronizacji w tle.", + "Info_BackgroundExecutionUnknownErrorTitle": "Działanie w tle nie powiodło się", + "Info_ComposerMissingMIMEMessage": "Nie można zlokalizować pliku MIME. Synchronizacja może pomóc.", + "Info_ComposerMissingMIMETitle": "Nie powiodło się", + "Info_ContactExistsMessage": "Ten kontakt jest już na liście odbiorców.", + "Info_ContactExistsTitle": "Kontakt istnieje", + "Info_DraftFolderMissingMessage": "Brak folderu wersji roboczych dla tego konta. Proszę sprawdzić ustawienia konta.", + "Info_DraftFolderMissingTitle": "Brak folderu wersji roboczych", + "Info_FileLaunchFailedTitle": "Nie udało się uruchomić pliku", + "Info_InvalidAddressMessage": "{0} nie jest prawidłowym adresem e-mail.", + "Info_InvalidAddressTitle": "Błędny adres", + "Info_InvalidMoveTargetMessage": "Nie możesz przenieść zaznaczonych wiadomości do tego folderu.", + "Info_InvalidMoveTargetTitle": "Nieprawidłowy folder docelowy", + "Info_LogsNotFoundMessage": "Brak logów do udostępnienia.", + "Info_LogsNotFoundTitle": "Nie znaleziono logów", + "Info_LogsSavedMessage": "{0} został zapisany w wybranym folderze.", + "Info_LogsSavedTitle": "Zapisano", + "Info_MailRenderingFailedMessage": "Ta wiadomość jest uszkodzona lub nie może zostać otwarta.\n{0}", + "Info_MailRenderingFailedTitle": "Wyświetlenie nie powiodło się", + "Info_MessageCorruptedMessage": "Ta wiadomość jest uszkodzona.", + "Info_MessageCorruptedTitle": "Błąd", + "Info_MissingFolderMessage": "{0} nie istnieje dla tego konta.", + "Info_MissingFolderTitle": "Brakujący folder", + "Info_PurchaseExistsMessage": "Wygląda na to, że ten produkt został już zakupiony wcześniej.", + "Info_PurchaseExistsTitle": "Produkt już został wykupiony", + "Info_PurchaseThankYouMessage": "Dziękuję", + "Info_PurchaseThankYouTitle": "Zakup zakończony pomyślnie", + "Info_RequestCreationFailedTitle": "Nie udało się utworzyć żądań", + "Info_ReviewNetworkErrorMessage": "Wystąpił problem sieciowy z Twoją recenzją.", + "Info_ReviewNetworkErrorTitle": "Problem z siecią", + "Info_ReviewNewMessage": "Wszelkie informacje zwrotne mile widziane. Dziękuję za Twoją opinię!", + "Info_ReviewSuccessTitle": "Dziękuję", + "Info_ReviewUnknownErrorMessage": "Wystąpił nieznany błąd podczas wystawiania recenzji. ({0})", + "Info_ReviewUnknownErrorTitle": "Nieznany błąd", + "Info_ReviewUpdatedMessage": "Dziękuję za aktualizację recenzji.", + "Info_SignatureDisabledMessage": "Wyłączono podpis dla tego konta", + "Info_SignatureDisabledTitle": "Zakończono pomyślnie", + "Info_SignatureSavedMessage": "Nowy podpis został zapisany", + "Info_SignatureSavedTitle": "Zakończono pomyślnie", + "Info_SyncCanceledMessage": "Anulowano", + "Info_SyncCanceledTitle": "Synchronizacja", + "Info_SyncFailedTitle": "Synchronizacja nieudana", + "Info_UnsupportedFunctionalityDescription": "Ta funkcjonalność nie jest jeszcze zaimplementowana.", + "Info_UnsupportedFunctionalityTitle": "Nieobsługiwane", + "Info_UnsubscribeLinkInvalidTitle": "Nieprawidłowy link anulowania subskrypcji", + "Info_UnsubscribeLinkInvalidMessage": "Link anulowania subskrypcji jest nieprawidłowy. Nie udało się wypisać z listy subskrybentów.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Metoda autoryzacji", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Zabezpieczenia dot. połączenia", + "ImapAuthenticationMethod_Auto": "Automatyczne", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Brak uwierzytelnienia", + "ImapAuthenticationMethod_Plain": "Normale hasło", + "ImapAuthenticationMethod_EncryptedPassword": "Zaszyfrowane hasło", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Brak", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Automatyczne", + "Justify": "Wyjustuj", + "Left": "Wyrównaj do lewej", + "Link": "Odnośnik", + "LinkedAccountsCreatePolicyMessage": "musisz mieć co najmniej 2 konta, aby je połączyć\npołączenie zostanie usunięte przy zapisywaniu", + "LinkedAccountsTitle": "Połączone konta", + "MailOperation_AlwaysMoveFocused": "Zawsze Przenoś do \"Priorytetowe\"", + "MailOperation_AlwaysMoveOther": "Zawsze Przenoś do \"Inne\"", + "MailOperation_Archive": "Archiwizuj", + "MailOperation_ClearFlag": "Usuń flagę", + "MailOperation_DarkEditor": "Ciemny", + "MailOperation_Delete": "Usuń", + "MailOperation_ExportPDF": "Eksportuj do PDF", + "MailOperation_Find": "Znajdź", + "MailOperation_Forward": "Prześlij dalej", + "MailOperation_Ignore": "Ignoruj", + "MailOperation_LightEditor": "Jasny", + "MailOperation_MarkAsJunk": "Oznacz jako wiadomość-śmieć", + "MailOperation_MarkAsRead": "Oznacz jako przeczytane", + "MailOperation_MarkAsUnread": "Oznacz jako nieprzeczytane", + "MailOperation_MarkNotJunk": "Oznacz jako nieśmieciową wiadomość", + "MailOperation_Move": "Przenieś", + "MailOperation_MoveFocused": "Przenieś do: Priorytetowe", + "MailOperation_MoveJunk": "Przenieś do: Wiadomości-śmieci", + "MailOperation_MoveOther": "Przenieś do: Inne", + "MailOperation_Navigate": "Nawiguj", + "MailOperation_Print": "Drukuj", + "MailOperation_Reply": "Odpowiedz", + "MailOperation_ReplyAll": "Odpowiedz wszystkim", + "MailOperation_SaveAs": "Zapisz jako", + "MailOperation_SetFlag": "Ustaw flagę", + "MailOperation_Unarchive": "Odarchiwizuj", + "MailOperation_Zoom": "Powiększ", + "MailsSelected": "{0} zaznaczonych elementów", + "MarkFlagUnflag": "Oznacz jako oflagowane/nieoflagowane", + "MarkReadUnread": "Oznacz jako przeczytane/nieprzeczytane", + "MenuManageAccounts": "Zarządzaj kontami", + "MenuNewMail": "Nowa wiadomość", + "MenuMergedAccountItemAccountsSuffix": " kont", + "MenuRate": "Oceń Wino", + "MenuSettings": "Ustawienia", + "MergedAccountsAvailableAccountsTitle": "Dostępne konta", + "More": "Więcej", + "MoveMailDialog_InvalidFolderMessage": "{0} nie jest prawidłowym folderem dla tej wiadomości.", + "MoveMailDialog_Title": "Wybierz folder", + "NewAccountDialog_AccountName": "Nazwa konta", + "NewAccountDialog_AccountNameDefaultValue": "Osobiste", + "NewAccountDialog_AccountNamePlaceholder": "np. Osobista poczta", + "NewAccountDialog_Title": "Dodaj nowe konto", + "NoMailSelected": "nie wybrano żadnej wiadomości", + "NoMessageCrieteria": "żadne wiadomości nie spełniają kryteriów wyszukiwania.", + "NoMessageEmptyFolder": "ten folder jest pusty.", + "Notifications_MultipleNotificationsMessage": "Masz {0} nowych wiadomości", + "Notifications_MultipleNotificationsTitle": "Nowa poczta", + "Notifications_WinoUpdatedMessage": "Sprawdź nową wersję {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail został zaktualizowany.", + "Other": "Inne", + "PaneLengthOption_Default": "Domyślne", + "PaneLengthOption_ExtraLarge": "Bardzo duża", + "PaneLengthOption_Large": "Duża", + "PaneLengthOption_Medium": "Średnia", + "PaneLengthOption_Micro": "Mikro", + "PaneLengthOption_Small": "Mała", + "Photos": "Zdjęcia", + "PreparingFoldersMessage": "Przygotowywanie folderów", + "ProviderDetail_Gmail_Description": "Konto Google", + "ProviderDetail_IMAP_Description": "Serwer IMAP/SMTP", + "ProviderDetail_IMAP_Title": "Serwer IMAP", + "Results": "Wyniki", + "Right": "Wyrównaj do prawej", + "SynchronizationFolderReport_Success": "aktualne", + "SynchronizationFolderReport_Failed": "synchronizacja nieudana", + "SearchBarPlaceholder": "wyszukaj", + "SearchingIn": "szukanie w", + "SettingsAboutGithub_Description": "Przejdź do repozytorium trackera zgłoszeń GitHub.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Dołącz wiadomości do folderu Wysłane", + "SettingsAccountManagementAppendMessage_Description": "Utwórz kopię wiadomości w folderze Wysłane po wysłaniu wersji roboczej. Włącz to, jeśli nie widzisz swoich wiadomości po wysłaniu ich, w folderze Wysłane.", + "SettingsEditLinkedInbox_Title": "Edytuj połączoną skrzynkę odbiorczą", + "SettingsEditLinkedInbox_Description": "Dodaj / usuń konta, zmień nazwę lub zerwij powiązanie między kontami.", + "SettingsAboutVersion": "Wersja ", + "SettingsAboutWinoDescription": "Lekki klient poczty dla rodzin urządzeń Windows.", + "SettingsAbout_Description": "Dowiedz się więcej o Wino.", + "SettingsAbout_Title": "O aplikacji", + "SettingsAccentColor_Description": "Zmień kolor akcentu aplikacji", + "SettingsAccentColor_Title": "Kolor akcentu", + "SettingsAccentColor_UseWindowsAccentColor": "Użyj mojego koloru akcentu Windows", + "SettingsAccountName_Description": "Zmień nazwę konta.", + "SettingsAccountName_Title": "Nazwa konta", + "SettingsApplicationTheme_Description": "Spersonalizuj Wino z innymi niestandardowymi motywami aplikacji.", + "SettingsApplicationTheme_Title": "Motyw aplikacji", + "SettingsAvailableThemes_Description": "Wybierz motyw z kolekcji Wino wedle uznania lub zastosuj własne motywy.", + "SettingsAvailableThemes_Title": "Dostępne motywy", + "SettingsCustomTheme_Description": "Utwórz własny motyw z niestandardową tapetą i kolorem akcentu.", + "SettingsCustomTheme_Title": "Własny motyw", + "SettingsDeleteAccount_Description": "Usuń wszystkie e-maile i dane uwierzytelniające powiązane z tym kontem.", + "SettingsDeleteAccount_Title": "Usuń to konto", + "SettingsDeleteProtection_Description": "Czy Wino powinno poprosić Cię o potwierdzenie za każdym razem, gdy próbujesz trwale usunąć wiadomość za pomocą kombinacji Shift + Del?", + "SettingsDeleteProtection_Title": "Ochrona przed trwałym usunięciem", + "SettingsDiagnostics_Description": "Dla programistów", + "SettingsDiagnostics_Title": "Diagnostyka", + "SettingsDiscord_Description": "Otrzymuj regularne informacje dotyczące rozwoju aplikacji, dołącz do dyskusji o roadmapie i przedstawiaj opinie.", + "SettingsDiscord_Title": "Kanał Discord", + "SettingsElementThemeSelectionDisabled": "Wybór motywu elementu jest wyłączony, gdy wybrany motyw aplikacji jest inny niż Domyślny.", + "SettingsElementTheme_Description": "Wybierz motyw Windows dla Wino", + "SettingsElementTheme_Title": "Motyw elementu", + "SettingsEnableHoverActions_Title": "Włącz akcje po najechaniu kursorem", + "SettingsEnableIMAPLogs_Description": "Włącz tę opcję, aby dostarczyć szczegółów dotyczących problemów z połączeniem IMAP podczas konfiguracji serwera IMAP.", + "SettingsEnableIMAPLogs_Title": "Włącz logi protokołu IMAP", + "SettingsEnableLogs_Description": "Mogę potrzebować logów, kiedy aplikacja ulegnie awarii, by móc zdiagnozować problemy, które zgłosiłeś na GitHubie. Żaden z logów nie ujawni Twoich danych do logowania czy wrażliwych danych.", + "SettingsEnableLogs_Title": "Włącz logi", + "SettingsEnableSignature": "Włącz podpis", + "SettingsExpandOnStartup_Description": "Ustaw czy Wino powinno ukazywać listę folderów tego konta przy uruchomieniu.", + "SettingsExpandOnStartup_Title": "Rozwiń listę folderów przy uruchomieniu", + "SettingsExternalContent_Description": "Zarządzaj zewnętrznymi ustawieniami zawartości podczas wyświetlania wiadomości.", + "SettingsExternalContent_Title": "Zawartość zewnętrzna", + "SettingsFocusedInbox_Description": "Określ, czy skrzynka odbiorcza powinna być podzielona na dwie jako Priorytetowe - Inne.", + "SettingsFocusedInbox_Title": "Priorytetowa skrzynka odbiorcza", + "SettingsFolderSync_Description": "Włącz lub wyłącz synchronizacji określonych folderów.", + "SettingsFolderSync_Title": "Synchronizacja folderów", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Zmień ustawienia poszczególnych folderów, takie jak wyłączenie lub włączenie synchronizacji lub pokazywanie i ukrywanie ikony nieprzeczytanych wiadomości.", + "SettingsHoverActionCenter": "Akcja ze środka", + "SettingsHoverActionLeft": "Akcja z lewej", + "SettingsHoverActionRight": "Akcja z prawej", + "SettingsHoverActions_Description": "Wybierz 3 akcje, które pojawią się, kiedy najedziesz kursorem na wiadomość.", + "SettingsHoverActions_Title": "Akcje po najechaniu kursorem", + "SettingsLanguage_Description": "Zmień język wyświetlania Wino.", + "SettingsLanguage_Title": "Ustawienia języka", + "CategoriesFolderNameOverride": "Kategorie", + "MoreFolderNameOverride": "Więcej", + "SettingsOptions_Title": "Ustawienia", + "SettingsLinkAccounts_Description": "Scal wiele kont w jedno. Przeglądaj wiadomości z jednej skrzynki odbiorczej razem.", + "SettingsLinkAccounts_Title": "Stwórz połączone konta", + "SettingsLinkedAccountsSave_Description": "Modyfikuj bieżące połączenie z nowymi kontami.", + "SettingsLinkedAccountsSave_Title": "Zapisz zmiany", + "SettingsLoadImages_Title": "Automatycznie wczytuj obrazy", + "SettingsLoadStyles_Title": "Automatycznie wczytuj style", + "SettingsMailSpacing_Description": "Dostosuj odstępy dla wiadomości na liście.", + "SettingsMailSpacing_Title": "Odstępy między wiadomościami", + "SettingsFolderMenuStyle_Title": "Utwórz zagnieżdżone foldery", + "SettingsFolderMenuStyle_Description": "Zmień czy foldery konta powinny być zagnieżdżone wewnątrz pozycji menu konta. Wyłącz, jeśli podoba Ci się stary system menu w Windows Mail", + "SettingsManageAccountSettings_Description": "Powiadomienia, podpisy, synchronizacja i inne ustawienia dla każdego konta osobno.", + "SettingsManageAccountSettings_Title": "Zarządzaj ustawieniami konta", + "SettingsManageLink_Description": "Przenieś elementy, aby dodać nowe połączenie lub usunąć istniejące połączenie.", + "SettingsManageLink_Title": "Zarządzaj połączeniem kont", + "SettingsMarkAsRead_Description": "Zmień, co powinno się stać z zaznaczonym elementem.", + "SettingsMarkAsRead_DontChange": "Nie oznaczaj automatycznie elementu jako przeczytany", + "SettingsMarkAsRead_SecondsToWait": "Sekundy do odczekania: ", + "SettingsMarkAsRead_Timer": "Po wyświetleniu w panelu czytania", + "SettingsMarkAsRead_Title": "Oznacz jako przeczytane", + "SettingsMarkAsRead_WhenSelected": "Gdy zaznaczone", + "SettingsMessageList_Description": "Zmień sposób organizacji wiadomości na liście.", + "SettingsMessageList_Title": "Lista wiadomości", + "SettingsNoAccountSetupMessage": "Nie skonfigurowano jeszcze żadnych kont.", + "SettingsNotifications_Description": "Włącz lub wyłącz powiadomienia dla tego konta.", + "SettingsNotifications_Title": "Powiadomienia", + "SettingsPaneLength_Description": "Zmień szerokość listy wiadomości.", + "SettingsPaneLength_Title": "Długość panelu listy wiadomości", + "SettingsPaypal_Description": "Okaż dużo więcej miłości ❤️ Za wszystkie darowizny dziękuję.", + "SettingsPaypal_Title": "Wspomóż przez PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Tryb kompaktowy", + "SettingsPersonalizationMailDisplayMediumMode": "Tryb umiarkowany", + "SettingsPersonalizationMailDisplaySpaciousMode": "Tryb przestronny", + "SettingsPersonalization_Description": "Zmień wygląd Wino tak, jak chcesz.", + "SettingsPersonalization_Title": "Personalizacja", + "SettingsPrivacyPolicy_Description": "Zapoznaj się z Polityką prywatności.", + "SettingsPrivacyPolicy_Title": "Politykę prywatności", + "SettingsReadingPane_Description": "Opcje wyświetlania wiadomości.", + "SettingsReadingPane_Title": "Panel czytania wiadomości", + "SettingsReaderFont_Title": "Domyślna czcionka przy czytaniu wiadomości", + "SettingsReaderFontFamily_Description": "Zmień domyślny rozmiar czcionki i czcionki do odczytu wiadomości.", + "SettingsFontFamily_Title": "Czcionka", + "SettingsFontSize_Title": "Rozmiar czcionki", + "SettingsFontPreview_Title": "Podgląd", + "SettingsComposerFont_Title": "Domyślna czcionka przy pisaniu wiadomości", + "SettingsComposerFontFamily_Description": "Zmień domyślny rozmiar czcionki i czcionki dla pisanej wiadomości.", + "SettingsRenameMergeAccount_Description": "Zmień wyświetlaną nazwę połączonych kont.", + "SettingsRenameMergeAccount_Title": "Zmień nazwę", + "SettingsSemanticZoom_Description": "To pozwoli Ci kliknąć w nagłówki na liście wiadomości i przejść do określonej daty", + "SettingsSemanticZoom_Title": "Semantyczne powiększenie dla nagłówków dat", + "SettingsShowPreviewText_Description": "Ukryj/pokaż tekst podglądu.", + "SettingsShowPreviewText_Title": "Pokaż podgląd tekstu", + "SettingsShowSenderPictures_Description": "Ukryj/pokaż miniaturki zdjęć nadawcy.", + "SettingsShowSenderPictures_Title": "Pokaż awatary nadawcy", + "SettingsPrefer24HourClock_Title": "Wyświetl czas w formacie 24-godzinnym", + "SettingsPrefer24HourClock_Description": "Czas odbioru wiadomości będzie wyświetlany w formacie 24-godzinnym zamiast 12-godzinnym (AM/PM)", + "SettingsSignature_Description": "Edytuj lub usuń podpis konta", + "SettingsSignature_Title": "Podpis", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Okaż trochę miłości ❤️", + "SettingsStore_Title": "Oceń w sklepie", + "SettingsThreads_Description": "Organizuj wiadomości w wątki konwersacji.", + "SettingsThreads_Title": "Wątkowanie konwersacji", + "SettingsUnlinkAccounts_Description": "Usuń połączenie między kontami. Nie spowoduje to usunięcia Twoich kont.", + "SettingsUnlinkAccounts_Title": "Odłącz konto", + "SortingOption_Date": "według daty", + "SortingOption_Name": "według nazwy", + "StoreRatingDialog_MessageFirstLine": "Wszystkie opinie są mile widziane i znacznie poprawią Wino w przyszłości. Czy chcesz ocenić Wino w Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Czy chcesz ocenić Wino Mail w Microsoft Store?", + "StoreRatingDialog_Title": "Podoba Ci się Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Usunięte wiadomości zostaną przeniesione tutaj.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Usunięty folder", + "SystemFolderConfigDialog_DraftFolderDescription": "Nowe wiadomości/odpowiedzi zostaną tutaj stworzone.", + "SystemFolderConfigDialog_DraftFolderHeader": "Folder wersji roboczych", + "SystemFolderConfigDialog_JunkFolderDescription": "Wszelki spam/wiadomości-śmieci będą tutaj.", + "SystemFolderConfigDialog_JunkFolderHeader": "Folder wiadomości-śmieci/spamu", + "SystemFolderConfigDialog_MessageFirstLine": "Ten serwer IMAP nie obsługuje rozszerzenia SPECIAL-USE, dlatego Wino nie mogło prawidłowo skonfigurować folderów systemowych.", + "SystemFolderConfigDialog_MessageSecondLine": "Proszę wybrać odpowiednie foldery dla określonych funkcji.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder, który wysłał wiadomości zostanie zapisany.", + "SystemFolderConfigDialog_SentFolderHeader": "Folder „Wysłane”", + "SystemFolderConfigDialog_Title": "Konfiguruj foldery systemowe", + "TestingImapConnectionMessage": "Testowanie połączenia z serwerem...", + "Today": "Dzisiaj", + "UnknownAddress": "nieznany adres", + "UnknownDateHeader": "Nieznana data", + "UnknownGroupAddress": "nieznana grupa adresów", + "UnknownSender": "Nieznany nadawca", + "Unsubscribe": "Anuluj subskrypcję", + "ViewContactDetails": "Wyświetl szczegóły", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Ulepsz do nielimitowanych kont", + "WinoUpgradeRemainingAccountsMessage": "Wykorzystano {0} z {1} darmowych kont.", + "Yesterday": "Wczoraj" +} diff --git a/Wino.Core.Domain/Translations/ru_RU/resources.json b/Wino.Core.Domain/Translations/ru_RU/resources.json new file mode 100644 index 00000000..f7ff0909 --- /dev/null +++ b/Wino.Core.Domain/Translations/ru_RU/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "все готово", + "AccountCreationDialog_Initializing": "инициализация", + "AccountCreationDialog_PreparingFolders": "На данный момент мы получаем информацию о папках.", + "AccountCreationDialog_SigninIn": "Данные учетной записи сохраняются.", + "AccountEditDialog_Message": "Имя пользователя", + "AccountEditDialog_Title": "Редактировать учетную запись", + "AccountPickerDialog_Title": "Выберите учетную запись", + "AddHyperlink": "Добавить", + "AutoDiscoveryProgressMessage": "Поиск настроек почты...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Расширенная конфигурация", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Ваши учетные данные будут храниться только локально на вашем компьютере.", + "BasicIMAPSetupDialog_Description": "Некоторые учетные записи требуют дополнительных шагов для входа", + "BasicIMAPSetupDialog_DisplayName": "Отображаемое имя", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "напр. Иван Иванов", + "BasicIMAPSetupDialog_LearnMore": "Подробнее", + "BasicIMAPSetupDialog_MailAddress": "Адрес электронной почты", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "ivanivanov@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Пароль", + "BasicIMAPSetupDialog_Title": "Учетная запись IMAP", + "Buttons_AddAccount": "Добавить учетную запись", + "Buttons_ApplyTheme": "Применить тему", + "Buttons_Browse": "Обзор", + "Buttons_Cancel": "Отмена", + "Buttons_Close": "Закрыть", + "Buttons_Create": "Создать", + "Buttons_CreateAccount": "Создать учетную запись", + "Buttons_Delete": "Удалить", + "Buttons_Discard": "Отклонить", + "Buttons_EnableImageRendering": "Включить", + "Buttons_No": "Нет", + "Buttons_Open": "Открыть", + "Buttons_Purchase": "Купить", + "Buttons_RateWino": "Оцените Wino", + "Buttons_Save": "Сохранить", + "Buttons_SaveConfiguration": "Сохранить конфигурацию", + "Buttons_Share": "Поделиться", + "Buttons_SignIn": "Войти", + "Buttons_Yes": "Да", + "Center": "Центр", + "ComingSoon": "Скоро...", + "ComposerFrom": "От: ", + "ComposerSubject": "Тема: ", + "ComposerTo": "Кому: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "нажмите Enter для ввода адресов", + "CustomThemeBuilder_AccentColorDescription": "Установите пользовательский контрастный цвет, если хотите. Если цвет не выбран, будет использоваться контрастный цвет Windows.", + "CustomThemeBuilder_AccentColorTitle": "Контрастный цвет", + "CustomThemeBuilder_PickColor": "Выбрать", + "CustomThemeBuilder_ThemeNameDescription": "Уникальное имя для пользовательской темы.", + "CustomThemeBuilder_ThemeNameTitle": "Название темы", + "CustomThemeBuilder_Title": "Создатель пользовательских тем", + "CustomThemeBuilder_WallpaperDescription": "Установить пользовательские обои для Wino", + "CustomThemeBuilder_WallpaperTitle": "Установить пользовательские обои", + "DialogMessage_AccountLimitMessage": "Вы достигли предела создания учетной записи.\nХотите приобрести дополнение 'Неограниченная учетная запись', чтобы продолжить?", + "DialogMessage_AccountLimitTitle": "Достигнут лимит учетных записей", + "DialogMessage_CleanupFolderMessage": "Вы хотите навсегда удалить все письма в этой папке?", + "DialogMessage_CleanupFolderTitle": "Очистить папку", + "DialogMessage_ComposerMissingRecipientMessage": "Сообщение не имеет получателя.", + "DialogMessage_ComposerValidationFailedTitle": "Проверка не удалась", + "DialogMessage_CreateLinkedAccountMessage": "Дайте этой связке имя. Учетные записи будут объединены под этим именем.", + "DialogMessage_CreateLinkedAccountTitle": "Название связки учетных записей", + "DialogMessage_DeleteAccountConfirmationMessage": "Удалить {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "Все данные, связанные с этой учетной записью, будут окончательно удалены с диска.", + "DialogMessage_DiscardDraftConfirmationMessage": "Этот черновик будет удален. Вы хотите продолжить?", + "DialogMessage_DiscardDraftConfirmationTitle": "Удалить черновик", + "DialogMessage_HardDeleteConfirmationMessage": "Удалить безвозвратно", + "DialogMessage_HardDeleteConfirmationTitle": "Сообщение(я) будут удалены навсегда. Продолжить?", + "DialogMessage_NoAccountsForCreateMailMessage": "У вас нет учетных записей для создания сообщений.", + "DialogMessage_NoAccountsForCreateMailTitle": "Учетная запись отсутствует", + "DialogMessage_RenameLinkedAccountsMessage": "Введите новое имя для связанных учетных записей", + "DialogMessage_RenameLinkedAccountsTitle": "Переименовать имя связанных учетных записей", + "DialogMessage_UnlinkAccountsConfirmationMessage": "Эта операция не удалит ваши учетные записи, но только нарушает ссылку на соединение с общими папками. Вы хотите продолжить?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Отвязать учетные записи", + "DialogMessage_EmptySubjectConfirmation": "Не указана тема письма", + "DialogMessage_EmptySubjectConfirmationMessage": "Сообщение не имеет темы. Вы хотите продолжить?", + "Dialog_DontAskAgain": "Больше не спрашивать", + "DiscordChannelDisclaimerMessage": "У Wino нет собственного сервера Discord, но специальный канал 'wino-mail' размещен на сервере 'Developer Sanctuary'.\nЧтобы получать обновления о Wino, пожалуйста, присоединитесь к серверу Developer Sanctuary и следите за каналом 'wino-mail' в разделе 'Community Projects'.\n\nВы будете направлены на URL сервера, так как Discord не поддерживает приглашения на канал.", + "DiscordChannelDisclaimerTitle": "Важная информация о Discord", + "Draft": "Черновик", + "EditorToolbarOption_Draw": "Рисование", + "EditorToolbarOption_Format": "Форматирование", + "EditorToolbarOption_Insert": "Вставить", + "EditorToolbarOption_None": "Нет", + "EditorToolbarOption_Options": "Настройки", + "ElementTheme_Dark": "Темная тема", + "ElementTheme_Default": "Использовать системные настройки", + "ElementTheme_Light": "Светлая тема", + "Emoji": "Эмодзи", + "Exception_ImapClientPoolFailed": "Сбой пула клиентов IMAP.", + "Exception_AuthenticationCanceled": "Аутентификация отменена", + "Exception_CustomThemeExists": "Такая тема уже существует.", + "Exception_CustomThemeMissingName": "Необходимо указать название.", + "Exception_CustomThemeMissingWallpaper": "Необходимо предоставить пользовательское фоновое изображение.", + "Exception_FailedToSynchronizeFolders": "Не удалось синхронизировать папки", + "Exception_GoogleAuthCallbackNull": "Callback uri пустой при активации.", + "Exception_GoogleAuthCorruptedCode": "Поврежденный ответ авторизации.", + "Exception_GoogleAuthError": "Ошибка авторизации OAuth: {0}", + "Exception_GoogleAuthInvalidResponse": "Получен запрос с недопустимым состоянием ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Не удалось выполнить обмен кодом авторизации.", + "Exception_InvalidSystemFolderConfiguration": "Конфигурация системных папок неверна. Проверьте конфигурацию и повторите попытку.", + "Exception_NullAssignedAccount": "Назначенная учетная запись пустая", + "Exception_NullAssignedFolder": "Назначенная папка пустая", + "Exception_SynchronizerFailureHTTP": "Не удалось обработать ответ с ошибкой HTTP код {0}", + "Exception_TokenGenerationFailed": "Ошибка генерации токена", + "Exception_TokenInfoRetrivalFailed": "Не удалось получить информацию о токене.", + "Exception_UnknowErrorDuringAuthentication": "Во время аутентификации произошла неизвестная ошибка", + "Exception_UnsupportedAction": "Действие {0} не реализовано в процессоре запросов", + "Exception_UnsupportedProvider": "Этот провайдер не поддерживается.", + "Exception_UnsupportedSynchronizerOperation": "Эта операция не поддерживается для {0}", + "Exception_UserCancelSystemFolderSetupDialog": "Пользователь отменил диалог конфигурации системной папки.", + "Files": "Файлы", + "FilteringOption_All": "Все", + "FilteringOption_Flagged": "Помеченные", + "FilteringOption_Unread": "Непрочитанные", + "Focused": "Фокусировка", + "FolderOperation_CreateSubFolder": "Создать подпапку", + "FolderOperation_Delete": "Удалить", + "FolderOperation_DontSync": "Не синхронизировать эту папку", + "FolderOperation_Empty": "Очистить папку", + "FolderOperation_MarkAllAsRead": "Пометить все как прочитанные", + "FolderOperation_Move": "Переместить", + "DragMoveToFolderCaption": "Переместить в {0}", + "FolderOperation_None": "Нет", + "FolderOperation_Pin": "Закрепить", + "FolderOperation_Rename": "Переименовать", + "FolderOperation_Unpin": "Открепить", + "HoverActionOption_Archive": "Архивировать", + "HoverActionOption_Delete": "Удалить", + "HoverActionOption_MoveJunk": "Переместить в мусор", + "HoverActionOption_ToggleFlag": "Флаг / Убрать флаг", + "HoverActionOption_ToggleRead": "Прочитанное / Непрочитанное", + "MergedAccountCommonFolderInbox": "Входящие", + "MergedAccountCommonFolderSent": "Отправленные", + "MergedAccountCommonFolderDraft": "Черновики", + "MergedAccountCommonFolderJunk": "Мусор", + "MergedAccountCommonFolderTrash": "Удалено", + "MergedAccountCommonFolderArchive": "Архив", + "IMAPSetupDialog_AccountType": "Тип учетной записи", + "IMAPSetupDialog_DisplayName": "Отображаемое имя", + "IMAPSetupDialog_DisplayNamePlaceholder": "напр. Иван Иванов", + "IMAPSetupDialog_IncomingMailServer": "Сервер входящей почты", + "IMAPSetupDialog_IncomingMailServerPort": "Порт", + "IMAPSetupDialog_MailAddress": "Адрес электронной почты", + "IMAPSetupDialog_MailAddressPlaceholder": "кто-то@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Сервер исходящей почты (SMTP)", + "IMAPSetupDialog_OutgoingMailServerPassword": "Пароль сервера исходящей почты", + "IMAPSetupDialog_OutgoingMailServerPort": "Порт", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Сервер исходящей почты требует аутентификации", + "IMAPSetupDialog_OutgoingMailServerUsername": "Имя пользователя исходящей сервера", + "IMAPSetupDialog_Password": "Пароль", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Требовать SSL для входящего сообщения", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Требовать SSL для исходящей почты", + "IMAPSetupDialog_Title": "Расширенная конфигурация IMAP", + "IMAPSetupDialog_UseSameConfig": "Используйте то же имя пользователя и пароль для отправки электронной почты", + "IMAPSetupDialog_Username": "Имя пользователя", + "IMAPSetupDialog_UsernamePlaceholder": "иваниванов, ivanivanov@fabrikam.com, домен/иваниванов", + "ImageRenderingDisabled": "Отображение изображений отключено для этого сообщения.", + "InfoBarAction_Enable": "Включено", + "InfoBarMessage_SynchronizationDisabledFolder": "Эта папка отключена для синхронизации.", + "InfoBarTitle_SynchronizationDisabledFolder": "Папка отключена", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} создано", + "Info_AccountCreatedTitle": "Создание учетной записи", + "Info_AccountCreationFailedTitle": "Не удалось создать учетную запись", + "Info_AccountDeletedMessage": "{0} успешно удалён.", + "Info_AccountDeletedTitle": "Учетная запись удалена", + "Info_AccountIssueFixFailedTitle": "Ошибка", + "Info_AccountIssueFixSuccessMessage": "Исправлены все проблемы с учетной записью.", + "Info_AccountIssueFixSuccessTitle": "Успешно", + "Info_AttachmentOpenFailedMessage": "Не удается открыть это вложение.", + "Info_AttachmentOpenFailedTitle": "Ошибка", + "Info_AttachmentSaveFailedMessage": "Не удается сохранить это вложение.", + "Info_AttachmentSaveFailedTitle": "Ошибка", + "Info_AttachmentSaveSuccessMessage": "Вложение сохранено.", + "Info_AttachmentSaveSuccessTitle": "Вложение сохранено", + "Info_BackgroundExecutionDeniedMessage": "Отказано в выполнении фонового режима. Это может повлиять на фоновую синхронизацию и прямые уведомления.", + "Info_BackgroundExecutionDeniedTitle": "Отказано в выполнении фонового режима", + "Info_BackgroundExecutionUnknownErrorMessage": "Произошла неизвестная ошибка при регистрации фоновой синхронизации.", + "Info_BackgroundExecutionUnknownErrorTitle": "Ошибка исполнения фона", + "Info_ComposerMissingMIMEMessage": "Не удалось найти MIME-файл. Синхронизация может помочь.", + "Info_ComposerMissingMIMETitle": "Ошибка", + "Info_ContactExistsMessage": "Этот контакт уже есть в списке получателей.", + "Info_ContactExistsTitle": "Контакт уже существует", + "Info_DraftFolderMissingMessage": "У этой учетной записи отсутствует папка \"Черновики\". Проверьте настройки учетной записи.", + "Info_DraftFolderMissingTitle": "Отсутствует папка \"Черновики\"", + "Info_FileLaunchFailedTitle": "Не удалось запустить файл", + "Info_InvalidAddressMessage": "'{0}' не является допустимым адресом электронной почты.", + "Info_InvalidAddressTitle": "Недопустимый адрес", + "Info_InvalidMoveTargetMessage": "Вы не можете переместить выбранные письма в эту папку.", + "Info_InvalidMoveTargetTitle": "Недопустимая цель перемещения", + "Info_LogsNotFoundMessage": "Нет журналов для отправки.", + "Info_LogsNotFoundTitle": "Журналы не найдены", + "Info_LogsSavedMessage": "{0} сохранено в выбранную папку.", + "Info_LogsSavedTitle": "Сохранено", + "Info_MailRenderingFailedMessage": "Это письмо повреждено или не может быть открыто.\n{0}", + "Info_MailRenderingFailedTitle": "Ошибка отображения", + "Info_MessageCorruptedMessage": "Это сообщение повреждено.", + "Info_MessageCorruptedTitle": "Ошибка", + "Info_MissingFolderMessage": "{0} не существует для этой учетной записи.", + "Info_MissingFolderTitle": "Отсутствует папка", + "Info_PurchaseExistsMessage": "Похоже, этот товар уже был куплен ранее.", + "Info_PurchaseExistsTitle": "Существующий товар", + "Info_PurchaseThankYouMessage": "Спасибо!", + "Info_PurchaseThankYouTitle": "Покупка прошла успешно", + "Info_RequestCreationFailedTitle": "Не удалось создать запросы", + "Info_ReviewNetworkErrorMessage": "При отправке вашего отзыва возникли проблемы с сетью.", + "Info_ReviewNetworkErrorTitle": "Проблема с сетью", + "Info_ReviewNewMessage": "Все замечания приветствуются. Спасибо за отзыв!", + "Info_ReviewSuccessTitle": "Спасибо!", + "Info_ReviewUnknownErrorMessage": "При отправке вашего отзыва возникла неизвестная проблема. ({0})", + "Info_ReviewUnknownErrorTitle": "Неизвестная ошибка", + "Info_ReviewUpdatedMessage": "Спасибо за обновленный отзыв.", + "Info_SignatureDisabledMessage": "Отключена подпись для этой учетной записи", + "Info_SignatureDisabledTitle": "Успешно", + "Info_SignatureSavedMessage": "Новая подпись сохранена", + "Info_SignatureSavedTitle": "Успешно", + "Info_SyncCanceledMessage": "Отменено", + "Info_SyncCanceledTitle": "Синхронизация", + "Info_SyncFailedTitle": "Ошибка синхронизации", + "Info_UnsupportedFunctionalityDescription": "Эта функция еще не реализована.", + "Info_UnsupportedFunctionalityTitle": "Не поддерживается", + "Info_UnsubscribeLinkInvalidTitle": "Неправильный адрес отписки", + "Info_UnsubscribeLinkInvalidMessage": "Ссылка недействительна. Не удалось отписаться от списка рассылки.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Метод авторизации", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Безопасность соединения", + "ImapAuthenticationMethod_Auto": "Автоматически", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "Без авторизации", + "ImapAuthenticationMethod_Plain": "Обычный пароль", + "ImapAuthenticationMethod_EncryptedPassword": "Зашифрованный пароль", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "Нет", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Автоматически", + "Justify": "Выравнять", + "Left": "Слева", + "Link": "Связать", + "LinkedAccountsCreatePolicyMessage": "Для создания связки у вас должно быть не менее 2 учетных записей\nсвязка будет удалена при сохранении", + "LinkedAccountsTitle": "Связанные учетные записи", + "MailOperation_AlwaysMoveFocused": "Всегда перемещать в Фокусировку", + "MailOperation_AlwaysMoveOther": "Всегда перемещать в Другие", + "MailOperation_Archive": "Архивировать", + "MailOperation_ClearFlag": "Убрать пометку", + "MailOperation_DarkEditor": "Темная тема", + "MailOperation_Delete": "Удалить", + "MailOperation_ExportPDF": "Экспорт в PDF", + "MailOperation_Find": "Найти", + "MailOperation_Forward": "Переслать", + "MailOperation_Ignore": "Игнорировать", + "MailOperation_LightEditor": "Светлая тема", + "MailOperation_MarkAsJunk": "Пометить как мусор", + "MailOperation_MarkAsRead": "Пометить как прочитанное", + "MailOperation_MarkAsUnread": "Пометить как непрочитанное", + "MailOperation_MarkNotJunk": "Пометить как не мусор", + "MailOperation_Move": "Переместить", + "MailOperation_MoveFocused": "Переместить в Фокусировку", + "MailOperation_MoveJunk": "Переместить в мусор", + "MailOperation_MoveOther": "Переместить в Другие", + "MailOperation_Navigate": "Перейти", + "MailOperation_Print": "Печать", + "MailOperation_Reply": "Ответить", + "MailOperation_ReplyAll": "Ответить всем", + "MailOperation_SaveAs": "Сохранить как", + "MailOperation_SetFlag": "Пометить", + "MailOperation_Unarchive": "Вернуть из архива", + "MailOperation_Zoom": "Масштаб", + "MailsSelected": "Выбрано бесед: {0}", + "MarkFlagUnflag": "Пометить как помеченное/неотмеченное", + "MarkReadUnread": "Пометить как прочитанное/непрочитанное", + "MenuManageAccounts": "Учетные записи", + "MenuNewMail": "Новое сообщение", + "MenuMergedAccountItemAccountsSuffix": " учетных записей", + "MenuRate": "Оценить Wino", + "MenuSettings": "Параметры", + "MergedAccountsAvailableAccountsTitle": "Доступные учетные записи", + "More": "Подробнее", + "MoveMailDialog_InvalidFolderMessage": "{0} не является допустимой папкой для этого письма.", + "MoveMailDialog_Title": "Выбрать папку", + "NewAccountDialog_AccountName": "Имя учетной записи", + "NewAccountDialog_AccountNameDefaultValue": "Личная", + "NewAccountDialog_AccountNamePlaceholder": "например \"Личная почта\"", + "NewAccountDialog_Title": "Добавить учетную запись", + "NoMailSelected": "не выбрано сообщение", + "NoMessageCrieteria": "нет сообщений, удовлетворяющих критериям поиска.", + "NoMessageEmptyFolder": "эта папка пуста.", + "Notifications_MultipleNotificationsMessage": "У вас {0} новых писем", + "Notifications_MultipleNotificationsTitle": "Новые письма", + "Notifications_WinoUpdatedMessage": "Ознакомьтесь с новой версией {0}", + "Notifications_WinoUpdatedTitle": "Почта Wino обновлена.", + "Other": "Другое", + "PaneLengthOption_Default": "По умолчанию", + "PaneLengthOption_ExtraLarge": "Очень большая", + "PaneLengthOption_Large": "Большая", + "PaneLengthOption_Medium": "Средняя", + "PaneLengthOption_Micro": "Очень маленькая", + "PaneLengthOption_Small": "Маленькая", + "Photos": "Фотографии", + "PreparingFoldersMessage": "Подготовка папок", + "ProviderDetail_Gmail_Description": "Учетная запись Google", + "ProviderDetail_IMAP_Description": "Пользовательский сервер IMAP/SMTP", + "ProviderDetail_IMAP_Title": "Сервер IMAP", + "Results": "Результаты", + "Right": "Справа", + "SynchronizationFolderReport_Success": "Обновлено", + "SynchronizationFolderReport_Failed": "Сбой синхронизации", + "SearchBarPlaceholder": "Поиск", + "SearchingIn": "Поиск в", + "SettingsAboutGithub_Description": "Перейти к трекеру задач репозитория GitHub.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Добавлять сообщения в папку \"Отправленные\"", + "SettingsAccountManagementAppendMessage_Description": "После отправки черновика создается копия сообщения в папке \"Отправленные\". Включите эту функцию, если вы не видите свои письма в папке \"Отправленные\" после их отправки.", + "SettingsEditLinkedInbox_Title": "Редактировать связанную папку \"Входящие\"", + "SettingsEditLinkedInbox_Description": "Добавляйте/удаляйте учетные записи, переименовывайте или разрывайте связь между ними.", + "SettingsAboutVersion": "Версия ", + "SettingsAboutWinoDescription": "Легкий почтовый клиент для семейства устройств Windows.", + "SettingsAbout_Description": "Узнать больше о Wino.", + "SettingsAbout_Title": "О программе", + "SettingsAccentColor_Description": "Измените цветовую схему приложения", + "SettingsAccentColor_Title": "Цветовая схема", + "SettingsAccentColor_UseWindowsAccentColor": "Использовать цветовую схему Windows", + "SettingsAccountName_Description": "Измените имя учетной записи.", + "SettingsAccountName_Title": "Имя учетной записи", + "SettingsApplicationTheme_Description": "Персонализируйте Wino с помощью различных пользовательских тем приложения по своему вкусу.", + "SettingsApplicationTheme_Title": "Тема приложения", + "SettingsAvailableThemes_Description": "Выберите тему из коллекции Wino на свой вкус или используйте свои собственные темы.", + "SettingsAvailableThemes_Title": "Доступные темы", + "SettingsCustomTheme_Description": "Создайте свою собственную тему с помощью собственных обоев и цветовой схемы.", + "SettingsCustomTheme_Title": "Пользовательская тема", + "SettingsDeleteAccount_Description": "Удалите все письма и учетные данные, связанные с этой учетной записью.", + "SettingsDeleteAccount_Title": "Удалить эту учетную запись", + "SettingsDeleteProtection_Description": "Должен ли Wino запрашивать у вас подтверждение каждый раз, когда вы пытаетесь окончательно удалить письмо с помощью клавиш Shift + Del?", + "SettingsDeleteProtection_Title": "Защита от окончательного удаления", + "SettingsDiagnostics_Description": "Для разработчиков", + "SettingsDiagnostics_Title": "Диагностика", + "SettingsDiscord_Description": "Получайте регулярные обновления о разработке, присоединяйтесь к обсуждениям дорожной карты и делитесь отзывами.", + "SettingsDiscord_Title": "Канал Discord", + "SettingsElementThemeSelectionDisabled": "Выбор режима темы не работает, если выбрана тема приложения, отличная от темы \"По умолчанию\".", + "SettingsElementTheme_Description": "Выберите тему Windows для Wino", + "SettingsElementTheme_Title": "Режим темы", + "SettingsEnableHoverActions_Title": "Включить действия при наведении", + "SettingsEnableIMAPLogs_Description": "Включите эту опцию, чтобы получить подробную информацию о проблемах подключения IMAP, возникших во время настройки сервера IMAP.", + "SettingsEnableIMAPLogs_Title": "Включить журнал протокола IMAP", + "SettingsEnableLogs_Description": "Мне могут понадобиться журналы сбоев для диагностики задач, которые вы открыли на GitHub. Ни один из журналов не раскрывает ваши учетные данные или конфиденциальную информацию.", + "SettingsEnableLogs_Title": "Включить журналы", + "SettingsEnableSignature": "Включить подпись", + "SettingsExpandOnStartup_Description": "Укажите, следует ли Wino разворачивать папки этой учетной записи при запуске.", + "SettingsExpandOnStartup_Title": "Разворачивать меню при загрузке", + "SettingsExternalContent_Description": "Управление настройками внешнего содержимого при отображении писем.", + "SettingsExternalContent_Title": "Внешнее содержимое", + "SettingsFocusedInbox_Description": "Укажите, следует ли разделять папку \"Входящие\" на две папки \"Фокусировка\" - \"Другие\".", + "SettingsFocusedInbox_Title": "Фокусировка", + "SettingsFolderSync_Description": "Включите или отключите синхронизацию определенных папок.", + "SettingsFolderSync_Title": "Синхронизация папок", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Кнопка по центру", + "SettingsHoverActionLeft": "Левая кнопка", + "SettingsHoverActionRight": "Правая кнопка", + "SettingsHoverActions_Description": "Выберите 3 действия, которые будут показаны при наведении курсора на письма.", + "SettingsHoverActions_Title": "Действия при наведении", + "SettingsLanguage_Description": "Изменить язык интерфейса Wino.", + "SettingsLanguage_Title": "Язык интерфейса", + "CategoriesFolderNameOverride": "Категории", + "MoreFolderNameOverride": "Ещё", + "SettingsOptions_Title": "Параметры", + "SettingsLinkAccounts_Description": "Объедините несколько учетных записей в одну. Просматривайте письма из одной папки \"Входящие\".", + "SettingsLinkAccounts_Title": "Создать связанные учетные записи", + "SettingsLinkedAccountsSave_Description": "Изменить текущую привязку на новые учетные записи.", + "SettingsLinkedAccountsSave_Title": "Сохранить изменения", + "SettingsLoadImages_Title": "Автозагрузка изображений", + "SettingsLoadStyles_Title": "Автозагрузка стилей", + "SettingsMailSpacing_Description": "Настройте интервал между письмами.", + "SettingsMailSpacing_Title": "Интервал между письмами", + "SettingsFolderMenuStyle_Title": "Создать вложенные папки", + "SettingsFolderMenuStyle_Description": "Выберите, должны ли папки учетных записей находится внутри пункта меню «Учетные записи». Выключите эту опцию, если вам нравится старая система меню в Почте Windows", + "SettingsManageAccountSettings_Description": "Уведомления, подписи, синхронизация и другие настройки для каждой учетной записи.", + "SettingsManageAccountSettings_Title": "Управление настройками учетной записи", + "SettingsManageLink_Description": "Перемещайте элементы, чтобы добавить новую или удалить существующую привязку.", + "SettingsManageLink_Title": "Управление привязкой", + "SettingsMarkAsRead_Description": "Выберите, что должно произойти с выбранным элементом.", + "SettingsMarkAsRead_DontChange": "Не помечать элементы как прочитанные автоматически", + "SettingsMarkAsRead_SecondsToWait": "Секунд осталось: ", + "SettingsMarkAsRead_Timer": "При просмотре в панели чтения", + "SettingsMarkAsRead_Title": "Пометить как прочитанное", + "SettingsMarkAsRead_WhenSelected": "При выборе", + "SettingsMessageList_Description": "Измените способ организации сообщений в почтовом списке.", + "SettingsMessageList_Title": "Список сообщений", + "SettingsNoAccountSetupMessage": "Вы еще не создали ни одной учетной записи.", + "SettingsNotifications_Description": "Включите или отключите уведомления для этой учетной записи.", + "SettingsNotifications_Title": "Уведомления", + "SettingsPaneLength_Description": "Измените ширину почтового списка.", + "SettingsPaneLength_Title": "Длина панели почтового списка", + "SettingsPaypal_Description": "Проявите больше любви ❤️ Все пожертвования высоко ценятся.", + "SettingsPaypal_Title": "Пожертвовать через PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Компактный режим", + "SettingsPersonalizationMailDisplayMediumMode": "Средний режим", + "SettingsPersonalizationMailDisplaySpaciousMode": "Просторный режим", + "SettingsPersonalization_Description": "Измените внешний вид Wino по своему вкусу.", + "SettingsPersonalization_Title": "Персонализация", + "SettingsPrivacyPolicy_Description": "Ознакомьтесь с политикой конфиденциальности.", + "SettingsPrivacyPolicy_Title": "Политика конфиденциальности", + "SettingsReadingPane_Description": "Параметры отображения почты.", + "SettingsReadingPane_Title": "Панель чтения", + "SettingsReaderFont_Title": "Шрифт по умолчанию", + "SettingsReaderFontFamily_Description": "Измените семейство и размер шрифта по умолчанию для чтения писем.", + "SettingsFontFamily_Title": "Семейство шрифтов", + "SettingsFontSize_Title": "Размер шрифта", + "SettingsFontPreview_Title": "Предпросмотр", + "SettingsComposerFont_Title": "Шрифт редактора по умолчанию", + "SettingsComposerFontFamily_Description": "Измените семейство и размер шрифта по умолчанию при написании писем.", + "SettingsRenameMergeAccount_Description": "Измените отображаемое имя связанных учетных записей.", + "SettingsRenameMergeAccount_Title": "Переименовать", + "SettingsSemanticZoom_Description": "Это позволит вам нажимать на заголовки в списке сообщений и переходить к определенной дате", + "SettingsSemanticZoom_Title": "Семантическое масштабирование заголовков даты", + "SettingsShowPreviewText_Description": "Скрыть/показать текст предпросмотра.", + "SettingsShowPreviewText_Title": "Показать текст предпросмотра", + "SettingsShowSenderPictures_Description": "Скрыть/показать миниатюру изображения отправителя.", + "SettingsShowSenderPictures_Title": "Показывать аватары отправителя", + "SettingsPrefer24HourClock_Title": "24-часовой формат отображения времени", + "SettingsPrefer24HourClock_Description": "Время получения почты будет отображаться в 24-часовом формате вместо 12 (AM/PM)", + "SettingsSignature_Description": "Редактировать или удалить подпись учетной записи", + "SettingsSignature_Title": "Подпись", + "SettingsStartupItem_Description": "Основной элемент учетной записи для загрузки папки \"Входящие\" при запуске.", + "SettingsStartupItem_Title": "Элемент при запуске", + "SettingsStore_Description": "Проявите любовь ❤️", + "SettingsStore_Title": "Оценить в магазине приложений", + "SettingsThreads_Description": "Организуйте сообщения в беседы.", + "SettingsThreads_Title": "Беседы", + "SettingsUnlinkAccounts_Description": "Удалить связь между учетными записями. Это не приведет к удалению учетных записей.", + "SettingsUnlinkAccounts_Title": "Отвязать учетные записи", + "SortingOption_Date": "по дате", + "SortingOption_Name": "по имени", + "StoreRatingDialog_MessageFirstLine": "Все отзывы приветствуются, и они помогут сделать Wino лучше в будущем. Вы хотите оценить Wino в Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Вы хотите оценить Почту Wino в Microsoft Store?", + "StoreRatingDialog_Title": "Вам нравится Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Удаленные сообщения будут перемещены сюда.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Папка \"Удаленные\"", + "SystemFolderConfigDialog_DraftFolderDescription": "Здесь будут создаваться новые письма/ответы.", + "SystemFolderConfigDialog_DraftFolderHeader": "Папка \"Черновики\"", + "SystemFolderConfigDialog_JunkFolderDescription": "Все спам/нежелательные письма будут здесь.", + "SystemFolderConfigDialog_JunkFolderHeader": "Папка \"Спам\"", + "SystemFolderConfigDialog_MessageFirstLine": "Этот IMAP-сервер не поддерживает расширение SPECIAL-USE, поэтому Wino не смог правильно настроить системные папки.", + "SystemFolderConfigDialog_MessageSecondLine": "Пожалуйста, выберите соответствующие папки для определенных функций.", + "SystemFolderConfigDialog_SentFolderDescription": "Папка, в которой будут храниться отправленные сообщения.", + "SystemFolderConfigDialog_SentFolderHeader": "Папка \"Отправленные\"", + "SystemFolderConfigDialog_Title": "Настройка системных папок", + "TestingImapConnectionMessage": "Проверка соединения с сервером...", + "Today": "Сегодня", + "UnknownAddress": "Неизвестный адрес", + "UnknownDateHeader": "Неизвестная дата", + "UnknownGroupAddress": "Неизвестный адрес почтовой группы", + "UnknownSender": "Неизвестный отправитель", + "Unsubscribe": "Отписаться", + "ViewContactDetails": "Показать подробности", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Улучшить до неограниченного количества учетных записей", + "WinoUpgradeRemainingAccountsMessage": "Использовано {0} из {1} бесплатных учетных записей.", + "Yesterday": "Вчера" +} diff --git a/Wino.Core.Domain/Translations/tr_TR/resources.json b/Wino.Core.Domain/Translations/tr_TR/resources.json new file mode 100644 index 00000000..15218a84 --- /dev/null +++ b/Wino.Core.Domain/Translations/tr_TR/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "all done", + "AccountCreationDialog_Initializing": "başlatılıyor", + "AccountCreationDialog_PreparingFolders": "Klasör bilgileri yükleniyor.", + "AccountCreationDialog_SigninIn": "Hesap bilgileri kaydediliyor.", + "AccountEditDialog_Message": "Account Name", + "AccountEditDialog_Title": "Hesabı Düzenle", + "AccountPickerDialog_Title": "Pick an account", + "AddHyperlink": "Add", + "AutoDiscoveryProgressMessage": "Searching for mail settings...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Advanced Configuration", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Your credentials will only be stored locally on your computer.", + "BasicIMAPSetupDialog_Description": "Some accounts require additional steps to sign in", + "BasicIMAPSetupDialog_DisplayName": "Display Name", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "BasicIMAPSetupDialog_LearnMore": "Learn more", + "BasicIMAPSetupDialog_MailAddress": "E-Mail Address", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Password", + "BasicIMAPSetupDialog_Title": "IMAP Account", + "Buttons_AddAccount": "Add Account", + "Buttons_ApplyTheme": "Apply Theme", + "Buttons_Browse": "Browse", + "Buttons_Cancel": "Cancel", + "Buttons_Close": "Close", + "Buttons_Create": "Create", + "Buttons_CreateAccount": "Create Account", + "Buttons_Delete": "Delete", + "Buttons_Discard": "Discard", + "Buttons_EnableImageRendering": "Enable", + "Buttons_No": "No", + "Buttons_Open": "Open", + "Buttons_Purchase": "Purchase", + "Buttons_RateWino": "Rate Wino", + "Buttons_Save": "Save", + "Buttons_SaveConfiguration": "Save Configuration", + "Buttons_Share": "Share", + "Buttons_SignIn": "Sign In", + "Buttons_Yes": "Yes", + "Center": "Center", + "ComingSoon": "Coming soon...", + "ComposerFrom": "From: ", + "ComposerSubject": "Subject: ", + "ComposerTo": "To: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "click enter to input addresses", + "CustomThemeBuilder_AccentColorDescription": "Set custom accent color if you wish. Not selecting a color will use your Windows accent color.", + "CustomThemeBuilder_AccentColorTitle": "Accent color", + "CustomThemeBuilder_PickColor": "Pick", + "CustomThemeBuilder_ThemeNameDescription": "Unique name for your custom theme.", + "CustomThemeBuilder_ThemeNameTitle": "Theme name", + "CustomThemeBuilder_Title": "Custom Theme Builder", + "CustomThemeBuilder_WallpaperDescription": "Set a custom wallpaper for Wino", + "CustomThemeBuilder_WallpaperTitle": "Set custom wallpaper", + "DialogMessage_AccountLimitMessage": "You have reached the account creation limit.\nWould you like to purchase 'Unlimited Account' add-on to continue?", + "DialogMessage_AccountLimitTitle": "Account Limit Reached", + "DialogMessage_CleanupFolderMessage": "Do you want to permanently delete all the mails in this folder?", + "DialogMessage_CleanupFolderTitle": "Cleanup Folder", + "DialogMessage_ComposerMissingRecipientMessage": "Message has no recipient.", + "DialogMessage_ComposerValidationFailedTitle": "Validation Failed", + "DialogMessage_CreateLinkedAccountMessage": "Give this new link a name. Accounts will be merged under this name.", + "DialogMessage_CreateLinkedAccountTitle": "Account Link Name", + "DialogMessage_DeleteAccountConfirmationMessage": "Delete {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "All data associated with this account will be deleted from disk permanently.", + "DialogMessage_DiscardDraftConfirmationMessage": "This draft will be discarded. Do you want to continue?", + "DialogMessage_DiscardDraftConfirmationTitle": "Discard Draft", + "DialogMessage_HardDeleteConfirmationMessage": "Permanent Delete", + "DialogMessage_HardDeleteConfirmationTitle": "Message(s) will be permanently deleted. Do you want to continue?", + "DialogMessage_NoAccountsForCreateMailMessage": "You don't have any accounts to create message from.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account Missing", + "DialogMessage_RenameLinkedAccountsMessage": "Enter new name for linked account", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Unlink Accounts", + "DialogMessage_EmptySubjectConfirmation": "Missin Subject", + "DialogMessage_EmptySubjectConfirmationMessage": "Message has no subject. Do you want to continue?", + "Dialog_DontAskAgain": "Don't ask again", + "DiscordChannelDisclaimerMessage": "Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server.\nTo get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects'\n\nYou will be directed to server URL since Discord doesn't support channel invites.", + "DiscordChannelDisclaimerTitle": "Important Discord Information", + "Draft": "Draft", + "EditorToolbarOption_Draw": "Draw", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insert", + "EditorToolbarOption_None": "None", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Dark mode", + "ElementTheme_Default": "Use system setting", + "ElementTheme_Light": "Light mode", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool failed.", + "Exception_AuthenticationCanceled": "Authentication canceled", + "Exception_CustomThemeExists": "This theme already exists.", + "Exception_CustomThemeMissingName": "You must provide a name.", + "Exception_CustomThemeMissingWallpaper": "You must provide a custom background image.", + "Exception_FailedToSynchronizeFolders": "Failed to synchronize folders", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Corrupted authorization response.", + "Exception_GoogleAuthError": "OAuth authorization error: {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "System folder configuration is not valid. Check configuration and try again.", + "Exception_NullAssignedAccount": "Assigned account is null", + "Exception_NullAssignedFolder": "Assigned folder is null", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Token generation failed", + "Exception_TokenInfoRetrivalFailed": "Failed to get token information.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "This provider is not supported.", + "Exception_UnsupportedSynchronizerOperation": "This operation is not supported for {0}", + "Exception_UserCancelSystemFolderSetupDialog": "User canceled system folder config dialog.", + "Files": "Files", + "FilteringOption_All": "All", + "FilteringOption_Flagged": "Flagged", + "FilteringOption_Unread": "Unread", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Create sub folder", + "FolderOperation_Delete": "Delete", + "FolderOperation_DontSync": "Don't sync this folder", + "FolderOperation_Empty": "Empty this folder", + "FolderOperation_MarkAllAsRead": "Mark all as read", + "FolderOperation_Move": "Move", + "DragMoveToFolderCaption": "Move to {0}", + "FolderOperation_None": "None", + "FolderOperation_Pin": "Pin", + "FolderOperation_Rename": "Rename", + "FolderOperation_Unpin": "Unpin", + "HoverActionOption_Archive": "Archive", + "HoverActionOption_Delete": "Delete", + "HoverActionOption_MoveJunk": "Move to Junk", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Outgoing (SMTP) mail server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Outgoing server password", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Outgoing server requires authentication", + "IMAPSetupDialog_OutgoingMailServerUsername": "Outgoing server user name", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Network Issue", + "Info_ReviewNewMessage": "All feedbacks are appreciated. Thank you for the review!", + "Info_ReviewSuccessTitle": "Thank you", + "Info_ReviewUnknownErrorMessage": "There was an unknown issue with your review. ({0})", + "Info_ReviewUnknownErrorTitle": "Unknown Error", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Synchronization Failed", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Unsupported", + "Info_UnsubscribeLinkInvalidTitle": "Invalid Unsubscribe Uri", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Connection security", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "No authentication", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/uk_UA/resources.json b/Wino.Core.Domain/Translations/uk_UA/resources.json new file mode 100644 index 00000000..54ddd05d --- /dev/null +++ b/Wino.Core.Domain/Translations/uk_UA/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "all done", + "AccountCreationDialog_Initializing": "initializing", + "AccountCreationDialog_PreparingFolders": "We are getting folder information at the moment.", + "AccountCreationDialog_SigninIn": "Account information is being saved.", + "AccountEditDialog_Message": "Account Name", + "AccountEditDialog_Title": "Edit Account", + "AccountPickerDialog_Title": "Pick an account", + "AddHyperlink": "Add", + "AutoDiscoveryProgressMessage": "Searching for mail settings...", + "BasicIMAPSetupDialog_AdvancedConfiguration": "Advanced Configuration", + "BasicIMAPSetupDialog_CredentialLocalMessage": "Your credentials will only be stored locally on your computer.", + "BasicIMAPSetupDialog_Description": "Some accounts require additional steps to sign in", + "BasicIMAPSetupDialog_DisplayName": "Display Name", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "BasicIMAPSetupDialog_LearnMore": "Learn more", + "BasicIMAPSetupDialog_MailAddress": "E-Mail Address", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "Password", + "BasicIMAPSetupDialog_Title": "IMAP Account", + "Buttons_AddAccount": "Add Account", + "Buttons_ApplyTheme": "Apply Theme", + "Buttons_Browse": "Browse", + "Buttons_Cancel": "Cancel", + "Buttons_Close": "Close", + "Buttons_Create": "Create", + "Buttons_CreateAccount": "Create Account", + "Buttons_Delete": "Delete", + "Buttons_Discard": "Discard", + "Buttons_EnableImageRendering": "Enable", + "Buttons_No": "No", + "Buttons_Open": "Open", + "Buttons_Purchase": "Purchase", + "Buttons_RateWino": "Rate Wino", + "Buttons_Save": "Save", + "Buttons_SaveConfiguration": "Save Configuration", + "Buttons_Share": "Share", + "Buttons_SignIn": "Sign In", + "Buttons_Yes": "Yes", + "Center": "Center", + "ComingSoon": "Coming soon...", + "ComposerFrom": "From: ", + "ComposerSubject": "Subject: ", + "ComposerTo": "To: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "click enter to input addresses", + "CustomThemeBuilder_AccentColorDescription": "Set custom accent color if you wish. Not selecting a color will use your Windows accent color.", + "CustomThemeBuilder_AccentColorTitle": "Accent color", + "CustomThemeBuilder_PickColor": "Pick", + "CustomThemeBuilder_ThemeNameDescription": "Unique name for your custom theme.", + "CustomThemeBuilder_ThemeNameTitle": "Theme name", + "CustomThemeBuilder_Title": "Custom Theme Builder", + "CustomThemeBuilder_WallpaperDescription": "Set a custom wallpaper for Wino", + "CustomThemeBuilder_WallpaperTitle": "Set custom wallpaper", + "DialogMessage_AccountLimitMessage": "You have reached the account creation limit.\nWould you like to purchase 'Unlimited Account' add-on to continue?", + "DialogMessage_AccountLimitTitle": "Account Limit Reached", + "DialogMessage_CleanupFolderMessage": "Do you want to permanently delete all the mails in this folder?", + "DialogMessage_CleanupFolderTitle": "Cleanup Folder", + "DialogMessage_ComposerMissingRecipientMessage": "Message has no recipient.", + "DialogMessage_ComposerValidationFailedTitle": "Validation Failed", + "DialogMessage_CreateLinkedAccountMessage": "Give this new link a name. Accounts will be merged under this name.", + "DialogMessage_CreateLinkedAccountTitle": "Account Link Name", + "DialogMessage_DeleteAccountConfirmationMessage": "Delete {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "All data associated with this account will be deleted from disk permanently.", + "DialogMessage_DiscardDraftConfirmationMessage": "This draft will be discarded. Do you want to continue?", + "DialogMessage_DiscardDraftConfirmationTitle": "Discard Draft", + "DialogMessage_HardDeleteConfirmationMessage": "Permanent Delete", + "DialogMessage_HardDeleteConfirmationTitle": "Message(s) will be permanently deleted. Do you want to continue?", + "DialogMessage_NoAccountsForCreateMailMessage": "You don't have any accounts to create message from.", + "DialogMessage_NoAccountsForCreateMailTitle": "Account Missing", + "DialogMessage_RenameLinkedAccountsMessage": "Enter new name for linked account", + "DialogMessage_RenameLinkedAccountsTitle": "Rename Linked Account", + "DialogMessage_UnlinkAccountsConfirmationMessage": "This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "Unlink Accounts", + "DialogMessage_EmptySubjectConfirmation": "Missin Subject", + "DialogMessage_EmptySubjectConfirmationMessage": "Message has no subject. Do you want to continue?", + "Dialog_DontAskAgain": "Don't ask again", + "DiscordChannelDisclaimerMessage": "Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server.\nTo get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects'\n\nYou will be directed to server URL since Discord doesn't support channel invites.", + "DiscordChannelDisclaimerTitle": "Important Discord Information", + "Draft": "Draft", + "EditorToolbarOption_Draw": "Draw", + "EditorToolbarOption_Format": "Format", + "EditorToolbarOption_Insert": "Insert", + "EditorToolbarOption_None": "None", + "EditorToolbarOption_Options": "Options", + "ElementTheme_Dark": "Dark mode", + "ElementTheme_Default": "Use system setting", + "ElementTheme_Light": "Light mode", + "Emoji": "Emoji", + "Exception_ImapClientPoolFailed": "IMAP Client Pool failed.", + "Exception_AuthenticationCanceled": "Authentication canceled", + "Exception_CustomThemeExists": "This theme already exists.", + "Exception_CustomThemeMissingName": "You must provide a name.", + "Exception_CustomThemeMissingWallpaper": "You must provide a custom background image.", + "Exception_FailedToSynchronizeFolders": "Failed to synchronize folders", + "Exception_GoogleAuthCallbackNull": "Callback uri is null on activation.", + "Exception_GoogleAuthCorruptedCode": "Corrupted authorization response.", + "Exception_GoogleAuthError": "OAuth authorization error: {0}", + "Exception_GoogleAuthInvalidResponse": "Received request with invalid state ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "Authorization code exchange failed.", + "Exception_InvalidSystemFolderConfiguration": "System folder configuration is not valid. Check configuration and try again.", + "Exception_NullAssignedAccount": "Assigned account is null", + "Exception_NullAssignedFolder": "Assigned folder is null", + "Exception_SynchronizerFailureHTTP": "Response handling failed with error HTTP code {0}", + "Exception_TokenGenerationFailed": "Token generation failed", + "Exception_TokenInfoRetrivalFailed": "Failed to get token information.", + "Exception_UnknowErrorDuringAuthentication": "Unknown error occurred during authentication", + "Exception_UnsupportedAction": "Action {0} is not implemented in request processor", + "Exception_UnsupportedProvider": "This provider is not supported.", + "Exception_UnsupportedSynchronizerOperation": "This operation is not supported for {0}", + "Exception_UserCancelSystemFolderSetupDialog": "User canceled system folder config dialog.", + "Files": "Files", + "FilteringOption_All": "All", + "FilteringOption_Flagged": "Flagged", + "FilteringOption_Unread": "Unread", + "Focused": "Focused", + "FolderOperation_CreateSubFolder": "Create sub folder", + "FolderOperation_Delete": "Delete", + "FolderOperation_DontSync": "Don't sync this folder", + "FolderOperation_Empty": "Empty this folder", + "FolderOperation_MarkAllAsRead": "Mark all as read", + "FolderOperation_Move": "Move", + "DragMoveToFolderCaption": "Move to {0}", + "FolderOperation_None": "None", + "FolderOperation_Pin": "Pin", + "FolderOperation_Rename": "Rename", + "FolderOperation_Unpin": "Unpin", + "HoverActionOption_Archive": "Archive", + "HoverActionOption_Delete": "Delete", + "HoverActionOption_MoveJunk": "Move to Junk", + "HoverActionOption_ToggleFlag": "Flag / Unflag", + "HoverActionOption_ToggleRead": "Read / Unread", + "MergedAccountCommonFolderInbox": "Inbox", + "MergedAccountCommonFolderSent": "Sent", + "MergedAccountCommonFolderDraft": "Draft", + "MergedAccountCommonFolderJunk": "Junk", + "MergedAccountCommonFolderTrash": "Deleted", + "MergedAccountCommonFolderArchive": "Archive", + "IMAPSetupDialog_AccountType": "Account type", + "IMAPSetupDialog_DisplayName": "Display Name", + "IMAPSetupDialog_DisplayNamePlaceholder": "eg. John Doe", + "IMAPSetupDialog_IncomingMailServer": "Incoming mail server", + "IMAPSetupDialog_IncomingMailServerPort": "Port", + "IMAPSetupDialog_MailAddress": "Email address", + "IMAPSetupDialog_MailAddressPlaceholder": "someone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "Outgoing (SMTP) mail server", + "IMAPSetupDialog_OutgoingMailServerPassword": "Outgoing server password", + "IMAPSetupDialog_OutgoingMailServerPort": "Port", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Outgoing server requires authentication", + "IMAPSetupDialog_OutgoingMailServerUsername": "Outgoing server user name", + "IMAPSetupDialog_Password": "Password", + "IMAPSetupDialog_RequireSSLForIncomingMail": "Require SSL for incoming email", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "Require SSL for outgoing email", + "IMAPSetupDialog_Title": "Advanced IMAP Configuration", + "IMAPSetupDialog_UseSameConfig": "Use the same username and password for sending email", + "IMAPSetupDialog_Username": "Username", + "IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "Image rendering is disabled for this message.", + "InfoBarAction_Enable": "Enable", + "InfoBarMessage_SynchronizationDisabledFolder": "This folder is disabled for synchronization.", + "InfoBarTitle_SynchronizationDisabledFolder": "Disabled Folder", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} is created", + "Info_AccountCreatedTitle": "Account Creation", + "Info_AccountCreationFailedTitle": "Account Creation Failed", + "Info_AccountDeletedMessage": "{0} is successfuly deleted.", + "Info_AccountDeletedTitle": "Account Deleted", + "Info_AccountIssueFixFailedTitle": "Failed", + "Info_AccountIssueFixSuccessMessage": "Fixed all account issues.", + "Info_AccountIssueFixSuccessTitle": "Success", + "Info_AttachmentOpenFailedMessage": "Can't open this attachment.", + "Info_AttachmentOpenFailedTitle": "Failed", + "Info_AttachmentSaveFailedMessage": "Can't save this attachment.", + "Info_AttachmentSaveFailedTitle": "Failed", + "Info_AttachmentSaveSuccessMessage": "Attachment is saved.", + "Info_AttachmentSaveSuccessTitle": "Attachment Saved", + "Info_BackgroundExecutionDeniedMessage": "Background execution for the app is denied. This may affect background synchronization and live notifications.", + "Info_BackgroundExecutionDeniedTitle": "Denied Background Execution", + "Info_BackgroundExecutionUnknownErrorMessage": "Unknown exception occurred when registering background synchronizer.", + "Info_BackgroundExecutionUnknownErrorTitle": "Background Execution Failure", + "Info_ComposerMissingMIMEMessage": "Couldn't locate the MIME file. Synchronizing may help.", + "Info_ComposerMissingMIMETitle": "Failed", + "Info_ContactExistsMessage": "This contact is already in the recipient list.", + "Info_ContactExistsTitle": "Contact Exists", + "Info_DraftFolderMissingMessage": "Draft folder is missing for this account. Please check your account settings.", + "Info_DraftFolderMissingTitle": "Missing Draft Folder", + "Info_FileLaunchFailedTitle": "Failed to launch file", + "Info_InvalidAddressMessage": "'{0}' is not a valid e-mail address.", + "Info_InvalidAddressTitle": "Invalid Address", + "Info_InvalidMoveTargetMessage": "You can't move selected mails to this folder.", + "Info_InvalidMoveTargetTitle": "Invalid Move Target", + "Info_LogsNotFoundMessage": "There are no logs to share.", + "Info_LogsNotFoundTitle": "Logs Not Found", + "Info_LogsSavedMessage": "{0} is saved to selected folder.", + "Info_LogsSavedTitle": "Saved", + "Info_MailRenderingFailedMessage": "This mail is corrupted or can't be opened.\n{0}", + "Info_MailRenderingFailedTitle": "Render Failed", + "Info_MessageCorruptedMessage": "This message is corrupted.", + "Info_MessageCorruptedTitle": "Error", + "Info_MissingFolderMessage": "{0} doesn't exist for this account.", + "Info_MissingFolderTitle": "Missing Folder", + "Info_PurchaseExistsMessage": "Looks like this product has already been purchased before.", + "Info_PurchaseExistsTitle": "Existing Product", + "Info_PurchaseThankYouMessage": "Thank You", + "Info_PurchaseThankYouTitle": "Purchase successful", + "Info_RequestCreationFailedTitle": "Failed to Create Requests", + "Info_ReviewNetworkErrorMessage": "There was a network issue with your review.", + "Info_ReviewNetworkErrorTitle": "Network Issue", + "Info_ReviewNewMessage": "All feedbacks are appreciated. Thank you for the review!", + "Info_ReviewSuccessTitle": "Thank you", + "Info_ReviewUnknownErrorMessage": "There was an unknown issue with your review. ({0})", + "Info_ReviewUnknownErrorTitle": "Unknown Error", + "Info_ReviewUpdatedMessage": "Thank you for the updated review.", + "Info_SignatureDisabledMessage": "Disabled signature for this account", + "Info_SignatureDisabledTitle": "Success", + "Info_SignatureSavedMessage": "New signature is saved", + "Info_SignatureSavedTitle": "Success", + "Info_SyncCanceledMessage": "Canceled", + "Info_SyncCanceledTitle": "Synchronization", + "Info_SyncFailedTitle": "Synchronization Failed", + "Info_UnsupportedFunctionalityDescription": "This functionality is not implemented yet.", + "Info_UnsupportedFunctionalityTitle": "Unsupported", + "Info_UnsubscribeLinkInvalidTitle": "Invalid Unsubscribe Uri", + "Info_UnsubscribeLinkInvalidMessage": "This unsubscribe link is invalid. Failed to unsubscribe from the list.", + "ImapAdvancedSetupDialog_AuthenticationMethod": "Authentication method", + "ImapAdvancedSetupDialog_ConnectionSecurity": "Connection security", + "ImapAuthenticationMethod_Auto": "Auto", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "No authentication", + "ImapAuthenticationMethod_Plain": "Normal password", + "ImapAuthenticationMethod_EncryptedPassword": "Encrypted password", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "None", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "Auto", + "Justify": "Justify", + "Left": "Left", + "Link": "Link", + "LinkedAccountsCreatePolicyMessage": "you must have at least 2 accounts to create link\nlink will be removed on save", + "LinkedAccountsTitle": "Linked Accounts", + "MailOperation_AlwaysMoveFocused": "Always Move to Focused", + "MailOperation_AlwaysMoveOther": "Always Move to Other", + "MailOperation_Archive": "Archive", + "MailOperation_ClearFlag": "Clear flag", + "MailOperation_DarkEditor": "Dark", + "MailOperation_Delete": "Delete", + "MailOperation_ExportPDF": "Export to PDF", + "MailOperation_Find": "Find", + "MailOperation_Forward": "Forward", + "MailOperation_Ignore": "Ignore", + "MailOperation_LightEditor": "Light", + "MailOperation_MarkAsJunk": "Mark as junk", + "MailOperation_MarkAsRead": "Mark as read", + "MailOperation_MarkAsUnread": "Mark as unread", + "MailOperation_MarkNotJunk": "Mark as Not Junk", + "MailOperation_Move": "Move", + "MailOperation_MoveFocused": "Move to Focused", + "MailOperation_MoveJunk": "Move to Junk", + "MailOperation_MoveOther": "Move to Other", + "MailOperation_Navigate": "Navigate", + "MailOperation_Print": "Print", + "MailOperation_Reply": "Reply", + "MailOperation_ReplyAll": "Reply all", + "MailOperation_SaveAs": "Save As", + "MailOperation_SetFlag": "Set flag", + "MailOperation_Unarchive": "Unarchive", + "MailOperation_Zoom": "Zoom", + "MailsSelected": "{0} item(s) selected", + "MarkFlagUnflag": "Mark as flagged/unflagged", + "MarkReadUnread": "Mark as read/unread", + "MenuManageAccounts": "Manage Accounts", + "MenuNewMail": "New Mail", + "MenuMergedAccountItemAccountsSuffix": " accounts", + "MenuRate": "Rate Wino", + "MenuSettings": "Settings", + "MergedAccountsAvailableAccountsTitle": "Available Accounts", + "More": "More", + "MoveMailDialog_InvalidFolderMessage": "{0} is not a valid folder for this mail.", + "MoveMailDialog_Title": "Pick a folder", + "NewAccountDialog_AccountName": "Account Name", + "NewAccountDialog_AccountNameDefaultValue": "Personal", + "NewAccountDialog_AccountNamePlaceholder": "eg. Personal Mail", + "NewAccountDialog_Title": "Add New Account", + "NoMailSelected": "no message selected", + "NoMessageCrieteria": "no messages match your search criteria.", + "NoMessageEmptyFolder": "this folder is empty.", + "Notifications_MultipleNotificationsMessage": "You have {0} new mails", + "Notifications_MultipleNotificationsTitle": "New Mails", + "Notifications_WinoUpdatedMessage": "Checkout new version {0}", + "Notifications_WinoUpdatedTitle": "Wino Mail has been updated.", + "Other": "Other", + "PaneLengthOption_Default": "Default", + "PaneLengthOption_ExtraLarge": "Extra Large", + "PaneLengthOption_Large": "Large", + "PaneLengthOption_Medium": "Medium", + "PaneLengthOption_Micro": "Micro", + "PaneLengthOption_Small": "Small", + "Photos": "Photos", + "PreparingFoldersMessage": "Preparing folders", + "ProviderDetail_Gmail_Description": "Google Account", + "ProviderDetail_IMAP_Description": "Custom IMAP/SMTP server", + "ProviderDetail_IMAP_Title": "IMAP Server", + "Results": "Results", + "Right": "Right", + "SynchronizationFolderReport_Success": "up to date", + "SynchronizationFolderReport_Failed": "synchronization is failed", + "SearchBarPlaceholder": "search", + "SearchingIn": "searching in", + "SettingsAboutGithub_Description": "Go to issue tracker GitHub repository.", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "Append messages to Sent folder", + "SettingsAccountManagementAppendMessage_Description": "Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder.", + "SettingsEditLinkedInbox_Title": "Edit Linked Inbox", + "SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.", + "SettingsAboutVersion": "Version ", + "SettingsAboutWinoDescription": "Lightweight mail client for Windows device families.", + "SettingsAbout_Description": "Learn more about Wino.", + "SettingsAbout_Title": "About", + "SettingsAccentColor_Description": "Change application's accent color", + "SettingsAccentColor_Title": "Accent Color", + "SettingsAccentColor_UseWindowsAccentColor": "Use my Windows accent color", + "SettingsAccountName_Description": "Change the name of the account.", + "SettingsAccountName_Title": "Account Name", + "SettingsApplicationTheme_Description": "Personalize Wino with different custom application themes for your like.", + "SettingsApplicationTheme_Title": "Application Theme", + "SettingsAvailableThemes_Description": "Select a theme from Wino's own collection for your taste or apply your own themes.", + "SettingsAvailableThemes_Title": "Available Themes", + "SettingsCustomTheme_Description": "Create your own custom theme with custom wallpaper and accent color.", + "SettingsCustomTheme_Title": "Custom Theme", + "SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.", + "SettingsDeleteAccount_Title": "Delete this account", + "SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?", + "SettingsDeleteProtection_Title": "Permanent Delete Protection", + "SettingsDiagnostics_Description": "For developers", + "SettingsDiagnostics_Title": "Diagnostics", + "SettingsDiscord_Description": "Get regular development updates, join roadmap discussions and provide feedback.", + "SettingsDiscord_Title": "Discord Channel", + "SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.", + "SettingsElementTheme_Description": "Select a Windows theme for Wino", + "SettingsElementTheme_Title": "Element Theme", + "SettingsEnableHoverActions_Title": "Enable hover actions", + "SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.", + "SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs", + "SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.", + "SettingsEnableLogs_Title": "Enable Logs", + "SettingsEnableSignature": "Enable Signature", + "SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.", + "SettingsExpandOnStartup_Title": "Expand Menu on Startup", + "SettingsExternalContent_Description": "Manage external content settings when rendering mails.", + "SettingsExternalContent_Title": "External Content", + "SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.", + "SettingsFocusedInbox_Title": "Focused Inbox", + "SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.", + "SettingsFolderSync_Title": "Folder Synchronization", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "Center Action", + "SettingsHoverActionLeft": "Left Action", + "SettingsHoverActionRight": "Right Action", + "SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.", + "SettingsHoverActions_Title": "Hover Actions", + "SettingsLanguage_Description": "Change display language for Wino.", + "SettingsLanguage_Title": "Display Language", + "CategoriesFolderNameOverride": "Categories", + "MoreFolderNameOverride": "More", + "SettingsOptions_Title": "Settings", + "SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.", + "SettingsLinkAccounts_Title": "Create Linked Accounts", + "SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.", + "SettingsLinkedAccountsSave_Title": "Save Changes", + "SettingsLoadImages_Title": "Load images automatically", + "SettingsLoadStyles_Title": "Load styles automatically", + "SettingsMailSpacing_Description": "Adjust the spacing for listing mails.", + "SettingsMailSpacing_Title": "Mail Spacing", + "SettingsFolderMenuStyle_Title": "Create Nested Folders", + "SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail", + "SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.", + "SettingsManageAccountSettings_Title": "Manage Account Settings", + "SettingsManageLink_Description": "Move items to add new link or remove existing link.", + "SettingsManageLink_Title": "Manage Link", + "SettingsMarkAsRead_Description": "Change what should happen to the selected item.", + "SettingsMarkAsRead_DontChange": "Don't automatically mark item as read", + "SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ", + "SettingsMarkAsRead_Timer": "When viewed in the reading pane", + "SettingsMarkAsRead_Title": "Mark item as read", + "SettingsMarkAsRead_WhenSelected": "When selected", + "SettingsMessageList_Description": "Change how your messages should be organized in mail list.", + "SettingsMessageList_Title": "Message List", + "SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.", + "SettingsNotifications_Description": "Turn on or off notifications for this account.", + "SettingsNotifications_Title": "Notifications", + "SettingsPaneLength_Description": "Change the width of the mail list.", + "SettingsPaneLength_Title": "Mail List Pane Length", + "SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.", + "SettingsPaypal_Title": "Donate via PayPal", + "SettingsPersonalizationMailDisplayCompactMode": "Compact Mode", + "SettingsPersonalizationMailDisplayMediumMode": "Medium Mode", + "SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode", + "SettingsPersonalization_Description": "Change appearance of Wino as you like.", + "SettingsPersonalization_Title": "Personalization", + "SettingsPrivacyPolicy_Description": "Review privacy policy.", + "SettingsPrivacyPolicy_Title": "Privacy Policy", + "SettingsReadingPane_Description": "Mail rendering options.", + "SettingsReadingPane_Title": "Reading Pane", + "SettingsReaderFont_Title": "Default Reader Font", + "SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.", + "SettingsFontFamily_Title": "Font Family", + "SettingsFontSize_Title": "Font Size", + "SettingsFontPreview_Title": "Preview", + "SettingsComposerFont_Title": "Default Composer Font", + "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", + "SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.", + "SettingsRenameMergeAccount_Title": "Rename", + "SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date", + "SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers", + "SettingsShowPreviewText_Description": "Hide/show thepreview text.", + "SettingsShowPreviewText_Title": "Show Preview Text", + "SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.", + "SettingsShowSenderPictures_Title": "Show Sender Avatars", + "SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours", + "SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)", + "SettingsSignature_Description": "Edit or remove account signature", + "SettingsSignature_Title": "Signature", + "SettingsStartupItem_Description": "Primary account item to load Inbox at startup.", + "SettingsStartupItem_Title": "Startup Item", + "SettingsStore_Description": "Show some love ❤️", + "SettingsStore_Title": "Rate in Store", + "SettingsThreads_Description": "Organize messages into conversation threads.", + "SettingsThreads_Title": "Conversation Threading", + "SettingsUnlinkAccounts_Description": "Remove the link between accounts. This will not delete your accounts.", + "SettingsUnlinkAccounts_Title": "Unlink Accounts", + "SortingOption_Date": "by date", + "SortingOption_Name": "by name", + "StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?", + "StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?", + "StoreRatingDialog_Title": "Enjoying Wino?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.", + "SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder", + "SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.", + "SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder", + "SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.", + "SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder", + "SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.", + "SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.", + "SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.", + "SystemFolderConfigDialog_SentFolderHeader": "Sent Folder", + "SystemFolderConfigDialog_Title": "Configure System Folders", + "TestingImapConnectionMessage": "Testing server connection...", + "Today": "Today", + "UnknownAddress": "unknown address", + "UnknownDateHeader": "Unknown Date", + "UnknownGroupAddress": "unknown Mail Group Address", + "UnknownSender": "Unknown Sender", + "Unsubscribe": "Unsubscribe", + "ViewContactDetails": "View Details", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "Upgrade to Unlimited Accounts", + "WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.", + "Yesterday": "Yesterday" +} diff --git a/Wino.Core.Domain/Translations/zh_CN/resources.json b/Wino.Core.Domain/Translations/zh_CN/resources.json new file mode 100644 index 00000000..a0968cad --- /dev/null +++ b/Wino.Core.Domain/Translations/zh_CN/resources.json @@ -0,0 +1,468 @@ +{ + "AccountCreationDialog_Completed": "已完成", + "AccountCreationDialog_Initializing": "正在初始化", + "AccountCreationDialog_PreparingFolders": "我们正在获取文件夹信息。", + "AccountCreationDialog_SigninIn": "正在保存账户信息。", + "AccountEditDialog_Message": "账户名称", + "AccountEditDialog_Title": "编辑账户", + "AccountPickerDialog_Title": "选择账户", + "AddHyperlink": "添加", + "AutoDiscoveryProgressMessage": "正在搜索邮件设置…", + "BasicIMAPSetupDialog_AdvancedConfiguration": "高级设置", + "BasicIMAPSetupDialog_CredentialLocalMessage": "您的凭据将仅存储在您的计算机上。", + "BasicIMAPSetupDialog_Description": "部分账户需要额外的登录步骤", + "BasicIMAPSetupDialog_DisplayName": "显示名称", + "BasicIMAPSetupDialog_DisplayNamePlaceholder": "例如 John Doe", + "BasicIMAPSetupDialog_LearnMore": "了解更多", + "BasicIMAPSetupDialog_MailAddress": "电子邮件地址", + "BasicIMAPSetupDialog_MailAddressPlaceholder": "johndoe@fabrikam.com", + "BasicIMAPSetupDialog_Password": "密码", + "BasicIMAPSetupDialog_Title": "IMAP 账户", + "Buttons_AddAccount": "添加账户", + "Buttons_ApplyTheme": "应用主题", + "Buttons_Browse": "浏览", + "Buttons_Cancel": "取消", + "Buttons_Close": "关闭", + "Buttons_Create": "创建", + "Buttons_CreateAccount": "添加账户", + "Buttons_Delete": "删除", + "Buttons_Discard": "放弃", + "Buttons_EnableImageRendering": "启用", + "Buttons_No": "否", + "Buttons_Open": "打开", + "Buttons_Purchase": "购买", + "Buttons_RateWino": "评价 Wino", + "Buttons_Save": "保存", + "Buttons_SaveConfiguration": "保存设置", + "Buttons_Share": "分享", + "Buttons_SignIn": "登录", + "Buttons_Yes": "是", + "Center": "中心", + "ComingSoon": "即将到来...", + "ComposerFrom": "来自: ", + "ComposerSubject": "主题: ", + "ComposerTo": "至: ", + "ClipboardTextCopied_Message": "{0} copied to clipboard.", + "ClipboardTextCopied_Title": "Copied", + "ClipboardTextCopyFailed_Message": "Failed to copy {0} to clipboard.", + "ComposerToPlaceholder": "点击输入地址", + "CustomThemeBuilder_AccentColorDescription": "设置自定义颜色。若未选择颜色,将使用 Windows 默认颜色。", + "CustomThemeBuilder_AccentColorTitle": "主题色", + "CustomThemeBuilder_PickColor": "选择", + "CustomThemeBuilder_ThemeNameDescription": "自定义主题的名称。", + "CustomThemeBuilder_ThemeNameTitle": "主题名称", + "CustomThemeBuilder_Title": "自定义主题生成器", + "CustomThemeBuilder_WallpaperDescription": "为Wino设置自定义壁纸", + "CustomThemeBuilder_WallpaperTitle": "设置自定义壁纸", + "DialogMessage_AccountLimitMessage": "您已达到免费用户可创建账户数量上限(3个)。\n是否购买支持作者以“解除可创建账户数量上限”?", + "DialogMessage_AccountLimitTitle": "已达到账户限制", + "DialogMessage_CleanupFolderMessage": "您想永久删除此文件夹中的所有邮件吗?", + "DialogMessage_CleanupFolderTitle": "清空文件夹", + "DialogMessage_ComposerMissingRecipientMessage": "邮件没有收件人。", + "DialogMessage_ComposerValidationFailedTitle": "验证失败", + "DialogMessage_CreateLinkedAccountMessage": "给这个新链接命名。账户将在此名称下合并。", + "DialogMessage_CreateLinkedAccountTitle": "账户链接名称", + "DialogMessage_DeleteAccountConfirmationMessage": "删除 {0}?", + "DialogMessage_DeleteAccountConfirmationTitle": "与此账户相关的所有数据将从磁盘上永久删除。", + "DialogMessage_DiscardDraftConfirmationMessage": "草稿将被删除。你想要继续吗?", + "DialogMessage_DiscardDraftConfirmationTitle": "舍弃草稿", + "DialogMessage_HardDeleteConfirmationMessage": "永久删除", + "DialogMessage_HardDeleteConfirmationTitle": "邮件将被永久删除。是否继续?", + "DialogMessage_NoAccountsForCreateMailMessage": "您没有任何账户可创建邮件。", + "DialogMessage_NoAccountsForCreateMailTitle": "没有邮件账户", + "DialogMessage_RenameLinkedAccountsMessage": "输入链接账户的新名称", + "DialogMessage_RenameLinkedAccountsTitle": "重命名已链接账户", + "DialogMessage_UnlinkAccountsConfirmationMessage": "此操作不会删除您的账户,只会断开共享文件夹的连接。是否继续?", + "DialogMessage_UnlinkAccountsConfirmationTitle": "取消链接账户", + "DialogMessage_EmptySubjectConfirmation": "缺少主题", + "DialogMessage_EmptySubjectConfirmationMessage": "邮件没有主题。您想要继续吗?", + "Dialog_DontAskAgain": "不再询问", + "DiscordChannelDisclaimerMessage": "Wino 没有自己的 Discord 服务器,但在 Developer Sanctuary 服务器上设有专门的 wino-mail 频道。如果要获取有关 Wino 的更新,请加入 Developer Sanctuary 服务器,并关注 Community Projects下的 wino-mail 频道。\n\n因为 Discord 不支持频道邀请,所以你需要通过网页加入频道。", + "DiscordChannelDisclaimerTitle": "重要的 Discord 信息", + "Draft": "草稿", + "EditorToolbarOption_Draw": "绘制", + "EditorToolbarOption_Format": "格式", + "EditorToolbarOption_Insert": "插入", + "EditorToolbarOption_None": "无", + "EditorToolbarOption_Options": "选项", + "ElementTheme_Dark": "深色模式", + "ElementTheme_Default": "使用系统设置", + "ElementTheme_Light": "浅色模式", + "Emoji": "表情", + "Exception_ImapClientPoolFailed": "IMAP 客户端池失败。", + "Exception_AuthenticationCanceled": "身份验证已取消", + "Exception_CustomThemeExists": "此主题已经存在。", + "Exception_CustomThemeMissingName": "您必须提供名称。", + "Exception_CustomThemeMissingWallpaper": "您必须提供自定义背景图像。", + "Exception_FailedToSynchronizeFolders": "同步文件夹失败", + "Exception_GoogleAuthCallbackNull": "Callback uri 在激活时无效。", + "Exception_GoogleAuthCorruptedCode": "授权响应不正确。", + "Exception_GoogleAuthError": "OAuth 授权错误: {0}", + "Exception_GoogleAuthInvalidResponse": "收到无效状态请求 ({0})", + "Exception_GoogleAuthorizationCodeExchangeFailed": "授权代码交换失败。", + "Exception_InvalidSystemFolderConfiguration": "系统文件夹配置无效。请检查配置,然后重试。", + "Exception_NullAssignedAccount": "分配的账户为空", + "Exception_NullAssignedFolder": "分配的文件夹为空", + "Exception_SynchronizerFailureHTTP": "处理响应失败,HTTP 错误代码: {0}", + "Exception_TokenGenerationFailed": "令牌生成失败", + "Exception_TokenInfoRetrivalFailed": "获取令牌信息失败。", + "Exception_UnknowErrorDuringAuthentication": "身份验证时发生未知错误", + "Exception_UnsupportedAction": "请求处理器不支持 {0} 操作。", + "Exception_UnsupportedProvider": "不支持该提供商。", + "Exception_UnsupportedSynchronizerOperation": "{0} 不支持此操作", + "Exception_UserCancelSystemFolderSetupDialog": "用户取消了配置系统文件夹的对话框。", + "Files": "文件", + "FilteringOption_All": "全选", + "FilteringOption_Flagged": "已标记", + "FilteringOption_Unread": "未读", + "Focused": "重点", + "FolderOperation_CreateSubFolder": "创建子文件夹", + "FolderOperation_Delete": "删除", + "FolderOperation_DontSync": "不要同步此文件夹", + "FolderOperation_Empty": "清空此文件夹", + "FolderOperation_MarkAllAsRead": "全部标记为已读", + "FolderOperation_Move": "移动", + "DragMoveToFolderCaption": "移动到 {0}", + "FolderOperation_None": "无", + "FolderOperation_Pin": "置顶", + "FolderOperation_Rename": "重命名", + "FolderOperation_Unpin": "取消置顶", + "HoverActionOption_Archive": "归档", + "HoverActionOption_Delete": "删除", + "HoverActionOption_MoveJunk": "移至垃圾箱", + "HoverActionOption_ToggleFlag": "标记/取消标记", + "HoverActionOption_ToggleRead": "已读/未读", + "MergedAccountCommonFolderInbox": "收件箱", + "MergedAccountCommonFolderSent": "已发送", + "MergedAccountCommonFolderDraft": "草稿箱", + "MergedAccountCommonFolderJunk": "垃圾箱", + "MergedAccountCommonFolderTrash": "已删除", + "MergedAccountCommonFolderArchive": "归档", + "IMAPSetupDialog_AccountType": "账户名称", + "IMAPSetupDialog_DisplayName": "显示名称", + "IMAPSetupDialog_DisplayNamePlaceholder": "例如 John Doe", + "IMAPSetupDialog_IncomingMailServer": "收件邮件服务器", + "IMAPSetupDialog_IncomingMailServerPort": "端口", + "IMAPSetupDialog_MailAddress": "电子邮件地址", + "IMAPSetupDialog_MailAddressPlaceholder": "somone@example.com", + "IMAPSetupDialog_OutgoingMailServer": "发送 (SMTP) 邮件服务器", + "IMAPSetupDialog_OutgoingMailServerPassword": "发送服务器密码", + "IMAPSetupDialog_OutgoingMailServerPort": "端口", + "IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "发送服务器需要身份验证", + "IMAPSetupDialog_OutgoingMailServerUsername": "发送服务器用户名", + "IMAPSetupDialog_Password": "密码", + "IMAPSetupDialog_RequireSSLForIncomingMail": "接收邮件需要 SSL", + "IMAPSetupDialog_RequireSSLForOutgoingMail": "接收邮件需要 SSL", + "IMAPSetupDialog_Title": "IMAP 高级选项", + "IMAPSetupDialog_UseSameConfig": "发送电子邮件时使用同一用户名和密码", + "IMAPSetupDialog_Username": "用户名", + "IMAPSetupDialog_UsernamePlaceholder": "示例:johndoe, johndoe@fabrikam.com, domain/johndoe", + "ImageRenderingDisabled": "此邮件的图像渲染已禁用。", + "InfoBarAction_Enable": "启用", + "InfoBarMessage_SynchronizationDisabledFolder": "此文件夹已禁用同步。", + "InfoBarTitle_SynchronizationDisabledFolder": "已禁用文件夹", + "GeneralTitle_Error": "Error", + "GeneralTitle_Warning": "Warning", + "GeneralTitle_Info": "Information", + "Info_AccountCreatedMessage": "{0} 已创建", + "Info_AccountCreatedTitle": "创建账户", + "Info_AccountCreationFailedTitle": "账户创建失败", + "Info_AccountDeletedMessage": "{0} 已成功删除。", + "Info_AccountDeletedTitle": "账户已删除", + "Info_AccountIssueFixFailedTitle": "失败", + "Info_AccountIssueFixSuccessMessage": "已修复所有账户问题。", + "Info_AccountIssueFixSuccessTitle": "成功", + "Info_AttachmentOpenFailedMessage": "无法打开此附件。", + "Info_AttachmentOpenFailedTitle": "失败", + "Info_AttachmentSaveFailedMessage": "无法保存此附件。", + "Info_AttachmentSaveFailedTitle": "失败", + "Info_AttachmentSaveSuccessMessage": "附件已保存。", + "Info_AttachmentSaveSuccessTitle": "附件已保存", + "Info_BackgroundExecutionDeniedMessage": "应用的后台运行被禁止。这可能会影响后台同步和实时通知。", + "Info_BackgroundExecutionDeniedTitle": "后台执行被拒绝", + "Info_BackgroundExecutionUnknownErrorMessage": "注册后台同步器时发生未知异常。", + "Info_BackgroundExecutionUnknownErrorTitle": "后台执行失败", + "Info_ComposerMissingMIMEMessage": "无法找到 MIME 文件。同步可能有帮助。", + "Info_ComposerMissingMIMETitle": "失败", + "Info_ContactExistsMessage": "此联系人已经在收件人列表中。", + "Info_ContactExistsTitle": "联系人已存在", + "Info_DraftFolderMissingMessage": "此账户缺少草稿文件夹。请检查您的账户设置。", + "Info_DraftFolderMissingTitle": "缺少草稿文件夹", + "Info_FileLaunchFailedTitle": "无法启动文件", + "Info_InvalidAddressMessage": "{0} 不是有效的电子邮件地址。", + "Info_InvalidAddressTitle": "无效地址", + "Info_InvalidMoveTargetMessage": "您不能将选中的邮件移动到此文件夹。", + "Info_InvalidMoveTargetTitle": "无效的移动目标", + "Info_LogsNotFoundMessage": "没有可共享的日志。", + "Info_LogsNotFoundTitle": "未找到日志", + "Info_LogsSavedMessage": "{0} 已保存到所选文件夹。", + "Info_LogsSavedTitle": "已保存", + "Info_MailRenderingFailedMessage": "这封邮件已损坏或无法打开。\n{0}", + "Info_MailRenderingFailedTitle": "渲染失败", + "Info_MessageCorruptedMessage": "此邮件已损坏。", + "Info_MessageCorruptedTitle": "错误", + "Info_MissingFolderMessage": "此账户不存在 {0}。", + "Info_MissingFolderTitle": "缺少文件夹", + "Info_PurchaseExistsMessage": "看起来这个产品已经被购买了。", + "Info_PurchaseExistsTitle": "产品已购买", + "Info_PurchaseThankYouMessage": "感谢您", + "Info_PurchaseThankYouTitle": "购买成功", + "Info_RequestCreationFailedTitle": "请求创建失败", + "Info_ReviewNetworkErrorMessage": "您的评论有一个网络问题。", + "Info_ReviewNetworkErrorTitle": "网络问题", + "Info_ReviewNewMessage": "感谢所有反馈。谢谢您的评论!", + "Info_ReviewSuccessTitle": "谢谢", + "Info_ReviewUnknownErrorMessage": "您的评论有一个未知的问题。({0})", + "Info_ReviewUnknownErrorTitle": "未知错误", + "Info_ReviewUpdatedMessage": "感谢您的最新评论。", + "Info_SignatureDisabledMessage": "已禁用此账户的签名", + "Info_SignatureDisabledTitle": "成功", + "Info_SignatureSavedMessage": "已保存新签名", + "Info_SignatureSavedTitle": "成功", + "Info_SyncCanceledMessage": "已取消", + "Info_SyncCanceledTitle": "同步", + "Info_SyncFailedTitle": "同步失败", + "Info_UnsupportedFunctionalityDescription": "此功能尚未实现。", + "Info_UnsupportedFunctionalityTitle": "不支持", + "Info_UnsubscribeLinkInvalidTitle": "无效的取消订阅 Uri", + "Info_UnsubscribeLinkInvalidMessage": "此退订链接无效。取消订阅列表失败。", + "ImapAdvancedSetupDialog_AuthenticationMethod": "身份验证方法", + "ImapAdvancedSetupDialog_ConnectionSecurity": "连接安全性", + "ImapAuthenticationMethod_Auto": "自动", + "ImapAuthenticationMethod_CramMD5": "CRAM-MD5", + "ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5", + "ImapAuthenticationMethod_None": "无身份验证", + "ImapAuthenticationMethod_Plain": "常规密码", + "ImapAuthenticationMethod_EncryptedPassword": "加密密码", + "ImapAuthenticationMethod_Ntlm": "NTLM", + "ImapConnectionSecurity_None": "无", + "ImapConnectionSecurity_SslTls": "SSL/TLS", + "ImapConnectionSecurity_StartTls": "STARTTLS", + "ImapConnectionSecurity_Auto": "自动", + "Justify": "对齐", + "Left": "左侧", + "Link": "链接", + "LinkedAccountsCreatePolicyMessage": "您必须拥有至少 2 个账户才能创建链接\n链接将在保存时删除", + "LinkedAccountsTitle": "已绑定的账户", + "MailOperation_AlwaysMoveFocused": "总是移动到重点。", + "MailOperation_AlwaysMoveOther": "总是移动到其他", + "MailOperation_Archive": "归档", + "MailOperation_ClearFlag": "清除标记", + "MailOperation_DarkEditor": "深色", + "MailOperation_Delete": "删除", + "MailOperation_ExportPDF": "导出为 PDF", + "MailOperation_Find": "搜索", + "MailOperation_Forward": "转发", + "MailOperation_Ignore": "忽略", + "MailOperation_LightEditor": "浅色", + "MailOperation_MarkAsJunk": "标记为垃圾邮件", + "MailOperation_MarkAsRead": "标记为已读", + "MailOperation_MarkAsUnread": "标记为未读", + "MailOperation_MarkNotJunk": "标记为非垃圾邮件", + "MailOperation_Move": "移动", + "MailOperation_MoveFocused": "移动到重点", + "MailOperation_MoveJunk": "移至垃圾箱", + "MailOperation_MoveOther": "移至其他", + "MailOperation_Navigate": "导航", + "MailOperation_Print": "打印", + "MailOperation_Reply": "回复", + "MailOperation_ReplyAll": "回复所有", + "MailOperation_SaveAs": "另存为", + "MailOperation_SetFlag": "设置标记", + "MailOperation_Unarchive": "取消归档", + "MailOperation_Zoom": "缩放", + "MailsSelected": "已选择 {0} 项", + "MarkFlagUnflag": "标记为已标记/未标记", + "MarkReadUnread": "标记为已读/未读", + "MenuManageAccounts": "管理账户", + "MenuNewMail": "新邮件", + "MenuMergedAccountItemAccountsSuffix": " 账户", + "MenuRate": "评价 Wino", + "MenuSettings": "设置", + "MergedAccountsAvailableAccountsTitle": "可用账户", + "More": "更多", + "MoveMailDialog_InvalidFolderMessage": "{0} 不是此邮件的有效文件夹。", + "MoveMailDialog_Title": "选择文件夹", + "NewAccountDialog_AccountName": "账户名称", + "NewAccountDialog_AccountNameDefaultValue": "个人信息", + "NewAccountDialog_AccountNamePlaceholder": "例如:个人邮件", + "NewAccountDialog_Title": "添加新账户", + "NoMailSelected": "未选择任何邮件", + "NoMessageCrieteria": "没有符合您搜索条件的邮件。", + "NoMessageEmptyFolder": "此文件夹为空。", + "Notifications_MultipleNotificationsMessage": "您有 {0} 条新邮件", + "Notifications_MultipleNotificationsTitle": "新邮件", + "Notifications_WinoUpdatedMessage": "检查新版本 {0}", + "Notifications_WinoUpdatedTitle": "Wino 邮件已更新。", + "Other": "其他", + "PaneLengthOption_Default": "默认", + "PaneLengthOption_ExtraLarge": "超大", + "PaneLengthOption_Large": "大", + "PaneLengthOption_Medium": "中", + "PaneLengthOption_Micro": "极小", + "PaneLengthOption_Small": "小", + "Photos": "图片", + "PreparingFoldersMessage": "正在准备文件夹", + "ProviderDetail_Gmail_Description": "Google 账号", + "ProviderDetail_IMAP_Description": "自定义 IMAP/SMTP 服务器", + "ProviderDetail_IMAP_Title": "IMAP 服务器", + "Results": "结果", + "Right": "右侧", + "SynchronizationFolderReport_Success": "已是最新", + "SynchronizationFolderReport_Failed": "同步失败", + "SearchBarPlaceholder": "搜索", + "SearchingIn": "搜索于", + "SettingsAboutGithub_Description": "转到 GitHub 仓库的问题追踪器", + "SettingsAboutGithub_Title": "GitHub", + "SettingsAccountManagementAppendMessage_Title": "添加邮件到已发送文件夹", + "SettingsAccountManagementAppendMessage_Description": "在草稿发送后在发送文件夹中创建邮件的副本。 如果您在发送文件夹中没有看到您的邮件,请启用此功能。", + "SettingsEditLinkedInbox_Title": "编辑已链接收件箱", + "SettingsEditLinkedInbox_Description": "添加/删除账户,重命名或断开账户之间的链接。", + "SettingsAboutVersion": "版本 ", + "SettingsAboutWinoDescription": "Windows 系列设备的轻量邮件客户端。", + "SettingsAbout_Description": "了解更多关于 Wino 的信息。", + "SettingsAbout_Title": "关于", + "SettingsAccentColor_Description": "更改应用的主题颜色", + "SettingsAccentColor_Title": "主题颜色", + "SettingsAccentColor_UseWindowsAccentColor": "使用 Windows 主题色", + "SettingsAccountName_Description": "更改账户名称。", + "SettingsAccountName_Title": "账户名称", + "SettingsApplicationTheme_Description": "根据你的喜好,用不同的自定义应用主题来个性化 Wino。", + "SettingsApplicationTheme_Title": "应用主题", + "SettingsAvailableThemes_Description": "从 Wino 的自带收藏中选择一个符合您口味的主题,或应用您自己的主题。", + "SettingsAvailableThemes_Title": "可用的主题", + "SettingsCustomTheme_Description": "用自定义壁纸和主题色创建您自己的自定义主题。", + "SettingsCustomTheme_Title": "自定义主题", + "SettingsDeleteAccount_Description": "删除与此账户关联的所有电子邮件和凭据。", + "SettingsDeleteAccount_Title": "删除此账户", + "SettingsDeleteProtection_Description": "每次您尝试使用 Shift + Del 键永久删除邮件时,Wino 应该向您二次确认吗?", + "SettingsDeleteProtection_Title": "永久性删除保护", + "SettingsDiagnostics_Description": "开发者选项", + "SettingsDiagnostics_Title": "诊断信息", + "SettingsDiscord_Description": "获取定期开发更新,加入路线图讨论并提供反馈。", + "SettingsDiscord_Title": "Discord 频道", + "SettingsElementThemeSelectionDisabled": "当选择的应用主题不是默认主题时,元素主题选择将被禁用。", + "SettingsElementTheme_Description": "为 Wino 选择一个 Windows 主题", + "SettingsElementTheme_Title": "元素主题", + "SettingsEnableHoverActions_Title": "启用悬停动作", + "SettingsEnableIMAPLogs_Description": "启用此选项可提供在设置 IMAP 服务器过程中遇到的 IMAP 连接问题的详细信息。", + "SettingsEnableIMAPLogs_Title": "启用 IMAP 协议日志", + "SettingsEnableLogs_Description": "我可能需要日志来分析您在 GitHub 中打开的问题。 所有日志都不会公开您的凭据或敏感信息。", + "SettingsEnableLogs_Title": "启用日志", + "SettingsEnableSignature": "启用签名", + "SettingsExpandOnStartup_Description": "设置 Wino 是否应该在启动时展开此账户的文件夹。", + "SettingsExpandOnStartup_Title": "启动时展开菜单", + "SettingsExternalContent_Description": "在渲染邮件时管理外部内容设置。", + "SettingsExternalContent_Title": "外部内容", + "SettingsFocusedInbox_Description": "设置是否应将收件箱分为两部分 - 重点和其他。", + "SettingsFocusedInbox_Title": "重点收件箱", + "SettingsFolderSync_Description": "启用或禁用特定文件夹同步。", + "SettingsFolderSync_Title": "文件夹同步", + "SettingsFolderOptions_Title": "Folder Configuration", + "SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.", + "SettingsHoverActionCenter": "中心动作", + "SettingsHoverActionLeft": "左侧动作", + "SettingsHoverActionRight": "右侧动作", + "SettingsHoverActions_Description": "选择 3 个动作,当你用鼠标悬停在邮件上时显示。", + "SettingsHoverActions_Title": "悬停动作", + "SettingsLanguage_Description": "更改 Wino 的显示语言。", + "SettingsLanguage_Title": "显示语言", + "CategoriesFolderNameOverride": "分类", + "MoreFolderNameOverride": "更多", + "SettingsOptions_Title": "设置", + "SettingsLinkAccounts_Description": "将多个账户合并为一个。在同一个收件箱内查看所有邮件。", + "SettingsLinkAccounts_Title": "创建链接账户", + "SettingsLinkedAccountsSave_Description": "修改当前与新账户的链接。", + "SettingsLinkedAccountsSave_Title": "保存更改", + "SettingsLoadImages_Title": "自动加载图片", + "SettingsLoadStyles_Title": "自动加载样式", + "SettingsMailSpacing_Description": "调整邮件列表的间距。", + "SettingsMailSpacing_Title": "邮件间距", + "SettingsFolderMenuStyle_Title": "创建内部文件夹", + "SettingsFolderMenuStyle_Description": "控制账户文件夹是否应嵌套在账户菜单中。 如果您喜欢Windows邮件中的旧菜单,关闭此选项", + "SettingsManageAccountSettings_Description": "每个账户的通知、签名、同步等设置。", + "SettingsManageAccountSettings_Title": "管理账户设置", + "SettingsManageLink_Description": "移动项目以添加新链接或删除现有链接。", + "SettingsManageLink_Title": "管理账户链接", + "SettingsMarkAsRead_Description": "更改应对选定项目进行何种操作。", + "SettingsMarkAsRead_DontChange": "不自动标记项目为已读", + "SettingsMarkAsRead_SecondsToWait": "等待时间: ", + "SettingsMarkAsRead_Timer": "当在阅读面板中查看时", + "SettingsMarkAsRead_Title": "标记为已读", + "SettingsMarkAsRead_WhenSelected": "选中时", + "SettingsMessageList_Description": "更改邮件列表中的消息应如何组织。", + "SettingsMessageList_Title": "邮件列表", + "SettingsNoAccountSetupMessage": "您尚未设置任何账户。", + "SettingsNotifications_Description": "开启或关闭此账户的通知。", + "SettingsNotifications_Title": "通知", + "SettingsPaneLength_Description": "更改邮件列表的宽度。", + "SettingsPaneLength_Title": "邮件列表视图长度", + "SettingsPaypal_Description": "展示更多的爱吧 ❤️ 我们感激所有的捐赠。", + "SettingsPaypal_Title": "通过 PayPal 捐赠", + "SettingsPersonalizationMailDisplayCompactMode": "紧凑模式", + "SettingsPersonalizationMailDisplayMediumMode": "中等模式", + "SettingsPersonalizationMailDisplaySpaciousMode": "宽敞模式", + "SettingsPersonalization_Description": "按照您喜欢的方式更改 Wino 的外观。", + "SettingsPersonalization_Title": "个性化", + "SettingsPrivacyPolicy_Description": "查看隐私政策。", + "SettingsPrivacyPolicy_Title": "隐私政策", + "SettingsReadingPane_Description": "邮件渲染选项", + "SettingsReadingPane_Title": "阅读面板", + "SettingsReaderFont_Title": "默认阅读字体", + "SettingsReaderFontFamily_Description": "更改阅读邮件的默认字体和字体大小。", + "SettingsFontFamily_Title": "字体", + "SettingsFontSize_Title": "字体大小", + "SettingsFontPreview_Title": "预览", + "SettingsComposerFont_Title": "默认撰写字体", + "SettingsComposerFontFamily_Description": "更改撰写邮件时的默认字体和字体大小。", + "SettingsRenameMergeAccount_Description": "更改链接账户的显示名称。", + "SettingsRenameMergeAccount_Title": "重命名", + "SettingsSemanticZoom_Description": "这将允许您点击消息列表中的标题并转到指定日期", + "SettingsSemanticZoom_Title": "为日期标题启用语义缩放", + "SettingsShowPreviewText_Description": "隐藏/显示预览文本。", + "SettingsShowPreviewText_Title": "显示预览文本", + "SettingsShowSenderPictures_Description": "隐藏/显示缩略图发件人图片。", + "SettingsShowSenderPictures_Title": "显示发件人头像", + "SettingsPrefer24HourClock_Title": "使用 24 小时制时间格式", + "SettingsPrefer24HourClock_Description": "邮件接收时间将显示为 24 小时制,而不是 12 小时制(上午/下午)", + "SettingsSignature_Description": "编辑或删除账户签名", + "SettingsSignature_Title": "签名", + "SettingsStartupItem_Description": "启动时加载收件箱的主要账户项。", + "SettingsStartupItem_Title": "启动项", + "SettingsStore_Description": "展示更多的爱❤️", + "SettingsStore_Title": "在商店中评分", + "SettingsThreads_Description": "将邮件组织成对话主题。", + "SettingsThreads_Title": "邮件会话", + "SettingsUnlinkAccounts_Description": "删除账户之间的链接。这不会删除您的账户。", + "SettingsUnlinkAccounts_Title": "取消链接账户", + "SortingOption_Date": "按日期", + "SortingOption_Name": "按名称", + "StoreRatingDialog_MessageFirstLine": "所有反馈都值得赞赏,它们将来会使 Wino 变得更好。您想要在 Microsoft Store 给 Wino 打分吗?", + "StoreRatingDialog_MessageSecondLine": "您想在 Microsoft Store 中给 Wino Mail 打分吗?", + "StoreRatingDialog_Title": "喜欢 Wino 吗?", + "SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.", + "SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder", + "SystemFolderConfigDialog_DeletedFolderDescription": "已删除的邮件将被移至此处。", + "SystemFolderConfigDialog_DeletedFolderHeader": "已删除文件夹", + "SystemFolderConfigDialog_DraftFolderDescription": "将在这里撰写新邮件/回复。", + "SystemFolderConfigDialog_DraftFolderHeader": "草稿文件夹", + "SystemFolderConfigDialog_JunkFolderDescription": "所有垃圾邮件都在这里。", + "SystemFolderConfigDialog_JunkFolderHeader": "垃圾邮件文件夹", + "SystemFolderConfigDialog_MessageFirstLine": "此 IMAP 服务器不支持 SPECIAL-USE 扩展,因此 Wino 无法正确设置系统文件夹。", + "SystemFolderConfigDialog_MessageSecondLine": "请为特定功能选择相应的文件夹。", + "SystemFolderConfigDialog_SentFolderDescription": "发送的邮件将被存储在该文件夹中。", + "SystemFolderConfigDialog_SentFolderHeader": "已发送文件夹", + "SystemFolderConfigDialog_Title": "配置系统文件夹", + "TestingImapConnectionMessage": "正在测试服务器连接...", + "Today": "今天", + "UnknownAddress": "未知地址", + "UnknownDateHeader": "未知日期", + "UnknownGroupAddress": "未知邮件群组地址", + "UnknownSender": "未知发件人", + "Unsubscribe": "取消订阅", + "ViewContactDetails": "查看详情", + "WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade", + "WinoUpgradeMessage": "升级为无限账户数", + "WinoUpgradeRemainingAccountsMessage": "已使用 {0} 个免费账户,共 {1} 个。", + "Yesterday": "昨天" +} diff --git a/Wino.Core.Domain/Translator.Designer.cs b/Wino.Core.Domain/Translator.Designer.cs new file mode 100644 index 00000000..a858e9c3 --- /dev/null +++ b/Wino.Core.Domain/Translator.Designer.cs @@ -0,0 +1,2916 @@ + + + + + + + + + + + + + + + +namespace Wino.Core.Domain +{ + public class Translator + { + private static global::Wino.Core.Domain.Translations.WinoTranslationDictionary _dictionary; + + public static global::Wino.Core.Domain.Translations.WinoTranslationDictionary Resources + { + get + { + if (_dictionary == null) + { + _dictionary = new global::Wino.Core.Domain.Translations.WinoTranslationDictionary(); + } + + return _dictionary; + } + } + + + /// + /// all done + /// + public static string AccountCreationDialog_Completed => Resources.GetTranslatedString(@"AccountCreationDialog_Completed"); + + + /// + /// initializing + /// + public static string AccountCreationDialog_Initializing => Resources.GetTranslatedString(@"AccountCreationDialog_Initializing"); + + + /// + /// We are getting folder information at the moment. + /// + public static string AccountCreationDialog_PreparingFolders => Resources.GetTranslatedString(@"AccountCreationDialog_PreparingFolders"); + + + /// + /// Account information is being saved. + /// + public static string AccountCreationDialog_SigninIn => Resources.GetTranslatedString(@"AccountCreationDialog_SigninIn"); + + + /// + /// Account Name + /// + public static string AccountEditDialog_Message => Resources.GetTranslatedString(@"AccountEditDialog_Message"); + + + /// + /// Edit Account + /// + public static string AccountEditDialog_Title => Resources.GetTranslatedString(@"AccountEditDialog_Title"); + + + /// + /// Pick an account + /// + public static string AccountPickerDialog_Title => Resources.GetTranslatedString(@"AccountPickerDialog_Title"); + + + /// + /// Add + /// + public static string AddHyperlink => Resources.GetTranslatedString(@"AddHyperlink"); + + + /// + /// Searching for mail settings... + /// + public static string AutoDiscoveryProgressMessage => Resources.GetTranslatedString(@"AutoDiscoveryProgressMessage"); + + + /// + /// Advanced Configuration + /// + public static string BasicIMAPSetupDialog_AdvancedConfiguration => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_AdvancedConfiguration"); + + + /// + /// Your credentials will only be stored locally on your computer. + /// + public static string BasicIMAPSetupDialog_CredentialLocalMessage => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_CredentialLocalMessage"); + + + /// + /// Some accounts require additional steps to sign in + /// + public static string BasicIMAPSetupDialog_Description => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_Description"); + + + /// + /// Display Name + /// + public static string BasicIMAPSetupDialog_DisplayName => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_DisplayName"); + + + /// + /// eg. John Doe + /// + public static string BasicIMAPSetupDialog_DisplayNamePlaceholder => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_DisplayNamePlaceholder"); + + + /// + /// Learn more + /// + public static string BasicIMAPSetupDialog_LearnMore => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_LearnMore"); + + + /// + /// E-Mail Address + /// + public static string BasicIMAPSetupDialog_MailAddress => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_MailAddress"); + + + /// + /// johndoe@fabrikam.com + /// + public static string BasicIMAPSetupDialog_MailAddressPlaceholder => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_MailAddressPlaceholder"); + + + /// + /// Password + /// + public static string BasicIMAPSetupDialog_Password => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_Password"); + + + /// + /// IMAP Account + /// + public static string BasicIMAPSetupDialog_Title => Resources.GetTranslatedString(@"BasicIMAPSetupDialog_Title"); + + + /// + /// Add Account + /// + public static string Buttons_AddAccount => Resources.GetTranslatedString(@"Buttons_AddAccount"); + + + /// + /// Apply Theme + /// + public static string Buttons_ApplyTheme => Resources.GetTranslatedString(@"Buttons_ApplyTheme"); + + + /// + /// Browse + /// + public static string Buttons_Browse => Resources.GetTranslatedString(@"Buttons_Browse"); + + + /// + /// Cancel + /// + public static string Buttons_Cancel => Resources.GetTranslatedString(@"Buttons_Cancel"); + + + /// + /// Close + /// + public static string Buttons_Close => Resources.GetTranslatedString(@"Buttons_Close"); + + + /// + /// Create + /// + public static string Buttons_Create => Resources.GetTranslatedString(@"Buttons_Create"); + + + /// + /// Create Account + /// + public static string Buttons_CreateAccount => Resources.GetTranslatedString(@"Buttons_CreateAccount"); + + + /// + /// Delete + /// + public static string Buttons_Delete => Resources.GetTranslatedString(@"Buttons_Delete"); + + + /// + /// Discard + /// + public static string Buttons_Discard => Resources.GetTranslatedString(@"Buttons_Discard"); + + + /// + /// Enable + /// + public static string Buttons_EnableImageRendering => Resources.GetTranslatedString(@"Buttons_EnableImageRendering"); + + + /// + /// No + /// + public static string Buttons_No => Resources.GetTranslatedString(@"Buttons_No"); + + + /// + /// Open + /// + public static string Buttons_Open => Resources.GetTranslatedString(@"Buttons_Open"); + + + /// + /// Purchase + /// + public static string Buttons_Purchase => Resources.GetTranslatedString(@"Buttons_Purchase"); + + + /// + /// Rate Wino + /// + public static string Buttons_RateWino => Resources.GetTranslatedString(@"Buttons_RateWino"); + + + /// + /// Save + /// + public static string Buttons_Save => Resources.GetTranslatedString(@"Buttons_Save"); + + + /// + /// Save Configuration + /// + public static string Buttons_SaveConfiguration => Resources.GetTranslatedString(@"Buttons_SaveConfiguration"); + + + /// + /// Share + /// + public static string Buttons_Share => Resources.GetTranslatedString(@"Buttons_Share"); + + + /// + /// Sign In + /// + public static string Buttons_SignIn => Resources.GetTranslatedString(@"Buttons_SignIn"); + + + /// + /// Yes + /// + public static string Buttons_Yes => Resources.GetTranslatedString(@"Buttons_Yes"); + + + /// + /// Center + /// + public static string Center => Resources.GetTranslatedString(@"Center"); + + + /// + /// Coming soon... + /// + public static string ComingSoon => Resources.GetTranslatedString(@"ComingSoon"); + + + /// + /// From: + /// + public static string ComposerFrom => Resources.GetTranslatedString(@"ComposerFrom"); + + + /// + /// Subject: + /// + public static string ComposerSubject => Resources.GetTranslatedString(@"ComposerSubject"); + + + /// + /// To: + /// + public static string ComposerTo => Resources.GetTranslatedString(@"ComposerTo"); + + + /// + /// {0} copied to clipboard. + /// + public static string ClipboardTextCopied_Message => Resources.GetTranslatedString(@"ClipboardTextCopied_Message"); + + + /// + /// Copied + /// + public static string ClipboardTextCopied_Title => Resources.GetTranslatedString(@"ClipboardTextCopied_Title"); + + + /// + /// Failed to copy {0} to clipboard. + /// + public static string ClipboardTextCopyFailed_Message => Resources.GetTranslatedString(@"ClipboardTextCopyFailed_Message"); + + + /// + /// click enter to input addresses + /// + public static string ComposerToPlaceholder => Resources.GetTranslatedString(@"ComposerToPlaceholder"); + + + /// + /// Set custom accent color if you wish. Not selecting a color will use your Windows accent color. + /// + public static string CustomThemeBuilder_AccentColorDescription => Resources.GetTranslatedString(@"CustomThemeBuilder_AccentColorDescription"); + + + /// + /// Accent color + /// + public static string CustomThemeBuilder_AccentColorTitle => Resources.GetTranslatedString(@"CustomThemeBuilder_AccentColorTitle"); + + + /// + /// Pick + /// + public static string CustomThemeBuilder_PickColor => Resources.GetTranslatedString(@"CustomThemeBuilder_PickColor"); + + + /// + /// Unique name for your custom theme. + /// + public static string CustomThemeBuilder_ThemeNameDescription => Resources.GetTranslatedString(@"CustomThemeBuilder_ThemeNameDescription"); + + + /// + /// Theme name + /// + public static string CustomThemeBuilder_ThemeNameTitle => Resources.GetTranslatedString(@"CustomThemeBuilder_ThemeNameTitle"); + + + /// + /// Custom Theme Builder + /// + public static string CustomThemeBuilder_Title => Resources.GetTranslatedString(@"CustomThemeBuilder_Title"); + + + /// + /// Set a custom wallpaper for Wino + /// + public static string CustomThemeBuilder_WallpaperDescription => Resources.GetTranslatedString(@"CustomThemeBuilder_WallpaperDescription"); + + + /// + /// Set custom wallpaper + /// + public static string CustomThemeBuilder_WallpaperTitle => Resources.GetTranslatedString(@"CustomThemeBuilder_WallpaperTitle"); + + + /// + /// You have reached the account creation limit. Would you like to purchase 'Unlimited Account' add-on to continue? + /// + public static string DialogMessage_AccountLimitMessage => Resources.GetTranslatedString(@"DialogMessage_AccountLimitMessage"); + + + /// + /// Account Limit Reached + /// + public static string DialogMessage_AccountLimitTitle => Resources.GetTranslatedString(@"DialogMessage_AccountLimitTitle"); + + + /// + /// Do you want to permanently delete all the mails in this folder? + /// + public static string DialogMessage_CleanupFolderMessage => Resources.GetTranslatedString(@"DialogMessage_CleanupFolderMessage"); + + + /// + /// Cleanup Folder + /// + public static string DialogMessage_CleanupFolderTitle => Resources.GetTranslatedString(@"DialogMessage_CleanupFolderTitle"); + + + /// + /// Message has no recipient. + /// + public static string DialogMessage_ComposerMissingRecipientMessage => Resources.GetTranslatedString(@"DialogMessage_ComposerMissingRecipientMessage"); + + + /// + /// Validation Failed + /// + public static string DialogMessage_ComposerValidationFailedTitle => Resources.GetTranslatedString(@"DialogMessage_ComposerValidationFailedTitle"); + + + /// + /// Give this new link a name. Accounts will be merged under this name. + /// + public static string DialogMessage_CreateLinkedAccountMessage => Resources.GetTranslatedString(@"DialogMessage_CreateLinkedAccountMessage"); + + + /// + /// Account Link Name + /// + public static string DialogMessage_CreateLinkedAccountTitle => Resources.GetTranslatedString(@"DialogMessage_CreateLinkedAccountTitle"); + + + /// + /// Delete {0}? + /// + public static string DialogMessage_DeleteAccountConfirmationMessage => Resources.GetTranslatedString(@"DialogMessage_DeleteAccountConfirmationMessage"); + + + /// + /// All data associated with this account will be deleted from disk permanently. + /// + public static string DialogMessage_DeleteAccountConfirmationTitle => Resources.GetTranslatedString(@"DialogMessage_DeleteAccountConfirmationTitle"); + + + /// + /// This draft will be discarded. Do you want to continue? + /// + public static string DialogMessage_DiscardDraftConfirmationMessage => Resources.GetTranslatedString(@"DialogMessage_DiscardDraftConfirmationMessage"); + + + /// + /// Discard Draft + /// + public static string DialogMessage_DiscardDraftConfirmationTitle => Resources.GetTranslatedString(@"DialogMessage_DiscardDraftConfirmationTitle"); + + + /// + /// Permanent Delete + /// + public static string DialogMessage_HardDeleteConfirmationMessage => Resources.GetTranslatedString(@"DialogMessage_HardDeleteConfirmationMessage"); + + + /// + /// Message(s) will be permanently deleted. Do you want to continue? + /// + public static string DialogMessage_HardDeleteConfirmationTitle => Resources.GetTranslatedString(@"DialogMessage_HardDeleteConfirmationTitle"); + + + /// + /// You don't have any accounts to create message from. + /// + public static string DialogMessage_NoAccountsForCreateMailMessage => Resources.GetTranslatedString(@"DialogMessage_NoAccountsForCreateMailMessage"); + + + /// + /// Account Missing + /// + public static string DialogMessage_NoAccountsForCreateMailTitle => Resources.GetTranslatedString(@"DialogMessage_NoAccountsForCreateMailTitle"); + + + /// + /// Enter new name for linked account + /// + public static string DialogMessage_RenameLinkedAccountsMessage => Resources.GetTranslatedString(@"DialogMessage_RenameLinkedAccountsMessage"); + + + /// + /// Rename Linked Account + /// + public static string DialogMessage_RenameLinkedAccountsTitle => Resources.GetTranslatedString(@"DialogMessage_RenameLinkedAccountsTitle"); + + + /// + /// This operation will not delete your accounts but only break the link for shared folder connections. Do you want to continue? + /// + public static string DialogMessage_UnlinkAccountsConfirmationMessage => Resources.GetTranslatedString(@"DialogMessage_UnlinkAccountsConfirmationMessage"); + + + /// + /// Unlink Accounts + /// + public static string DialogMessage_UnlinkAccountsConfirmationTitle => Resources.GetTranslatedString(@"DialogMessage_UnlinkAccountsConfirmationTitle"); + + + /// + /// Missin Subject + /// + public static string DialogMessage_EmptySubjectConfirmation => Resources.GetTranslatedString(@"DialogMessage_EmptySubjectConfirmation"); + + + /// + /// Message has no subject. Do you want to continue? + /// + public static string DialogMessage_EmptySubjectConfirmationMessage => Resources.GetTranslatedString(@"DialogMessage_EmptySubjectConfirmationMessage"); + + + /// + /// Don't ask again + /// + public static string Dialog_DontAskAgain => Resources.GetTranslatedString(@"Dialog_DontAskAgain"); + + + /// + /// Wino doesn't have it's own Discord server, but special 'wino-mail' channel is hosted at 'Developer Sanctuary' server. To get the updates about Wino please join Developer Sanctuary server and follow 'wino-mail' channel under 'Community Projects' You will be directed to server URL since Discord doesn't support channel invites. + /// + public static string DiscordChannelDisclaimerMessage => Resources.GetTranslatedString(@"DiscordChannelDisclaimerMessage"); + + + /// + /// Important Discord Information + /// + public static string DiscordChannelDisclaimerTitle => Resources.GetTranslatedString(@"DiscordChannelDisclaimerTitle"); + + + /// + /// Draft + /// + public static string Draft => Resources.GetTranslatedString(@"Draft"); + + + /// + /// Draw + /// + public static string EditorToolbarOption_Draw => Resources.GetTranslatedString(@"EditorToolbarOption_Draw"); + + + /// + /// Format + /// + public static string EditorToolbarOption_Format => Resources.GetTranslatedString(@"EditorToolbarOption_Format"); + + + /// + /// Insert + /// + public static string EditorToolbarOption_Insert => Resources.GetTranslatedString(@"EditorToolbarOption_Insert"); + + + /// + /// None + /// + public static string EditorToolbarOption_None => Resources.GetTranslatedString(@"EditorToolbarOption_None"); + + + /// + /// Options + /// + public static string EditorToolbarOption_Options => Resources.GetTranslatedString(@"EditorToolbarOption_Options"); + + + /// + /// Dark mode + /// + public static string ElementTheme_Dark => Resources.GetTranslatedString(@"ElementTheme_Dark"); + + + /// + /// Use system setting + /// + public static string ElementTheme_Default => Resources.GetTranslatedString(@"ElementTheme_Default"); + + + /// + /// Light mode + /// + public static string ElementTheme_Light => Resources.GetTranslatedString(@"ElementTheme_Light"); + + + /// + /// Emoji + /// + public static string Emoji => Resources.GetTranslatedString(@"Emoji"); + + + /// + /// IMAP Client Pool failed. + /// + public static string Exception_ImapClientPoolFailed => Resources.GetTranslatedString(@"Exception_ImapClientPoolFailed"); + + + /// + /// Authentication canceled + /// + public static string Exception_AuthenticationCanceled => Resources.GetTranslatedString(@"Exception_AuthenticationCanceled"); + + + /// + /// This theme already exists. + /// + public static string Exception_CustomThemeExists => Resources.GetTranslatedString(@"Exception_CustomThemeExists"); + + + /// + /// You must provide a name. + /// + public static string Exception_CustomThemeMissingName => Resources.GetTranslatedString(@"Exception_CustomThemeMissingName"); + + + /// + /// You must provide a custom background image. + /// + public static string Exception_CustomThemeMissingWallpaper => Resources.GetTranslatedString(@"Exception_CustomThemeMissingWallpaper"); + + + /// + /// Failed to synchronize folders + /// + public static string Exception_FailedToSynchronizeFolders => Resources.GetTranslatedString(@"Exception_FailedToSynchronizeFolders"); + + + /// + /// Callback uri is null on activation. + /// + public static string Exception_GoogleAuthCallbackNull => Resources.GetTranslatedString(@"Exception_GoogleAuthCallbackNull"); + + + /// + /// Corrupted authorization response. + /// + public static string Exception_GoogleAuthCorruptedCode => Resources.GetTranslatedString(@"Exception_GoogleAuthCorruptedCode"); + + + /// + /// OAuth authorization error: {0} + /// + public static string Exception_GoogleAuthError => Resources.GetTranslatedString(@"Exception_GoogleAuthError"); + + + /// + /// Received request with invalid state ({0}) + /// + public static string Exception_GoogleAuthInvalidResponse => Resources.GetTranslatedString(@"Exception_GoogleAuthInvalidResponse"); + + + /// + /// Authorization code exchange failed. + /// + public static string Exception_GoogleAuthorizationCodeExchangeFailed => Resources.GetTranslatedString(@"Exception_GoogleAuthorizationCodeExchangeFailed"); + + + /// + /// System folder configuration is not valid. Check configuration and try again. + /// + public static string Exception_InvalidSystemFolderConfiguration => Resources.GetTranslatedString(@"Exception_InvalidSystemFolderConfiguration"); + + + /// + /// Assigned account is null + /// + public static string Exception_NullAssignedAccount => Resources.GetTranslatedString(@"Exception_NullAssignedAccount"); + + + /// + /// Assigned folder is null + /// + public static string Exception_NullAssignedFolder => Resources.GetTranslatedString(@"Exception_NullAssignedFolder"); + + + /// + /// Response handling failed with error HTTP code {0} + /// + public static string Exception_SynchronizerFailureHTTP => Resources.GetTranslatedString(@"Exception_SynchronizerFailureHTTP"); + + + /// + /// Token generation failed + /// + public static string Exception_TokenGenerationFailed => Resources.GetTranslatedString(@"Exception_TokenGenerationFailed"); + + + /// + /// Failed to get token information. + /// + public static string Exception_TokenInfoRetrivalFailed => Resources.GetTranslatedString(@"Exception_TokenInfoRetrivalFailed"); + + + /// + /// Unknown error occurred during authentication + /// + public static string Exception_UnknowErrorDuringAuthentication => Resources.GetTranslatedString(@"Exception_UnknowErrorDuringAuthentication"); + + + /// + /// Action {0} is not implemented in request processor + /// + public static string Exception_UnsupportedAction => Resources.GetTranslatedString(@"Exception_UnsupportedAction"); + + + /// + /// This provider is not supported. + /// + public static string Exception_UnsupportedProvider => Resources.GetTranslatedString(@"Exception_UnsupportedProvider"); + + + /// + /// This operation is not supported for {0} + /// + public static string Exception_UnsupportedSynchronizerOperation => Resources.GetTranslatedString(@"Exception_UnsupportedSynchronizerOperation"); + + + /// + /// User canceled system folder config dialog. + /// + public static string Exception_UserCancelSystemFolderSetupDialog => Resources.GetTranslatedString(@"Exception_UserCancelSystemFolderSetupDialog"); + + + /// + /// Couldn't setup account folders. + /// + public static string Exception_InboxNotAvailable => Resources.GetTranslatedString(@"Exception_InboxNotAvailable"); + + + /// + /// Files + /// + public static string Files => Resources.GetTranslatedString(@"Files"); + + + /// + /// All + /// + public static string FilteringOption_All => Resources.GetTranslatedString(@"FilteringOption_All"); + + + /// + /// Flagged + /// + public static string FilteringOption_Flagged => Resources.GetTranslatedString(@"FilteringOption_Flagged"); + + + /// + /// Unread + /// + public static string FilteringOption_Unread => Resources.GetTranslatedString(@"FilteringOption_Unread"); + + + /// + /// Focused + /// + public static string Focused => Resources.GetTranslatedString(@"Focused"); + + + /// + /// Create sub folder + /// + public static string FolderOperation_CreateSubFolder => Resources.GetTranslatedString(@"FolderOperation_CreateSubFolder"); + + + /// + /// Delete + /// + public static string FolderOperation_Delete => Resources.GetTranslatedString(@"FolderOperation_Delete"); + + + /// + /// Don't sync this folder + /// + public static string FolderOperation_DontSync => Resources.GetTranslatedString(@"FolderOperation_DontSync"); + + + /// + /// Empty this folder + /// + public static string FolderOperation_Empty => Resources.GetTranslatedString(@"FolderOperation_Empty"); + + + /// + /// Mark all as read + /// + public static string FolderOperation_MarkAllAsRead => Resources.GetTranslatedString(@"FolderOperation_MarkAllAsRead"); + + + /// + /// Move + /// + public static string FolderOperation_Move => Resources.GetTranslatedString(@"FolderOperation_Move"); + + + /// + /// Move to {0} + /// + public static string DragMoveToFolderCaption => Resources.GetTranslatedString(@"DragMoveToFolderCaption"); + + + /// + /// None + /// + public static string FolderOperation_None => Resources.GetTranslatedString(@"FolderOperation_None"); + + + /// + /// Pin + /// + public static string FolderOperation_Pin => Resources.GetTranslatedString(@"FolderOperation_Pin"); + + + /// + /// Rename + /// + public static string FolderOperation_Rename => Resources.GetTranslatedString(@"FolderOperation_Rename"); + + + /// + /// Unpin + /// + public static string FolderOperation_Unpin => Resources.GetTranslatedString(@"FolderOperation_Unpin"); + + + /// + /// Archive + /// + public static string HoverActionOption_Archive => Resources.GetTranslatedString(@"HoverActionOption_Archive"); + + + /// + /// Delete + /// + public static string HoverActionOption_Delete => Resources.GetTranslatedString(@"HoverActionOption_Delete"); + + + /// + /// Move to Junk + /// + public static string HoverActionOption_MoveJunk => Resources.GetTranslatedString(@"HoverActionOption_MoveJunk"); + + + /// + /// Flag / Unflag + /// + public static string HoverActionOption_ToggleFlag => Resources.GetTranslatedString(@"HoverActionOption_ToggleFlag"); + + + /// + /// Read / Unread + /// + public static string HoverActionOption_ToggleRead => Resources.GetTranslatedString(@"HoverActionOption_ToggleRead"); + + + /// + /// Inbox + /// + public static string MergedAccountCommonFolderInbox => Resources.GetTranslatedString(@"MergedAccountCommonFolderInbox"); + + + /// + /// Sent + /// + public static string MergedAccountCommonFolderSent => Resources.GetTranslatedString(@"MergedAccountCommonFolderSent"); + + + /// + /// Draft + /// + public static string MergedAccountCommonFolderDraft => Resources.GetTranslatedString(@"MergedAccountCommonFolderDraft"); + + + /// + /// Junk + /// + public static string MergedAccountCommonFolderJunk => Resources.GetTranslatedString(@"MergedAccountCommonFolderJunk"); + + + /// + /// Deleted + /// + public static string MergedAccountCommonFolderTrash => Resources.GetTranslatedString(@"MergedAccountCommonFolderTrash"); + + + /// + /// Archive + /// + public static string MergedAccountCommonFolderArchive => Resources.GetTranslatedString(@"MergedAccountCommonFolderArchive"); + + + /// + /// Account type + /// + public static string IMAPSetupDialog_AccountType => Resources.GetTranslatedString(@"IMAPSetupDialog_AccountType"); + + + /// + /// Display Name + /// + public static string IMAPSetupDialog_DisplayName => Resources.GetTranslatedString(@"IMAPSetupDialog_DisplayName"); + + + /// + /// eg. John Doe + /// + public static string IMAPSetupDialog_DisplayNamePlaceholder => Resources.GetTranslatedString(@"IMAPSetupDialog_DisplayNamePlaceholder"); + + + /// + /// Incoming mail server + /// + public static string IMAPSetupDialog_IncomingMailServer => Resources.GetTranslatedString(@"IMAPSetupDialog_IncomingMailServer"); + + + /// + /// Port + /// + public static string IMAPSetupDialog_IncomingMailServerPort => Resources.GetTranslatedString(@"IMAPSetupDialog_IncomingMailServerPort"); + + + /// + /// Email address + /// + public static string IMAPSetupDialog_MailAddress => Resources.GetTranslatedString(@"IMAPSetupDialog_MailAddress"); + + + /// + /// someone@example.com + /// + public static string IMAPSetupDialog_MailAddressPlaceholder => Resources.GetTranslatedString(@"IMAPSetupDialog_MailAddressPlaceholder"); + + + /// + /// Outgoing (SMTP) mail server + /// + public static string IMAPSetupDialog_OutgoingMailServer => Resources.GetTranslatedString(@"IMAPSetupDialog_OutgoingMailServer"); + + + /// + /// Outgoing server password + /// + public static string IMAPSetupDialog_OutgoingMailServerPassword => Resources.GetTranslatedString(@"IMAPSetupDialog_OutgoingMailServerPassword"); + + + /// + /// Port + /// + public static string IMAPSetupDialog_OutgoingMailServerPort => Resources.GetTranslatedString(@"IMAPSetupDialog_OutgoingMailServerPort"); + + + /// + /// Outgoing server requires authentication + /// + public static string IMAPSetupDialog_OutgoingMailServerRequireAuthentication => Resources.GetTranslatedString(@"IMAPSetupDialog_OutgoingMailServerRequireAuthentication"); + + + /// + /// Outgoing server user name + /// + public static string IMAPSetupDialog_OutgoingMailServerUsername => Resources.GetTranslatedString(@"IMAPSetupDialog_OutgoingMailServerUsername"); + + + /// + /// Password + /// + public static string IMAPSetupDialog_Password => Resources.GetTranslatedString(@"IMAPSetupDialog_Password"); + + + /// + /// Require SSL for incoming email + /// + public static string IMAPSetupDialog_RequireSSLForIncomingMail => Resources.GetTranslatedString(@"IMAPSetupDialog_RequireSSLForIncomingMail"); + + + /// + /// Require SSL for outgoing email + /// + public static string IMAPSetupDialog_RequireSSLForOutgoingMail => Resources.GetTranslatedString(@"IMAPSetupDialog_RequireSSLForOutgoingMail"); + + + /// + /// Advanced IMAP Configuration + /// + public static string IMAPSetupDialog_Title => Resources.GetTranslatedString(@"IMAPSetupDialog_Title"); + + + /// + /// Use the same username and password for sending email + /// + public static string IMAPSetupDialog_UseSameConfig => Resources.GetTranslatedString(@"IMAPSetupDialog_UseSameConfig"); + + + /// + /// Username + /// + public static string IMAPSetupDialog_Username => Resources.GetTranslatedString(@"IMAPSetupDialog_Username"); + + + /// + /// johndoe, johndoe@fabrikam.com, domain/johndoe + /// + public static string IMAPSetupDialog_UsernamePlaceholder => Resources.GetTranslatedString(@"IMAPSetupDialog_UsernamePlaceholder"); + + + /// + /// Image rendering is disabled for this message. + /// + public static string ImageRenderingDisabled => Resources.GetTranslatedString(@"ImageRenderingDisabled"); + + + /// + /// Enable + /// + public static string InfoBarAction_Enable => Resources.GetTranslatedString(@"InfoBarAction_Enable"); + + + /// + /// This folder is disabled for synchronization. + /// + public static string InfoBarMessage_SynchronizationDisabledFolder => Resources.GetTranslatedString(@"InfoBarMessage_SynchronizationDisabledFolder"); + + + /// + /// Disabled Folder + /// + public static string InfoBarTitle_SynchronizationDisabledFolder => Resources.GetTranslatedString(@"InfoBarTitle_SynchronizationDisabledFolder"); + + + /// + /// Error + /// + public static string GeneralTitle_Error => Resources.GetTranslatedString(@"GeneralTitle_Error"); + + + /// + /// Warning + /// + public static string GeneralTitle_Warning => Resources.GetTranslatedString(@"GeneralTitle_Warning"); + + + /// + /// Information + /// + public static string GeneralTitle_Info => Resources.GetTranslatedString(@"GeneralTitle_Info"); + + + /// + /// {0} is created + /// + public static string Info_AccountCreatedMessage => Resources.GetTranslatedString(@"Info_AccountCreatedMessage"); + + + /// + /// Account Creation + /// + public static string Info_AccountCreatedTitle => Resources.GetTranslatedString(@"Info_AccountCreatedTitle"); + + + /// + /// Account Creation Failed + /// + public static string Info_AccountCreationFailedTitle => Resources.GetTranslatedString(@"Info_AccountCreationFailedTitle"); + + + /// + /// {0} is successfuly deleted. + /// + public static string Info_AccountDeletedMessage => Resources.GetTranslatedString(@"Info_AccountDeletedMessage"); + + + /// + /// Account Deleted + /// + public static string Info_AccountDeletedTitle => Resources.GetTranslatedString(@"Info_AccountDeletedTitle"); + + + /// + /// Failed + /// + public static string Info_AccountIssueFixFailedTitle => Resources.GetTranslatedString(@"Info_AccountIssueFixFailedTitle"); + + + /// + /// Fixed all account issues. + /// + public static string Info_AccountIssueFixSuccessMessage => Resources.GetTranslatedString(@"Info_AccountIssueFixSuccessMessage"); + + + /// + /// Success + /// + public static string Info_AccountIssueFixSuccessTitle => Resources.GetTranslatedString(@"Info_AccountIssueFixSuccessTitle"); + + + /// + /// Can't open this attachment. + /// + public static string Info_AttachmentOpenFailedMessage => Resources.GetTranslatedString(@"Info_AttachmentOpenFailedMessage"); + + + /// + /// Failed + /// + public static string Info_AttachmentOpenFailedTitle => Resources.GetTranslatedString(@"Info_AttachmentOpenFailedTitle"); + + + /// + /// Can't save this attachment. + /// + public static string Info_AttachmentSaveFailedMessage => Resources.GetTranslatedString(@"Info_AttachmentSaveFailedMessage"); + + + /// + /// Failed + /// + public static string Info_AttachmentSaveFailedTitle => Resources.GetTranslatedString(@"Info_AttachmentSaveFailedTitle"); + + + /// + /// Attachment is saved. + /// + public static string Info_AttachmentSaveSuccessMessage => Resources.GetTranslatedString(@"Info_AttachmentSaveSuccessMessage"); + + + /// + /// Attachment Saved + /// + public static string Info_AttachmentSaveSuccessTitle => Resources.GetTranslatedString(@"Info_AttachmentSaveSuccessTitle"); + + + /// + /// Background execution for the app is denied. This may affect background synchronization and live notifications. + /// + public static string Info_BackgroundExecutionDeniedMessage => Resources.GetTranslatedString(@"Info_BackgroundExecutionDeniedMessage"); + + + /// + /// Denied Background Execution + /// + public static string Info_BackgroundExecutionDeniedTitle => Resources.GetTranslatedString(@"Info_BackgroundExecutionDeniedTitle"); + + + /// + /// Unknown exception occurred when registering background synchronizer. + /// + public static string Info_BackgroundExecutionUnknownErrorMessage => Resources.GetTranslatedString(@"Info_BackgroundExecutionUnknownErrorMessage"); + + + /// + /// Background Execution Failure + /// + public static string Info_BackgroundExecutionUnknownErrorTitle => Resources.GetTranslatedString(@"Info_BackgroundExecutionUnknownErrorTitle"); + + + /// + /// Couldn't locate the MIME file. Synchronizing may help. + /// + public static string Info_ComposerMissingMIMEMessage => Resources.GetTranslatedString(@"Info_ComposerMissingMIMEMessage"); + + + /// + /// Failed + /// + public static string Info_ComposerMissingMIMETitle => Resources.GetTranslatedString(@"Info_ComposerMissingMIMETitle"); + + + /// + /// This contact is already in the recipient list. + /// + public static string Info_ContactExistsMessage => Resources.GetTranslatedString(@"Info_ContactExistsMessage"); + + + /// + /// Contact Exists + /// + public static string Info_ContactExistsTitle => Resources.GetTranslatedString(@"Info_ContactExistsTitle"); + + + /// + /// Draft folder is missing for this account. Please check your account settings. + /// + public static string Info_DraftFolderMissingMessage => Resources.GetTranslatedString(@"Info_DraftFolderMissingMessage"); + + + /// + /// Missing Draft Folder + /// + public static string Info_DraftFolderMissingTitle => Resources.GetTranslatedString(@"Info_DraftFolderMissingTitle"); + + + /// + /// Failed to launch file + /// + public static string Info_FileLaunchFailedTitle => Resources.GetTranslatedString(@"Info_FileLaunchFailedTitle"); + + + /// + /// '{0}' is not a valid e-mail address. + /// + public static string Info_InvalidAddressMessage => Resources.GetTranslatedString(@"Info_InvalidAddressMessage"); + + + /// + /// Invalid Address + /// + public static string Info_InvalidAddressTitle => Resources.GetTranslatedString(@"Info_InvalidAddressTitle"); + + + /// + /// You can't move selected mails to this folder. + /// + public static string Info_InvalidMoveTargetMessage => Resources.GetTranslatedString(@"Info_InvalidMoveTargetMessage"); + + + /// + /// Invalid Move Target + /// + public static string Info_InvalidMoveTargetTitle => Resources.GetTranslatedString(@"Info_InvalidMoveTargetTitle"); + + + /// + /// There are no logs to share. + /// + public static string Info_LogsNotFoundMessage => Resources.GetTranslatedString(@"Info_LogsNotFoundMessage"); + + + /// + /// Logs Not Found + /// + public static string Info_LogsNotFoundTitle => Resources.GetTranslatedString(@"Info_LogsNotFoundTitle"); + + + /// + /// {0} is saved to selected folder. + /// + public static string Info_LogsSavedMessage => Resources.GetTranslatedString(@"Info_LogsSavedMessage"); + + + /// + /// Saved + /// + public static string Info_LogsSavedTitle => Resources.GetTranslatedString(@"Info_LogsSavedTitle"); + + + /// + /// This mail is corrupted or can't be opened. {0} + /// + public static string Info_MailRenderingFailedMessage => Resources.GetTranslatedString(@"Info_MailRenderingFailedMessage"); + + + /// + /// Render Failed + /// + public static string Info_MailRenderingFailedTitle => Resources.GetTranslatedString(@"Info_MailRenderingFailedTitle"); + + + /// + /// This message is corrupted. + /// + public static string Info_MessageCorruptedMessage => Resources.GetTranslatedString(@"Info_MessageCorruptedMessage"); + + + /// + /// Error + /// + public static string Info_MessageCorruptedTitle => Resources.GetTranslatedString(@"Info_MessageCorruptedTitle"); + + + /// + /// {0} doesn't exist for this account. + /// + public static string Info_MissingFolderMessage => Resources.GetTranslatedString(@"Info_MissingFolderMessage"); + + + /// + /// Missing Folder + /// + public static string Info_MissingFolderTitle => Resources.GetTranslatedString(@"Info_MissingFolderTitle"); + + + /// + /// Success + /// + public static string Info_PDFSaveSuccessTitle => Resources.GetTranslatedString(@"Info_PDFSaveSuccessTitle"); + + + /// + /// Failed to save PDF file + /// + public static string Info_PDFSaveFailedTitle => Resources.GetTranslatedString(@"Info_PDFSaveFailedTitle"); + + + /// + /// PDF file is saved to {0} + /// + public static string Info_PDFSaveSuccessMessage => Resources.GetTranslatedString(@"Info_PDFSaveSuccessMessage"); + + + /// + /// Looks like this product has already been purchased before. + /// + public static string Info_PurchaseExistsMessage => Resources.GetTranslatedString(@"Info_PurchaseExistsMessage"); + + + /// + /// Existing Product + /// + public static string Info_PurchaseExistsTitle => Resources.GetTranslatedString(@"Info_PurchaseExistsTitle"); + + + /// + /// Thank You + /// + public static string Info_PurchaseThankYouMessage => Resources.GetTranslatedString(@"Info_PurchaseThankYouMessage"); + + + /// + /// Purchase successful + /// + public static string Info_PurchaseThankYouTitle => Resources.GetTranslatedString(@"Info_PurchaseThankYouTitle"); + + + /// + /// Failed to Create Requests + /// + public static string Info_RequestCreationFailedTitle => Resources.GetTranslatedString(@"Info_RequestCreationFailedTitle"); + + + /// + /// There was a network issue with your review. + /// + public static string Info_ReviewNetworkErrorMessage => Resources.GetTranslatedString(@"Info_ReviewNetworkErrorMessage"); + + + /// + /// Network Issue + /// + public static string Info_ReviewNetworkErrorTitle => Resources.GetTranslatedString(@"Info_ReviewNetworkErrorTitle"); + + + /// + /// All feedbacks are appreciated. Thank you for the review! + /// + public static string Info_ReviewNewMessage => Resources.GetTranslatedString(@"Info_ReviewNewMessage"); + + + /// + /// Thank you + /// + public static string Info_ReviewSuccessTitle => Resources.GetTranslatedString(@"Info_ReviewSuccessTitle"); + + + /// + /// There was an unknown issue with your review. ({0}) + /// + public static string Info_ReviewUnknownErrorMessage => Resources.GetTranslatedString(@"Info_ReviewUnknownErrorMessage"); + + + /// + /// Unknown Error + /// + public static string Info_ReviewUnknownErrorTitle => Resources.GetTranslatedString(@"Info_ReviewUnknownErrorTitle"); + + + /// + /// Thank you for the updated review. + /// + public static string Info_ReviewUpdatedMessage => Resources.GetTranslatedString(@"Info_ReviewUpdatedMessage"); + + + /// + /// Disabled signature for this account + /// + public static string Info_SignatureDisabledMessage => Resources.GetTranslatedString(@"Info_SignatureDisabledMessage"); + + + /// + /// Success + /// + public static string Info_SignatureDisabledTitle => Resources.GetTranslatedString(@"Info_SignatureDisabledTitle"); + + + /// + /// New signature is saved + /// + public static string Info_SignatureSavedMessage => Resources.GetTranslatedString(@"Info_SignatureSavedMessage"); + + + /// + /// Success + /// + public static string Info_SignatureSavedTitle => Resources.GetTranslatedString(@"Info_SignatureSavedTitle"); + + + /// + /// Canceled + /// + public static string Info_SyncCanceledMessage => Resources.GetTranslatedString(@"Info_SyncCanceledMessage"); + + + /// + /// Synchronization + /// + public static string Info_SyncCanceledTitle => Resources.GetTranslatedString(@"Info_SyncCanceledTitle"); + + + /// + /// Synchronization Failed + /// + public static string Info_SyncFailedTitle => Resources.GetTranslatedString(@"Info_SyncFailedTitle"); + + + /// + /// This functionality is not implemented yet. + /// + public static string Info_UnsupportedFunctionalityDescription => Resources.GetTranslatedString(@"Info_UnsupportedFunctionalityDescription"); + + + /// + /// Unsupported + /// + public static string Info_UnsupportedFunctionalityTitle => Resources.GetTranslatedString(@"Info_UnsupportedFunctionalityTitle"); + + + /// + /// Invalid Unsubscribe Uri + /// + public static string Info_UnsubscribeLinkInvalidTitle => Resources.GetTranslatedString(@"Info_UnsubscribeLinkInvalidTitle"); + + + /// + /// This unsubscribe link is invalid. Failed to unsubscribe from the list. + /// + public static string Info_UnsubscribeLinkInvalidMessage => Resources.GetTranslatedString(@"Info_UnsubscribeLinkInvalidMessage"); + + + /// + /// Authentication method + /// + public static string ImapAdvancedSetupDialog_AuthenticationMethod => Resources.GetTranslatedString(@"ImapAdvancedSetupDialog_AuthenticationMethod"); + + + /// + /// Connection security + /// + public static string ImapAdvancedSetupDialog_ConnectionSecurity => Resources.GetTranslatedString(@"ImapAdvancedSetupDialog_ConnectionSecurity"); + + + /// + /// Auto + /// + public static string ImapAuthenticationMethod_Auto => Resources.GetTranslatedString(@"ImapAuthenticationMethod_Auto"); + + + /// + /// CRAM-MD5 + /// + public static string ImapAuthenticationMethod_CramMD5 => Resources.GetTranslatedString(@"ImapAuthenticationMethod_CramMD5"); + + + /// + /// DIGEST-MD5 + /// + public static string ImapAuthenticationMethod_DigestMD5 => Resources.GetTranslatedString(@"ImapAuthenticationMethod_DigestMD5"); + + + /// + /// No authentication + /// + public static string ImapAuthenticationMethod_None => Resources.GetTranslatedString(@"ImapAuthenticationMethod_None"); + + + /// + /// Normal password + /// + public static string ImapAuthenticationMethod_Plain => Resources.GetTranslatedString(@"ImapAuthenticationMethod_Plain"); + + + /// + /// Encrypted password + /// + public static string ImapAuthenticationMethod_EncryptedPassword => Resources.GetTranslatedString(@"ImapAuthenticationMethod_EncryptedPassword"); + + + /// + /// NTLM + /// + public static string ImapAuthenticationMethod_Ntlm => Resources.GetTranslatedString(@"ImapAuthenticationMethod_Ntlm"); + + + /// + /// None + /// + public static string ImapConnectionSecurity_None => Resources.GetTranslatedString(@"ImapConnectionSecurity_None"); + + + /// + /// SSL/TLS + /// + public static string ImapConnectionSecurity_SslTls => Resources.GetTranslatedString(@"ImapConnectionSecurity_SslTls"); + + + /// + /// STARTTLS + /// + public static string ImapConnectionSecurity_StartTls => Resources.GetTranslatedString(@"ImapConnectionSecurity_StartTls"); + + + /// + /// Auto + /// + public static string ImapConnectionSecurity_Auto => Resources.GetTranslatedString(@"ImapConnectionSecurity_Auto"); + + + /// + /// Justify + /// + public static string Justify => Resources.GetTranslatedString(@"Justify"); + + + /// + /// Left + /// + public static string Left => Resources.GetTranslatedString(@"Left"); + + + /// + /// Link + /// + public static string Link => Resources.GetTranslatedString(@"Link"); + + + /// + /// you must have at least 2 accounts to create link link will be removed on save + /// + public static string LinkedAccountsCreatePolicyMessage => Resources.GetTranslatedString(@"LinkedAccountsCreatePolicyMessage"); + + + /// + /// Linked Accounts + /// + public static string LinkedAccountsTitle => Resources.GetTranslatedString(@"LinkedAccountsTitle"); + + + /// + /// Always Move to Focused + /// + public static string MailOperation_AlwaysMoveFocused => Resources.GetTranslatedString(@"MailOperation_AlwaysMoveFocused"); + + + /// + /// Always Move to Other + /// + public static string MailOperation_AlwaysMoveOther => Resources.GetTranslatedString(@"MailOperation_AlwaysMoveOther"); + + + /// + /// Archive + /// + public static string MailOperation_Archive => Resources.GetTranslatedString(@"MailOperation_Archive"); + + + /// + /// Clear flag + /// + public static string MailOperation_ClearFlag => Resources.GetTranslatedString(@"MailOperation_ClearFlag"); + + + /// + /// Dark + /// + public static string MailOperation_DarkEditor => Resources.GetTranslatedString(@"MailOperation_DarkEditor"); + + + /// + /// Delete + /// + public static string MailOperation_Delete => Resources.GetTranslatedString(@"MailOperation_Delete"); + + + /// + /// Export to PDF + /// + public static string MailOperation_ExportPDF => Resources.GetTranslatedString(@"MailOperation_ExportPDF"); + + + /// + /// Find + /// + public static string MailOperation_Find => Resources.GetTranslatedString(@"MailOperation_Find"); + + + /// + /// Forward + /// + public static string MailOperation_Forward => Resources.GetTranslatedString(@"MailOperation_Forward"); + + + /// + /// Ignore + /// + public static string MailOperation_Ignore => Resources.GetTranslatedString(@"MailOperation_Ignore"); + + + /// + /// Light + /// + public static string MailOperation_LightEditor => Resources.GetTranslatedString(@"MailOperation_LightEditor"); + + + /// + /// Mark as junk + /// + public static string MailOperation_MarkAsJunk => Resources.GetTranslatedString(@"MailOperation_MarkAsJunk"); + + + /// + /// Mark as read + /// + public static string MailOperation_MarkAsRead => Resources.GetTranslatedString(@"MailOperation_MarkAsRead"); + + + /// + /// Mark as unread + /// + public static string MailOperation_MarkAsUnread => Resources.GetTranslatedString(@"MailOperation_MarkAsUnread"); + + + /// + /// Mark as Not Junk + /// + public static string MailOperation_MarkNotJunk => Resources.GetTranslatedString(@"MailOperation_MarkNotJunk"); + + + /// + /// Move + /// + public static string MailOperation_Move => Resources.GetTranslatedString(@"MailOperation_Move"); + + + /// + /// Move to Focused + /// + public static string MailOperation_MoveFocused => Resources.GetTranslatedString(@"MailOperation_MoveFocused"); + + + /// + /// Move to Junk + /// + public static string MailOperation_MoveJunk => Resources.GetTranslatedString(@"MailOperation_MoveJunk"); + + + /// + /// Move to Other + /// + public static string MailOperation_MoveOther => Resources.GetTranslatedString(@"MailOperation_MoveOther"); + + + /// + /// Navigate + /// + public static string MailOperation_Navigate => Resources.GetTranslatedString(@"MailOperation_Navigate"); + + + /// + /// Print + /// + public static string MailOperation_Print => Resources.GetTranslatedString(@"MailOperation_Print"); + + + /// + /// Reply + /// + public static string MailOperation_Reply => Resources.GetTranslatedString(@"MailOperation_Reply"); + + + /// + /// Reply all + /// + public static string MailOperation_ReplyAll => Resources.GetTranslatedString(@"MailOperation_ReplyAll"); + + + /// + /// Save As + /// + public static string MailOperation_SaveAs => Resources.GetTranslatedString(@"MailOperation_SaveAs"); + + + /// + /// Set flag + /// + public static string MailOperation_SetFlag => Resources.GetTranslatedString(@"MailOperation_SetFlag"); + + + /// + /// Unarchive + /// + public static string MailOperation_Unarchive => Resources.GetTranslatedString(@"MailOperation_Unarchive"); + + + /// + /// Zoom + /// + public static string MailOperation_Zoom => Resources.GetTranslatedString(@"MailOperation_Zoom"); + + + /// + /// {0} item(s) selected + /// + public static string MailsSelected => Resources.GetTranslatedString(@"MailsSelected"); + + + /// + /// Mark as flagged/unflagged + /// + public static string MarkFlagUnflag => Resources.GetTranslatedString(@"MarkFlagUnflag"); + + + /// + /// Mark as read/unread + /// + public static string MarkReadUnread => Resources.GetTranslatedString(@"MarkReadUnread"); + + + /// + /// Manage Accounts + /// + public static string MenuManageAccounts => Resources.GetTranslatedString(@"MenuManageAccounts"); + + + /// + /// New Mail + /// + public static string MenuNewMail => Resources.GetTranslatedString(@"MenuNewMail"); + + + /// + /// accounts + /// + public static string MenuMergedAccountItemAccountsSuffix => Resources.GetTranslatedString(@"MenuMergedAccountItemAccountsSuffix"); + + + /// + /// Rate Wino + /// + public static string MenuRate => Resources.GetTranslatedString(@"MenuRate"); + + + /// + /// Settings + /// + public static string MenuSettings => Resources.GetTranslatedString(@"MenuSettings"); + + + /// + /// Available Accounts + /// + public static string MergedAccountsAvailableAccountsTitle => Resources.GetTranslatedString(@"MergedAccountsAvailableAccountsTitle"); + + + /// + /// More + /// + public static string More => Resources.GetTranslatedString(@"More"); + + + /// + /// {0} is not a valid folder for this mail. + /// + public static string MoveMailDialog_InvalidFolderMessage => Resources.GetTranslatedString(@"MoveMailDialog_InvalidFolderMessage"); + + + /// + /// Pick a folder + /// + public static string MoveMailDialog_Title => Resources.GetTranslatedString(@"MoveMailDialog_Title"); + + + /// + /// Account Name + /// + public static string NewAccountDialog_AccountName => Resources.GetTranslatedString(@"NewAccountDialog_AccountName"); + + + /// + /// Personal + /// + public static string NewAccountDialog_AccountNameDefaultValue => Resources.GetTranslatedString(@"NewAccountDialog_AccountNameDefaultValue"); + + + /// + /// eg. Personal Mail + /// + public static string NewAccountDialog_AccountNamePlaceholder => Resources.GetTranslatedString(@"NewAccountDialog_AccountNamePlaceholder"); + + + /// + /// Add New Account + /// + public static string NewAccountDialog_Title => Resources.GetTranslatedString(@"NewAccountDialog_Title"); + + + /// + /// no message selected + /// + public static string NoMailSelected => Resources.GetTranslatedString(@"NoMailSelected"); + + + /// + /// no messages match your search criteria. + /// + public static string NoMessageCrieteria => Resources.GetTranslatedString(@"NoMessageCrieteria"); + + + /// + /// this folder is empty. + /// + public static string NoMessageEmptyFolder => Resources.GetTranslatedString(@"NoMessageEmptyFolder"); + + + /// + /// You have {0} new mails + /// + public static string Notifications_MultipleNotificationsMessage => Resources.GetTranslatedString(@"Notifications_MultipleNotificationsMessage"); + + + /// + /// New Mails + /// + public static string Notifications_MultipleNotificationsTitle => Resources.GetTranslatedString(@"Notifications_MultipleNotificationsTitle"); + + + /// + /// Checkout new version {0} + /// + public static string Notifications_WinoUpdatedMessage => Resources.GetTranslatedString(@"Notifications_WinoUpdatedMessage"); + + + /// + /// Wino Mail has been updated. + /// + public static string Notifications_WinoUpdatedTitle => Resources.GetTranslatedString(@"Notifications_WinoUpdatedTitle"); + + + /// + /// Other + /// + public static string Other => Resources.GetTranslatedString(@"Other"); + + + /// + /// Default + /// + public static string PaneLengthOption_Default => Resources.GetTranslatedString(@"PaneLengthOption_Default"); + + + /// + /// Extra Large + /// + public static string PaneLengthOption_ExtraLarge => Resources.GetTranslatedString(@"PaneLengthOption_ExtraLarge"); + + + /// + /// Large + /// + public static string PaneLengthOption_Large => Resources.GetTranslatedString(@"PaneLengthOption_Large"); + + + /// + /// Medium + /// + public static string PaneLengthOption_Medium => Resources.GetTranslatedString(@"PaneLengthOption_Medium"); + + + /// + /// Micro + /// + public static string PaneLengthOption_Micro => Resources.GetTranslatedString(@"PaneLengthOption_Micro"); + + + /// + /// Small + /// + public static string PaneLengthOption_Small => Resources.GetTranslatedString(@"PaneLengthOption_Small"); + + + /// + /// Photos + /// + public static string Photos => Resources.GetTranslatedString(@"Photos"); + + + /// + /// Preparing folders + /// + public static string PreparingFoldersMessage => Resources.GetTranslatedString(@"PreparingFoldersMessage"); + + + /// + /// Google Account + /// + public static string ProviderDetail_Gmail_Description => Resources.GetTranslatedString(@"ProviderDetail_Gmail_Description"); + + + /// + /// Custom IMAP/SMTP server + /// + public static string ProviderDetail_IMAP_Description => Resources.GetTranslatedString(@"ProviderDetail_IMAP_Description"); + + + /// + /// IMAP Server + /// + public static string ProviderDetail_IMAP_Title => Resources.GetTranslatedString(@"ProviderDetail_IMAP_Title"); + + + /// + /// Results + /// + public static string Results => Resources.GetTranslatedString(@"Results"); + + + /// + /// Right + /// + public static string Right => Resources.GetTranslatedString(@"Right"); + + + /// + /// up to date + /// + public static string SynchronizationFolderReport_Success => Resources.GetTranslatedString(@"SynchronizationFolderReport_Success"); + + + /// + /// synchronization is failed + /// + public static string SynchronizationFolderReport_Failed => Resources.GetTranslatedString(@"SynchronizationFolderReport_Failed"); + + + /// + /// search + /// + public static string SearchBarPlaceholder => Resources.GetTranslatedString(@"SearchBarPlaceholder"); + + + /// + /// searching in + /// + public static string SearchingIn => Resources.GetTranslatedString(@"SearchingIn"); + + + /// + /// Go to issue tracker GitHub repository. + /// + public static string SettingsAboutGithub_Description => Resources.GetTranslatedString(@"SettingsAboutGithub_Description"); + + + /// + /// GitHub + /// + public static string SettingsAboutGithub_Title => Resources.GetTranslatedString(@"SettingsAboutGithub_Title"); + + + /// + /// Append messages to Sent folder + /// + public static string SettingsAccountManagementAppendMessage_Title => Resources.GetTranslatedString(@"SettingsAccountManagementAppendMessage_Title"); + + + /// + /// Create a copy of the message in Sent folder after the draft is sent. Enable this if you don't see your mails after you sent them in Sent folder. + /// + public static string SettingsAccountManagementAppendMessage_Description => Resources.GetTranslatedString(@"SettingsAccountManagementAppendMessage_Description"); + + + /// + /// Edit Linked Inbox + /// + public static string SettingsEditLinkedInbox_Title => Resources.GetTranslatedString(@"SettingsEditLinkedInbox_Title"); + + + /// + /// Add / remove accounts, rename or break the link between accounts. + /// + public static string SettingsEditLinkedInbox_Description => Resources.GetTranslatedString(@"SettingsEditLinkedInbox_Description"); + + + /// + /// Version + /// + public static string SettingsAboutVersion => Resources.GetTranslatedString(@"SettingsAboutVersion"); + + + /// + /// Lightweight mail client for Windows device families. + /// + public static string SettingsAboutWinoDescription => Resources.GetTranslatedString(@"SettingsAboutWinoDescription"); + + + /// + /// Learn more about Wino. + /// + public static string SettingsAbout_Description => Resources.GetTranslatedString(@"SettingsAbout_Description"); + + + /// + /// About + /// + public static string SettingsAbout_Title => Resources.GetTranslatedString(@"SettingsAbout_Title"); + + + /// + /// Change application's accent color + /// + public static string SettingsAccentColor_Description => Resources.GetTranslatedString(@"SettingsAccentColor_Description"); + + + /// + /// Accent Color + /// + public static string SettingsAccentColor_Title => Resources.GetTranslatedString(@"SettingsAccentColor_Title"); + + + /// + /// Use my Windows accent color + /// + public static string SettingsAccentColor_UseWindowsAccentColor => Resources.GetTranslatedString(@"SettingsAccentColor_UseWindowsAccentColor"); + + + /// + /// Change the name of the account. + /// + public static string SettingsAccountName_Description => Resources.GetTranslatedString(@"SettingsAccountName_Description"); + + + /// + /// Account Name + /// + public static string SettingsAccountName_Title => Resources.GetTranslatedString(@"SettingsAccountName_Title"); + + + /// + /// Personalize Wino with different custom application themes for your like. + /// + public static string SettingsApplicationTheme_Description => Resources.GetTranslatedString(@"SettingsApplicationTheme_Description"); + + + /// + /// Application Theme + /// + public static string SettingsApplicationTheme_Title => Resources.GetTranslatedString(@"SettingsApplicationTheme_Title"); + + + /// + /// Select a theme from Wino's own collection for your taste or apply your own themes. + /// + public static string SettingsAvailableThemes_Description => Resources.GetTranslatedString(@"SettingsAvailableThemes_Description"); + + + /// + /// Available Themes + /// + public static string SettingsAvailableThemes_Title => Resources.GetTranslatedString(@"SettingsAvailableThemes_Title"); + + + /// + /// Auto select next item + /// + public static string SettingsAutoSelectNextItem_Title => Resources.GetTranslatedString(@"SettingsAutoSelectNextItem_Title"); + + + /// + /// Select the next item after you delete or move a mail. + /// + public static string SettingsAutoSelectNextItem_Description => Resources.GetTranslatedString(@"SettingsAutoSelectNextItem_Description"); + + + /// + /// Create your own custom theme with custom wallpaper and accent color. + /// + public static string SettingsCustomTheme_Description => Resources.GetTranslatedString(@"SettingsCustomTheme_Description"); + + + /// + /// Custom Theme + /// + public static string SettingsCustomTheme_Title => Resources.GetTranslatedString(@"SettingsCustomTheme_Title"); + + + /// + /// Configure System Folders + /// + public static string SettingsConfigureSpecialFolders_Title => Resources.GetTranslatedString(@"SettingsConfigureSpecialFolders_Title"); + + + /// + /// Set folders with special functions. Folders such as Archive, Inbox, and Drafts are essential for Wino to function properly. + /// + public static string SettingsConfigureSpecialFolders_Description => Resources.GetTranslatedString(@"SettingsConfigureSpecialFolders_Description"); + + + /// + /// Configure + /// + public static string SettingConfigureSpecialFolders_Button => Resources.GetTranslatedString(@"SettingConfigureSpecialFolders_Button"); + + + /// + /// Failed to setup system folders + /// + public static string Error_FailedToSetupSystemFolders_Title => Resources.GetTranslatedString(@"Error_FailedToSetupSystemFolders_Title"); + + + /// + /// Delete all e-mails and credentials associated with this account. + /// + public static string SettingsDeleteAccount_Description => Resources.GetTranslatedString(@"SettingsDeleteAccount_Description"); + + + /// + /// Delete this account + /// + public static string SettingsDeleteAccount_Title => Resources.GetTranslatedString(@"SettingsDeleteAccount_Title"); + + + /// + /// Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys? + /// + public static string SettingsDeleteProtection_Description => Resources.GetTranslatedString(@"SettingsDeleteProtection_Description"); + + + /// + /// Permanent Delete Protection + /// + public static string SettingsDeleteProtection_Title => Resources.GetTranslatedString(@"SettingsDeleteProtection_Title"); + + + /// + /// For developers + /// + public static string SettingsDiagnostics_Description => Resources.GetTranslatedString(@"SettingsDiagnostics_Description"); + + + /// + /// Diagnostics + /// + public static string SettingsDiagnostics_Title => Resources.GetTranslatedString(@"SettingsDiagnostics_Title"); + + + /// + /// Get regular development updates, join roadmap discussions and provide feedback. + /// + public static string SettingsDiscord_Description => Resources.GetTranslatedString(@"SettingsDiscord_Description"); + + + /// + /// Discord Channel + /// + public static string SettingsDiscord_Title => Resources.GetTranslatedString(@"SettingsDiscord_Title"); + + + /// + /// Element theme selection is disabled when application theme is selected other than Default. + /// + public static string SettingsElementThemeSelectionDisabled => Resources.GetTranslatedString(@"SettingsElementThemeSelectionDisabled"); + + + /// + /// Select a Windows theme for Wino + /// + public static string SettingsElementTheme_Description => Resources.GetTranslatedString(@"SettingsElementTheme_Description"); + + + /// + /// Element Theme + /// + public static string SettingsElementTheme_Title => Resources.GetTranslatedString(@"SettingsElementTheme_Title"); + + + /// + /// Enable hover actions + /// + public static string SettingsEnableHoverActions_Title => Resources.GetTranslatedString(@"SettingsEnableHoverActions_Title"); + + + /// + /// Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup. + /// + public static string SettingsEnableIMAPLogs_Description => Resources.GetTranslatedString(@"SettingsEnableIMAPLogs_Description"); + + + /// + /// Enable IMAP Protocol Logs + /// + public static string SettingsEnableIMAPLogs_Title => Resources.GetTranslatedString(@"SettingsEnableIMAPLogs_Title"); + + + /// + /// I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public. + /// + public static string SettingsEnableLogs_Description => Resources.GetTranslatedString(@"SettingsEnableLogs_Description"); + + + /// + /// Enable Logs + /// + public static string SettingsEnableLogs_Title => Resources.GetTranslatedString(@"SettingsEnableLogs_Title"); + + + /// + /// Enable Signature + /// + public static string SettingsEnableSignature => Resources.GetTranslatedString(@"SettingsEnableSignature"); + + + /// + /// Set whether Wino should expand this account's folders on startup. + /// + public static string SettingsExpandOnStartup_Description => Resources.GetTranslatedString(@"SettingsExpandOnStartup_Description"); + + + /// + /// Expand Menu on Startup + /// + public static string SettingsExpandOnStartup_Title => Resources.GetTranslatedString(@"SettingsExpandOnStartup_Title"); + + + /// + /// Manage external content settings when rendering mails. + /// + public static string SettingsExternalContent_Description => Resources.GetTranslatedString(@"SettingsExternalContent_Description"); + + + /// + /// External Content + /// + public static string SettingsExternalContent_Title => Resources.GetTranslatedString(@"SettingsExternalContent_Title"); + + + /// + /// Set whether Inbox should be split into two as Focused - Other. + /// + public static string SettingsFocusedInbox_Description => Resources.GetTranslatedString(@"SettingsFocusedInbox_Description"); + + + /// + /// Focused Inbox + /// + public static string SettingsFocusedInbox_Title => Resources.GetTranslatedString(@"SettingsFocusedInbox_Title"); + + + /// + /// Enable or disable specific folders for synchronization. + /// + public static string SettingsFolderSync_Description => Resources.GetTranslatedString(@"SettingsFolderSync_Description"); + + + /// + /// Folder Synchronization + /// + public static string SettingsFolderSync_Title => Resources.GetTranslatedString(@"SettingsFolderSync_Title"); + + + /// + /// Folder Configuration + /// + public static string SettingsFolderOptions_Title => Resources.GetTranslatedString(@"SettingsFolderOptions_Title"); + + + /// + /// Change individual folder settings like enable/disable sync or show/hide unread badge. + /// + public static string SettingsFolderOptions_Description => Resources.GetTranslatedString(@"SettingsFolderOptions_Description"); + + + /// + /// Center Action + /// + public static string SettingsHoverActionCenter => Resources.GetTranslatedString(@"SettingsHoverActionCenter"); + + + /// + /// Left Action + /// + public static string SettingsHoverActionLeft => Resources.GetTranslatedString(@"SettingsHoverActionLeft"); + + + /// + /// Right Action + /// + public static string SettingsHoverActionRight => Resources.GetTranslatedString(@"SettingsHoverActionRight"); + + + /// + /// Select 3 actions to show up when you hover over the mails with cursor. + /// + public static string SettingsHoverActions_Description => Resources.GetTranslatedString(@"SettingsHoverActions_Description"); + + + /// + /// Hover Actions + /// + public static string SettingsHoverActions_Title => Resources.GetTranslatedString(@"SettingsHoverActions_Title"); + + + /// + /// Change display language for Wino. + /// + public static string SettingsLanguage_Description => Resources.GetTranslatedString(@"SettingsLanguage_Description"); + + + /// + /// Display Language + /// + public static string SettingsLanguage_Title => Resources.GetTranslatedString(@"SettingsLanguage_Title"); + + + /// + /// Categories + /// + public static string CategoriesFolderNameOverride => Resources.GetTranslatedString(@"CategoriesFolderNameOverride"); + + + /// + /// More + /// + public static string MoreFolderNameOverride => Resources.GetTranslatedString(@"MoreFolderNameOverride"); + + + /// + /// Settings + /// + public static string SettingsOptions_Title => Resources.GetTranslatedString(@"SettingsOptions_Title"); + + + /// + /// Merge multiple accounts into one. See mails from one Inbox together. + /// + public static string SettingsLinkAccounts_Description => Resources.GetTranslatedString(@"SettingsLinkAccounts_Description"); + + + /// + /// Create Linked Accounts + /// + public static string SettingsLinkAccounts_Title => Resources.GetTranslatedString(@"SettingsLinkAccounts_Title"); + + + /// + /// Modify the current link with the new accounts. + /// + public static string SettingsLinkedAccountsSave_Description => Resources.GetTranslatedString(@"SettingsLinkedAccountsSave_Description"); + + + /// + /// Save Changes + /// + public static string SettingsLinkedAccountsSave_Title => Resources.GetTranslatedString(@"SettingsLinkedAccountsSave_Title"); + + + /// + /// Load images automatically + /// + public static string SettingsLoadImages_Title => Resources.GetTranslatedString(@"SettingsLoadImages_Title"); + + + /// + /// Load styles automatically + /// + public static string SettingsLoadStyles_Title => Resources.GetTranslatedString(@"SettingsLoadStyles_Title"); + + + /// + /// Adjust the spacing for listing mails. + /// + public static string SettingsMailSpacing_Description => Resources.GetTranslatedString(@"SettingsMailSpacing_Description"); + + + /// + /// Mail Spacing + /// + public static string SettingsMailSpacing_Title => Resources.GetTranslatedString(@"SettingsMailSpacing_Title"); + + + /// + /// Create Nested Folders + /// + public static string SettingsFolderMenuStyle_Title => Resources.GetTranslatedString(@"SettingsFolderMenuStyle_Title"); + + + /// + /// Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail + /// + public static string SettingsFolderMenuStyle_Description => Resources.GetTranslatedString(@"SettingsFolderMenuStyle_Description"); + + + /// + /// Notifications, signatures, synchronization and other settings per account. + /// + public static string SettingsManageAccountSettings_Description => Resources.GetTranslatedString(@"SettingsManageAccountSettings_Description"); + + + /// + /// Manage Account Settings + /// + public static string SettingsManageAccountSettings_Title => Resources.GetTranslatedString(@"SettingsManageAccountSettings_Title"); + + + /// + /// Move items to add new link or remove existing link. + /// + public static string SettingsManageLink_Description => Resources.GetTranslatedString(@"SettingsManageLink_Description"); + + + /// + /// Manage Link + /// + public static string SettingsManageLink_Title => Resources.GetTranslatedString(@"SettingsManageLink_Title"); + + + /// + /// Change what should happen to the selected item. + /// + public static string SettingsMarkAsRead_Description => Resources.GetTranslatedString(@"SettingsMarkAsRead_Description"); + + + /// + /// Don't automatically mark item as read + /// + public static string SettingsMarkAsRead_DontChange => Resources.GetTranslatedString(@"SettingsMarkAsRead_DontChange"); + + + /// + /// Seconds to wait: + /// + public static string SettingsMarkAsRead_SecondsToWait => Resources.GetTranslatedString(@"SettingsMarkAsRead_SecondsToWait"); + + + /// + /// When viewed in the reading pane + /// + public static string SettingsMarkAsRead_Timer => Resources.GetTranslatedString(@"SettingsMarkAsRead_Timer"); + + + /// + /// Mark item as read + /// + public static string SettingsMarkAsRead_Title => Resources.GetTranslatedString(@"SettingsMarkAsRead_Title"); + + + /// + /// When selected + /// + public static string SettingsMarkAsRead_WhenSelected => Resources.GetTranslatedString(@"SettingsMarkAsRead_WhenSelected"); + + + /// + /// Change how your messages should be organized in mail list. + /// + public static string SettingsMessageList_Description => Resources.GetTranslatedString(@"SettingsMessageList_Description"); + + + /// + /// Message List + /// + public static string SettingsMessageList_Title => Resources.GetTranslatedString(@"SettingsMessageList_Title"); + + + /// + /// You didn't setup any accounts yet. + /// + public static string SettingsNoAccountSetupMessage => Resources.GetTranslatedString(@"SettingsNoAccountSetupMessage"); + + + /// + /// Turn on or off notifications for this account. + /// + public static string SettingsNotifications_Description => Resources.GetTranslatedString(@"SettingsNotifications_Description"); + + + /// + /// Notifications + /// + public static string SettingsNotifications_Title => Resources.GetTranslatedString(@"SettingsNotifications_Title"); + + + /// + /// Change the width of the mail list. + /// + public static string SettingsPaneLength_Description => Resources.GetTranslatedString(@"SettingsPaneLength_Description"); + + + /// + /// Mail List Pane Length + /// + public static string SettingsPaneLength_Title => Resources.GetTranslatedString(@"SettingsPaneLength_Title"); + + + /// + /// Show much more love ❤️ All donations are appreciated. + /// + public static string SettingsPaypal_Description => Resources.GetTranslatedString(@"SettingsPaypal_Description"); + + + /// + /// Donate via PayPal + /// + public static string SettingsPaypal_Title => Resources.GetTranslatedString(@"SettingsPaypal_Title"); + + + /// + /// Compact Mode + /// + public static string SettingsPersonalizationMailDisplayCompactMode => Resources.GetTranslatedString(@"SettingsPersonalizationMailDisplayCompactMode"); + + + /// + /// Medium Mode + /// + public static string SettingsPersonalizationMailDisplayMediumMode => Resources.GetTranslatedString(@"SettingsPersonalizationMailDisplayMediumMode"); + + + /// + /// Spacious Mode + /// + public static string SettingsPersonalizationMailDisplaySpaciousMode => Resources.GetTranslatedString(@"SettingsPersonalizationMailDisplaySpaciousMode"); + + + /// + /// Change appearance of Wino as you like. + /// + public static string SettingsPersonalization_Description => Resources.GetTranslatedString(@"SettingsPersonalization_Description"); + + + /// + /// Personalization + /// + public static string SettingsPersonalization_Title => Resources.GetTranslatedString(@"SettingsPersonalization_Title"); + + + /// + /// Review privacy policy. + /// + public static string SettingsPrivacyPolicy_Description => Resources.GetTranslatedString(@"SettingsPrivacyPolicy_Description"); + + + /// + /// Privacy Policy + /// + public static string SettingsPrivacyPolicy_Title => Resources.GetTranslatedString(@"SettingsPrivacyPolicy_Title"); + + + /// + /// Mail rendering options. + /// + public static string SettingsReadingPane_Description => Resources.GetTranslatedString(@"SettingsReadingPane_Description"); + + + /// + /// Reading Pane + /// + public static string SettingsReadingPane_Title => Resources.GetTranslatedString(@"SettingsReadingPane_Title"); + + + /// + /// Default Reader Font + /// + public static string SettingsReaderFont_Title => Resources.GetTranslatedString(@"SettingsReaderFont_Title"); + + + /// + /// Change the default font family and font size for reading mails. + /// + public static string SettingsReaderFontFamily_Description => Resources.GetTranslatedString(@"SettingsReaderFontFamily_Description"); + + + /// + /// Font Family + /// + public static string SettingsFontFamily_Title => Resources.GetTranslatedString(@"SettingsFontFamily_Title"); + + + /// + /// Font Size + /// + public static string SettingsFontSize_Title => Resources.GetTranslatedString(@"SettingsFontSize_Title"); + + + /// + /// Preview + /// + public static string SettingsFontPreview_Title => Resources.GetTranslatedString(@"SettingsFontPreview_Title"); + + + /// + /// Default Composer Font + /// + public static string SettingsComposerFont_Title => Resources.GetTranslatedString(@"SettingsComposerFont_Title"); + + + /// + /// Change the default font family and font size for composing mails. + /// + public static string SettingsComposerFontFamily_Description => Resources.GetTranslatedString(@"SettingsComposerFontFamily_Description"); + + + /// + /// Change the display name of the linked accounts. + /// + public static string SettingsRenameMergeAccount_Description => Resources.GetTranslatedString(@"SettingsRenameMergeAccount_Description"); + + + /// + /// Rename + /// + public static string SettingsRenameMergeAccount_Title => Resources.GetTranslatedString(@"SettingsRenameMergeAccount_Title"); + + + /// + /// This will allow you to click on the headers in messages list and go to specific date + /// + public static string SettingsSemanticZoom_Description => Resources.GetTranslatedString(@"SettingsSemanticZoom_Description"); + + + /// + /// Semantic Zoom for Date Headers + /// + public static string SettingsSemanticZoom_Title => Resources.GetTranslatedString(@"SettingsSemanticZoom_Title"); + + + /// + /// Hide/show thepreview text. + /// + public static string SettingsShowPreviewText_Description => Resources.GetTranslatedString(@"SettingsShowPreviewText_Description"); + + + /// + /// Show Preview Text + /// + public static string SettingsShowPreviewText_Title => Resources.GetTranslatedString(@"SettingsShowPreviewText_Title"); + + + /// + /// Hide/show the thumbnail sender pictures. + /// + public static string SettingsShowSenderPictures_Description => Resources.GetTranslatedString(@"SettingsShowSenderPictures_Description"); + + + /// + /// Show Sender Avatars + /// + public static string SettingsShowSenderPictures_Title => Resources.GetTranslatedString(@"SettingsShowSenderPictures_Title"); + + + /// + /// Display Clock Format in 24 Hours + /// + public static string SettingsPrefer24HourClock_Title => Resources.GetTranslatedString(@"SettingsPrefer24HourClock_Title"); + + + /// + /// Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM) + /// + public static string SettingsPrefer24HourClock_Description => Resources.GetTranslatedString(@"SettingsPrefer24HourClock_Description"); + + + /// + /// Edit or remove account signature + /// + public static string SettingsSignature_Description => Resources.GetTranslatedString(@"SettingsSignature_Description"); + + + /// + /// Signature + /// + public static string SettingsSignature_Title => Resources.GetTranslatedString(@"SettingsSignature_Title"); + + + /// + /// Primary account item to load Inbox at startup. + /// + public static string SettingsStartupItem_Description => Resources.GetTranslatedString(@"SettingsStartupItem_Description"); + + + /// + /// Startup Item + /// + public static string SettingsStartupItem_Title => Resources.GetTranslatedString(@"SettingsStartupItem_Title"); + + + /// + /// Show some love ❤️ + /// + public static string SettingsStore_Description => Resources.GetTranslatedString(@"SettingsStore_Description"); + + + /// + /// Rate in Store + /// + public static string SettingsStore_Title => Resources.GetTranslatedString(@"SettingsStore_Title"); + + + /// + /// Organize messages into conversation threads. + /// + public static string SettingsThreads_Description => Resources.GetTranslatedString(@"SettingsThreads_Description"); + + + /// + /// Conversation Threading + /// + public static string SettingsThreads_Title => Resources.GetTranslatedString(@"SettingsThreads_Title"); + + + /// + /// Remove the link between accounts. This will not delete your accounts. + /// + public static string SettingsUnlinkAccounts_Description => Resources.GetTranslatedString(@"SettingsUnlinkAccounts_Description"); + + + /// + /// Unlink Accounts + /// + public static string SettingsUnlinkAccounts_Title => Resources.GetTranslatedString(@"SettingsUnlinkAccounts_Title"); + + + /// + /// by date + /// + public static string SortingOption_Date => Resources.GetTranslatedString(@"SortingOption_Date"); + + + /// + /// by name + /// + public static string SortingOption_Name => Resources.GetTranslatedString(@"SortingOption_Name"); + + + /// + /// All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store? + /// + public static string StoreRatingDialog_MessageFirstLine => Resources.GetTranslatedString(@"StoreRatingDialog_MessageFirstLine"); + + + /// + /// Would you like to rate Wino Mail in Microsoft Store? + /// + public static string StoreRatingDialog_MessageSecondLine => Resources.GetTranslatedString(@"StoreRatingDialog_MessageSecondLine"); + + + /// + /// Enjoying Wino? + /// + public static string StoreRatingDialog_Title => Resources.GetTranslatedString(@"StoreRatingDialog_Title"); + + + /// + /// Archived messages will be moved to here. + /// + public static string SystemFolderConfigDialog_ArchiveFolderDescription => Resources.GetTranslatedString(@"SystemFolderConfigDialog_ArchiveFolderDescription"); + + + /// + /// Archive Folder + /// + public static string SystemFolderConfigDialog_ArchiveFolderHeader => Resources.GetTranslatedString(@"SystemFolderConfigDialog_ArchiveFolderHeader"); + + + /// + /// Deleted messages will be moved to here. + /// + public static string SystemFolderConfigDialog_DeletedFolderDescription => Resources.GetTranslatedString(@"SystemFolderConfigDialog_DeletedFolderDescription"); + + + /// + /// Deleted Folder + /// + public static string SystemFolderConfigDialog_DeletedFolderHeader => Resources.GetTranslatedString(@"SystemFolderConfigDialog_DeletedFolderHeader"); + + + /// + /// New mails/replies will be crafted in here. + /// + public static string SystemFolderConfigDialog_DraftFolderDescription => Resources.GetTranslatedString(@"SystemFolderConfigDialog_DraftFolderDescription"); + + + /// + /// Draft Folder + /// + public static string SystemFolderConfigDialog_DraftFolderHeader => Resources.GetTranslatedString(@"SystemFolderConfigDialog_DraftFolderHeader"); + + + /// + /// All spam/junk mails will be here. + /// + public static string SystemFolderConfigDialog_JunkFolderDescription => Resources.GetTranslatedString(@"SystemFolderConfigDialog_JunkFolderDescription"); + + + /// + /// Junk/Spam Folder + /// + public static string SystemFolderConfigDialog_JunkFolderHeader => Resources.GetTranslatedString(@"SystemFolderConfigDialog_JunkFolderHeader"); + + + /// + /// This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly. + /// + public static string SystemFolderConfigDialog_MessageFirstLine => Resources.GetTranslatedString(@"SystemFolderConfigDialog_MessageFirstLine"); + + + /// + /// Please select the appropriate folders for specific functionalities. + /// + public static string SystemFolderConfigDialog_MessageSecondLine => Resources.GetTranslatedString(@"SystemFolderConfigDialog_MessageSecondLine"); + + + /// + /// Folder that sent messages will be stored. + /// + public static string SystemFolderConfigDialog_SentFolderDescription => Resources.GetTranslatedString(@"SystemFolderConfigDialog_SentFolderDescription"); + + + /// + /// Sent Folder + /// + public static string SystemFolderConfigDialog_SentFolderHeader => Resources.GetTranslatedString(@"SystemFolderConfigDialog_SentFolderHeader"); + + + /// + /// Configure System Folders + /// + public static string SystemFolderConfigDialog_Title => Resources.GetTranslatedString(@"SystemFolderConfigDialog_Title"); + + + /// + /// You can't assign Inbox folder to any other system folder. + /// + public static string SystemFolderConfigDialogValidation_InboxSelected => Resources.GetTranslatedString(@"SystemFolderConfigDialogValidation_InboxSelected"); + + + /// + /// Some of the system folders are used more than once in the configuration. + /// + public static string SystemFolderConfigDialogValidation_DuplicateSystemFolders => Resources.GetTranslatedString(@"SystemFolderConfigDialogValidation_DuplicateSystemFolders"); + + + /// + /// System Folders Setup + /// + public static string SystemFolderConfigSetupSuccess_Title => Resources.GetTranslatedString(@"SystemFolderConfigSetupSuccess_Title"); + + + /// + /// System folders are successfully configured. + /// + public static string SystemFolderConfigSetupSuccess_Message => Resources.GetTranslatedString(@"SystemFolderConfigSetupSuccess_Message"); + + + /// + /// Testing server connection... + /// + public static string TestingImapConnectionMessage => Resources.GetTranslatedString(@"TestingImapConnectionMessage"); + + + /// + /// Today + /// + public static string Today => Resources.GetTranslatedString(@"Today"); + + + /// + /// unknown address + /// + public static string UnknownAddress => Resources.GetTranslatedString(@"UnknownAddress"); + + + /// + /// Unknown Date + /// + public static string UnknownDateHeader => Resources.GetTranslatedString(@"UnknownDateHeader"); + + + /// + /// unknown Mail Group Address + /// + public static string UnknownGroupAddress => Resources.GetTranslatedString(@"UnknownGroupAddress"); + + + /// + /// Unknown Sender + /// + public static string UnknownSender => Resources.GetTranslatedString(@"UnknownSender"); + + + /// + /// Unsubscribe + /// + public static string Unsubscribe => Resources.GetTranslatedString(@"Unsubscribe"); + + + /// + /// View Details + /// + public static string ViewContactDetails => Resources.GetTranslatedString(@"ViewContactDetails"); + + + /// + /// Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade + /// + public static string WinoUpgradeDescription => Resources.GetTranslatedString(@"WinoUpgradeDescription"); + + + /// + /// Upgrade to Unlimited Accounts + /// + public static string WinoUpgradeMessage => Resources.GetTranslatedString(@"WinoUpgradeMessage"); + + + /// + /// {0} out of {1} free accounts used. + /// + public static string WinoUpgradeRemainingAccountsMessage => Resources.GetTranslatedString(@"WinoUpgradeRemainingAccountsMessage"); + + + /// + /// Yesterday + /// + public static string Yesterday => Resources.GetTranslatedString(@"Yesterday"); + +} +} diff --git a/Wino.Core.Domain/Translator.tt b/Wino.Core.Domain/Translator.tt new file mode 100644 index 00000000..296dee9b --- /dev/null +++ b/Wino.Core.Domain/Translator.tt @@ -0,0 +1,60 @@ +<#@ template debug="true" hostspecific="true" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ assembly name="System.Text.Json" #> +<#@ assembly name="System.Memory" #> +<#@ assembly name="System" #> +<#@ import namespace="System.Text.Json" #> +<#@ import namespace="System" #> +<#@ assembly name="NetStandard" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.IO" #> +<#@ output extension="Designer.cs" #> +<# string filename = this.Host.ResolvePath("Translations/en_US/resources.json"); + var allText = File.ReadAllText(filename); + var resourceKeys = JsonSerializer.Deserialize>(allText); +#> + +namespace Wino.Core.Domain +{ + public class Translator + { + private static global::Wino.Core.Domain.Translations.WinoTranslationDictionary _dictionary; + + public static global::Wino.Core.Domain.Translations.WinoTranslationDictionary Resources + { + get + { + if (_dictionary == null) + { + _dictionary = new global::Wino.Core.Domain.Translations.WinoTranslationDictionary(); + } + + return _dictionary; + } + } + <# + + string[] escapeChars = new string[] { " ", ";", "@", "$", "&", "(",")","-","#",":","!","'","?","{","}","," }; + + foreach (var key in resourceKeys) + { + // Generate proper allowed variable name by C# + var allowedPropertyName = escapeChars.Aggregate(key.Key, (c1, c2) => c1.Replace(c2, string.Empty)); + + // There might be null values for some keys. Those will display as (null string) in the Comment; + // The actual translation for the key will be the key itself at runtime. + var beautifiedValue = key.Value == null ? "(null string)" : key.Value; + + // We need to trim the line ending literals for comments. + var beautifiedComment = beautifiedValue.Replace('\r',' ').Replace('\n',' '); + #> + + /// + /// <#= beautifiedComment #> + /// + public static string <#= allowedPropertyName #> => Resources.GetTranslatedString(@"<#= key.Key #>"); + <# } #> +} +} diff --git a/Wino.Core.Domain/Wino.Core.Domain.csproj b/Wino.Core.Domain/Wino.Core.Domain.csproj new file mode 100644 index 00000000..6a4ba33f --- /dev/null +++ b/Wino.Core.Domain/Wino.Core.Domain.csproj @@ -0,0 +1,64 @@ + + + + netstandard2.0 + true + 12.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + True + True + Translator.tt + + + + + TextTemplatingFileGenerator + Translator.Designer.cs + + + diff --git a/Wino.Core.UWP/CoreUWPContainerSetup.cs b/Wino.Core.UWP/CoreUWPContainerSetup.cs new file mode 100644 index 00000000..295c907c --- /dev/null +++ b/Wino.Core.UWP/CoreUWPContainerSetup.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.DependencyInjection; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Services; +using Wino.Services; + +namespace Wino.Core.UWP +{ + public static class CoreUWPContainerSetup + { + public static void RegisterCoreUWPServices(this IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + } + } +} diff --git a/Wino.Core.UWP/Dispatcher.cs b/Wino.Core.UWP/Dispatcher.cs new file mode 100644 index 00000000..060607f8 --- /dev/null +++ b/Wino.Core.UWP/Dispatcher.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading.Tasks; +using Windows.UI.Core; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP +{ + public class UWPDispatcher : IDispatcher + { + private readonly CoreDispatcher _coreDispatcher; + + public UWPDispatcher(CoreDispatcher coreDispatcher) + { + _coreDispatcher = coreDispatcher; + } + + public Task ExecuteOnUIThread(Action action) + => _coreDispatcher.RunAsync(CoreDispatcherPriority.Normal, () => action()).AsTask(); + } +} diff --git a/Wino.Core.UWP/Extensions/ElementThemeExtensions.cs b/Wino.Core.UWP/Extensions/ElementThemeExtensions.cs new file mode 100644 index 00000000..4f7fd145 --- /dev/null +++ b/Wino.Core.UWP/Extensions/ElementThemeExtensions.cs @@ -0,0 +1,34 @@ +using Windows.UI.Xaml; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.UWP.Extensions +{ + public static class ElementThemeExtensions + { + public static ApplicationElementTheme ToWinoElementTheme(this ElementTheme elementTheme) + { + switch (elementTheme) + { + case ElementTheme.Light: + return ApplicationElementTheme.Light; + case ElementTheme.Dark: + return ApplicationElementTheme.Dark; + } + + return ApplicationElementTheme.Default; + } + + public static ElementTheme ToWindowsElementTheme(this ApplicationElementTheme elementTheme) + { + switch (elementTheme) + { + case ApplicationElementTheme.Light: + return ElementTheme.Light; + case ApplicationElementTheme.Dark: + return ElementTheme.Dark; + } + + return ElementTheme.Default; + } + } +} diff --git a/Wino.Core.UWP/Models/Personalization/CustomAppTheme.cs b/Wino.Core.UWP/Models/Personalization/CustomAppTheme.cs new file mode 100644 index 00000000..3f821e5a --- /dev/null +++ b/Wino.Core.UWP/Models/Personalization/CustomAppTheme.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using Windows.Storage; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Personalization; +using Wino.Services; + +namespace Wino.Core.UWP.Models.Personalization +{ + /// + /// Custom themes that are generated by users. + /// + public class CustomAppTheme : AppThemeBase + { + public CustomAppTheme(CustomThemeMetadata metadata) : base(metadata.Name, metadata.Id) + { + AccentColor = metadata.AccentColorHex; + } + + public override AppThemeType AppThemeType => AppThemeType.Custom; + + public override string GetBackgroundPreviewImagePath() + => $"ms-appdata:///local/{ThemeService.CustomThemeFolderName}/{Id}_preview.jpg"; + + public override async Task GetThemeResourceDictionaryContentAsync() + { + var customAppThemeFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///AppThemes/Custom.xaml")); + return await FileIO.ReadTextAsync(customAppThemeFile); + } + } +} diff --git a/Wino.Core.UWP/Models/Personalization/PreDefinedAppTheme.cs b/Wino.Core.UWP/Models/Personalization/PreDefinedAppTheme.cs new file mode 100644 index 00000000..107f4a1a --- /dev/null +++ b/Wino.Core.UWP/Models/Personalization/PreDefinedAppTheme.cs @@ -0,0 +1,34 @@ +using System; +using System.Threading.Tasks; +using Windows.Storage; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Personalization; + +namespace Wino.Core.UWP.Models.Personalization +{ + /// + /// Forest, Nighty, Clouds etc. applies to pre-defined themes in Wino. + /// + public class PreDefinedAppTheme : AppThemeBase + { + public PreDefinedAppTheme(string themeName, + Guid id, + string accentColor = "", + ApplicationElementTheme forcedElementTheme = ApplicationElementTheme.Default) : base(themeName, id) + { + AccentColor = accentColor; + ForceElementTheme = forcedElementTheme; + } + + public override AppThemeType AppThemeType => AppThemeType.PreDefined; + + public override string GetBackgroundPreviewImagePath() + => $"ms-appx:///BackgroundImages/{ThemeName}.jpg"; + + public override async Task GetThemeResourceDictionaryContentAsync() + { + var xamlDictionaryFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///AppThemes/{ThemeName}.xaml")); + return await FileIO.ReadTextAsync(xamlDictionaryFile); + } + } +} diff --git a/Wino.Core.UWP/Models/Personalization/SystemAppTheme.cs b/Wino.Core.UWP/Models/Personalization/SystemAppTheme.cs new file mode 100644 index 00000000..3580b1d0 --- /dev/null +++ b/Wino.Core.UWP/Models/Personalization/SystemAppTheme.cs @@ -0,0 +1,13 @@ +using System; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.UWP.Models.Personalization +{ + // Mica - Acrylic. + public class SystemAppTheme : PreDefinedAppTheme + { + public SystemAppTheme(string themeName, Guid id) : base(themeName, id, "") { } + + public override AppThemeType AppThemeType => AppThemeType.System; + } +} diff --git a/Wino.Core.UWP/Properties/AssemblyInfo.cs b/Wino.Core.UWP/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..8d1893a5 --- /dev/null +++ b/Wino.Core.UWP/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Wino.Core.UWP")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Wino.Core.UWP")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Wino.Core.UWP/Properties/Wino.Core.UWP.rd.xml b/Wino.Core.UWP/Properties/Wino.Core.UWP.rd.xml new file mode 100644 index 00000000..ba802981 --- /dev/null +++ b/Wino.Core.UWP/Properties/Wino.Core.UWP.rd.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/Wino.Core.UWP/Services/AppInitializerService.cs b/Wino.Core.UWP/Services/AppInitializerService.cs new file mode 100644 index 00000000..e56f00e9 --- /dev/null +++ b/Wino.Core.UWP/Services/AppInitializerService.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading.Tasks; +using Windows.Storage; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class AppInitializerService : IAppInitializerService + { + private readonly IBackgroundTaskService _backgroundTaskService; + + public AppInitializerService(IBackgroundTaskService backgroundTaskService) + { + _backgroundTaskService = backgroundTaskService; + } + + public string GetApplicationDataFolder() => ApplicationData.Current.GetPublisherCacheFolder("WinoShared").Path; + + // TODO: Pre 1.7.0 for Wino Calendar... + //public string GetApplicationDataFolder() => ApplicationData.Current.LocalFolder.Path; + + public Task MigrateAsync() + { + UnregisterAllBackgroundTasks(); + + return Task.CompletedTask; + } + + #region 1.6.8 -> 1.6.9 + + private void UnregisterAllBackgroundTasks() + { + _backgroundTaskService.UnregisterAllBackgroundTask(); + } + + #endregion + + #region 1.7.0 + + /// + /// We decided to use publisher cache folder as a database going forward. + /// This migration will move the file from application local folder and delete it. + /// Going forward database will be initialized from publisher cache folder. + /// + private async Task MoveExistingDatabaseToSharedCacheFolderAsync() + { + throw new NotImplementedException(); + } + + #endregion + } +} diff --git a/Wino.Core.UWP/Services/BackgroundSynchronizer.cs b/Wino.Core.UWP/Services/BackgroundSynchronizer.cs new file mode 100644 index 00000000..64fbb57b --- /dev/null +++ b/Wino.Core.UWP/Services/BackgroundSynchronizer.cs @@ -0,0 +1,144 @@ +using System; +using System.Threading.Tasks; +using Serilog; +using Windows.Storage; +using Wino.Core; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Synchronizers; + +namespace Wino.Services +{ + public interface IBackgroundSynchronizer + { + Task RunBackgroundSynchronizationAsync(BackgroundSynchronizationReason reason); + void CreateLock(); + void ReleaseLock(); + bool IsBackgroundSynchronizationLocked(); + } + + /// + /// Service responsible for handling background synchronization on timer and session connected events. + /// + public class BackgroundSynchronizer : IBackgroundSynchronizer + { + private const string BackgroundSynchronizationLock = nameof(BackgroundSynchronizationLock); + + private readonly IAccountService _accountService; + private readonly IFolderService _folderService; + private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; + + public BackgroundSynchronizer(IAccountService accountService, + IFolderService folderService, + IWinoSynchronizerFactory winoSynchronizerFactory) + { + _accountService = accountService; + _folderService = folderService; + _winoSynchronizerFactory = winoSynchronizerFactory; + } + + public void CreateLock() => ApplicationData.Current.LocalSettings.Values[BackgroundSynchronizationLock] = true; + public void ReleaseLock() => ApplicationData.Current.LocalSettings.Values[BackgroundSynchronizationLock] = false; + + public bool IsBackgroundSynchronizationLocked() + => ApplicationData.Current.LocalSettings.Values.ContainsKey(BackgroundSynchronizationLock) + && ApplicationData.Current.LocalSettings.Values[BackgroundSynchronizationLock] is bool boolValue && boolValue; + + public async Task RunBackgroundSynchronizationAsync(BackgroundSynchronizationReason reason) + { + Log.Information($"{reason} background synchronization is kicked in."); + + // This should never crash. + // We might be in-process or out-of-process. + + //if (IsBackgroundSynchronizationLocked()) + //{ + // Log.Warning("Background synchronization is locked. Hence another background synchronization is canceled."); + // return; + //} + + try + { + CreateLock(); + + var accounts = await _accountService.GetAccountsAsync(); + + foreach (var account in accounts) + { + // We can't sync broken account. + if (account.AttentionReason != AccountAttentionReason.None) + continue; + + // TODO + // We can't synchronize without system folder setup is done. + //var isSystemFolderSetupDone = await _folderService.CheckSystemFolderSetupDoneAsync(account.Id); + + //// No need to throw here. It's a background process. + //if (!isSystemFolderSetupDone) + // continue; + + var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(account.Id); + + if (synchronizer.State != AccountSynchronizerState.Idle) + { + Log.Information("Skipping background synchronization for {Name} since current state is {State}", synchronizer.Account.Name, synchronizer.State); + + return; + } + + await HandleSynchronizationAsync(synchronizer, reason); + } + } + catch (Exception ex) + { + Log.Error($"[BackgroundSynchronization] Failed with message {ex.Message}"); + } + finally + { + ReleaseLock(); + } + } + + private async Task HandleSynchronizationAsync(IBaseSynchronizer synchronizer, BackgroundSynchronizationReason reason) + { + if (synchronizer.State != AccountSynchronizerState.Idle) return; + + var account = synchronizer.Account; + + try + { + // SessionConnected will do Full synchronization for logon, Timer task will do Inbox only. + + var syncType = reason == BackgroundSynchronizationReason.SessionConnected ? SynchronizationType.Full : SynchronizationType.Inbox; + + var options = new SynchronizationOptions() + { + AccountId = account.Id, + Type = syncType, + }; + + await synchronizer.SynchronizeAsync(options); + } + catch (AuthenticationAttentionException authenticationAttentionException) + { + Log.Error(authenticationAttentionException, $"[BackgroundSync] Invalid credentials for account {account.Address}"); + + account.AttentionReason = AccountAttentionReason.InvalidCredentials; + await _accountService.UpdateAccountAsync(account); + } + catch (SystemFolderConfigurationMissingException configMissingException) + { + Log.Error(configMissingException, $"[BackgroundSync] Missing system folder configuration for account {account.Address}"); + + account.AttentionReason = AccountAttentionReason.MissingSystemFolderConfiguration; + await _accountService.UpdateAccountAsync(account); + } + catch (Exception ex) + { + Log.Error(ex, "[BackgroundSync] Synchronization failed."); + } + } + } +} diff --git a/Wino.Core.UWP/Services/BackgroundTaskService.cs b/Wino.Core.UWP/Services/BackgroundTaskService.cs new file mode 100644 index 00000000..a0ac1c07 --- /dev/null +++ b/Wino.Core.UWP/Services/BackgroundTaskService.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Serilog; +using Windows.ApplicationModel.Background; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Exceptions; + +namespace Wino.Core.UWP.Services +{ + public class BackgroundTaskService : IBackgroundTaskService + { + private const string IsBackgroundExecutionDeniedMessageKey = nameof(IsBackgroundExecutionDeniedMessageKey); + + public const string BackgroundSynchronizationTimerTaskNameEx = nameof(BackgroundSynchronizationTimerTaskNameEx); + public const string ToastActivationTaskEx = nameof(ToastActivationTaskEx); + + private const string SessionConnectedTaskEntryPoint = "Wino.BackgroundTasks.SessionConnectedTask"; + private const string SessionConnectedTaskName = "SessionConnectedTask"; + + private readonly IConfigurationService _configurationService; + private readonly List registeredBackgroundTaskNames = new List(); + + public BackgroundTaskService(IConfigurationService configurationService) + { + _configurationService = configurationService; + + LoadRegisteredTasks(); + } + + // Calling WinRT all the time for registered tasks might be slow. Cache them on ctor. + private void LoadRegisteredTasks() + { + foreach (var task in BackgroundTaskRegistration.AllTasks) + { + registeredBackgroundTaskNames.Add(task.Value.Name); + } + + Log.Information($"Found {registeredBackgroundTaskNames.Count} registered background tasks. [{string.Join(',', registeredBackgroundTaskNames)}]"); + } + + public async Task HandleBackgroundTaskRegistrations() + { + var response = await BackgroundExecutionManager.RequestAccessAsync(); + + if (response == BackgroundAccessStatus.DeniedBySystemPolicy || + response == BackgroundAccessStatus.DeniedByUser) + { + // Only notify users about disabled background execution once. + + bool isNotifiedBefore = _configurationService.Get(IsBackgroundExecutionDeniedMessageKey, false); + + if (!isNotifiedBefore) + { + _configurationService.Set(IsBackgroundExecutionDeniedMessageKey, true); + + throw new BackgroundTaskExecutionRequestDeniedException(); + } + } + else + { + RegisterSessionConnectedTask(); + RegisterTimerSynchronizationTask(); + RegisterToastNotificationHandlerBackgroundTask(); + } + } + + private bool IsBackgroundTaskRegistered(string taskName) + => registeredBackgroundTaskNames.Contains(taskName); + + public void UnregisterAllBackgroundTask() + { + foreach (var task in BackgroundTaskRegistration.AllTasks) + { + task.Value.Unregister(true); + } + } + + private void LogBackgroundTaskRegistration(string taskName) + { + Log.Information($"Registered new background task -> {taskName}"); + + registeredBackgroundTaskNames.Add($"{taskName}"); + } + + private BackgroundTaskRegistration RegisterSessionConnectedTask() + { + if (IsBackgroundTaskRegistered(SessionConnectedTaskName)) return null; + + var builder = new BackgroundTaskBuilder + { + Name = SessionConnectedTaskName, + TaskEntryPoint = SessionConnectedTaskEntryPoint + }; + + builder.SetTrigger(new SystemTrigger(SystemTriggerType.SessionConnected, false)); + + LogBackgroundTaskRegistration(SessionConnectedTaskName); + + return builder.Register(); + } + + private BackgroundTaskRegistration RegisterToastNotificationHandlerBackgroundTask() + { + if (IsBackgroundTaskRegistered(ToastActivationTaskEx)) return null; + + var builder = new BackgroundTaskBuilder + { + Name = ToastActivationTaskEx + }; + + builder.SetTrigger(new ToastNotificationActionTrigger()); + + LogBackgroundTaskRegistration(ToastActivationTaskEx); + + return builder.Register(); + } + + private BackgroundTaskRegistration RegisterTimerSynchronizationTask() + { + if (IsBackgroundTaskRegistered(BackgroundSynchronizationTimerTaskNameEx)) return null; + + var builder = new BackgroundTaskBuilder + { + Name = BackgroundSynchronizationTimerTaskNameEx + }; + + builder.SetTrigger(new TimeTrigger(15, false)); + builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); + + LogBackgroundTaskRegistration(BackgroundSynchronizationTimerTaskNameEx); + + return builder.Register(); + } + } +} diff --git a/Wino.Core.UWP/Services/ClipboardService.cs b/Wino.Core.UWP/Services/ClipboardService.cs new file mode 100644 index 00000000..9e3f5c02 --- /dev/null +++ b/Wino.Core.UWP/Services/ClipboardService.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Windows.ApplicationModel.DataTransfer; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class ClipboardService : IClipboardService + { + public Task CopyClipboardAsync(string text) + { + var package = new DataPackage(); + package.SetText(text); + + Clipboard.SetContent(package); + + return Task.CompletedTask; + } + } +} diff --git a/Wino.Core.UWP/Services/ConfigurationService.cs b/Wino.Core.UWP/Services/ConfigurationService.cs new file mode 100644 index 00000000..79455800 --- /dev/null +++ b/Wino.Core.UWP/Services/ConfigurationService.cs @@ -0,0 +1,46 @@ +using System; +using System.ComponentModel; +using Windows.Foundation.Collections; +using Windows.Storage; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class ConfigurationService : IConfigurationService + { + public T Get(string key, T defaultValue = default) + => GetInternal(key, ApplicationData.Current.LocalSettings.Values, defaultValue); + + public T GetRoaming(string key, T defaultValue = default) + => GetInternal(key, ApplicationData.Current.RoamingSettings.Values, defaultValue); + + public void Set(string key, object value) + => SetInternal(key, value, ApplicationData.Current.LocalSettings.Values); + + public void SetRoaming(string key, object value) + => SetInternal(key, value, ApplicationData.Current.RoamingSettings.Values); + + private T GetInternal(string key, IPropertySet collection, T defaultValue = default) + { + if (collection.ContainsKey(key)) + { + var value = collection[key]?.ToString(); + + if (typeof(T).IsEnum) + return (T)Enum.Parse(typeof(T), value); + + if (typeof(T) == typeof(Guid?) && Guid.TryParse(value, out Guid guidResult)) + { + return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(value); + } + + return (T)Convert.ChangeType(value, typeof(T)); + } + + return defaultValue; + } + + private void SetInternal(string key, object value, IPropertySet collection) + => collection[key] = value?.ToString(); + } +} diff --git a/Wino.Core.UWP/Services/FileService.cs b/Wino.Core.UWP/Services/FileService.cs new file mode 100644 index 00000000..fdfbf5ab --- /dev/null +++ b/Wino.Core.UWP/Services/FileService.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Windows.Storage; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class FileService : IFileService + { + public async Task CopyFileAsync(string sourceFilePath, string destinationFolderPath) + { + var fileName = Path.GetFileName(sourceFilePath); + + var sourceFileHandle = await StorageFile.GetFileFromPathAsync(sourceFilePath); + var destinationFolder = await StorageFolder.GetFolderFromPathAsync(destinationFolderPath); + + var copiedFile = await sourceFileHandle.CopyAsync(destinationFolder, fileName, NameCollisionOption.GenerateUniqueName); + + return copiedFile.Path; + } + + public async Task GetFileContentByApplicationUriAsync(string resourcePath) + { + var releaseNoteFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(resourcePath)); + + return await FileIO.ReadTextAsync(releaseNoteFile); + } + + public async Task GetFileStreamAsync(string folderPath, string fileName) + { + var folder = await StorageFolder.GetFolderFromPathAsync(folderPath); + var createdFile = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); + + return await createdFile.OpenStreamForWriteAsync(); + } + } +} diff --git a/Wino.Core.UWP/Services/KeyPressService.cs b/Wino.Core.UWP/Services/KeyPressService.cs new file mode 100644 index 00000000..02a557d0 --- /dev/null +++ b/Wino.Core.UWP/Services/KeyPressService.cs @@ -0,0 +1,16 @@ +using Windows.System; +using Windows.UI.Core; +using Windows.UI.Xaml; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class KeyPressService : IKeyPressService + { + public bool IsCtrlKeyPressed() + => Window.Current?.CoreWindow?.GetKeyState(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down) ?? false; + + public bool IsShiftKeyPressed() + => Window.Current?.CoreWindow?.GetKeyState(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down) ?? false; + } +} diff --git a/Wino.Core.UWP/Services/NativeAppService.cs b/Wino.Core.UWP/Services/NativeAppService.cs new file mode 100644 index 00000000..54ac5bff --- /dev/null +++ b/Wino.Core.UWP/Services/NativeAppService.cs @@ -0,0 +1,131 @@ +using System; +using System.Threading.Tasks; +using Windows.ApplicationModel; +using Windows.Foundation.Metadata; +using Windows.Security.Authentication.Web; +using Windows.Security.Cryptography; +using Windows.Security.Cryptography.Core; +using Windows.Storage; +using Windows.Storage.Streams; +using Windows.System; +using Windows.UI.Shell; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Authorization; + +namespace Wino.Services +{ + public class NativeAppService : INativeAppService + { + private string _mimeMessagesFolder; + private string _editorBundlePath; + + public string GetWebAuthenticationBrokerUri() => WebAuthenticationBroker.GetCurrentApplicationCallbackUri().AbsoluteUri; + + public async Task GetMimeMessageStoragePath() + { + if (!string.IsNullOrEmpty(_mimeMessagesFolder)) + return _mimeMessagesFolder; + + var localFolder = ApplicationData.Current.LocalFolder; + var mimeFolder = await localFolder.CreateFolderAsync("Mime", CreationCollisionOption.OpenIfExists); + + _mimeMessagesFolder = mimeFolder.Path; + + return _mimeMessagesFolder; + } + + #region Cryptography + + public string randomDataBase64url(uint length) + { + IBuffer buffer = CryptographicBuffer.GenerateRandom(length); + return base64urlencodeNoPadding(buffer); + } + + public IBuffer sha256(string inputString) + { + HashAlgorithmProvider sha = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256); + IBuffer buff = CryptographicBuffer.ConvertStringToBinary(inputString, BinaryStringEncoding.Utf8); + return sha.HashData(buff); + } + + public string base64urlencodeNoPadding(IBuffer buffer) + { + string base64 = CryptographicBuffer.EncodeToBase64String(buffer); + + // Converts base64 to base64url. + base64 = base64.Replace("+", "-"); + base64 = base64.Replace("/", "_"); + + // Strips padding. + base64 = base64.Replace("=", ""); + + return base64; + } + + #endregion + + // GMail Integration. + public GoogleAuthorizationRequest GetGoogleAuthorizationRequest() + { + string state = randomDataBase64url(32); + string code_verifier = randomDataBase64url(32); + string code_challenge = base64urlencodeNoPadding(sha256(code_verifier)); + + return new GoogleAuthorizationRequest(state, code_verifier, code_challenge); + } + + public async Task GetQuillEditorBundlePathAsync() + { + if (string.IsNullOrEmpty(_editorBundlePath)) + { + var editorFileFromBundle = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///JS/Quill/full.html")) + .AsTask() + .ConfigureAwait(false); + + _editorBundlePath = editorFileFromBundle.Path; + } + + return _editorBundlePath; + } + + public bool IsAppRunning() => (Window.Current?.Content as Frame)?.Content != null; + + public async Task LaunchFileAsync(string filePath) + { + var file = await StorageFile.GetFileFromPathAsync(filePath); + + await Launcher.LaunchFileAsync(file); + } + + public Task LaunchUriAsync(Uri uri) => Xamarin.Essentials.Launcher.OpenAsync(uri); + + public string GetFullAppVersion() + { + Package package = Package.Current; + PackageId packageId = package.Id; + PackageVersion version = packageId.Version; + + return string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision); + } + + public async Task PinAppToTaskbarAsync() + { + // If Start screen manager API's aren't present + if (!ApiInformation.IsTypePresent("Windows.UI.Shell.TaskbarManager")) return; + + // Get the taskbar manager + var taskbarManager = TaskbarManager.GetDefault(); + + // If Taskbar doesn't allow pinning, don't show the tip + if (!taskbarManager.IsPinningAllowed) return; + + // If already pinned, don't show the tip + if (await taskbarManager.IsCurrentAppPinnedAsync()) return; + + await taskbarManager.RequestPinCurrentAppAsync(); + } + } +} diff --git a/Wino.Core.UWP/Services/NotificationBuilder.cs b/Wino.Core.UWP/Services/NotificationBuilder.cs new file mode 100644 index 00000000..3e389f8d --- /dev/null +++ b/Wino.Core.UWP/Services/NotificationBuilder.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Toolkit.Uwp.Notifications; +using Windows.Data.Xml.Dom; +using Windows.UI.Notifications; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Services; + +namespace Wino.Core.UWP.Services +{ + // TODO: Refactor this thing. It's garbage. + + public class NotificationBuilder : INotificationBuilder + { + private readonly IUnderlyingThemeService _underlyingThemeService; + private readonly IAccountService _accountService; + private readonly IFolderService _folderService; + + public NotificationBuilder(IUnderlyingThemeService underlyingThemeService, IAccountService accountService, IFolderService folderService) + { + _underlyingThemeService = underlyingThemeService; + _accountService = accountService; + _folderService = folderService; + } + + public async Task CreateNotificationsAsync(Guid inboxFolderId, IEnumerable newMailItems) + { + var mailCount = newMailItems.Count(); + + // If there are more than 3 mails, just display 1 general toast. + if (mailCount > 3) + { + var builder = new ToastContentBuilder(); + builder.SetToastScenario(ToastScenario.Default); + + builder.AddText(Translator.Notifications_MultipleNotificationsTitle); + builder.AddText(string.Format(Translator.Notifications_MultipleNotificationsTitle, mailCount)); + + builder.AddButton(GetDismissButton()); + + builder.Show(); + } + else + { + foreach (var mailItem in newMailItems) + { + if (mailItem.IsRead) + continue; + + var builder = new ToastContentBuilder(); + builder.SetToastScenario(ToastScenario.Default); + + var host = ThumbnailService.GetHost(mailItem.FromAddress); + + var knownTuple = ThumbnailService.CheckIsKnown(host); + + bool isKnown = knownTuple.Item1; + host = knownTuple.Item2; + + if (isKnown) + builder.AddAppLogoOverride(new System.Uri(ThumbnailService.GetKnownHostImage(host)), hintCrop: ToastGenericAppLogoCrop.Default); + else + { + // TODO: https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=toolkit + // Follow official guides for icons/theme. + + bool isOSDarkTheme = _underlyingThemeService.IsUnderlyingThemeDark(); + string profileLogoName = isOSDarkTheme ? "profile-dark.png" : "profile-light.png"; + + builder.AddAppLogoOverride(new System.Uri($"ms-appx:///Assets/NotificationIcons/{profileLogoName}"), hintCrop: ToastGenericAppLogoCrop.Circle); + } + + // Override system notification timetamp with received date of the mail. + // It may create confusion for some users, but still it's the truth... + builder.AddCustomTimeStamp(mailItem.CreationDate.ToLocalTime()); + + builder.AddText(mailItem.FromName); + builder.AddText(mailItem.Subject); + builder.AddText(mailItem.PreviewText); + + builder.AddArgument(Constants.ToastMailItemIdKey, mailItem.UniqueId.ToString()); + builder.AddArgument(Constants.ToastActionKey, MailOperation.Navigate); + + builder.AddButton(GetMarkedAsRead(mailItem.Id)); + builder.AddButton(GetDeleteButton(mailItem.Id)); + builder.AddButton(GetDismissButton()); + + builder.Show(); + } + + await UpdateTaskbarIconBadgeAsync(); + } + } + + private ToastButton GetDismissButton() + => new ToastButton() + .SetDismissActivation() + .SetImageUri(new Uri("ms-appx:///Assets/NotificationIcons/dismiss.png")); + + private ToastButton GetDeleteButton(string mailCopyId) + => new ToastButton() + .SetContent(Translator.MailOperation_Delete) + .SetImageUri(new Uri("ms-appx:///Assets/NotificationIcons/delete.png")) + .AddArgument(Constants.ToastMailItemIdKey, mailCopyId) + .AddArgument(Constants.ToastActionKey, MailOperation.SoftDelete) + .SetBackgroundActivation(); + + private ToastButton GetMarkedAsRead(string mailCopyId) + => new ToastButton() + .SetContent(Translator.MailOperation_MarkAsRead) + .SetImageUri(new System.Uri("ms-appx:///Assets/NotificationIcons/markread.png")) + .AddArgument(Constants.ToastMailItemIdKey, mailCopyId) + .AddArgument(Constants.ToastActionKey, MailOperation.MarkAsRead) + .SetBackgroundActivation(); + + public async Task UpdateTaskbarIconBadgeAsync() + { + int totalUnreadCount = 0; + var badgeUpdater = BadgeUpdateManager.CreateBadgeUpdaterForApplication(); + + try + { + var accounts = await _accountService.GetAccountsAsync(); + + foreach (var account in accounts) + { + var accountInbox = await _folderService.GetSpecialFolderByAccountIdAsync(account.Id, SpecialFolderType.Inbox); + + if (accountInbox == null) + continue; + + var inboxUnreadCount = await _folderService.GetFolderNotificationBadgeAsync(accountInbox.Id); + + totalUnreadCount += inboxUnreadCount; + } + + if (totalUnreadCount > 0) + { + // Get the blank badge XML payload for a badge number + XmlDocument badgeXml = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeNumber); + + // Set the value of the badge in the XML to our number + XmlElement badgeElement = badgeXml.SelectSingleNode("/badge") as XmlElement; + badgeElement.SetAttribute("value", totalUnreadCount.ToString()); + + // Create the badge notification + BadgeNotification badge = new BadgeNotification(badgeXml); + + // And update the badge + badgeUpdater.Update(badge); + } + else + badgeUpdater.Clear(); + } + catch (System.Exception ex) + { + // TODO: Log exceptions. + + badgeUpdater.Clear(); + } + } + + public async Task CreateTestNotificationAsync(string title, string message) + { + // with args test. + await CreateNotificationsAsync(Guid.Parse("28c3c39b-7147-4de3-b209-949bd19eede6"), new List() + { + new MailCopy() + { + Subject = "test subject", + PreviewText = "preview html", + CreationDate = DateTime.UtcNow, + FromAddress = "bkaankose@outlook.com", + Id = "AAkALgAAAAAAHYQDEapmEc2byACqAC-EWg0AnMdP0zg8wkS_Ib2Eeh80LAAGq91I3QAA", + } + }); + + //var builder = new ToastContentBuilder(); + //builder.SetToastScenario(ToastScenario.Default); + + //builder.AddText(title); + //builder.AddText(message); + + //builder.Show(); + + //await Task.CompletedTask; + } + } +} diff --git a/Wino.Core.UWP/Services/StoreManagementService.cs b/Wino.Core.UWP/Services/StoreManagementService.cs new file mode 100644 index 00000000..b8f40787 --- /dev/null +++ b/Wino.Core.UWP/Services/StoreManagementService.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Windows.Services.Store; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Store; + +namespace Wino.Core.UWP.Services +{ + public class StoreManagementService : IStoreManagementService + { + private StoreContext CurrentContext { get; } + + private readonly Dictionary productIds = new Dictionary() + { + { StoreProductType.UnlimitedAccounts, "UnlimitedAccounts" } + }; + + private readonly Dictionary skuIds = new Dictionary() + { + { StoreProductType.UnlimitedAccounts, "9P02MXZ42GSM" } + }; + + public StoreManagementService() + { + CurrentContext = StoreContext.GetDefault(); + } + + public async Task HasProductAsync(StoreProductType productType) + { + var productKey = productIds[productType]; + var appLicense = await CurrentContext.GetAppLicenseAsync(); + + if (appLicense == null) + return false; + + // Access the valid licenses for durable add-ons for this app. + foreach (KeyValuePair item in appLicense.AddOnLicenses) + { + StoreLicense addOnLicense = item.Value; + + if (addOnLicense.InAppOfferToken == productKey) + { + return addOnLicense.IsActive; + } + } + + return false; + } + + public async Task PurchaseAsync(StoreProductType productType) + { + if (await HasProductAsync(productType)) + return Domain.Enums.StorePurchaseResult.AlreadyPurchased; + else + { + var productKey = skuIds[productType]; + + var result = await CurrentContext.RequestPurchaseAsync(productKey); + + switch (result.Status) + { + case StorePurchaseStatus.Succeeded: + return Domain.Enums.StorePurchaseResult.Succeeded; + case StorePurchaseStatus.AlreadyPurchased: + return Domain.Enums.StorePurchaseResult.AlreadyPurchased; + default: + return Domain.Enums.StorePurchaseResult.NotPurchased; + } + } + } + } +} diff --git a/Wino.Core.UWP/Services/StoreRatingService.cs b/Wino.Core.UWP/Services/StoreRatingService.cs new file mode 100644 index 00000000..df33dcab --- /dev/null +++ b/Wino.Core.UWP/Services/StoreRatingService.cs @@ -0,0 +1,137 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using Windows.ApplicationModel.Core; +using Windows.Services.Store; +using Windows.System; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class StoreRatingService : IStoreRatingService + { + private const string RatedStorageKey = nameof(RatedStorageKey); + private const string LatestAskedKey = nameof(LatestAskedKey); + + private readonly IConfigurationService _configurationService; + private readonly IDialogService _dialogService; + + public StoreRatingService(IConfigurationService configurationService, IDialogService dialogService) + { + _configurationService = configurationService; + _dialogService = dialogService; + } + + private void SetRated() + => _configurationService.SetRoaming(RatedStorageKey, true); + + private bool IsAskingThresholdExceeded() + { + var latestAskedDate = _configurationService.Get(LatestAskedKey, DateTime.MinValue); + + // Never asked before. + // Set the threshold and wait for the next trigger. + + if (latestAskedDate == DateTime.MinValue) + { + _configurationService.Set(LatestAskedKey, DateTime.UtcNow); + } + else if (DateTime.UtcNow >= latestAskedDate.AddMinutes(30)) + { + return true; + } + + return false; + } + + public async Task PromptRatingDialogAsync() + { + // Annoying. + if (Debugger.IsAttached) return; + + // Swallow all exceptions. App should not crash in any errors. + + try + { + bool isRated = _configurationService.GetRoaming(RatedStorageKey, false); + + if (isRated) return; + + if (!isRated) + { + if (!IsAskingThresholdExceeded()) return; + + var ratingDialogResult = await _dialogService.ShowRatingDialogAsync(); + + if (ratingDialogResult == null) + return; + + if (ratingDialogResult.DontAskAgain) + SetRated(); + + if (ratingDialogResult.RateWinoClicked) + { + // In case of failure of this call, we will navigate users to Store page directly. + + try + { + await ShowPortableRatingDialogAsync(); + } + catch (Exception) + { + await Launcher.LaunchUriAsync(new Uri($"ms-windows-store://review/?ProductId=9NCRCVJC50WL")); + } + } + } + } + catch (Exception) { } + finally + { + _configurationService.Set(LatestAskedKey, DateTime.UtcNow); + } + } + + private async Task ShowPortableRatingDialogAsync() + { + var _storeContext = StoreContext.GetDefault(); + + StoreRateAndReviewResult result = await _storeContext.RequestRateAndReviewAppAsync(); + + // Check status + switch (result.Status) + { + case StoreRateAndReviewStatus.Succeeded: + if (result.WasUpdated) + _dialogService.InfoBarMessage(Translator.Info_ReviewSuccessTitle, Translator.Info_ReviewUpdatedMessage, Domain.Enums.InfoBarMessageType.Success); + else + _dialogService.InfoBarMessage(Translator.Info_ReviewSuccessTitle, Translator.Info_ReviewNewMessage, Domain.Enums.InfoBarMessageType.Success); + + SetRated(); + break; + case StoreRateAndReviewStatus.CanceledByUser: + break; + + case StoreRateAndReviewStatus.NetworkError: + _dialogService.InfoBarMessage(Translator.Info_ReviewNetworkErrorTitle, Translator.Info_ReviewNetworkErrorMessage, Domain.Enums.InfoBarMessageType.Warning); + break; + default: + _dialogService.InfoBarMessage(Translator.Info_ReviewUnknownErrorTitle, string.Format(Translator.Info_ReviewUnknownErrorMessage, result.ExtendedError.Message), Domain.Enums.InfoBarMessageType.Warning); + break; + } + } + + public async Task LaunchStorePageForReviewAsync() + { + try + { + await CoreApplication.GetCurrentView()?.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => + { + // TODO: Get it from package info. + await Launcher.LaunchUriAsync(new Uri($"ms-windows-store://review/?ProductId=9NCRCVJC50WL")); + }); + } + catch (Exception) { } + } + } +} diff --git a/Wino.Core.UWP/Services/ThemeService.cs b/Wino.Core.UWP/Services/ThemeService.cs new file mode 100644 index 00000000..9649a625 --- /dev/null +++ b/Wino.Core.UWP/Services/ThemeService.cs @@ -0,0 +1,446 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Toolkit.Uwp.Helpers; +using Newtonsoft.Json; +using Windows.Storage; +using Windows.UI; +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Markup; +using Windows.UI.Xaml.Media; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Personalization; +using Wino.Core.Messages.Shell; +using Wino.Core.UWP.Extensions; +using Wino.Core.UWP.Models.Personalization; +using Wino.Core.UWP.Services; + +namespace Wino.Services +{ + /// + /// Class providing functionality around switching and restoring theme settings + /// + public class ThemeService : IThemeService + { + public const string CustomThemeFolderName = "CustomThemes"; + + private static string _micaThemeId = "a160b1b0-2ab8-4e97-a803-f4050f036e25"; + private static string _acrylicThemeId = "fc08e58c-36fd-46e2-a562-26cf277f1467"; + private static string _cloudsThemeId = "3b621cc2-e270-4a76-8477-737917cccda0"; + private static string _forestThemeId = "8bc89b37-a7c5-4049-86e2-de1ae8858dbd"; + private static string _nightyThemeId = "5b65e04e-fd7e-4c2d-8221-068d3e02d23a"; + private static string _snowflakeThemeId = "e143ddde-2e28-4846-9d98-dad63d6505f1"; + private static string _gardenThemeId = "698e4466-f88c-4799-9c61-f0ea1308ed49"; + + private Frame mainApplicationFrame = null; + + public event EventHandler ElementThemeChanged; + public event EventHandler AccentColorChanged; + public event EventHandler AccentColorChangedBySystem; + + private const string AccentColorKey = nameof(AccentColorKey); + private const string CurrentApplicationThemeKey = nameof(CurrentApplicationThemeKey); + + // Custom theme + public const string CustomThemeAccentColorKey = nameof(CustomThemeAccentColorKey); + + // Keep reference so it does not get optimized/garbage collected + private readonly UISettings uiSettings = new UISettings(); + + private readonly IConfigurationService _configurationService; + private readonly IUnderlyingThemeService _underlyingThemeService; + private readonly IApplicationResourceManager _applicationResourceManager; + + private List preDefinedThemes { get; set; } = new List() + { + new SystemAppTheme("Mica", Guid.Parse(_micaThemeId)), + new SystemAppTheme("Acrylic", Guid.Parse(_acrylicThemeId)), + new PreDefinedAppTheme("Nighty", Guid.Parse(_nightyThemeId), "#e1b12c", ApplicationElementTheme.Dark), + new PreDefinedAppTheme("Forest", Guid.Parse(_forestThemeId), "#16a085", ApplicationElementTheme.Dark), + new PreDefinedAppTheme("Clouds", Guid.Parse(_cloudsThemeId), "#0984e3", ApplicationElementTheme.Light), + new PreDefinedAppTheme("Snowflake", Guid.Parse(_snowflakeThemeId), "#4a69bd", ApplicationElementTheme.Light), + new PreDefinedAppTheme("Garden", Guid.Parse(_gardenThemeId), "#05c46b", ApplicationElementTheme.Light), + }; + + public ThemeService(IConfigurationService configurationService, + IUnderlyingThemeService underlyingThemeService, + IApplicationResourceManager applicationResourceManager) + { + _configurationService = configurationService; + _underlyingThemeService = underlyingThemeService; + _applicationResourceManager = applicationResourceManager; + } + + /// + /// Gets or sets (with LocalSettings persistence) the RequestedTheme of the root element. + /// + public ApplicationElementTheme RootTheme + { + get + { + if (mainApplicationFrame == null) return ApplicationElementTheme.Default; + + return mainApplicationFrame.RequestedTheme.ToWinoElementTheme(); + } + set + { + if (mainApplicationFrame == null) + return; + + mainApplicationFrame.RequestedTheme = value.ToWindowsElementTheme(); + + _configurationService.Set(UnderlyingThemeService.SelectedAppThemeKey, value); + + UpdateSystemCaptionButtonColors(); + + // PopupRoot usually needs to react to changes. + NotifyThemeUpdate(); + } + } + + + private Guid currentApplicationThemeId; + + public Guid CurrentApplicationThemeId + { + get { return currentApplicationThemeId; } + set + { + currentApplicationThemeId = value; + + _configurationService.Set(CurrentApplicationThemeKey, value); + + _ = mainApplicationFrame.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, async () => + { + await ApplyCustomThemeAsync(false); + }); + } + } + + + private string accentColor; + + public string AccentColor + { + get { return accentColor; } + set + { + accentColor = value; + + UpdateAccentColor(value); + + _configurationService.Set(AccentColorKey, value); + AccentColorChanged?.Invoke(this, value); + } + } + + public async Task InitializeAsync() + { + // Already initialized. There is no need. + if (mainApplicationFrame != null) + return; + + // Save reference as this might be null when the user is in another app + + mainApplicationFrame = Window.Current.Content as Frame; + + if (mainApplicationFrame == null) return; + + RootTheme = _configurationService.Get(UnderlyingThemeService.SelectedAppThemeKey, ApplicationElementTheme.Default); + AccentColor = _configurationService.Get(AccentColorKey, string.Empty); + + // Set the current theme id. Default to Mica. + var applicationThemeGuid = _configurationService.Get(CurrentApplicationThemeKey, _micaThemeId); + + currentApplicationThemeId = Guid.Parse(applicationThemeGuid); + + await ApplyCustomThemeAsync(true); + + // Registering to color changes, thus we notice when user changes theme system wide + uiSettings.ColorValuesChanged += UISettingsColorChanged; + } + + private void NotifyThemeUpdate() + { + if (mainApplicationFrame == null || mainApplicationFrame.Dispatcher == null) return; + + _ = mainApplicationFrame.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => + { + ElementThemeChanged?.Invoke(this, RootTheme); + WeakReferenceMessenger.Default.Send(new ApplicationThemeChanged(_underlyingThemeService.IsUnderlyingThemeDark())); + }); + } + + private void UISettingsColorChanged(UISettings sender, object args) + { + // Make sure we have a reference to our window so we dispatch a UI change + if (mainApplicationFrame != null) + { + // Dispatch on UI thread so that we have a current appbar to access and change + + _ = mainApplicationFrame.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => + { + UpdateSystemCaptionButtonColors(); + + var accentColor = sender.GetColorValue(UIColorType.Accent); + //AccentColorChangedBySystem?.Invoke(this, accentColor.ToHex()); + }); + } + + NotifyThemeUpdate(); + } + + public void UpdateSystemCaptionButtonColors() + { + if (mainApplicationFrame == null) return; + + _ = mainApplicationFrame.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => + { + ApplicationViewTitleBar titleBar = ApplicationView.GetForCurrentView().TitleBar; + + if (titleBar == null) return; + + if (_underlyingThemeService.IsUnderlyingThemeDark()) + { + titleBar.ButtonForegroundColor = Colors.White; + } + else + { + titleBar.ButtonForegroundColor = Colors.Black; + } + }); + } + + public void UpdateAccentColor(string hex) + { + // Change accent color if specified. + if (!string.IsNullOrEmpty(hex)) + { + var brush = new SolidColorBrush(Microsoft.Toolkit.Uwp.Helpers.ColorHelper.ToColor(hex)); + + if (_applicationResourceManager.ContainsResourceKey("SystemAccentColor")) + _applicationResourceManager.ReplaceResource("SystemAccentColor", brush); + + if (_applicationResourceManager.ContainsResourceKey("NavigationViewSelectionIndicatorForeground")) + _applicationResourceManager.ReplaceResource("NavigationViewSelectionIndicatorForeground", brush); + + RefreshThemeResource(); + } + } + + private void RefreshThemeResource() + { + if (mainApplicationFrame == null) return; + + if (mainApplicationFrame.RequestedTheme == ElementTheme.Dark) + { + mainApplicationFrame.RequestedTheme = ElementTheme.Light; + mainApplicationFrame.RequestedTheme = ElementTheme.Dark; + } + else if (mainApplicationFrame.RequestedTheme == ElementTheme.Light) + { + mainApplicationFrame.RequestedTheme = ElementTheme.Dark; + mainApplicationFrame.RequestedTheme = ElementTheme.Light; + } + else + { + var isUnderlyingDark = _underlyingThemeService.IsUnderlyingThemeDark(); + + mainApplicationFrame.RequestedTheme = isUnderlyingDark ? ElementTheme.Light : ElementTheme.Dark; + mainApplicationFrame.RequestedTheme = ElementTheme.Default; + } + } + + public async Task ApplyCustomThemeAsync(bool isInitializing) + { + AppThemeBase applyingTheme = null; + + var controlThemeList = new List(preDefinedThemes); + + // Don't search for custom themes if applying theme is already in pre-defined templates. + // This is important for startup performance because we won't be loading the custom themes on launch. + + bool isApplyingPreDefinedTheme = preDefinedThemes.Exists(a => a.Id == currentApplicationThemeId); + + if (isApplyingPreDefinedTheme) + { + applyingTheme = preDefinedThemes.Find(a => a.Id == currentApplicationThemeId); + } + else + { + // User applied custom theme. Load custom themes and find it there. + // Fallback to Mica if nothing found. + + var customThemes = await GetCurrentCustomThemesAsync(); + + controlThemeList.AddRange(customThemes.Select(a => new CustomAppTheme(a))); + + applyingTheme = controlThemeList.Find(a => a.Id == currentApplicationThemeId) ?? preDefinedThemes.First(a => a.Id == Guid.Parse(_micaThemeId)); + } + + try + { + var existingThemeDictionary = _applicationResourceManager.GetLastResource(); + + if (existingThemeDictionary != null && existingThemeDictionary.TryGetValue("ThemeName", out object themeNameString)) + { + var themeName = themeNameString.ToString(); + + // Applying different theme. + if (themeName != applyingTheme.ThemeName) + { + var resourceDictionaryContent = await applyingTheme.GetThemeResourceDictionaryContentAsync(); + + var resourceDictionary = XamlReader.Load(resourceDictionaryContent) as ResourceDictionary; + + // Custom themes require special attention for background image because + // they share the same base theme resource dictionary. + + if (applyingTheme is CustomAppTheme) + { + resourceDictionary["ThemeBackgroundImage"] = $"ms-appdata:///local/{CustomThemeFolderName}/{applyingTheme.Id}.jpg"; + } + + _applicationResourceManager.RemoveResource(existingThemeDictionary); + _applicationResourceManager.AddResource(resourceDictionary); + + bool isSystemTheme = applyingTheme is SystemAppTheme || applyingTheme is CustomAppTheme; + + if (isSystemTheme) + { + // For system themes, set the RootElement theme from saved values. + // Potential bug: When we set it to system default, theme is not applied when system and + // app element theme is different :) + + var savedElement = _configurationService.Get(UnderlyingThemeService.SelectedAppThemeKey, ApplicationElementTheme.Default); + RootTheme = savedElement; + + // Quickly switch theme to apply theme resource changes. + RefreshThemeResource(); + } + else + RootTheme = applyingTheme.ForceElementTheme; + + // Theme has accent color. Override. + if (!isInitializing) + { + AccentColor = applyingTheme.AccentColor; + } + } + else + UpdateSystemCaptionButtonColors(); + } + } + catch (Exception ex) + { + Debug.WriteLine($"Apply theme failed -> {ex.Message}"); + } + } + + public async Task> GetAvailableThemesAsync() + { + var availableThemes = new List(preDefinedThemes); + + var customThemes = await GetCurrentCustomThemesAsync(); + + availableThemes.AddRange(customThemes.Select(a => new CustomAppTheme(a))); + + return availableThemes; + } + + public async Task CreateNewCustomThemeAsync(string themeName, string accentColor, byte[] wallpaperData) + { + if (wallpaperData == null || wallpaperData.Length == 0) + throw new CustomThemeCreationFailedException(Translator.Exception_CustomThemeMissingWallpaper); + + if (string.IsNullOrEmpty(themeName)) + throw new CustomThemeCreationFailedException(Translator.Exception_CustomThemeMissingName); + + var themes = await GetCurrentCustomThemesAsync(); + + if (themes.Exists(a => a.Name == themeName)) + throw new CustomThemeCreationFailedException(Translator.Exception_CustomThemeExists); + + var newTheme = new CustomThemeMetadata() + { + Id = Guid.NewGuid(), + Name = themeName, + AccentColorHex = accentColor + }; + + // Save wallpaper. + // Filename would be the same as metadata id, in jpg format. + + var themeFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(CustomThemeFolderName, CreationCollisionOption.OpenIfExists); + + var wallpaperFile = await themeFolder.CreateFileAsync($"{newTheme.Id}.jpg", CreationCollisionOption.ReplaceExisting); + await FileIO.WriteBytesAsync(wallpaperFile, wallpaperData); + + // Generate thumbnail for settings page. + + var thumbnail = await wallpaperFile.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.PicturesView); + var thumbnailFile = await themeFolder.CreateFileAsync($"{newTheme.Id}_preview.jpg", CreationCollisionOption.ReplaceExisting); + + using (var readerStream = thumbnail.AsStreamForRead()) + { + byte[] bytes = new byte[readerStream.Length]; + + await readerStream.ReadAsync(bytes, 0, bytes.Length); + + var buffer = bytes.AsBuffer(); + + await FileIO.WriteBufferAsync(thumbnailFile, buffer); + } + + // Save metadata. + var metadataFile = await themeFolder.CreateFileAsync($"{newTheme.Id}.json", CreationCollisionOption.ReplaceExisting); + + var serialized = JsonConvert.SerializeObject(newTheme); + await FileIO.WriteTextAsync(metadataFile, serialized); + + return newTheme; + } + + public async Task> GetCurrentCustomThemesAsync() + { + var results = new List(); + + var themeFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(CustomThemeFolderName, CreationCollisionOption.OpenIfExists); + + var allFiles = await themeFolder.GetFilesAsync(); + + var themeMetadatas = allFiles.Where(a => a.FileType == ".json"); + + foreach (var theme in themeMetadatas) + { + var metadata = await GetCustomMetadataAsync(theme).ConfigureAwait(false); + + if (metadata == null) continue; + + results.Add(metadata); + } + + return results; + } + + private async Task GetCustomMetadataAsync(IStorageFile file) + { + var fileContent = await FileIO.ReadTextAsync(file); + + return JsonConvert.DeserializeObject(fileContent); + } + + public string GetSystemAccentColorHex() + => uiSettings.GetColorValue(UIColorType.Accent).ToHex(); + } +} diff --git a/Wino.Core.UWP/Services/UnderlyingThemeService.cs b/Wino.Core.UWP/Services/UnderlyingThemeService.cs new file mode 100644 index 00000000..5f88a393 --- /dev/null +++ b/Wino.Core.UWP/Services/UnderlyingThemeService.cs @@ -0,0 +1,32 @@ +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class UnderlyingThemeService : IUnderlyingThemeService + { + public const string SelectedAppThemeKey = nameof(SelectedAppThemeKey); + + private readonly UISettings uiSettings = new UISettings(); + private readonly IConfigurationService _configurationService; + + public UnderlyingThemeService(IConfigurationService configurationService) + { + _configurationService = configurationService; + } + + // This should not rely on application window to be present. + // Check theme from the settings, rely on UISettings background color if Default. + + public bool IsUnderlyingThemeDark() + { + var currentTheme = _configurationService.Get(SelectedAppThemeKey, ElementTheme.Default); + + if (currentTheme == ElementTheme.Default) + return uiSettings.GetColorValue(UIColorType.Background).ToString() == "#FF000000"; + else + return currentTheme == ElementTheme.Dark; + } + } +} diff --git a/Wino.Core.UWP/Wino.Core.UWP.csproj b/Wino.Core.UWP/Wino.Core.UWP.csproj new file mode 100644 index 00000000..b46724c3 --- /dev/null +++ b/Wino.Core.UWP/Wino.Core.UWP.csproj @@ -0,0 +1,184 @@ + + + + + Debug + AnyCPU + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8} + Library + Properties + Wino.Core.UWP + Wino.Core.UWP + en-US + UAP + 10.0.22621.0 + 10.0.17763.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + x86 + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + x86 + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + ARM + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + ARM + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + ARM64 + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + ARM64 + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + x64 + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + x64 + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + PackageReference + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.0.3 + + + 6.2.14 + + + 7.1.3 + + + 7.1.3 + + + + + {cf3312e5-5da0-4867-9945-49ea7598af1f} + Wino.Core.Domain + + + {e6b1632a-8901-41e8-9ddf-6793c7698b0b} + Wino.Core + + + + + 14.0 + + + + \ No newline at end of file diff --git a/Wino.Core/Authenticators/BaseAuthenticator.cs b/Wino.Core/Authenticators/BaseAuthenticator.cs new file mode 100644 index 00000000..b1ab4374 --- /dev/null +++ b/Wino.Core/Authenticators/BaseAuthenticator.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Services; + +namespace Wino.Core.Authenticators +{ + public abstract class BaseAuthenticator + { + public abstract MailProviderType ProviderType { get; } + + protected ITokenService TokenService { get; } + + protected BaseAuthenticator(ITokenService tokenService) + { + TokenService = tokenService; + } + + internal Task SaveTokenInternalAsync(MailAccount account, TokenInformation tokenInformation) + => TokenService.SaveTokenInformationAsync(account.Id, tokenInformation); + } +} diff --git a/Wino.Core/Authenticators/CustomAuthenticator.cs b/Wino.Core/Authenticators/CustomAuthenticator.cs new file mode 100644 index 00000000..a254d66c --- /dev/null +++ b/Wino.Core/Authenticators/CustomAuthenticator.cs @@ -0,0 +1,34 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Core.Authenticators +{ + public class CustomAuthenticator : BaseAuthenticator, IAuthenticator + { + public CustomAuthenticator(ITokenService tokenService) : base(tokenService) { } + + public override MailProviderType ProviderType => MailProviderType.IMAP4; + + public string ClientId => throw new NotImplementedException(); // Not needed. + + public event EventHandler InteractiveAuthenticationRequired; + + public void CancelAuthorization() { } + + public void ContinueAuthorization(Uri authorizationResponseUri) { } + + public Task GenerateTokenAsync(MailAccount account, bool saveToken) + { + throw new NotImplementedException(); + } + + public Task GetTokenAsync(MailAccount account) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wino.Core/Authenticators/GmailAuthenticator.cs b/Wino.Core/Authenticators/GmailAuthenticator.cs new file mode 100644 index 00000000..3c77136e --- /dev/null +++ b/Wino.Core/Authenticators/GmailAuthenticator.cs @@ -0,0 +1,219 @@ +using System; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using Nito.AsyncEx; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Authentication; +using Wino.Core.Domain.Models.Authorization; +using Wino.Core.Services; +using Xamarin.Essentials; + +namespace Wino.Core.Authenticators +{ + public class GmailAuthenticator : BaseAuthenticator, IAuthenticator + { + public string ClientId { get; } = "973025879644-s7b4ur9p3rlgop6a22u7iuptdc0brnrn.apps.googleusercontent.com"; + + private const string TokenEndpoint = "https://www.googleapis.com/oauth2/v4/token"; + private const string RefreshTokenEndpoint = "https://oauth2.googleapis.com/token"; + private const string UserInfoEndpoint = "https://gmail.googleapis.com/gmail/v1/users/me/profile"; + + public override MailProviderType ProviderType => MailProviderType.Gmail; + + private TaskCompletionSource _authorizationCompletionSource = null; + private CancellationTokenSource _authorizationCancellationTokenSource = null; + + private readonly INativeAppService _nativeAppService; + + public event EventHandler InteractiveAuthenticationRequired; + + public GmailAuthenticator(ITokenService tokenService, INativeAppService nativeAppService) : base(tokenService) + { + _nativeAppService = nativeAppService; + } + + /// + /// Performs tokenization code exchange and retrieves the actual Access - Refresh tokens from Google + /// after redirect uri returns from browser. + /// + /// Tokenization request. + /// In case of network or parsing related error. + private async Task PerformCodeExchangeAsync(GoogleTokenizationRequest tokenizationRequest) + { + var uri = tokenizationRequest.BuildRequest(); + + var content = new StringContent(uri, Encoding.UTF8, "application/x-www-form-urlencoded"); + + var handler = new HttpClientHandler() + { + AllowAutoRedirect = true + }; + + var client = new HttpClient(handler); + + var response = await client.PostAsync(TokenEndpoint, content); + string responseString = await response.Content.ReadAsStringAsync(); + + if (!response.IsSuccessStatusCode) + throw new GoogleAuthenticationException(Translator.Exception_GoogleAuthorizationCodeExchangeFailed); + + var parsed = JObject.Parse(responseString); + + if (parsed.ContainsKey("error")) + throw new GoogleAuthenticationException(parsed["error"]["message"].Value()); + + var accessToken = parsed["access_token"].Value(); + var refreshToken = parsed["refresh_token"].Value(); + var expiresIn = parsed["expires_in"].Value(); + + var expirationDate = DateTime.UtcNow.AddSeconds(expiresIn); + + client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken); + + // Get basic user info for UserName. + + var userinfoResponse = await client.GetAsync(UserInfoEndpoint); + string userinfoResponseContent = await userinfoResponse.Content.ReadAsStringAsync(); + + var parsedUserInfo = JObject.Parse(userinfoResponseContent); + + if (parsedUserInfo.ContainsKey("error")) + throw new GoogleAuthenticationException(parsedUserInfo["error"]["message"].Value()); + + var username = parsedUserInfo["emailAddress"].Value(); + + return new TokenInformation() + { + Id = Guid.NewGuid(), + Address = username, + AccessToken = accessToken, + RefreshToken = refreshToken, + ExpiresAt = expirationDate + }; + } + + public void ContinueAuthorization(Uri authorizationResponseUri) => _authorizationCompletionSource?.TrySetResult(authorizationResponseUri); + + public async Task GetTokenAsync(MailAccount account) + { + var cachedToken = await TokenService.GetTokenInformationAsync(account.Id) + ?? throw new AuthenticationAttentionException(account); + + if (cachedToken.IsExpired) + { + // Refresh token with new exchanges. + // No need to check Username for account. + + var refreshedTokenInfoBase = await RefreshTokenAsync(cachedToken.RefreshToken); + + cachedToken.RefreshTokens(refreshedTokenInfoBase); + + // Save new token and return. + await SaveTokenInternalAsync(account, cachedToken); + } + + return cachedToken; + } + + + public async Task GenerateTokenAsync(MailAccount account, bool saveToken) + { + var authRequest = _nativeAppService.GetGoogleAuthorizationRequest(); + + _authorizationCompletionSource = new TaskCompletionSource(); + _authorizationCancellationTokenSource = new CancellationTokenSource(); + + var authorizationUri = authRequest.BuildRequest(ClientId); + + await Browser.OpenAsync(authorizationUri, BrowserLaunchMode.SystemPreferred); + + Uri responseRedirectUri = null; + + try + { + responseRedirectUri = await _authorizationCompletionSource.Task.WaitAsync(_authorizationCancellationTokenSource.Token); + } + catch (OperationCanceledException) + { + throw new AuthenticationException(Translator.Exception_AuthenticationCanceled); + } + finally + { + _authorizationCancellationTokenSource.Dispose(); + _authorizationCancellationTokenSource = null; + _authorizationCompletionSource = null; + } + + authRequest.ValidateAuthorizationCode(responseRedirectUri); + + // Start tokenization. + var tokenizationRequest = new GoogleTokenizationRequest(authRequest); + var tokenInformation = await PerformCodeExchangeAsync(tokenizationRequest); + + if (saveToken) + { + await SaveTokenInternalAsync(account, tokenInformation); + } + + return tokenInformation; + } + + /// + /// Internally exchanges refresh token with a new access token and returns new TokenInformation. + /// + /// Token to be used in refreshing. + /// New TokenInformationBase that has new tokens and expiration date without a username. This token is not saved to database after returned. + private async Task RefreshTokenAsync(string refresh_token) + { + // TODO: This doesn't work. + var refreshUri = string.Format("client_id={0}&refresh_token={1}&grant_type=refresh_token", ClientId, refresh_token); + + //Uri.EscapeDataString(refreshUri); + var content = new StringContent(refreshUri, Encoding.UTF8, "application/x-www-form-urlencoded"); + + var client = new HttpClient(); + + var response = await client.PostAsync(RefreshTokenEndpoint, content); + + string responseString = await response.Content.ReadAsStringAsync(); + + var parsed = JObject.Parse(responseString); + + // TODO: Error parsing is incorrect. + if (parsed.ContainsKey("error")) + throw new GoogleAuthenticationException(parsed["error_description"].Value()); + + var accessToken = parsed["access_token"].Value(); + + string activeRefreshToken = refresh_token; + + // Refresh token might not be returned. + // In this case older refresh token is still available for new refreshes. + // Only change if provided. + + if (parsed.ContainsKey("refresh_token")) + { + activeRefreshToken = parsed["refresh_token"].Value(); + } + + var expiresIn = parsed["expires_in"].Value(); + var expirationDate = DateTime.UtcNow.AddSeconds(expiresIn); + + return new TokenInformationBase() + { + AccessToken = accessToken, + ExpiresAt = expirationDate, + RefreshToken = activeRefreshToken + }; + } + + public void CancelAuthorization() => _authorizationCancellationTokenSource?.Cancel(); + } +} diff --git a/Wino.Core/Authenticators/Office365Authenticator.cs b/Wino.Core/Authenticators/Office365Authenticator.cs new file mode 100644 index 00000000..916be96c --- /dev/null +++ b/Wino.Core/Authenticators/Office365Authenticator.cs @@ -0,0 +1,13 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Core.Authenticators +{ + public class Office365Authenticator : OutlookAuthenticator + { + public Office365Authenticator(ITokenService tokenService, INativeAppService nativeAppService) : base(tokenService, nativeAppService) { } + + public override MailProviderType ProviderType => MailProviderType.Office365; + } +} diff --git a/Wino.Core/Authenticators/OutlookAuthenticator.cs b/Wino.Core/Authenticators/OutlookAuthenticator.cs new file mode 100644 index 00000000..878d1c91 --- /dev/null +++ b/Wino.Core/Authenticators/OutlookAuthenticator.cs @@ -0,0 +1,115 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Identity.Client; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Extensions; +using Wino.Core.Services; + +namespace Wino.Core.Authenticators +{ + public class OutlookAuthenticator : BaseAuthenticator, IAuthenticator + { + // Outlook + private const string Authority = "https://login.microsoftonline.com/common"; + + public string ClientId { get; } = "b19c2035-d740-49ff-b297-de6ec561b208"; + + private readonly string[] MailScope = new string[] { "email", "mail.readwrite", "offline_access", "mail.send" }; + + public override MailProviderType ProviderType => MailProviderType.Outlook; + + private readonly IPublicClientApplication _publicClientApplication; + + public OutlookAuthenticator(ITokenService tokenService, INativeAppService nativeAppService) : base(tokenService) + { + var authenticationRedirectUri = nativeAppService.GetWebAuthenticationBrokerUri(); + + _publicClientApplication = PublicClientApplicationBuilder.Create(ClientId) + .WithAuthority(Authority) + .WithRedirectUri(authenticationRedirectUri) + .Build(); + } + +#pragma warning disable S1133 // Deprecated code should be removed + [Obsolete("Not used for OutlookAuthenticator.")] +#pragma warning restore S1133 // Deprecated code should be removed + public void ContinueAuthorization(Uri authorizationResponseUri) { } + +#pragma warning disable S1133 // Deprecated code should be removed + [Obsolete("Not used for OutlookAuthenticator.")] +#pragma warning restore S1133 // Deprecated code should be removed + public void CancelAuthorization() { } + + public async Task GetTokenAsync(MailAccount account) + { + var cachedToken = await TokenService.GetTokenInformationAsync(account.Id) + ?? throw new AuthenticationAttentionException(account); + + // We have token but it's expired. + // Silently refresh the token and save new token. + + if (cachedToken.IsExpired) + { + var cachedOutlookAccount = (await _publicClientApplication.GetAccountsAsync()).FirstOrDefault(a => a.Username == account.Address); + + // Again, not expected at all... + // Force interactive login at this point. + + if (cachedOutlookAccount == null) + { + // What if interactive login info is for different account? + + return await GenerateTokenAsync(account, true); + } + else + { + // Silently refresh token from cache. + + AuthenticationResult authResult = await _publicClientApplication.AcquireTokenSilent(MailScope, cachedOutlookAccount).ExecuteAsync(); + + // Save refreshed token and return + var refreshedTokenInformation = authResult.CreateTokenInformation(); + + await TokenService.SaveTokenInformationAsync(account.Id, refreshedTokenInformation); + + return refreshedTokenInformation; + } + } + else + return cachedToken; + } + + public async Task GenerateTokenAsync(MailAccount account, bool saveToken) + { + try + { + var authResult = await _publicClientApplication + .AcquireTokenInteractive(MailScope) + .ExecuteAsync(); + + var tokenInformation = authResult.CreateTokenInformation(); + + if (saveToken) + { + await SaveTokenInternalAsync(account, tokenInformation); + } + + return tokenInformation; + } + catch (MsalClientException msalClientException) + { + if (msalClientException.ErrorCode == "authentication_canceled" || msalClientException.ErrorCode == "access_denied") + throw new AccountSetupCanceledException(); + + throw; + } + + throw new AuthenticationException(Translator.Exception_UnknowErrorDuringAuthentication, new Exception(Translator.Exception_TokenGenerationFailed)); + } + } +} diff --git a/Wino.Core/Authenticators/YahooAuthenticator.cs b/Wino.Core/Authenticators/YahooAuthenticator.cs new file mode 100644 index 00000000..f42842ca --- /dev/null +++ b/Wino.Core/Authenticators/YahooAuthenticator.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Core.Authenticators +{ + public class YahooAuthenticator : BaseAuthenticator, IAuthenticator + { + public YahooAuthenticator(ITokenService tokenService) : base(tokenService) { } + + public override MailProviderType ProviderType => MailProviderType.Yahoo; + + public string ClientId => throw new NotImplementedException(); + + public event EventHandler InteractiveAuthenticationRequired; + + public void CancelAuthorization() + { + throw new NotImplementedException(); + } + + public void ContinueAuthorization(Uri authorizationResponseUri) + { + throw new NotImplementedException(); + } + + public Task GenerateTokenAsync(MailAccount account, bool saveToken) + { + throw new NotImplementedException(); + } + + public Task GetTokenAsync(MailAccount account) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wino.Core/CoreContainerSetup.cs b/Wino.Core/CoreContainerSetup.cs new file mode 100644 index 00000000..0554b0a0 --- /dev/null +++ b/Wino.Core/CoreContainerSetup.cs @@ -0,0 +1,46 @@ +using Microsoft.Extensions.DependencyInjection; +using Serilog.Core; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration.Processors; +using Wino.Core.Integration.Threading; +using Wino.Core.Services; + +namespace Wino.Core +{ + public static class CoreContainerSetup + { + public static void RegisterCoreServices(this IServiceCollection services) + { + var loggerLevelSwitcher = new LoggingLevelSwitch(); + + services.AddSingleton(loggerLevelSwitcher); + services.AddSingleton(); + + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + } + } +} diff --git a/Wino.Core/Extensions/FolderTreeExtensions.cs b/Wino.Core/Extensions/FolderTreeExtensions.cs new file mode 100644 index 00000000..12c46447 --- /dev/null +++ b/Wino.Core/Extensions/FolderTreeExtensions.cs @@ -0,0 +1,54 @@ +using System.Linq; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.MenuItems; + +namespace Wino.Core.Extensions +{ + public static class FolderTreeExtensions + { + public static AccountMenuItem GetAccountMenuTree(this AccountFolderTree accountTree, IMenuItem parentMenuItem = null) + { + var accountMenuItem = new AccountMenuItem(accountTree.Account, parentMenuItem); + + foreach (var structure in accountTree.Folders) + { + var tree = GetMenuItemByFolderRecursive(structure, accountMenuItem, null); + + accountMenuItem.SubMenuItems.Add(tree); + } + + + // Create flat folder hierarchy for ease of access. + accountMenuItem.FlattenedFolderHierarchy = ListExtensions + .FlattenBy(accountMenuItem.SubMenuItems, a => a.SubMenuItems) + .Where(a => a is FolderMenuItem) + .Cast() + .ToList(); + + return accountMenuItem; + } + + private static MenuItemBase GetMenuItemByFolderRecursive(IMailItemFolder structure, AccountMenuItem parentAccountMenuItem, IMenuItem parentFolderItem) + { + MenuItemBase parentMenuItem = new FolderMenuItem(structure, parentAccountMenuItem.Parameter, parentAccountMenuItem); + + var childStructures = structure.ChildFolders; + + foreach (var childFolder in childStructures) + { + if (childFolder == null) continue; + + // Folder menu item. + var subChildrenFolderTree = GetMenuItemByFolderRecursive(childFolder, parentAccountMenuItem, parentMenuItem); + + if (subChildrenFolderTree is FolderMenuItem folderItem) + { + parentMenuItem.SubMenuItems.Add(folderItem); + } + } + + return parentMenuItem; + } + } +} diff --git a/Wino.Core/Extensions/GoogleIntegratorExtensions.cs b/Wino.Core/Extensions/GoogleIntegratorExtensions.cs new file mode 100644 index 00000000..89a3c8f5 --- /dev/null +++ b/Wino.Core/Extensions/GoogleIntegratorExtensions.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Web; +using Google.Apis.Gmail.v1.Data; +using MimeKit; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Extensions +{ + public static class GoogleIntegratorExtensions + { + public const string INBOX_LABEL_ID = "INBOX"; + public const string UNREAD_LABEL_ID = "UNREAD"; + public const string IMPORTANT_LABEL_ID = "IMPORTANT"; + public const string STARRED_LABEL_ID = "STARRED"; + public const string DRAFT_LABEL_ID = "DRAFT"; + public const string SENT_LABEL_ID = "SENT"; + + private const string SYSTEM_FOLDER_IDENTIFIER = "system"; + private const string FOLDER_HIDE_IDENTIFIER = "labelHide"; + + private static Dictionary KnownFolderDictioanry = new Dictionary() + { + { INBOX_LABEL_ID, SpecialFolderType.Inbox }, + { "CHAT", SpecialFolderType.Chat }, + { IMPORTANT_LABEL_ID, SpecialFolderType.Important }, + { "TRASH", SpecialFolderType.Deleted }, + { DRAFT_LABEL_ID, SpecialFolderType.Draft }, + { SENT_LABEL_ID, SpecialFolderType.Sent }, + { "SPAM", SpecialFolderType.Junk }, + { STARRED_LABEL_ID, SpecialFolderType.Starred }, + { UNREAD_LABEL_ID, SpecialFolderType.Unread }, + { "FORUMS", SpecialFolderType.Forums }, + { "UPDATES", SpecialFolderType.Updates }, + { "PROMOTIONS", SpecialFolderType.Promotions }, + { "SOCIAL", SpecialFolderType.Social}, + { "PERSONAL", SpecialFolderType.Personal}, + }; + + public static MailItemFolder GetLocalFolder(this Label label, Guid accountId) + { + var unchangedFolderName = label.Name; + + if (label.Name.StartsWith("CATEGORY_")) + label.Name = label.Name.Replace("CATEGORY_", ""); + + bool isSpecialFolder = KnownFolderDictioanry.ContainsKey(label.Name); + bool isAllCapital = label.Name.All(a => char.IsUpper(a)); + + var specialFolderType = isSpecialFolder ? KnownFolderDictioanry[label.Name] : SpecialFolderType.Other; + + return new MailItemFolder() + { + TextColorHex = label.Color?.TextColor, + BackgroundColorHex = label.Color?.BackgroundColor, + FolderName = isAllCapital ? char.ToUpper(label.Name[0]) + label.Name.Substring(1).ToLower() : label.Name, // Capitilize only first letter. + RemoteFolderId = label.Id, + Id = Guid.NewGuid(), + MailAccountId = accountId, + IsSynchronizationEnabled = true, + SpecialFolderType = specialFolderType, + IsSystemFolder = label.Type == SYSTEM_FOLDER_IDENTIFIER, + IsSticky = isSpecialFolder && specialFolderType != SpecialFolderType.Category && !unchangedFolderName.StartsWith("CATEGORY"), + IsHidden = label.LabelListVisibility == FOLDER_HIDE_IDENTIFIER, + + // By default, all special folders update unread count in the UI except Trash. + ShowUnreadCount = specialFolderType != SpecialFolderType.Deleted || specialFolderType != SpecialFolderType.Other + }; + } + + public static bool GetIsDraft(this Message message) + => message?.LabelIds?.Any(a => a == DRAFT_LABEL_ID) ?? false; + + public static bool GetIsUnread(this Message message) + => message?.LabelIds?.Any(a => a == UNREAD_LABEL_ID) ?? false; + + public static bool GetIsFocused(this Message message) + => message?.LabelIds?.Any(a => a == IMPORTANT_LABEL_ID) ?? false; + + public static bool GetIsFlagged(this Message message) + => message?.LabelIds?.Any(a => a == STARRED_LABEL_ID) ?? false; + + /// + /// Returns MailCopy out of native Gmail message and converted MimeMessage of that native messaage. + /// + /// Gmail Message + /// MimeMessage representation of that native message. + /// MailCopy object that is ready to be inserted to database. + public static MailCopy AsMailCopy(this Message gmailMessage, MimeMessage mimeMessage) + { + bool isUnread = gmailMessage.GetIsUnread(); + bool isFocused = gmailMessage.GetIsFocused(); + bool isFlagged = gmailMessage.GetIsFlagged(); + bool isDraft = gmailMessage.GetIsDraft(); + + return new MailCopy() + { + CreationDate = mimeMessage.Date.UtcDateTime, + Subject = HttpUtility.HtmlDecode(mimeMessage.Subject), + FromName = MailkitClientExtensions.GetActualSenderName(mimeMessage), + FromAddress = MailkitClientExtensions.GetActualSenderAddress(mimeMessage), + PreviewText = HttpUtility.HtmlDecode(gmailMessage.Snippet), + ThreadId = gmailMessage.ThreadId, + Importance = (MailImportance)mimeMessage.Importance, + Id = gmailMessage.Id, + IsDraft = isDraft, + HasAttachments = mimeMessage.Attachments.Any(), + IsRead = !isUnread, + IsFlagged = isFlagged, + IsFocused = isFocused, + InReplyTo = mimeMessage.InReplyTo, + MessageId = mimeMessage.MessageId, + References = mimeMessage.References.GetReferences(), + FileId = Guid.NewGuid() + }; + } + + public static Tuple> GetMailDetails(this Message message) + { + MimeMessage mimeMessage = message.GetGmailMimeMessage(); + + if (mimeMessage == null) + { + // This should never happen. + Debugger.Break(); + + return default; + } + + bool isUnread = message.GetIsUnread(); + bool isFocused = message.GetIsFocused(); + bool isFlagged = message.GetIsFlagged(); + bool isDraft = message.GetIsDraft(); + + var mailCopy = new MailCopy() + { + CreationDate = mimeMessage.Date.UtcDateTime, + Subject = HttpUtility.HtmlDecode(mimeMessage.Subject), + FromName = MailkitClientExtensions.GetActualSenderName(mimeMessage), + FromAddress = MailkitClientExtensions.GetActualSenderAddress(mimeMessage), + PreviewText = HttpUtility.HtmlDecode(message.Snippet), + ThreadId = message.ThreadId, + Importance = (MailImportance)mimeMessage.Importance, + Id = message.Id, + IsDraft = isDraft, + HasAttachments = mimeMessage.Attachments.Any(), + IsRead = !isUnread, + IsFlagged = isFlagged, + IsFocused = isFocused, + InReplyTo = mimeMessage.InReplyTo, + MessageId = mimeMessage.MessageId, + References = mimeMessage.References.GetReferences() + }; + + return new Tuple>(mailCopy, mimeMessage, message.LabelIds); + } + + } +} diff --git a/Wino.Core/Extensions/HtmlAgilityPackExtensions.cs b/Wino.Core/Extensions/HtmlAgilityPackExtensions.cs new file mode 100644 index 00000000..1c1cc61f --- /dev/null +++ b/Wino.Core/Extensions/HtmlAgilityPackExtensions.cs @@ -0,0 +1,121 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using HtmlAgilityPack; + +namespace Wino.Core.Extensions +{ + public static class HtmlAgilityPackExtensions + { + /// + /// Clears out the src attribute for all `img` and `v:fill` tags. + /// + /// + public static void ClearImages(this HtmlDocument document) + { + if (document.DocumentNode.InnerHtml.Contains(" + /// Removes `style` tags from the document. + /// + /// + public static void ClearStyles(this HtmlDocument document) + { + document.DocumentNode + .Descendants() + .Where(n => n.Name.Equals("script", StringComparison.OrdinalIgnoreCase) + || n.Name.Equals("style", StringComparison.OrdinalIgnoreCase) + || n.Name.Equals("#comment", StringComparison.OrdinalIgnoreCase)) + .ToList() + .ForEach(n => n.Remove()); + } + + /// + /// Returns plain text from the HTML content. + /// + /// Content to get preview from. + /// Text body for the html. + public static string GetPreviewText(string htmlContent) + { + if (string.IsNullOrEmpty(htmlContent)) return string.Empty; + + HtmlDocument doc = new HtmlDocument(); + doc.LoadHtml(htmlContent); + + StringWriter sw = new StringWriter(); + ConvertTo(doc.DocumentNode, sw); + sw.Flush(); + + return sw.ToString().Replace(Environment.NewLine, ""); + } + + private static void ConvertContentTo(HtmlNode node, TextWriter outText) + { + foreach (HtmlNode subnode in node.ChildNodes) + { + ConvertTo(subnode, outText); + } + } + + private static void ConvertTo(HtmlNode node, TextWriter outText) + { + string html; + switch (node.NodeType) + { + case HtmlNodeType.Comment: + // don't output comments + break; + + case HtmlNodeType.Document: + ConvertContentTo(node, outText); + break; + + case HtmlNodeType.Text: + // script and style must not be output + string parentName = node.ParentNode.Name; + if ((parentName == "script") || (parentName == "style")) + break; + + // get text + html = ((HtmlTextNode)node).Text; + + // is it in fact a special closing node output as text? + if (HtmlNode.IsOverlappedClosingElement(html)) + break; + + // check the text is meaningful and not a bunch of whitespaces + if (html.Trim().Length > 0) + { + outText.Write(HtmlEntity.DeEntitize(html)); + } + break; + + case HtmlNodeType.Element: + switch (node.Name) + { + case "p": + // treat paragraphs as crlf + outText.Write("\r\n"); + break; + case "br": + outText.Write("\r\n"); + break; + } + + if (node.HasChildNodes) + { + ConvertContentTo(node, outText); + } + break; + } + } + } +} diff --git a/Wino.Core/Extensions/ListExtensions.cs b/Wino.Core/Extensions/ListExtensions.cs new file mode 100644 index 00000000..7330c44e --- /dev/null +++ b/Wino.Core/Extensions/ListExtensions.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Extensions +{ + public static class ListExtensions + { + public static IEnumerable FlattenBy(this IEnumerable nodes, Func> selector) + { + if (nodes.Any() == false) + return nodes; + + var descendants = nodes + .SelectMany(selector) + .FlattenBy(selector); + + return nodes.Concat(descendants); + } + + public static IEnumerable CreateBatch(this IEnumerable> items) + { + IBatchChangeRequest batch = null; + + foreach (var group in items) + { + var key = group.Key; + } + + yield return batch; + } + + public static void AddSorted(this List @this, T item) where T : IComparable + { + if (@this.Count == 0) + { + @this.Add(item); + return; + } + if (@this[@this.Count - 1].CompareTo(item) <= 0) + { + @this.Add(item); + return; + } + if (@this[0].CompareTo(item) >= 0) + { + @this.Insert(0, item); + return; + } + int index = @this.BinarySearch(item); + if (index < 0) + index = ~index; + @this.Insert(index, item); + } + } +} diff --git a/Wino.Core/Extensions/LongExtensions.cs b/Wino.Core/Extensions/LongExtensions.cs new file mode 100644 index 00000000..2fa1198f --- /dev/null +++ b/Wino.Core/Extensions/LongExtensions.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Wino.Core.Extensions +{ + public static class LongExtensions + { + // Returns the human-readable file size for an arbitrary, 64-bit file size + // The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB" + public static string GetBytesReadable(this long i) + { + // Get absolute value + long absolute_i = (i < 0 ? -i : i); + // Determine the suffix and readable value + string suffix; + double readable; + if (absolute_i >= 0x1000000000000000) // Exabyte + { + suffix = "EB"; + readable = (i >> 50); + } + else if (absolute_i >= 0x4000000000000) // Petabyte + { + suffix = "PB"; + readable = (i >> 40); + } + else if (absolute_i >= 0x10000000000) // Terabyte + { + suffix = "TB"; + readable = (i >> 30); + } + else if (absolute_i >= 0x40000000) // Gigabyte + { + suffix = "GB"; + readable = (i >> 20); + } + else if (absolute_i >= 0x100000) // Megabyte + { + suffix = "MB"; + readable = (i >> 10); + } + else if (absolute_i >= 0x400) // Kilobyte + { + suffix = "KB"; + readable = i; + } + else + { + return i.ToString("0 B"); // Byte + } + // Divide by 1024 to get fractional value + readable = (readable / 1024); + // Return formatted number with suffix + return readable.ToString("0.# ") + suffix; + } + } +} diff --git a/Wino.Core/Extensions/MailkitClientExtensions.cs b/Wino.Core/Extensions/MailkitClientExtensions.cs new file mode 100644 index 00000000..1fb1fb58 --- /dev/null +++ b/Wino.Core/Extensions/MailkitClientExtensions.cs @@ -0,0 +1,187 @@ +using System; +using System.Linq; +using MailKit; +using MimeKit; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Extensions +{ + public static class MailkitClientExtensions + { + public static char MailCopyUidSeparator = '_'; + + public static uint ResolveUid(string mailCopyId) + { + var splitted = mailCopyId.Split(MailCopyUidSeparator); + + if (splitted.Length > 1 && uint.TryParse(splitted[1], out uint parsedUint)) return parsedUint; + + throw new ArgumentOutOfRangeException(nameof(mailCopyId), mailCopyId, "Invalid mailCopyId format."); + } + + public static string CreateUid(Guid folderId, uint messageUid) + => $"{folderId}{MailCopyUidSeparator}{messageUid}"; + + public static MailImportance GetImportance(this MimeMessage messageSummary) + { + if (messageSummary.Headers != null && messageSummary.Headers.Contains(HeaderId.Importance)) + { + var rawImportance = messageSummary.Headers[HeaderId.Importance]; + + return rawImportance switch + { + "Low" => MailImportance.Low, + "High" => MailImportance.High, + _ => MailImportance.Normal, + }; + } + + return MailImportance.Normal; + } + + public static bool GetIsRead(this MessageFlags? flags) + => flags.GetValueOrDefault().HasFlag(MessageFlags.Seen); + + public static bool GetIsFlagged(this MessageFlags? flags) + => flags.GetValueOrDefault().HasFlag(MessageFlags.Flagged); + + public static string GetThreadId(this IMessageSummary messageSummary) + { + // First check whether we have the default values. + + if (!string.IsNullOrEmpty(messageSummary.ThreadId)) + return messageSummary.ThreadId; + + if (messageSummary.GMailThreadId != null) + return messageSummary.GMailThreadId.ToString(); + + return default; + } + + public static string GetMessageId(this MimeMessage mimeMessage) + => mimeMessage.MessageId; + + public static string GetReferences(this MessageIdList messageIdList) + => string.Join(";", messageIdList); + + public static string GetInReplyTo(this MimeMessage mimeMessage) + { + if (mimeMessage.Headers.Contains(HeaderId.InReplyTo)) + { + // Normalize if <> brackets are there. + var inReplyTo = mimeMessage.Headers[HeaderId.InReplyTo]; + + if (inReplyTo.StartsWith("<") && inReplyTo.EndsWith(">")) + return inReplyTo.Substring(1, inReplyTo.Length - 2); + + return inReplyTo; + } + + return string.Empty; + } + + private static string GetPreviewText(this MimeMessage message) + { + if (string.IsNullOrEmpty(message.HtmlBody)) + return message.TextBody; + else + return HtmlAgilityPackExtensions.GetPreviewText(message.HtmlBody); + } + + public static MailCopy GetMailDetails(this IMessageSummary messageSummary, MailItemFolder folder, MimeMessage mime) + { + // MessageSummary will only have UniqueId, Flags, ThreadId. + // Other properties are extracted directly from the MimeMessage. + + // IMAP doesn't have unique id for mails. + // All mails are mapped to specific folders with incremental Id. + // Uid 1 may belong to different messages in different folders, but can never be + // same for different messages in same folders. + // Here we create arbitrary Id that maps the Id of the message with Folder UniqueId. + // When folder becomes invalid, we'll clear out these MailCopies as well. + + var messageUid = CreateUid(folder.Id, messageSummary.UniqueId.Id); + var previewText = mime.GetPreviewText(); + + var copy = new MailCopy() + { + Id = messageUid, + CreationDate = mime.Date.UtcDateTime, + ThreadId = messageSummary.GetThreadId(), + MessageId = mime.GetMessageId(), + Subject = mime.Subject, + IsRead = messageSummary.Flags.GetIsRead(), + IsFlagged = messageSummary.Flags.GetIsFlagged(), + PreviewText = previewText, + FromAddress = GetActualSenderAddress(mime), + FromName = GetActualSenderName(mime), + IsFocused = false, + Importance = mime.GetImportance(), + References = mime.References?.GetReferences(), + InReplyTo = mime.GetInReplyTo(), + HasAttachments = mime.Attachments.Any(), + FileId = Guid.NewGuid() + }; + + return copy; + } + + // TODO: Name and Address parsing should be handled better. + // At some point Wino needs better contact management. + + public static string GetActualSenderName(MimeMessage message) + { + if (message == null) + return string.Empty; + + // From MimeKit + + // The "From" header specifies the author(s) of the message. + // If more than one MimeKit.MailboxAddress is added to the list of "From" addresses, + // the MimeKit.MimeMessage.Sender should be set to the single MimeKit.MailboxAddress + // of the personal actually sending the message. + + // Also handle: https://stackoverflow.com/questions/46474030/mailkit-from-address + + if (message.Sender != null) + return string.IsNullOrEmpty(message.Sender.Name) ? message.Sender.Address : message.Sender.Name; + else if (message.From?.Mailboxes != null) + { + var firstAvailableName = message.From.Mailboxes.FirstOrDefault(a => !string.IsNullOrEmpty(a.Name))?.Name; + + if (string.IsNullOrEmpty(firstAvailableName)) + { + var firstAvailableAddress = message.From.Mailboxes.FirstOrDefault(a => !string.IsNullOrEmpty(a.Address))?.Address; + + if (!string.IsNullOrEmpty(firstAvailableAddress)) + { + return firstAvailableAddress; + } + } + + return firstAvailableName; + } + + // No sender, no from, I don't know what to do. + return Translator.UnknownSender; + } + + // TODO: This is wrong. + public static string GetActualSenderAddress(MimeMessage mime) + { + if (mime == null) + return string.Empty; + + bool hasSingleFromMailbox = mime.From.Mailboxes.Count() == 1; + + if (hasSingleFromMailbox) + return mime.From.Mailboxes.First().GetAddress(idnEncode: true); + else if (mime.Sender != null) + return mime.Sender.GetAddress(idnEncode: true); + else + return Translator.UnknownSender; + } + } +} diff --git a/Wino.Core/Extensions/MailkitExtensions.cs b/Wino.Core/Extensions/MailkitExtensions.cs new file mode 100644 index 00000000..c2b1c91e --- /dev/null +++ b/Wino.Core/Extensions/MailkitExtensions.cs @@ -0,0 +1,22 @@ +using System; +using MailKit; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Extensions +{ + public static class MailkitExtensions + { + public static MailItemFolder GetLocalFolder(this IMailFolder mailkitMailFolder) + { + return new MailItemFolder() + { + Id = Guid.NewGuid(), + FolderName = mailkitMailFolder.Name, + RemoteFolderId = mailkitMailFolder.FullName, + ParentRemoteFolderId = mailkitMailFolder.ParentFolder?.FullName, + SpecialFolderType = Domain.Enums.SpecialFolderType.Other, + IsSynchronizationEnabled = true + }; + } + } +} diff --git a/Wino.Core/Extensions/MimeExtensions.cs b/Wino.Core/Extensions/MimeExtensions.cs new file mode 100644 index 00000000..624645d1 --- /dev/null +++ b/Wino.Core/Extensions/MimeExtensions.cs @@ -0,0 +1,52 @@ +using System.IO; +using System.Text; +using Google.Apis.Gmail.v1.Data; +using MimeKit; +using MimeKit.IO; +using MimeKit.IO.Filters; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Extensions +{ + public static class MimeExtensions + { + /// + /// Returns MimeKit.MimeMessage instance for this GMail Message's Raw content. + /// + /// GMail message. + public static MimeMessage GetGmailMimeMessage(this Message message) + { + if (message == null || message.Raw == null) + return null; + + // Gmail raw is not base64 but base64Safe. We need to remove this HTML things. + var base64Encoded = message.Raw.Replace(",", "=").Replace("-", "+").Replace("_", "/"); + + byte[] bytes = Encoding.ASCII.GetBytes(base64Encoded); + + var stream = new MemoryStream(bytes); + + // This method will dispose outer stream. + + using (stream) + { + using var filtered = new FilteredStream(stream); + filtered.Add(DecoderFilter.Create(ContentEncoding.Base64)); + + return MimeMessage.Load(filtered); + } + } + + public static AddressInformation ToAddressInformation(this MailboxAddress address) + { + if (address == null) + return new AddressInformation() { Name = Translator.UnknownSender, Address = Translator.UnknownAddress }; + + if (string.IsNullOrEmpty(address.Name)) + address.Name = address.Address; + + return new AddressInformation() { Name = address.Name, Address = address.Address }; + } + } +} diff --git a/Wino.Core/Extensions/OutlookIntegratorExtensions.cs b/Wino.Core/Extensions/OutlookIntegratorExtensions.cs new file mode 100644 index 00000000..2d542849 --- /dev/null +++ b/Wino.Core/Extensions/OutlookIntegratorExtensions.cs @@ -0,0 +1,65 @@ +using System; +using Microsoft.Graph.Models; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Extensions +{ + public static class OutlookIntegratorExtensions + { + public static MailItemFolder GetLocalFolder(this MailFolder nativeFolder, Guid accountId) + { + return new MailItemFolder() + { + Id = Guid.NewGuid(), + FolderName = nativeFolder.DisplayName, + RemoteFolderId = nativeFolder.Id, + ParentRemoteFolderId = nativeFolder.ParentFolderId, + IsSynchronizationEnabled = true, + MailAccountId = accountId, + IsHidden = nativeFolder.IsHidden.GetValueOrDefault() + }; + } + + public static bool GetIsDraft(this Message message) + => message != null && message.IsDraft.GetValueOrDefault(); + + public static bool GetIsRead(this Message message) + => message != null && message.IsRead.GetValueOrDefault(); + + public static bool GetIsFocused(this Message message) + => message?.InferenceClassification != null && message.InferenceClassification.Value == InferenceClassificationType.Focused; + + public static bool GetIsFlagged(this Message message) + => message?.Flag?.FlagStatus != null && message.Flag.FlagStatus == FollowupFlagStatus.Flagged; + + public static MailCopy AsMailCopy(this Message outlookMessage) + { + bool isDraft = GetIsDraft(outlookMessage); + + var mailCopy = new MailCopy() + { + MessageId = outlookMessage.InternetMessageId, + IsFlagged = GetIsFlagged(outlookMessage), + IsFocused = GetIsFocused(outlookMessage), + Importance = !outlookMessage.Importance.HasValue ? MailImportance.Normal : (MailImportance)outlookMessage.Importance.Value, + IsRead = GetIsRead(outlookMessage), + IsDraft = isDraft, + CreationDate = outlookMessage.ReceivedDateTime.GetValueOrDefault().DateTime, + HasAttachments = outlookMessage.HasAttachments.GetValueOrDefault(), + PreviewText = outlookMessage.BodyPreview, + Id = outlookMessage.Id, + ThreadId = outlookMessage.ConversationId, + FromName = outlookMessage.From?.EmailAddress?.Name, + FromAddress = outlookMessage.From?.EmailAddress?.Address, + Subject = outlookMessage.Subject, + FileId = Guid.NewGuid() + }; + + if (mailCopy.IsDraft) + mailCopy.DraftId = mailCopy.ThreadId; + + return mailCopy; + } + } +} diff --git a/Wino.Core/Extensions/SqlKataExtensions.cs b/Wino.Core/Extensions/SqlKataExtensions.cs new file mode 100644 index 00000000..a974d013 --- /dev/null +++ b/Wino.Core/Extensions/SqlKataExtensions.cs @@ -0,0 +1,15 @@ +using SqlKata; +using SqlKata.Compilers; + +namespace Wino.Core.Extensions +{ + public static class SqlKataExtensions + { + private static SqliteCompiler Compiler = new SqliteCompiler(); + + public static string GetRawQuery(this Query query) + { + return Compiler.Compile(query).ToString(); + } + } +} diff --git a/Wino.Core/Extensions/StringExtensions.cs b/Wino.Core/Extensions/StringExtensions.cs new file mode 100644 index 00000000..499e67a6 --- /dev/null +++ b/Wino.Core/Extensions/StringExtensions.cs @@ -0,0 +1,22 @@ +using System; + +namespace Wino.Core.Extensions +{ + public static class StringExtensions + { + public static bool Contains(this string source, string toCheck, StringComparison comp) + { + return source?.IndexOf(toCheck, comp) >= 0; + } + + public static string ReplaceFirst(this string text, string search, string replace) + { + int pos = text.IndexOf(search); + if (pos < 0) + { + return text; + } + return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); + } + } +} diff --git a/Wino.Core/Extensions/TokenizationExtensions.cs b/Wino.Core/Extensions/TokenizationExtensions.cs new file mode 100644 index 00000000..3ffefb57 --- /dev/null +++ b/Wino.Core/Extensions/TokenizationExtensions.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.Identity.Client; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Extensions +{ + public static class TokenizationExtensions + { + public static TokenInformation CreateTokenInformation(this AuthenticationResult clientBuilderResult) + { + var expirationDate = clientBuilderResult.ExpiresOn.UtcDateTime; + var accesToken = clientBuilderResult.AccessToken; + var userName = clientBuilderResult.Account.Username; + + // MSAL does not expose refresh token for security reasons. + // This token info will be created without refresh token. + // but OutlookIntegrator will ask for publicApplication to refresh it + // in case of expiration. + + var tokenInfo = new TokenInformation() + { + ExpiresAt = expirationDate, + AccessToken = accesToken, + Address = userName, + Id = Guid.NewGuid(), + }; + + return tokenInfo; + } + } +} diff --git a/Wino.Core/GlobalSuppressions.cs b/Wino.Core/GlobalSuppressions.cs new file mode 100644 index 00000000..c217dec0 --- /dev/null +++ b/Wino.Core/GlobalSuppressions.cs @@ -0,0 +1,10 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~P:Wino.Core.Models.IMailDisplayInformation.asd")] +[assembly: SuppressMessage("Minor Code Smell", "S3267:Loops should be simplified with \"LINQ\" expressions", Justification = "", Scope = "member", Target = "~M:Wino.Core.Services.WinoRequestProcessor.PrepareRequestsAsync(Wino.Core.Domain.Enums.MailOperation,System.Collections.Generic.IEnumerable{System.String})~System.Threading.Tasks.Task{System.Collections.Generic.List{Wino.Core.Abstractions.Interfaces.Data.IWinoChangeRequest}}")] +[assembly: SuppressMessage("Minor Code Smell", "S3267:Loops should be simplified with \"LINQ\" expressions", Justification = "", Scope = "member", Target = "~M:Wino.Core.Services.SynchronizationWorker.QueueAsync(System.Collections.Generic.IEnumerable{Wino.Core.Abstractions.Interfaces.Data.IWinoChangeRequest})")] diff --git a/Wino.Core/Http/GmailClientMessageHandler.cs b/Wino.Core/Http/GmailClientMessageHandler.cs new file mode 100644 index 00000000..c1b6a77a --- /dev/null +++ b/Wino.Core/Http/GmailClientMessageHandler.cs @@ -0,0 +1,29 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Google.Apis.Http; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Http +{ + internal class GmailClientMessageHandler : ConfigurableMessageHandler + { + public Func> TokenRetrieveDelegate { get; } + + public GmailClientMessageHandler(Func> tokenRetrieveDelegate) : base(new HttpClientHandler()) + { + TokenRetrieveDelegate = tokenRetrieveDelegate; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var tokenizationTask = TokenRetrieveDelegate.Invoke(); + var tokenInformation = await tokenizationTask; + + request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenInformation.AccessToken); + + return await base.SendAsync(request, cancellationToken); + } + } +} diff --git a/Wino.Core/Http/MicrosoftImmutableIdHandler.cs b/Wino.Core/Http/MicrosoftImmutableIdHandler.cs new file mode 100644 index 00000000..d839d76b --- /dev/null +++ b/Wino.Core/Http/MicrosoftImmutableIdHandler.cs @@ -0,0 +1,19 @@ +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace Wino.Core.Http +{ + /// + /// Adds additional Prefer header for immutable id support in the Graph service client. + /// + public class MicrosoftImmutableIdHandler : DelegatingHandler + { + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + request.Headers.TryAddWithoutValidation("Prefer", "IdType=\"ImmutableId\""); + + return base.SendAsync(request, cancellationToken); + } + } +} diff --git a/Wino.Core/Http/MicrosoftJsonContractResolver.cs b/Wino.Core/Http/MicrosoftJsonContractResolver.cs new file mode 100644 index 00000000..79148cbe --- /dev/null +++ b/Wino.Core/Http/MicrosoftJsonContractResolver.cs @@ -0,0 +1,36 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace Wino.Core.Http +{ + + /// + /// We need to generate HttpRequestMessage for batch requests, and sometimes we need to + /// serialize content as json. However, some of the fields like 'ODataType' must be ignored + /// in order PATCH requests to succeed. Therefore Microsoft account synchronizer uses + /// special JsonSerializerSettings for ignoring some of the properties. + /// + public class MicrosoftJsonContractResolver : DefaultContractResolver + { + private readonly HashSet ignoreProps = new HashSet() + { + "ODataType" + }; + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + + if (ignoreProps.Contains(property.PropertyName)) + { + property.ShouldSerialize = _ => false; + } + + return property; + } + } +} diff --git a/Wino.Core/Http/MicrosoftTokenProvider.cs b/Wino.Core/Http/MicrosoftTokenProvider.cs new file mode 100644 index 00000000..606d35ae --- /dev/null +++ b/Wino.Core/Http/MicrosoftTokenProvider.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Kiota.Abstractions.Authentication; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Http +{ + public class MicrosoftTokenProvider : IAccessTokenProvider + { + private readonly MailAccount _account; + private readonly IAuthenticator _authenticator; + + public MicrosoftTokenProvider(MailAccount account, IAuthenticator authenticator) + { + _account = account; + _authenticator = authenticator; + } + + public AllowedHostsValidator AllowedHostsValidator { get; } + + public async Task GetAuthorizationTokenAsync(Uri uri, + Dictionary additionalAuthenticationContext = null, + CancellationToken cancellationToken = default) + { + var token = await _authenticator.GetTokenAsync(_account).ConfigureAwait(false); + + return token?.AccessToken; + } + } +} diff --git a/Wino.Core/Integration/BaseMailIntegrator.cs b/Wino.Core/Integration/BaseMailIntegrator.cs new file mode 100644 index 00000000..a4bda8ea --- /dev/null +++ b/Wino.Core/Integration/BaseMailIntegrator.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MailKit.Net.Imap; +using MoreLinq; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; +using Wino.Core.Requests.Bundles; + +namespace Wino.Core.Integration +{ + public abstract class BaseMailIntegrator + { + /// + /// How many items per single HTTP call can be modified. + /// + public abstract uint BatchModificationSize { get; } + + /// + /// How many items must be downloaded per folder when the folder is first synchronized. + /// + public abstract uint InitialMessageDownloadCountPerFolder { get; } + + /// + /// Creates a batched HttpBundle without a response for a collection of MailItem. + /// + /// Generated batch request. + /// An action to get the native request from the MailItem. + /// Collection of http bundle that contains batch and native request. + public IEnumerable> CreateBatchedHttpBundleFromGroup( + IBatchChangeRequest batchChangeRequest, + Func, TNativeRequestType> action) + { + if (batchChangeRequest.Items == null) yield break; + + var groupedItems = batchChangeRequest.Items.Batch((int)BatchModificationSize); + + foreach (var group in groupedItems) + yield return new HttpRequestBundle(action(group), batchChangeRequest); + } + + public IEnumerable> CreateBatchedHttpBundle( + IBatchChangeRequest batchChangeRequest, + Func action) + { + if (batchChangeRequest.Items == null) yield break; + + var groupedItems = batchChangeRequest.Items.Batch((int)BatchModificationSize); + + foreach (var group in groupedItems) + foreach (var item in group) + yield return new HttpRequestBundle(action(item), item); + + yield break; + } + + /// + /// Creates a single HttpBundle without a response for a collection of MailItem. + /// + /// Batch request + /// An action to get the native request from the MailItem + /// Collection of http bundle that contains batch and native request. + public IEnumerable> CreateHttpBundle( + IBatchChangeRequest batchChangeRequest, + Func action) + { + if (batchChangeRequest.Items == null) yield break; + + foreach (var item in batchChangeRequest.Items) + yield return new HttpRequestBundle(action(item), batchChangeRequest); + } + + public IEnumerable> CreateHttpBundle( + IBatchChangeRequest batchChangeRequest, + Func action) + { + if (batchChangeRequest.Items == null) yield break; + + foreach (var item in batchChangeRequest.Items) + yield return new HttpRequestBundle(action(item), item); + } + + /// + /// Creates HttpBundle with TResponse of expected response type from the http call for each of the items in the batch. + /// + /// Expected http response type after the call. + /// Generated batch request. + /// An action to get the native request from the MailItem. + /// Collection of http bundle that contains batch and native request. + public IEnumerable> CreateHttpBundleWithResponse( + IBatchChangeRequest batchChangeRequest, + Func action) + { + if (batchChangeRequest.Items == null) yield break; + + foreach (var item in batchChangeRequest.Items) + yield return new HttpRequestBundle(action(item), batchChangeRequest); + } + + /// + /// Creates a batched HttpBundle with TResponse of expected response type from the http call for each of the items in the batch. + /// Func will be executed for each item separately in the batch request. + /// + /// Expected http response type after the call. + /// Generated batch request. + /// An action to get the native request from the MailItem. + /// Collection of http bundle that contains batch and native request. + public IEnumerable> CreateBatchedHttpBundle( + IBatchChangeRequest batchChangeRequest, + Func action) + { + if (batchChangeRequest.Items == null) yield break; + + var groupedItems = batchChangeRequest.Items.Batch((int)BatchModificationSize); + + foreach (var group in groupedItems) + foreach (var item in group) + yield return new HttpRequestBundle(action(item), item); + + yield break; + } + + public IEnumerable> CreateTaskBundle(Func value, IRequestBase request) + { + var imapreq = new ImapRequest(value, request); + + return [new ImapRequestBundle(imapreq, request)]; + } + } +} diff --git a/Wino.Core/Integration/ImapClientPool.cs b/Wino.Core/Integration/ImapClientPool.cs new file mode 100644 index 00000000..8746b218 --- /dev/null +++ b/Wino.Core/Integration/ImapClientPool.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using MailKit.Net.Imap; +using MailKit.Net.Proxy; +using MailKit.Security; +using Serilog; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; + +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 + { + // Hardcoded implementation details for ID extension if the server supports. + // Some providers like Chinese 126 require Id to be sent before authentication. + // We don't expose any customer data here. Therefore it's safe for now. + // Later on maybe we can make it configurable and leave it to the user with passing + // real implementation details. + + private readonly ImapImplementation _implementation = new ImapImplementation() + { + Version = "1.0", + OS = "Windows", + Vendor = "Wino" + }; + + private const int MaxPoolSize = 5; + + private readonly ConcurrentBag _clients = []; + private readonly SemaphoreSlim _semaphore = new(MaxPoolSize); + private readonly CustomServerInformation _customServerInformation; + private readonly ILogger _logger = Log.ForContext(); + + public ImapClientPool(CustomServerInformation customServerInformation) + { + _customServerInformation = customServerInformation; + } + + private async Task EnsureConnectivityAsync(ImapClient client, bool isCreatedNew) + { + try + { + await EnsureConnectedAsync(client); + + if (isCreatedNew && client.IsConnected) + { + // Activate supported pre-auth capabilities. + if (client.Capabilities.HasFlag(ImapCapabilities.Compress)) + await client.CompressAsync(); + + // Identify if the server supports ID extension. + if (client.Capabilities.HasFlag(ImapCapabilities.Id)) + await client.IdentifyAsync(_implementation); + } + + await EnsureAuthenticatedAsync(client); + + if (isCreatedNew && client.IsAuthenticated) + { + // Activate post-auth capabilities. + if (client.Capabilities.HasFlag(ImapCapabilities.QuickResync)) + await client.EnableQuickResyncAsync(); + } + } + catch (Exception ex) + { + throw new ImapClientPoolException(ex); + } + finally + { + // Release it even if it fails. + _semaphore.Release(); + } + } + + public async Task GetClientAsync() + { + await _semaphore.WaitAsync(); + + if (_clients.TryTake(out ImapClient item)) + { + await EnsureConnectivityAsync(item, false); + + return item; + } + + var client = CreateNewClient(); + + await EnsureConnectivityAsync(client, true); + + return client; + } + + public void Release(ImapClient item) + { + if (item != null) + { + _clients.Add(item); + _semaphore.Release(); + } + } + + public ImapClient CreateNewClient() + { + var client = new ImapClient(); + + HttpProxyClient proxyClient = null; + + // Add proxy client if exists. + if (!string.IsNullOrEmpty(_customServerInformation.ProxyServer)) + { + proxyClient = new HttpProxyClient(_customServerInformation.ProxyServer, int.Parse(_customServerInformation.ProxyServerPort)); + } + + client.ProxyClient = proxyClient; + + _logger.Debug("Created new ImapClient. Current clients: {Count}", _clients.Count); + + return client; + } + + private SecureSocketOptions GetSocketOptions(ImapConnectionSecurity connectionSecurity) + => connectionSecurity switch + { + ImapConnectionSecurity.Auto => SecureSocketOptions.Auto, + ImapConnectionSecurity.None => SecureSocketOptions.None, + ImapConnectionSecurity.StartTls => SecureSocketOptions.StartTlsWhenAvailable, + ImapConnectionSecurity.SslTls => SecureSocketOptions.SslOnConnect, + _ => SecureSocketOptions.None + }; + + public async Task EnsureConnectedAsync(ImapClient client) + { + if (client.IsConnected) return; + + await client.ConnectAsync(_customServerInformation.IncomingServer, + int.Parse(_customServerInformation.IncomingServerPort), + GetSocketOptions(_customServerInformation.IncomingServerSocketOption)); + } + + public async Task EnsureAuthenticatedAsync(ImapClient client) + { + if (client.IsAuthenticated) return; + + switch (_customServerInformation.IncomingAuthenticationMethod) + { + case ImapAuthenticationMethod.Auto: + break; + case ImapAuthenticationMethod.None: + break; + case ImapAuthenticationMethod.NormalPassword: + break; + case ImapAuthenticationMethod.EncryptedPassword: + break; + case ImapAuthenticationMethod.Ntlm: + break; + case ImapAuthenticationMethod.CramMd5: + break; + case ImapAuthenticationMethod.DigestMd5: + break; + default: + break; + } + + await client.AuthenticateAsync(_customServerInformation.IncomingServerUsername, _customServerInformation.IncomingServerPassword); + } + } +} diff --git a/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs b/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs new file mode 100644 index 00000000..ecf10231 --- /dev/null +++ b/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MimeKit; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Services; + +namespace Wino.Core.Integration.Processors +{ + /// + /// Database change processor that handles common operations for all synchronizers. + /// When a synchronizer detects a change, it should call the appropriate method in this class to reflect the change in the database. + /// Different synchronizers might need additional implementations. + /// and + /// None of the synchronizers can directly change anything in the database. + /// + public interface IDefaultChangeProcessor + { + Task UpdateAccountDeltaSynchronizationIdentifierAsync(Guid accountId, string deltaSynchronizationIdentifier); + Task UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string deltaSynchronizationIdentifier); + + Task CreateAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId); + Task DeleteAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId); + + Task ChangeMailReadStatusAsync(string mailCopyId, bool isRead); + Task ChangeFlagStatusAsync(string mailCopyId, bool isFlagged); + + Task CreateMailAsync(Guid AccountId, NewMailItemPackage package); + Task DeleteMailAsync(Guid accountId, string mailId); + + Task MapLocalDraftAsync(Guid accountId, Guid localDraftCopyUniqueId, string newMailCopyId, string newDraftId, string newThreadId); + Task MapLocalDraftAsync(string mailCopyId, string newDraftId, string newThreadId); + + Task> GetDownloadedUnreadMailsAsync(Guid accountId, IEnumerable downloadedMailCopyIds); + + Task SaveMimeFileAsync(Guid fileId, MimeMessage mimeMessage, Guid accountId); + + // For gmail. + Task UpdateFolderStructureAsync(Guid accountId, List allFolders); + + Task DeleteFolderAsync(Guid accountId, string remoteFolderId); + Task> GetSynchronizationFoldersAsync(SynchronizationOptions options); + Task InsertFolderAsync(MailItemFolder folder); + + Task> GetKnownUidsForFolderAsync(Guid folderId); + } + + public interface IGmailChangeProcessor : IDefaultChangeProcessor + { + + } + + public interface IOutlookChangeProcessor : IDefaultChangeProcessor + { + + } + + public class DefaultChangeProcessor(IDatabaseService databaseService, + IFolderService folderService, + IMailService mailService, + IAccountService accountService, + IMimeFileService mimeFileService) : BaseDatabaseService(databaseService), IDefaultChangeProcessor + { + private readonly IFolderService _folderService = folderService; + private readonly IMailService _mailService = mailService; + private readonly IAccountService _accountService = accountService; + private readonly IMimeFileService _mimeFileService = mimeFileService; + + public Task UpdateAccountDeltaSynchronizationIdentifierAsync(Guid accountId, string synchronizationDeltaIdentifier) + => _accountService.UpdateSynchronizationIdentifierAsync(accountId, synchronizationDeltaIdentifier); + + public Task ChangeFlagStatusAsync(string mailCopyId, bool isFlagged) + => _mailService.ChangeFlagStatusAsync(mailCopyId, isFlagged); + + public Task ChangeMailReadStatusAsync(string mailCopyId, bool isRead) + => _mailService.ChangeReadStatusAsync(mailCopyId, isRead); + + public Task DeleteAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId) + => _mailService.DeleteAssignmentAsync(accountId, mailCopyId, remoteFolderId); + + public Task CreateAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId) + => _mailService.CreateAssignmentAsync(accountId, mailCopyId, remoteFolderId); + + public Task DeleteMailAsync(Guid accountId, string mailId) + => _mailService.DeleteMailAsync(accountId, mailId); + + public Task CreateMailAsync(Guid accountId, NewMailItemPackage package) + => _mailService.CreateMailAsync(accountId, package); + + // Folder methods + public Task UpdateFolderStructureAsync(Guid accountId, List allFolders) + => _folderService.BulkUpdateFolderStructureAsync(accountId, allFolders); + + public Task MapLocalDraftAsync(Guid accountId, Guid localDraftCopyUniqueId, string newMailCopyId, string newDraftId, string newThreadId) + => _mailService.MapLocalDraftAsync(accountId, localDraftCopyUniqueId, newMailCopyId, newDraftId, newThreadId); + + public Task MapLocalDraftAsync(string mailCopyId, string newDraftId, string newThreadId) + => _mailService.MapLocalDraftAsync(mailCopyId, newDraftId, newThreadId); + + public Task> GetSynchronizationFoldersAsync(SynchronizationOptions options) + => _folderService.GetSynchronizationFoldersAsync(options); + + public Task UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string deltaSynchronizationIdentifier) + => _folderService.UpdateFolderDeltaSynchronizationIdentifierAsync(folderId, deltaSynchronizationIdentifier); + + public Task DeleteFolderAsync(Guid accountId, string remoteFolderId) + => _folderService.DeleteFolderAsync(accountId, remoteFolderId); + + public Task InsertFolderAsync(MailItemFolder folder) + => _folderService.InsertFolderAsync(folder); + + public Task> GetDownloadedUnreadMailsAsync(Guid accountId, IEnumerable downloadedMailCopyIds) + => _mailService.GetDownloadedUnreadMailsAsync(accountId, downloadedMailCopyIds); + + public Task> GetKnownUidsForFolderAsync(Guid folderId) + => _folderService.GetKnownUidsForFolderAsync(folderId); + + public Task SaveMimeFileAsync(Guid fileId, MimeMessage mimeMessage, Guid accountId) + => _mimeFileService.SaveMimeMessageAsync(fileId, mimeMessage, accountId); + } +} diff --git a/Wino.Core/Integration/Threading/APIThreadingStrategy.cs b/Wino.Core/Integration/Threading/APIThreadingStrategy.cs new file mode 100644 index 00000000..c1685f95 --- /dev/null +++ b/Wino.Core/Integration/Threading/APIThreadingStrategy.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Services; + +namespace Wino.Core.Integration.Threading +{ + public class APIThreadingStrategy : IThreadingStrategy + { + private readonly IDatabaseService _databaseService; + private readonly IFolderService _folderService; + + public APIThreadingStrategy(IDatabaseService databaseService, IFolderService folderService) + { + _databaseService = databaseService; + _folderService = folderService; + } + + public virtual bool ShouldThreadWithItem(IMailItem originalItem, IMailItem targetItem) + { + return originalItem.ThreadId != null && originalItem.ThreadId == targetItem.ThreadId; + } + + public async Task> ThreadItemsAsync(List items) + { + var accountId = items.First().AssignedAccount.Id; + + var threads = new List(); + var assignedAccount = items.First().AssignedAccount; + + // TODO: Can be optimized by moving to the caller. + var sentFolder = await _folderService.GetSpecialFolderByAccountIdAsync(accountId, Domain.Enums.SpecialFolderType.Sent); + var draftFolder = await _folderService.GetSpecialFolderByAccountIdAsync(accountId, Domain.Enums.SpecialFolderType.Draft); + + if (sentFolder == null || draftFolder == null) return default; + + // Child -> Parent approach. + + var potentialThreadItems = items.Distinct().Where(a => !string.IsNullOrEmpty(a.ThreadId)); + + var mailLookupTable = new Dictionary(); + + // Fill up the mail lookup table to prevent double thread creation. + foreach (var mail in items) + if (!mailLookupTable.ContainsKey(mail.Id)) + mailLookupTable.Add(mail.Id, false); + + foreach (var potentialItem in potentialThreadItems) + { + if (mailLookupTable[potentialItem.Id]) + continue; + + mailLookupTable[potentialItem.Id] = true; + + var allThreadItems = await GetThreadItemsAsync(potentialItem.ThreadId, accountId, potentialItem.AssignedFolder, sentFolder.Id, draftFolder.Id); + + if (allThreadItems.Count == 1) + { + // It's a single item. + // Mark as not-processed as thread. + + mailLookupTable[potentialItem.Id] = false; + } + else + { + // Thread item. Mark all items as true in dict. + var threadItem = new ThreadMailItem(); + + foreach (var childThreadItem in allThreadItems) + { + if (mailLookupTable.ContainsKey(childThreadItem.Id)) + mailLookupTable[childThreadItem.Id] = true; + + childThreadItem.AssignedAccount = assignedAccount; + childThreadItem.AssignedFolder = await _folderService.GetFolderAsync(childThreadItem.FolderId); + + threadItem.AddThreadItem(childThreadItem); + } + + // Multiple mail copy ids from different folders are thing for Gmail. + if (threadItem.ThreadItems.Count == 1) + mailLookupTable[potentialItem.Id] = false; + else + threads.Add(threadItem); + } + } + + // At this points all mails in the list belong to single items. + // Merge with threads. + // Last sorting will be done later on in MailService. + + // Remove single mails that are included in thread. + items.RemoveAll(a => mailLookupTable.ContainsKey(a.Id) && mailLookupTable[a.Id]); + + var finalList = new List(items); + + finalList.AddRange(threads); + + return finalList; + } + + private async Task> GetThreadItemsAsync(string threadId, + Guid accountId, + MailItemFolder threadingFolder, + Guid sentFolderId, + Guid draftFolderId) + { + // Only items from the folder that we are threading for, sent and draft folder items must be included. + // This is important because deleted items or item assignments that belongs to different folder is + // affecting the thread creation here. + + // If the threading is done from Sent or Draft folder, include everything... + + // TODO: Convert to SQLKata query. + + string query = string.Empty; + + if (threadingFolder.SpecialFolderType == SpecialFolderType.Draft || threadingFolder.SpecialFolderType == SpecialFolderType.Sent) + { + query = @$"SELECT DISTINCT MC.* FROM MailCopy MC + INNER JOIN MailItemFolder MF on MF.Id = MC.FolderId + WHERE MF.MailAccountId == '{accountId}' AND MC.ThreadId = '{threadId}'"; + } + else + { + query = @$"SELECT DISTINCT MC.* FROM MailCopy MC + INNER JOIN MailItemFolder MF on MF.Id = MC.FolderId + WHERE MF.MailAccountId == '{accountId}' AND MC.FolderId IN ('{threadingFolder.Id}','{sentFolderId}','{draftFolderId}') + AND MC.ThreadId = '{threadId}'"; + } + + + return await _databaseService.Connection.QueryAsync(query); + } + } +} diff --git a/Wino.Core/Integration/Threading/GmailThreadingStrategy.cs b/Wino.Core/Integration/Threading/GmailThreadingStrategy.cs new file mode 100644 index 00000000..5cd0ce1c --- /dev/null +++ b/Wino.Core/Integration/Threading/GmailThreadingStrategy.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Core.Integration.Threading +{ + public class GmailThreadingStrategy : APIThreadingStrategy + { + public GmailThreadingStrategy(IDatabaseService databaseService, IFolderService folderService) : base(databaseService, folderService) { } + } +} diff --git a/Wino.Core/Integration/Threading/ImapThreadStrategy.cs b/Wino.Core/Integration/Threading/ImapThreadStrategy.cs new file mode 100644 index 00000000..0a2d7da8 --- /dev/null +++ b/Wino.Core/Integration/Threading/ImapThreadStrategy.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using SqlKata; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Extensions; +using Wino.Core.Services; + +namespace Wino.Core.Integration.Threading +{ + public class ImapThreadStrategy : IThreadingStrategy + { + private readonly IDatabaseService _databaseService; + private readonly IFolderService _folderService; + + public ImapThreadStrategy(IDatabaseService databaseService, IFolderService folderService) + { + _databaseService = databaseService; + _folderService = folderService; + } + + private Task GetReplyParentAsync(IMailItem replyItem, Guid accountId, Guid threadingFolderId, Guid sentFolderId, Guid draftFolderId) + { + if (string.IsNullOrEmpty(replyItem?.MessageId)) return Task.FromResult(null); + + var query = new Query("MailCopy") + .Distinct() + .Take(1) + .Join("MailItemFolder", "MailItemFolder.Id", "MailCopy.FolderId") + .Where("MailItemFolder.MailAccountId", accountId) + .WhereIn("MailItemFolder.Id", new List { threadingFolderId, sentFolderId, draftFolderId }) + .Where("MailCopy.MessageId", replyItem.InReplyTo) + .WhereNot("MailCopy.Id", replyItem.Id) + .Select("MailCopy.*"); + + return _databaseService.Connection.FindWithQueryAsync(query.GetRawQuery()); + } + + private Task GetInReplyToReplyAsync(IMailItem originalItem, Guid accountId, Guid threadingFolderId, Guid sentFolderId, Guid draftFolderId) + { + if (string.IsNullOrEmpty(originalItem?.MessageId)) return Task.FromResult(null); + + var query = new Query("MailCopy") + .Distinct() + .Take(1) + .Join("MailItemFolder", "MailItemFolder.Id", "MailCopy.FolderId") + .WhereNot("MailCopy.Id", originalItem.Id) + .Where("MailItemFolder.MailAccountId", accountId) + .Where("MailCopy.InReplyTo", originalItem.MessageId) + .WhereIn("MailItemFolder.Id", new List { threadingFolderId, sentFolderId, draftFolderId }) + .Select("MailCopy.*"); + + var raq = query.GetRawQuery(); + + return _databaseService.Connection.FindWithQueryAsync(query.GetRawQuery()); + } + + public async Task> ThreadItemsAsync(List items) + { + var threads = new List(); + + var account = items.First().AssignedAccount; + var accountId = account.Id; + + // Child -> Parent approach. + + var mailLookupTable = new Dictionary(); + + // Fill up the mail lookup table to prevent double thread creation. + foreach (var mail in items) + if (!mailLookupTable.ContainsKey(mail.Id)) + mailLookupTable.Add(mail.Id, false); + + var sentFolder = await _folderService.GetSpecialFolderByAccountIdAsync(accountId, Domain.Enums.SpecialFolderType.Sent); + var draftFolder = await _folderService.GetSpecialFolderByAccountIdAsync(accountId, Domain.Enums.SpecialFolderType.Draft); + + if (sentFolder == null || draftFolder == null) return default; + + foreach (var replyItem in items) + { + if (mailLookupTable[replyItem.Id]) + continue; + + mailLookupTable[replyItem.Id] = true; + + var threadItem = new ThreadMailItem(); + + threadItem.AddThreadItem(replyItem); + + var replyToChild = await GetReplyParentAsync(replyItem, accountId, replyItem.AssignedFolder.Id, sentFolder.Id, draftFolder.Id); + + // Build up + while (replyToChild != null) + { + replyToChild.AssignedAccount = account; + + if (replyToChild.FolderId == draftFolder.Id) + replyToChild.AssignedFolder = draftFolder; + + if (replyToChild.FolderId == sentFolder.Id) + replyToChild.AssignedFolder = sentFolder; + + if (replyToChild.FolderId == replyItem.AssignedFolder.Id) + replyToChild.AssignedFolder = replyItem.AssignedFolder; + + threadItem.AddThreadItem(replyToChild); + + if (mailLookupTable.ContainsKey(replyToChild.Id)) + mailLookupTable[replyToChild.Id] = true; + + replyToChild = await GetReplyParentAsync(replyToChild, accountId, replyToChild.AssignedFolder.Id, sentFolder.Id, draftFolder.Id); + } + + // Build down + var replyToParent = await GetInReplyToReplyAsync(replyItem, accountId, replyItem.AssignedFolder.Id, sentFolder.Id, draftFolder.Id); + + while (replyToParent != null) + { + replyToParent.AssignedAccount = account; + + if (replyToParent.FolderId == draftFolder.Id) + replyToParent.AssignedFolder = draftFolder; + + if (replyToParent.FolderId == sentFolder.Id) + replyToParent.AssignedFolder = sentFolder; + + if (replyToParent.FolderId == replyItem.AssignedFolder.Id) + replyToParent.AssignedFolder = replyItem.AssignedFolder; + + threadItem.AddThreadItem(replyToParent); + + if (mailLookupTable.ContainsKey(replyToParent.Id)) + mailLookupTable[replyToParent.Id] = true; + + replyToParent = await GetInReplyToReplyAsync(replyToParent, accountId, replyToParent.AssignedFolder.Id, sentFolder.Id, draftFolder.Id); + } + + // It's a thread item. + + if (threadItem.ThreadItems.Count > 1 && !threads.Exists(a => a.Id == threadItem.Id)) + { + threads.Add(threadItem); + } + else + { + // False alert. This is not a thread item. + mailLookupTable[replyItem.Id] = false; + + // TODO: Here potentially check other algorithms for threading like References. + } + } + + // At this points all mails in the list belong to single items. + // Merge with threads. + // Last sorting will be done later on in MailService. + + // Remove single mails that are included in thread. + items.RemoveAll(a => mailLookupTable.ContainsKey(a.Id) && mailLookupTable[a.Id]); + + var finalList = new List(items); + + finalList.AddRange(threads); + + return finalList; + } + + public bool ShouldThreadWithItem(IMailItem originalItem, IMailItem targetItem) + { + bool isChild = originalItem.InReplyTo != null && originalItem.InReplyTo == targetItem.MessageId; + bool isParent = originalItem.MessageId != null && originalItem.MessageId == targetItem.InReplyTo; + + return isChild || isParent; + } + } +} diff --git a/Wino.Core/Integration/Threading/OutlookThreadingStrategy.cs b/Wino.Core/Integration/Threading/OutlookThreadingStrategy.cs new file mode 100644 index 00000000..89c4bd89 --- /dev/null +++ b/Wino.Core/Integration/Threading/OutlookThreadingStrategy.cs @@ -0,0 +1,14 @@ +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Core.Integration.Threading +{ + // Outlook and Gmail is using the same threading strategy. + // Outlook: ConversationId -> it's set as ThreadId + // Gmail: ThreadId + + public class OutlookThreadingStrategy : APIThreadingStrategy + { + public OutlookThreadingStrategy(IDatabaseService databaseService, IFolderService folderService) : base(databaseService, folderService) { } + } +} diff --git a/Wino.Core/MenuItems/AccountMenuItem.cs b/Wino.Core/MenuItems/AccountMenuItem.cs new file mode 100644 index 00000000..3bd7d13f --- /dev/null +++ b/Wino.Core/MenuItems/AccountMenuItem.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.MenuItems +{ + public partial class AccountMenuItem : MenuItemBase>, IAccountMenuItem + { + public List FlattenedFolderHierarchy { get; set; } + + [ObservableProperty] + private int unreadItemCount; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsSynchronizationProgressVisible))] + private double synchronizationProgress; + + public bool IsAttentionRequired => AttentionReason != AccountAttentionReason.None; + public bool IsSynchronizationProgressVisible => SynchronizationProgress > 0 && SynchronizationProgress < 100; + public Guid AccountId => Parameter.Id; + + private AccountAttentionReason attentionReason; + + public AccountAttentionReason AttentionReason + { + get => attentionReason; + set + { + if (SetProperty(ref attentionReason, value)) + { + OnPropertyChanged(nameof(IsAttentionRequired)); + + UpdateFixAccountIssueMenuItem(); + } + } + } + + public string AccountName + { + get => Parameter.Name; + set => SetProperty(Parameter.Name, value, Parameter, (u, n) => u.Name = n); + } + + public IEnumerable HoldingAccounts => new List { Parameter }; + + public AccountMenuItem(MailAccount account, IMenuItem parent = null) : base(account, account.Id, parent) + { + UpdateAccount(account); + } + + public void UpdateAccount(MailAccount account) + { + Parameter = account; + AccountName = account.Name; + AttentionReason = account.AttentionReason; + } + + private void UpdateFixAccountIssueMenuItem() + { + if (AttentionReason != AccountAttentionReason.None && !SubMenuItems.Any(a => a is FixAccountIssuesMenuItem)) + { + // Add fix issue item if not exists. + SubMenuItems.Insert(0, new FixAccountIssuesMenuItem(Parameter, this)); + } + else + { + // Remove existing if issue is resolved. + var fixAccountIssueItem = SubMenuItems.FirstOrDefault(a => a is FixAccountIssuesMenuItem); + + if (fixAccountIssueItem != null) + { + SubMenuItems.Remove(fixAccountIssueItem); + } + } + } + + public int GetUnreadItemCountByFolderType(SpecialFolderType specialFolderType) + => FlattenedFolderHierarchy?.Where(a => a.SpecialFolderType == specialFolderType).Sum(a => a.UnreadItemCount) ?? 0; + } +} diff --git a/Wino.Core/MenuItems/FixAccountIssuesMenuItem.cs b/Wino.Core/MenuItems/FixAccountIssuesMenuItem.cs new file mode 100644 index 00000000..ce953cb6 --- /dev/null +++ b/Wino.Core/MenuItems/FixAccountIssuesMenuItem.cs @@ -0,0 +1,16 @@ +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.MenuItems +{ + public class FixAccountIssuesMenuItem : MenuItemBase + { + public MailAccount Account { get; } + + public FixAccountIssuesMenuItem(MailAccount account, IMenuItem parentAccountMenuItem) : base(null, null, parentAccountMenuItem) + { + Account = account; + } + } +} diff --git a/Wino.Core/MenuItems/FolderMenuItem.cs b/Wino.Core/MenuItems/FolderMenuItem.cs new file mode 100644 index 00000000..a192b70e --- /dev/null +++ b/Wino.Core/MenuItems/FolderMenuItem.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.MenuItems +{ + public partial class FolderMenuItem : MenuItemBase, IFolderMenuItem + { + [ObservableProperty] + private int unreadItemCount; + + public bool HasTextColor => !string.IsNullOrEmpty(Parameter.TextColorHex); + public bool IsMoveTarget => HandlingFolders.All(a => a.IsMoveTarget); + + public SpecialFolderType SpecialFolderType => Parameter.SpecialFolderType; + public bool IsSticky => Parameter.IsSticky; + public bool IsSystemFolder => Parameter.IsSystemFolder; + + /// + /// Display name of the folder. More and Category folders have localized display names. + /// + public string FolderName + { + get + { + if (Parameter.SpecialFolderType == SpecialFolderType.More) + return Translator.MoreFolderNameOverride; + else if (Parameter.SpecialFolderType == SpecialFolderType.Category) + return Translator.CategoriesFolderNameOverride; + else + return Parameter.FolderName; + } + set => SetProperty(Parameter.FolderName, value, Parameter, (u, n) => u.FolderName = n); + } + + public bool IsSynchronizationEnabled + { + get => Parameter.IsSynchronizationEnabled; + set => SetProperty(Parameter.IsSynchronizationEnabled, value, Parameter, (u, n) => u.IsSynchronizationEnabled = n); + } + + public IEnumerable HandlingFolders => new List() { Parameter }; + + public MailAccount ParentAccount { get; } + + public string AssignedAccountName => ParentAccount?.Name; + + public bool ShowUnreadCount => Parameter.ShowUnreadCount; + + public FolderMenuItem(IMailItemFolder folderStructure, MailAccount parentAccount, IMenuItem parentMenuItem) : base(folderStructure, folderStructure.Id, parentMenuItem) + { + ParentAccount = parentAccount; + } + + public void UpdateFolder(IMailItemFolder folder) + { + Parameter = folder; + + OnPropertyChanged(nameof(IsSynchronizationEnabled)); + OnPropertyChanged(nameof(ShowUnreadCount)); + OnPropertyChanged(nameof(HasTextColor)); + OnPropertyChanged(nameof(IsSystemFolder)); + OnPropertyChanged(nameof(SpecialFolderType)); + OnPropertyChanged(nameof(IsSticky)); + OnPropertyChanged(nameof(FolderName)); + } + + public override string ToString() => FolderName; + } +} diff --git a/Wino.Core/MenuItems/ManageAccountsMenuItem.cs b/Wino.Core/MenuItems/ManageAccountsMenuItem.cs new file mode 100644 index 00000000..2d69f5b0 --- /dev/null +++ b/Wino.Core/MenuItems/ManageAccountsMenuItem.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.MenuItems +{ + public class ManageAccountsMenuItem : MenuItemBase { } +} diff --git a/Wino.Core/MenuItems/MenuItemBase.cs b/Wino.Core/MenuItems/MenuItemBase.cs new file mode 100644 index 00000000..fef4fffd --- /dev/null +++ b/Wino.Core/MenuItems/MenuItemBase.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.MenuItems +{ + public partial class MenuItemBase : ObservableObject, IMenuItem + { + [ObservableProperty] + private bool _isExpanded; + + [ObservableProperty] + private bool _isSelected; + + public IMenuItem ParentMenuItem { get; } + + public Guid? EntityId { get; } + + public MenuItemBase(Guid? entityId = null, IMenuItem parentMenuItem = null) + { + EntityId = entityId; + ParentMenuItem = parentMenuItem; + } + + public void Expand() + { + // Recursively expand all parent menu items if parent exists, starting from parent. + if (ParentMenuItem != null) + { + IMenuItem parentMenuItem = ParentMenuItem; + + while (parentMenuItem != null) + { + parentMenuItem.IsExpanded = true; + + parentMenuItem = parentMenuItem.ParentMenuItem; + } + } + + // Finally expand itself. + IsExpanded = true; + } + } + + public partial class MenuItemBase : MenuItemBase + { + [ObservableProperty] + private T _parameter; + + public MenuItemBase(T parameter, Guid? entityId, IMenuItem parentMenuItem = null) : base(entityId, parentMenuItem) => Parameter = parameter; + } + + public partial class MenuItemBase : MenuItemBase + { + [ObservableProperty] + private bool _isChildSelected; + + protected MenuItemBase(TValue parameter, Guid? entityId, IMenuItem parentMenuItem = null) : base(parameter, entityId, parentMenuItem) { } + + public ObservableCollection SubMenuItems { get; set; } = []; + } +} diff --git a/Wino.Core/MenuItems/MenuItemCollection.cs b/Wino.Core/MenuItems/MenuItemCollection.cs new file mode 100644 index 00000000..f166a08a --- /dev/null +++ b/Wino.Core/MenuItems/MenuItemCollection.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.MenuItems +{ + public class MenuItemCollection : ObservableRangeCollection + { + public IEnumerable GetFolderItems(Guid folderId) + { + var rootItems = this.OfType() + .SelectMany(a => a.FlattenedFolderHierarchy) + .Where(a => a.Parameter?.Id == folderId) + .Cast(); + + // Accounts that are merged can't exist in the root items. + // Therefore if the folder is found in root items, return it without searching inside merged accounts. + + if (rootItems.Any()) return rootItems; + + var mergedItems = this.OfType() + .SelectMany(a => a.SubMenuItems.OfType() + .Where(a => a.Parameter.Any(b => b.Id == folderId))) + .Cast(); + + // Folder is found in the MergedInbox shared folders. + if (mergedItems.Any()) return mergedItems; + + // Folder is not in any of the above. Looks inside the individual accounts in merged inbox account menu item. + var mergedAccountItems = this.OfType() + .SelectMany(a => a.SubMenuItems.OfType() + .SelectMany(a => a.FlattenedFolderHierarchy) + .Where(a => a.Parameter?.Id == folderId)) + .Cast(); + + return mergedAccountItems; + } + + public IBaseFolderMenuItem GetFolderItem(Guid folderId) => GetFolderItems(folderId).FirstOrDefault(); + + public IAccountMenuItem GetAccountMenuItem(Guid accountId) + { + if (accountId == null) return null; + + if (TryGetRootAccountMenuItem(accountId, out IAccountMenuItem rootAccountMenuItem)) return rootAccountMenuItem; + + return null; + } + + // Pattern: Look for root account menu item only. Don't search inside the merged account menu item. + public bool TryGetRootAccountMenuItem(Guid accountId, out IAccountMenuItem value) + { + value = this.OfType().FirstOrDefault(a => a.HoldingAccounts.Any(b => b.Id == accountId)); + + value ??= this.OfType().FirstOrDefault(a => a.EntityId == accountId); + + return value != null; + } + + // Pattern: Look for root account menu item only and return the folder menu item inside the account menu item that has specific special folder type. + public bool TryGetRootSpecialFolderMenuItem(Guid accountId, SpecialFolderType specialFolderType, out FolderMenuItem value) + { + value = this.OfType() + .Where(a => a.HoldingAccounts.Any(b => b.Id == accountId)) + .SelectMany(a => a.FlattenedFolderHierarchy) + .FirstOrDefault(a => a.Parameter?.SpecialFolderType == specialFolderType); + + return value != null; + } + + // Pattern: Look for special folder menu item inside the loaded folders for Windows Mail style menu items. + public bool TryGetWindowsStyleRootSpecialFolderMenuItem(Guid accountId, SpecialFolderType specialFolderType, out FolderMenuItem value) + { + value = this.OfType() + .FirstOrDefault(a => a.HandlingFolders.Any(b => b.MailAccountId == accountId && b.SpecialFolderType == specialFolderType)) as FolderMenuItem; + + return value != null; + } + + // Pattern: Find the merged account menu item and return the special folder menu item that belongs to the merged account menu item. + // This will not look for the folders inside individual account menu items inside merged account menu item. + public bool TryGetMergedAccountSpecialFolderMenuItem(Guid mergedInboxId, SpecialFolderType specialFolderType, out IBaseFolderMenuItem value) + { + value = this.OfType() + .Where(a => a.EntityId == mergedInboxId) + .SelectMany(a => a.SubMenuItems) + .OfType() + .FirstOrDefault(a => a.SpecialFolderType == specialFolderType); + + return value != null; + } + + // Pattern: Find the child account menu item inside the merged account menu item, locate the special folder menu item inside the child account menu item. + public bool TryGetMergedAccountFolderMenuItemByAccountId(Guid accountId, SpecialFolderType specialFolderType, out FolderMenuItem value) + { + value = this.OfType() + .SelectMany(a => a.SubMenuItems) + .OfType() + .FirstOrDefault(a => a.HoldingAccounts.Any(b => b.Id == accountId)) + ?.FlattenedFolderHierarchy + .OfType() + .FirstOrDefault(a => a.Parameter?.SpecialFolderType == specialFolderType); + + return value != null; + } + + // Pattern: Find the common folder menu item with special folder type inside the merged account menu item for the given AccountId. + public bool TryGetMergedAccountRootFolderMenuItemByAccountId(Guid accountId, SpecialFolderType specialFolderType, out MergedAccountFolderMenuItem value) + { + value = this.OfType() + .Where(a => a.HoldingAccounts.Any(b => b.Id == accountId)) + .SelectMany(a => a.SubMenuItems) + .OfType() + .FirstOrDefault(a => a.SpecialFolderType == specialFolderType); + + return value != null; + } + + /// + /// Skips the merged account menu item, but directly returns the Account menu item inside the merged account menu item. + /// + /// Account id to look for. + /// Direct AccountMenuItem inside the Merged Account menu item if exists. + public AccountMenuItem GetSpecificAccountMenuItem(Guid accountId) + { + AccountMenuItem accountMenuItem = null; + + accountMenuItem = this.OfType().FirstOrDefault(a => a.HoldingAccounts.Any(b => b.Id == accountId)); + + // Look for the items inside the merged accounts if regular menu item is not found. + accountMenuItem ??= this.OfType() + .FirstOrDefault(a => a.HoldingAccounts.Any(b => b.Id == accountId))?.SubMenuItems + .OfType() + .FirstOrDefault(); + + return accountMenuItem; + } + + public void ReplaceFolders(IEnumerable folders) + { + ClearFolderAreaMenuItems(); + + Items.Add(new SeperatorItem()); + AddRange(folders); + } + + public void AddAccountMenuItem(IAccountMenuItem accountMenuItem) + { + var lastAccount = Items.OfType().LastOrDefault(); + + // Index 0 is always the New Mail button. + var insertIndex = lastAccount == null ? 1 : Items.IndexOf(lastAccount) + 1; + + Insert(insertIndex, accountMenuItem); + } + + private void ClearFolderAreaMenuItems() + { + var cloneItems = Items.ToList(); + + foreach (var item in cloneItems) + { + if (item is SeperatorItem || item is IBaseFolderMenuItem || item is MergedAccountMoreFolderMenuItem) + { + item.IsSelected = false; + item.IsExpanded = false; + + Remove(item); + } + } + } + } +} diff --git a/Wino.Core/MenuItems/MergedAccountFolderMenuItem.cs b/Wino.Core/MenuItems/MergedAccountFolderMenuItem.cs new file mode 100644 index 00000000..4ad3601e --- /dev/null +++ b/Wino.Core/MenuItems/MergedAccountFolderMenuItem.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Diagnostics; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Core.MenuItems +{ + /// + /// Menu item that holds a list of folders under the merged account menu item. + /// + public partial class MergedAccountFolderMenuItem : MenuItemBase>, IMergedAccountFolderMenuItem + { + public SpecialFolderType FolderType { get; } + + public string FolderName { get; private set; } + + // Any of the folders is enough to determine the synchronization enable/disable state. + public bool IsSynchronizationEnabled => HandlingFolders.Any(a => a.IsSynchronizationEnabled); + public bool IsMoveTarget => HandlingFolders.All(a => a.IsMoveTarget); + public IEnumerable HandlingFolders => Parameter; + + // All folders in the list should have the same type. + public SpecialFolderType SpecialFolderType => HandlingFolders.First().SpecialFolderType; + + public bool IsSticky => true; + + public bool IsSystemFolder => true; + + public string AssignedAccountName => MergedInbox?.Name; + + public MergedInbox MergedInbox { get; set; } + + public bool ShowUnreadCount => HandlingFolders?.Any(a => a.ShowUnreadCount) ?? false; + + [ObservableProperty] + private int unreadItemCount; + + // Merged account's shared folder menu item does not have an entity id. + // Navigations to specific folders are done by explicit folder id if needed. + + public MergedAccountFolderMenuItem(List parameter, IMenuItem parentMenuItem, MergedInbox mergedInbox) : base(parameter, null, parentMenuItem) + { + Guard.IsNotNull(mergedInbox, nameof(mergedInbox)); + Guard.IsNotNull(parameter, nameof(parameter)); + Guard.HasSizeGreaterThan(parameter, 0, nameof(parameter)); + + MergedInbox = mergedInbox; + + SetFolderName(); + + // All folders in the list should have the same type. + FolderType = parameter[0].SpecialFolderType; + } + + private void SetFolderName() + { + // Folders that hold more than 1 folder belong to merged account. + // These folders will be displayed as their localized names based on the + // special type they have. + + if (HandlingFolders.Count() > 1) + { + FolderName = GetSpecialFolderName(HandlingFolders.First()); + } + else + { + // Folder only holds 1 Id, but it's displayed as merged account folder. + FolderName = HandlingFolders.First().FolderName; + } + } + + private string GetSpecialFolderName(IMailItemFolder folder) + { + var specialType = folder.SpecialFolderType; + + // We only handle 5 different types for combining folders. + // Rest of the types are not supported. + + return specialType switch + { + SpecialFolderType.Inbox => Translator.MergedAccountCommonFolderInbox, + SpecialFolderType.Draft => Translator.MergedAccountCommonFolderDraft, + SpecialFolderType.Sent => Translator.MergedAccountCommonFolderSent, + SpecialFolderType.Deleted => Translator.MergedAccountCommonFolderTrash, + SpecialFolderType.Junk => Translator.MergedAccountCommonFolderJunk, + SpecialFolderType.Archive => Translator.MergedAccountCommonFolderArchive, + _ => folder.FolderName, + }; + } + + public void UpdateFolder(IMailItemFolder folder) + { + var existingFolder = Parameter.FirstOrDefault(a => a.Id == folder.Id); + + if (existingFolder == null) return; + + Parameter.Remove(existingFolder); + Parameter.Add(folder); + + SetFolderName(); + OnPropertyChanged(nameof(ShowUnreadCount)); + OnPropertyChanged(nameof(IsSynchronizationEnabled)); + } + } +} diff --git a/Wino.Core/MenuItems/MergedAccountMenuItem.cs b/Wino.Core/MenuItems/MergedAccountMenuItem.cs new file mode 100644 index 00000000..42058afe --- /dev/null +++ b/Wino.Core/MenuItems/MergedAccountMenuItem.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.MenuItems +{ + public partial class MergedAccountMenuItem : MenuItemBase, IAccountMenuItem + { + public int MergedAccountCount => GetAccountMenuItems().Count(); + + public IEnumerable HoldingAccounts => GetAccountMenuItems()?.SelectMany(a => a.HoldingAccounts); + + [ObservableProperty] + private int unreadItemCount; + + [ObservableProperty] + private double synchronizationProgress; + + [ObservableProperty] + private string mergedAccountName; + + public MergedAccountMenuItem(MergedInbox mergedInbox, IMenuItem parent) : base(mergedInbox, mergedInbox.Id, parent) + { + MergedAccountName = mergedInbox.Name; + } + + public void RefreshFolderItemCount() + { + UnreadItemCount = GetAccountMenuItems().Select(a => a.GetUnreadItemCountByFolderType(SpecialFolderType.Inbox)).Sum(); + + var unreadUpdateFolders = SubMenuItems.OfType().Where(a => a.ShowUnreadCount); + + foreach (var folder in unreadUpdateFolders) + { + folder.UnreadItemCount = GetAccountMenuItems().Select(a => a.GetUnreadItemCountByFolderType(folder.SpecialFolderType)).Sum(); + } + } + + // Accounts are always located in More folder of Merged Inbox menu item. + public IEnumerable GetAccountMenuItems() + { + var moreFolder = SubMenuItems.OfType().FirstOrDefault(); + + if (moreFolder == null) return default; + + return moreFolder.SubMenuItems.OfType(); + } + + public void UpdateAccount(MailAccount account) + => GetAccountMenuItems().FirstOrDefault(a => a.HoldingAccounts.Any(b => b.Id == account.Id))?.UpdateAccount(account); + } +} diff --git a/Wino.Core/MenuItems/MergedAccountMoreFolderMenuItem.cs b/Wino.Core/MenuItems/MergedAccountMoreFolderMenuItem.cs new file mode 100644 index 00000000..f0a8b0cc --- /dev/null +++ b/Wino.Core/MenuItems/MergedAccountMoreFolderMenuItem.cs @@ -0,0 +1,12 @@ +using System; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.MenuItems +{ + public class MergedAccountMoreFolderMenuItem : MenuItemBase + { + public MergedAccountMoreFolderMenuItem(object parameter, Guid? entityId, IMenuItem parentMenuItem = null) : base(parameter, entityId, parentMenuItem) + { + } + } +} diff --git a/Wino.Core/MenuItems/NewMailMenuItem.cs b/Wino.Core/MenuItems/NewMailMenuItem.cs new file mode 100644 index 00000000..dc543c2d --- /dev/null +++ b/Wino.Core/MenuItems/NewMailMenuItem.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.MenuItems +{ + public class NewMailMenuItem : MenuItemBase { } +} diff --git a/Wino.Core/MenuItems/ObservableRangeCollection.cs b/Wino.Core/MenuItems/ObservableRangeCollection.cs new file mode 100644 index 00000000..17025fd0 --- /dev/null +++ b/Wino.Core/MenuItems/ObservableRangeCollection.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; + +namespace Wino.Core.MenuItems +{ + /// + /// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed. + /// + /// + public class ObservableRangeCollection : ObservableCollection + { + + /// + /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. + /// + public ObservableRangeCollection() + : base() + { + } + + /// + /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. + /// + /// collection: The collection from which the elements are copied. + /// The collection parameter cannot be null. + public ObservableRangeCollection(IEnumerable collection) + : base(collection) + { + } + + /// + /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). + /// + public void AddRange(IEnumerable collection, NotifyCollectionChangedAction notificationMode = NotifyCollectionChangedAction.Add) + { + if (notificationMode != NotifyCollectionChangedAction.Add && notificationMode != NotifyCollectionChangedAction.Reset) + throw new ArgumentException("Mode must be either Add or Reset for AddRange.", nameof(notificationMode)); + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + + CheckReentrancy(); + + var startIndex = Count; + + var itemsAdded = AddArrangeCore(collection); + + if (!itemsAdded) + return; + + if (notificationMode == NotifyCollectionChangedAction.Reset) + { + RaiseChangeNotificationEvents(action: NotifyCollectionChangedAction.Reset); + + return; + } + + var changedItems = collection is List ? (List)collection : new List(collection); + + RaiseChangeNotificationEvents( + action: NotifyCollectionChangedAction.Add, + changedItems: changedItems, + startingIndex: startIndex); + } + + /// + /// Removes the first occurence of each item in the specified collection from ObservableCollection(Of T). NOTE: with notificationMode = Remove, removed items starting index is not set because items are not guaranteed to be consecutive. + /// + public void RemoveRange(IEnumerable collection, NotifyCollectionChangedAction notificationMode = NotifyCollectionChangedAction.Reset) + { + if (notificationMode != NotifyCollectionChangedAction.Remove && notificationMode != NotifyCollectionChangedAction.Reset) + throw new ArgumentException("Mode must be either Remove or Reset for RemoveRange.", nameof(notificationMode)); + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + + CheckReentrancy(); + + if (notificationMode == NotifyCollectionChangedAction.Reset) + { + var raiseEvents = false; + foreach (var item in collection) + { + Items.Remove(item); + raiseEvents = true; + } + + if (raiseEvents) + RaiseChangeNotificationEvents(action: NotifyCollectionChangedAction.Reset); + + return; + } + + var changedItems = new List(collection); + for (var i = 0; i < changedItems.Count; i++) + { + if (!Items.Remove(changedItems[i])) + { + changedItems.RemoveAt(i); //Can't use a foreach because changedItems is intended to be (carefully) modified + i--; + } + } + + if (changedItems.Count == 0) + return; + + RaiseChangeNotificationEvents( + action: NotifyCollectionChangedAction.Remove, + changedItems: changedItems); + } + + /// + /// Clears the current collection and replaces it with the specified item. + /// + public void Replace(T item) => ReplaceRange(new T[] { item }); + + /// + /// Clears the current collection and replaces it with the specified collection. + /// + public void ReplaceRange(IEnumerable collection) + { + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + + CheckReentrancy(); + + var previouslyEmpty = Items.Count == 0; + + Items.Clear(); + + AddArrangeCore(collection); + + var currentlyEmpty = Items.Count == 0; + + if (previouslyEmpty && currentlyEmpty) + return; + + RaiseChangeNotificationEvents(action: NotifyCollectionChangedAction.Reset); + } + + private bool AddArrangeCore(IEnumerable collection) + { + var itemAdded = false; + foreach (var item in collection) + { + Items.Add(item); + itemAdded = true; + } + return itemAdded; + } + + private void RaiseChangeNotificationEvents(NotifyCollectionChangedAction action, List? changedItems = null, int startingIndex = -1) + { + OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count))); + OnPropertyChanged(new PropertyChangedEventArgs("Item[]")); + + if (changedItems is null) + OnCollectionChanged(new NotifyCollectionChangedEventArgs(action)); + else + OnCollectionChanged(new NotifyCollectionChangedEventArgs(action, changedItems: changedItems, startingIndex: startingIndex)); + } + } +} diff --git a/Wino.Core/MenuItems/RateMenuItem.cs b/Wino.Core/MenuItems/RateMenuItem.cs new file mode 100644 index 00000000..cb339a1a --- /dev/null +++ b/Wino.Core/MenuItems/RateMenuItem.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.MenuItems +{ + public class RateMenuItem : MenuItemBase { } +} diff --git a/Wino.Core/MenuItems/SeperatorItem.cs b/Wino.Core/MenuItems/SeperatorItem.cs new file mode 100644 index 00000000..974f36cc --- /dev/null +++ b/Wino.Core/MenuItems/SeperatorItem.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.MenuItems +{ + public class SeperatorItem : MenuItemBase { } +} diff --git a/Wino.Core/MenuItems/SettingsItem.cs b/Wino.Core/MenuItems/SettingsItem.cs new file mode 100644 index 00000000..12aafba9 --- /dev/null +++ b/Wino.Core/MenuItems/SettingsItem.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.MenuItems +{ + public class SettingsItem : MenuItemBase { } +} diff --git a/Wino.Core/Messages/Accounts/AccountMenuItemExtended.cs b/Wino.Core/Messages/Accounts/AccountMenuItemExtended.cs new file mode 100644 index 00000000..737ae9c3 --- /dev/null +++ b/Wino.Core/Messages/Accounts/AccountMenuItemExtended.cs @@ -0,0 +1,14 @@ +using System; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Core.Messages.Accounts +{ + /// + /// When menu item for the account is requested to be extended. + /// Additional properties are also supported to navigate to correct IMailItem. + /// + /// Account to extend menu item for. + /// Folder to select after expansion. + /// Mail item to select if possible in the expanded folder. + public record AccountMenuItemExtended(Guid FolderId, IMailItem NavigateMailItem); +} diff --git a/Wino.Core/Messages/Accounts/AccountsMenuRefreshRequested.cs b/Wino.Core/Messages/Accounts/AccountsMenuRefreshRequested.cs new file mode 100644 index 00000000..d6848622 --- /dev/null +++ b/Wino.Core/Messages/Accounts/AccountsMenuRefreshRequested.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Accounts +{ + /// + /// When a full menu refresh for accounts menu is requested. + /// + public record AccountsMenuRefreshRequested(bool AutomaticallyNavigateFirstItem = true); +} diff --git a/Wino.Core/Messages/Authorization/ProtocolAuthorizationCallbackReceived.cs b/Wino.Core/Messages/Authorization/ProtocolAuthorizationCallbackReceived.cs new file mode 100644 index 00000000..d748f6df --- /dev/null +++ b/Wino.Core/Messages/Authorization/ProtocolAuthorizationCallbackReceived.cs @@ -0,0 +1,10 @@ +using System; + +namespace Wino.Core.Messages.Authorization +{ + /// + /// When Google authentication makes a callback to the app via protocol activation to the app. + /// + /// Callback Uri that Google returned. + public record ProtocolAuthorizationCallbackReceived(Uri AuthorizationResponseUri); +} diff --git a/Wino.Core/Messages/Mails/CancelRenderingContentRequested.cs b/Wino.Core/Messages/Mails/CancelRenderingContentRequested.cs new file mode 100644 index 00000000..0df0be2a --- /dev/null +++ b/Wino.Core/Messages/Mails/CancelRenderingContentRequested.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Mails +{ + /// + /// When rendered html is requested to cancel. + /// + public record CancelRenderingContentRequested; +} diff --git a/Wino.Core/Messages/Mails/ClearMailSelectionsRequested.cs b/Wino.Core/Messages/Mails/ClearMailSelectionsRequested.cs new file mode 100644 index 00000000..d38af5f4 --- /dev/null +++ b/Wino.Core/Messages/Mails/ClearMailSelectionsRequested.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Mails +{ + /// + /// When reset all mail selections requested. + /// + public record ClearMailSelectionsRequested; +} diff --git a/Wino.Core/Messages/Mails/CreateNewComposeMailRequested.cs b/Wino.Core/Messages/Mails/CreateNewComposeMailRequested.cs new file mode 100644 index 00000000..60a7586d --- /dev/null +++ b/Wino.Core/Messages/Mails/CreateNewComposeMailRequested.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Models.Reader; + +namespace Wino.Core.Messages.Mails +{ + /// + /// When a new composing requested. + /// + /// + public record CreateNewComposeMailRequested(MailRenderModel RenderModel); +} diff --git a/Wino.Core/Messages/Mails/HtmlRenderingRequested.cs b/Wino.Core/Messages/Mails/HtmlRenderingRequested.cs new file mode 100644 index 00000000..f7b572ec --- /dev/null +++ b/Wino.Core/Messages/Mails/HtmlRenderingRequested.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Messages.Mails +{ + /// + /// When existing a new html is requested to be rendered due to mail selection or signature. + /// + /// HTML to render in WebView2. + public record HtmlRenderingRequested(string HtmlBody); +} diff --git a/Wino.Core/Messages/Mails/ImapSetupBackNavigationRequested.cs b/Wino.Core/Messages/Mails/ImapSetupBackNavigationRequested.cs new file mode 100644 index 00000000..54ebddb6 --- /dev/null +++ b/Wino.Core/Messages/Mails/ImapSetupBackNavigationRequested.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Messages.Mails +{ + /// + /// When IMAP setup dialog requestes back breadcrumb navigation. + /// + /// Type to go back. + /// Back parameters. + public record ImapSetupBackNavigationRequested(Type PageType, object Parameter); +} diff --git a/Wino.Core/Messages/Mails/ImapSetupDismissRequested.cs b/Wino.Core/Messages/Mails/ImapSetupDismissRequested.cs new file mode 100644 index 00000000..5a02a441 --- /dev/null +++ b/Wino.Core/Messages/Mails/ImapSetupDismissRequested.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Messages.Mails +{ + /// + /// When user asked to dismiss IMAP setup dialog. + /// + /// Validated server information that is ready to be saved to database. + public record ImapSetupDismissRequested(CustomServerInformation CompletedServerInformation = null); +} diff --git a/Wino.Core/Messages/Mails/ImapSetupNavigationRequested.cs b/Wino.Core/Messages/Mails/ImapSetupNavigationRequested.cs new file mode 100644 index 00000000..4c74be90 --- /dev/null +++ b/Wino.Core/Messages/Mails/ImapSetupNavigationRequested.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Messages.Mails +{ + /// + /// When IMAP setup dialog breadcrumb navigation requested. + /// + /// Page type to navigate. + /// Navigation parameters. + public record ImapSetupNavigationRequested(Type PageType, object Parameter); +} diff --git a/Wino.Core/Messages/Mails/MailItemNavigationRequested.cs b/Wino.Core/Messages/Mails/MailItemNavigationRequested.cs new file mode 100644 index 00000000..f64721bf --- /dev/null +++ b/Wino.Core/Messages/Mails/MailItemNavigationRequested.cs @@ -0,0 +1,11 @@ +using System; + +namespace Wino.Core.Messages.Mails +{ + /// + /// When a IMailItem needs to be navigated (or selected) + /// + /// UniqueId of the mail to navigate. + /// Whether navigated item should be scrolled to or not.. + public record MailItemNavigationRequested(Guid UniqueMailId, bool ScrollToItem = false); +} diff --git a/Wino.Core/Messages/Mails/NavigateMailFolderEvent.cs b/Wino.Core/Messages/Mails/NavigateMailFolderEvent.cs new file mode 100644 index 00000000..d6814c92 --- /dev/null +++ b/Wino.Core/Messages/Mails/NavigateMailFolderEvent.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; + +namespace Wino.Core.Messages.Mails +{ + /// + /// Selects the given FolderMenuItem in the shell folders list. + /// + public class NavigateMailFolderEvent : NavigateMailFolderEventArgs + { + public NavigateMailFolderEvent(IBaseFolderMenuItem baseFolderMenuItem, TaskCompletionSource folderInitLoadAwaitTask = null) + : base(baseFolderMenuItem, folderInitLoadAwaitTask) + { + } + } +} diff --git a/Wino.Core/Messages/Mails/RefreshUnreadCountsMessage.cs b/Wino.Core/Messages/Mails/RefreshUnreadCountsMessage.cs new file mode 100644 index 00000000..5e06029a --- /dev/null +++ b/Wino.Core/Messages/Mails/RefreshUnreadCountsMessage.cs @@ -0,0 +1,6 @@ +using System; + +namespace Wino.Core.Messages.Mails +{ + public record RefreshUnreadCountsMessage(Guid AccountId); +} diff --git a/Wino.Core/Messages/Mails/SaveAsPDFRequested.cs b/Wino.Core/Messages/Mails/SaveAsPDFRequested.cs new file mode 100644 index 00000000..e5d4e55c --- /dev/null +++ b/Wino.Core/Messages/Mails/SaveAsPDFRequested.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Wino.Core.Messages.Mails +{ + /// + /// When mail save as PDF requested. + /// + public record SaveAsPDFRequested(string FileSavePath); +} diff --git a/Wino.Core/Messages/Mails/SelectedMailItemsChanged.cs b/Wino.Core/Messages/Mails/SelectedMailItemsChanged.cs new file mode 100644 index 00000000..44ac929e --- /dev/null +++ b/Wino.Core/Messages/Mails/SelectedMailItemsChanged.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Messages.Mails +{ + /// + /// When selected mail count is changed. + /// + /// New selected mail count. + public record SelectedMailItemsChanged(int SelectedItemCount); +} diff --git a/Wino.Core/Messages/Navigation/BackBreadcrumNavigationRequested.cs b/Wino.Core/Messages/Navigation/BackBreadcrumNavigationRequested.cs new file mode 100644 index 00000000..1b485fae --- /dev/null +++ b/Wino.Core/Messages/Navigation/BackBreadcrumNavigationRequested.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Navigation +{ + /// + /// When back navigation is requested for breadcrumb pages. + /// + public record BackBreadcrumNavigationRequested { } +} diff --git a/Wino.Core/Messages/Navigation/BreadcrumbNavigationRequested.cs b/Wino.Core/Messages/Navigation/BreadcrumbNavigationRequested.cs new file mode 100644 index 00000000..e89ac11b --- /dev/null +++ b/Wino.Core/Messages/Navigation/BreadcrumbNavigationRequested.cs @@ -0,0 +1,12 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Messages.Navigation +{ + /// + /// When Breadcrumb control navigation requested. + /// + /// Title to display for the page. + /// Enum equilavent of the page to navigate. + /// Additional parameters to the page. + public record BreadcrumbNavigationRequested(string PageTitle, WinoPage PageType, object Parameter = null); +} diff --git a/Wino.Core/Messages/Navigation/NavigateSettingsRequested.cs b/Wino.Core/Messages/Navigation/NavigateSettingsRequested.cs new file mode 100644 index 00000000..1e4a9477 --- /dev/null +++ b/Wino.Core/Messages/Navigation/NavigateSettingsRequested.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Navigation +{ + /// + /// Navigates to settings page. + /// + public record NavigateSettingsRequested; +} \ No newline at end of file diff --git a/Wino.Core/Messages/Shell/ApplicationThemeChanged.cs b/Wino.Core/Messages/Shell/ApplicationThemeChanged.cs new file mode 100644 index 00000000..a688f33b --- /dev/null +++ b/Wino.Core/Messages/Shell/ApplicationThemeChanged.cs @@ -0,0 +1,8 @@ +namespace Wino.Core.Messages.Shell +{ + /// + /// When the application theme changed. + /// + /// + public record ApplicationThemeChanged(bool IsUnderlyingThemeDark); +} diff --git a/Wino.Core/Messages/Shell/CreateNewMailWithMultipleAccountsRequested.cs b/Wino.Core/Messages/Shell/CreateNewMailWithMultipleAccountsRequested.cs new file mode 100644 index 00000000..ac938562 --- /dev/null +++ b/Wino.Core/Messages/Shell/CreateNewMailWithMultipleAccountsRequested.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Messages.Shell +{ + /// + /// When + /// - There is no selection of any folder for any account + /// - Multiple accounts exists + /// - User clicked 'Create New Mail' + /// + /// flyout must be presented to pick correct account. + /// This message will be picked up by UWP Shell. + /// + public record CreateNewMailWithMultipleAccountsRequested(IEnumerable AllAccounts); +} diff --git a/Wino.Core/Messages/Shell/InfoBarMessageRequested.cs b/Wino.Core/Messages/Shell/InfoBarMessageRequested.cs new file mode 100644 index 00000000..a67daea7 --- /dev/null +++ b/Wino.Core/Messages/Shell/InfoBarMessageRequested.cs @@ -0,0 +1,17 @@ +using System; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Messages.Shell +{ + /// + /// For displaying right sliding notification message in shell. + /// + /// Severity of notification. + /// Title of the message. + /// Message content. + public record InfoBarMessageRequested(InfoBarMessageType Severity, + string Title, + string Message, + string ActionButtonTitle = "", + Action Action = null); +} diff --git a/Wino.Core/Messages/Shell/LanguageChanged.cs b/Wino.Core/Messages/Shell/LanguageChanged.cs new file mode 100644 index 00000000..3c98746f --- /dev/null +++ b/Wino.Core/Messages/Shell/LanguageChanged.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Shell +{ + /// + /// When application language is updated. + /// + public record LanguageChanged; +} diff --git a/Wino.Core/Messages/Shell/MailtoProtocolMessageRequested.cs b/Wino.Core/Messages/Shell/MailtoProtocolMessageRequested.cs new file mode 100644 index 00000000..9ed37bc4 --- /dev/null +++ b/Wino.Core/Messages/Shell/MailtoProtocolMessageRequested.cs @@ -0,0 +1,4 @@ +namespace Wino.Core.Messages.Shell +{ + public class MailtoProtocolMessageRequested { } +} diff --git a/Wino.Core/Messages/Shell/NavigationPaneModeChanged.cs b/Wino.Core/Messages/Shell/NavigationPaneModeChanged.cs new file mode 100644 index 00000000..994d33ed --- /dev/null +++ b/Wino.Core/Messages/Shell/NavigationPaneModeChanged.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Messages.Shell +{ + /// + /// When navigation pane mode is changed. + /// + /// New navigation mode. + public record NavigationPaneModeChanged(MenuPaneMode NewMode); +} diff --git a/Wino.Core/Messages/Shell/ShellStateUpdated.cs b/Wino.Core/Messages/Shell/ShellStateUpdated.cs new file mode 100644 index 00000000..4d07af9e --- /dev/null +++ b/Wino.Core/Messages/Shell/ShellStateUpdated.cs @@ -0,0 +1,7 @@ +namespace Wino.Core.Messages.Shell +{ + /// + /// When reading mail state or reader pane narrowed state is changed. + /// + public record ShellStateUpdated; +} diff --git a/Wino.Core/Messages/Synchronization/AccountSynchronizationCompleted.cs b/Wino.Core/Messages/Synchronization/AccountSynchronizationCompleted.cs new file mode 100644 index 00000000..c45033fe --- /dev/null +++ b/Wino.Core/Messages/Synchronization/AccountSynchronizationCompleted.cs @@ -0,0 +1,7 @@ +using System; +using Wino.Core.Domain.Enums; + +namespace Wino.Core.Messages.Synchronization +{ + public record AccountSynchronizationCompleted(Guid AccountId, SynchronizationCompletedState Result, Guid? SynchronizationTrackingId); +} diff --git a/Wino.Core/Messages/Synchronization/AccountSynchronizerStateChanged.cs b/Wino.Core/Messages/Synchronization/AccountSynchronizerStateChanged.cs new file mode 100644 index 00000000..ea7db120 --- /dev/null +++ b/Wino.Core/Messages/Synchronization/AccountSynchronizerStateChanged.cs @@ -0,0 +1,12 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Synchronizers; + +namespace Wino.Core.Messages.Synchronization +{ + /// + /// Emitted when synchronizer state is updated. + /// + /// Account Synchronizer + /// New state. + public record AccountSynchronizerStateChanged(IBaseSynchronizer Synchronizer, AccountSynchronizerState NewState); +} diff --git a/Wino.Core/Messages/Synchronization/NewSynchronizationRequested.cs b/Wino.Core/Messages/Synchronization/NewSynchronizationRequested.cs new file mode 100644 index 00000000..593d6c89 --- /dev/null +++ b/Wino.Core/Messages/Synchronization/NewSynchronizationRequested.cs @@ -0,0 +1,10 @@ +using Wino.Core.Domain.Models.Synchronization; + +namespace Wino.Core.Messages.Synchronization +{ + /// + /// Triggers a new synchronization if possible. + /// + /// Options for synchronization. + public record NewSynchronizationRequested(SynchronizationOptions Options); +} diff --git a/Wino.Core/Mime/HtmlPreviewVisitor.cs b/Wino.Core/Mime/HtmlPreviewVisitor.cs new file mode 100644 index 00000000..7c1e9029 --- /dev/null +++ b/Wino.Core/Mime/HtmlPreviewVisitor.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.IO; +using MimeKit; +using MimeKit.Text; +using MimeKit.Tnef; + +namespace Wino.Core.Mime +{ + /// + /// Visits a MimeMessage and generates HTML suitable to be rendered by a browser control. + /// + public class HtmlPreviewVisitor : MimeVisitor + { + List stack = new List(); + List attachments = new List(); + + readonly string tempDir; + + public string Body { get; set; } + + /// + /// Creates a new HtmlPreviewVisitor. + /// + /// A temporary directory used for storing image files. + public HtmlPreviewVisitor(string tempDirectory) + { + tempDir = tempDirectory; + } + + /// + /// The list of attachments that were in the MimeMessage. + /// + public IList Attachments + { + get { return attachments; } + } + + /// + /// The HTML string that can be set on the BrowserControl. + /// + public string HtmlBody + { + get { return Body ?? string.Empty; } + } + + protected override void VisitMultipartAlternative(MultipartAlternative alternative) + { + // walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful + for (int i = alternative.Count - 1; i >= 0 && Body == null; i--) + alternative[i].Accept(this); + } + + protected override void VisitMultipartRelated(MultipartRelated related) + { + var root = related.Root; + + // push this multipart/related onto our stack + stack.Add(related); + + // visit the root document + root.Accept(this); + + // pop this multipart/related off our stack + stack.RemoveAt(stack.Count - 1); + } + + // look up the image based on the img src url within our multipart/related stack + bool TryGetImage(string url, out MimePart image) + { + UriKind kind; + int index; + Uri uri; + + if (Uri.IsWellFormedUriString(url, UriKind.Absolute)) + kind = UriKind.Absolute; + else if (Uri.IsWellFormedUriString(url, UriKind.Relative)) + kind = UriKind.Relative; + else + kind = UriKind.RelativeOrAbsolute; + + try + { + uri = new Uri(url, kind); + } + catch + { + image = null; + return false; + } + + for (int i = stack.Count - 1; i >= 0; i--) + { + if ((index = stack[i].IndexOf(uri)) == -1) + continue; + + image = stack[i][index] as MimePart; + return image != null; + } + + image = null; + + return false; + } + + // Save the image to our temp directory and return a "file://" url suitable for + // the browser control to load. + // Note: if you'd rather embed the image data into the HTML, you can construct a + // "data:" url instead. + string SaveImage(MimePart image) + { + using (var memory = new MemoryStream()) + { + image.Content.DecodeTo(memory); + var buffer = memory.GetBuffer(); + var length = (int)memory.Length; + var base64 = Convert.ToBase64String(buffer, 0, length); + + return string.Format("data:{0};base64,{1}", image.ContentType.MimeType, base64); + } + + //string fileName = url + // .Replace(':', '_') + // .Replace('\\', '_') + // .Replace('/', '_'); + + //string path = Path.Combine(tempDir, fileName); + + //if (!File.Exists(path)) + //{ + // using (var output = File.Create(path)) + // image.Content.DecodeTo(output); + //} + + //return "file://" + path.Replace('\\', '/'); + } + + // Replaces urls that refer to images embedded within the message with + // "file://" urls that the browser control will actually be able to load. + void HtmlTagCallback(HtmlTagContext ctx, HtmlWriter htmlWriter) + { + if (ctx.TagId == HtmlTagId.Image && !ctx.IsEndTag && stack.Count > 0) + { + ctx.WriteTag(htmlWriter, false); + + // replace the src attribute with a file:// URL + foreach (var attribute in ctx.Attributes) + { + if (attribute.Id == HtmlAttributeId.Src) + { + MimePart image; + string url; + + if (!TryGetImage(attribute.Value, out image)) + { + htmlWriter.WriteAttribute(attribute); + continue; + } + + url = SaveImage(image); + + htmlWriter.WriteAttributeName(attribute.Name); + htmlWriter.WriteAttributeValue(url); + } + else + { + htmlWriter.WriteAttribute(attribute); + } + } + } + else if (ctx.TagId == HtmlTagId.Body && !ctx.IsEndTag) + { + ctx.WriteTag(htmlWriter, false); + + // add and/or replace oncontextmenu="return false;" + foreach (var attribute in ctx.Attributes) + { + if (attribute.Name.ToLowerInvariant() == "oncontextmenu") + continue; + + htmlWriter.WriteAttribute(attribute); + } + + htmlWriter.WriteAttribute("oncontextmenu", "return false;"); + } + else + { + // pass the tag through to the output + ctx.WriteTag(htmlWriter, true); + } + } + + protected override void VisitTextPart(TextPart entity) + { + TextConverter converter; + + if (Body != null) + { + // since we've already found the body, treat this as an attachment + attachments.Add(entity); + return; + } + + if (entity.IsHtml) + { + converter = new HtmlToHtml + { + HtmlTagCallback = HtmlTagCallback + }; + } + else if (entity.IsFlowed) + { + var flowed = new FlowedToHtml(); + string delsp; + + if (entity.ContentType.Parameters.TryGetValue("delsp", out delsp)) + flowed.DeleteSpace = delsp.ToLowerInvariant() == "yes"; + + converter = flowed; + } + else + { + converter = new TextToHtml(); + } + + Body = converter.Convert(entity.Text); + } + + protected override void VisitTnefPart(TnefPart entity) + { + // extract any attachments in the MS-TNEF part + attachments.AddRange(entity.ExtractAttachments()); + } + + protected override void VisitMessagePart(MessagePart entity) + { + // treat message/rfc822 parts as attachments + attachments.Add(entity); + } + + protected override void VisitMimePart(MimePart entity) + { + // realistically, if we've gotten this far, then we can treat this as an attachment + // even if the IsAttachment property is false. + attachments.Add(entity); + } + } +} diff --git a/Wino.Core/Mime/ImapMessageCreationPackage.cs b/Wino.Core/Mime/ImapMessageCreationPackage.cs new file mode 100644 index 00000000..ae482d98 --- /dev/null +++ b/Wino.Core/Mime/ImapMessageCreationPackage.cs @@ -0,0 +1,9 @@ +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/Misc/RequestComparer.cs b/Wino.Core/Misc/RequestComparer.cs new file mode 100644 index 00000000..e884e5ea --- /dev/null +++ b/Wino.Core/Misc/RequestComparer.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Requests; + +namespace Wino.Core.Misc +{ + /// + /// This is incomplete. + /// + internal class RequestComparer : IEqualityComparer + { + public bool Equals(IRequestBase x, IRequestBase y) + { + if (x is MoveRequest sourceMoveRequest && y is MoveRequest targetMoveRequest) + { + return sourceMoveRequest.FromFolder.Id == targetMoveRequest.FromFolder.Id && sourceMoveRequest.ToFolder.Id == targetMoveRequest.ToFolder.Id; + } + else if (x is ChangeFlagRequest sourceFlagRequest && y is ChangeFlagRequest targetFlagRequest) + { + return sourceFlagRequest.IsFlagged == targetFlagRequest.IsFlagged; + } + else if (x is MarkReadRequest sourceMarkReadRequest && y is MarkReadRequest targetMarkReadRequest) + { + return sourceMarkReadRequest.Item.IsRead == targetMarkReadRequest.Item.IsRead; + } + else if (x is DeleteRequest sourceDeleteRequest && y is DeleteRequest targetDeleteRequest) + { + return sourceDeleteRequest.MailItem.AssignedFolder.Id == targetDeleteRequest.MailItem.AssignedFolder.Id; + } + + return true; + } + + public int GetHashCode(IRequestBase obj) => obj.Operation.GetHashCode(); + } +} diff --git a/Wino.Core/Requests/AlwaysMoveToRequest.cs b/Wino.Core/Requests/AlwaysMoveToRequest.cs new file mode 100644 index 00000000..db3ac3fe --- /dev/null +++ b/Wino.Core/Requests/AlwaysMoveToRequest.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record AlwaysMoveToRequest(MailCopy Item, bool MoveToFocused) : RequestBase(Item, MailSynchronizerOperation.AlwaysMoveTo) + { + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchAlwaysMoveToRequest(matchingItems, MoveToFocused); + + public override void ApplyUIChanges() + { + + } + + public override void RevertUIChanges() + { + + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record BatchAlwaysMoveToRequest(IEnumerable Items, bool MoveToFocused) : BatchRequestBase(Items, MailSynchronizerOperation.AlwaysMoveTo) + { + public override void ApplyUIChanges() + { + + } + + public override void RevertUIChanges() + { + + } + } +} diff --git a/Wino.Core/Requests/Bundles/RequestBundle.cs b/Wino.Core/Requests/Bundles/RequestBundle.cs new file mode 100644 index 00000000..bf8a7045 --- /dev/null +++ b/Wino.Core/Requests/Bundles/RequestBundle.cs @@ -0,0 +1,59 @@ +using System; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Domain.Models.Requests +{ + + + /// + /// Bundle that encapsulates batch request and native request without a response. + /// + /// Http type for each integrator. eg. ClientServiceRequest for Gmail and RequestInformation for Microsoft Graph. + /// Native type to send via http. + /// Batch request that is generated by base synchronizer. + public record HttpRequestBundle(TRequest NativeRequest, IRequestBase Request) : IRequestBundle + { + public string BundleId { get; set; } = string.Empty; + + public override string ToString() + { + if (Request is IRequest singleRequest) + return $"Single {singleRequest.Operation}. No response."; + else if (Request is IBatchChangeRequest batchChangeRequest) + return $"Batch {batchChangeRequest.Operation} for {batchChangeRequest.Items.Count()} items. No response."; + else + return "Unknown http request bundle."; + } + } + + /// + /// Bundle that encapsulates batch request and native request with response. + /// + /// Http type for each integrator. eg. ClientServiceRequest for Gmail and RequestInformation for Microsoft Graph. + /// Native type to send via http. + /// Batch request that is generated by base synchronizer. + public record HttpRequestBundle(TRequest NativeRequest, IRequestBase Request) : HttpRequestBundle(NativeRequest, Request) + { + public async Task DeserializeBundleAsync(HttpResponseMessage httpResponse, CancellationToken cancellationToken = default) + { + var content = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); + + return JsonConvert.DeserializeObject(content) ?? throw new InvalidOperationException("Invalid Http Response Deserialization"); + } + + public override string ToString() + { + if (Request is IRequest singleRequest) + return $"Single {singleRequest.Operation}. Expecting '{typeof(TResponse).FullName}' type."; + else if (Request is IBatchChangeRequest batchChangeRequest) + return $"Batch {batchChangeRequest.Operation} for {batchChangeRequest.Items.Count()} items. Expecting '{typeof(TResponse).FullName}' type."; + else + return "Unknown http request bundle."; + } + } +} diff --git a/Wino.Core/Requests/Bundles/TaskRequestBundle.cs b/Wino.Core/Requests/Bundles/TaskRequestBundle.cs new file mode 100644 index 00000000..32b0991e --- /dev/null +++ b/Wino.Core/Requests/Bundles/TaskRequestBundle.cs @@ -0,0 +1,24 @@ +using System; +using System.Threading.Tasks; +using MailKit.Net.Imap; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Requests.Bundles +{ + //public abstract record TaskRequestBundleBase() + //{ + // public abstract Task ExecuteAsync(ImapClient executorImapClient); + //} + + //public record TaskRequestBundle(Func NativeRequest) : TaskRequestBundleBase + //{ + // public override async Task ExecuteAsync(ImapClient executorImapClient) => await NativeRequest(executorImapClient).ConfigureAwait(false); + //} + + public record ImapRequest(Func IntegratorTask, IRequestBase Request) { } + + public record ImapRequestBundle(ImapRequest NativeRequest, IRequestBase Request) : IRequestBundle + { + public string BundleId { get; set; } = Guid.NewGuid().ToString(); + } +} diff --git a/Wino.Core/Requests/ChangeFlagRequest.cs b/Wino.Core/Requests/ChangeFlagRequest.cs new file mode 100644 index 00000000..e7259c27 --- /dev/null +++ b/Wino.Core/Requests/ChangeFlagRequest.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record ChangeFlagRequest(MailCopy Item, bool IsFlagged) : RequestBase(Item, MailSynchronizerOperation.ChangeFlag), + ICustomFolderSynchronizationRequest + { + public List SynchronizationFolderIds => [Item.FolderId]; + + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchChangeFlagRequest(matchingItems, IsFlagged); + + public override void ApplyUIChanges() + { + Item.IsFlagged = IsFlagged; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(Item)); + } + + public override void RevertUIChanges() + { + Item.IsFlagged = !IsFlagged; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(Item)); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record BatchChangeFlagRequest(IEnumerable Items, bool IsFlagged) : BatchRequestBase(Items, MailSynchronizerOperation.ChangeFlag) + { + public override void ApplyUIChanges() + { + Items.ForEach(item => + { + item.Item.IsFlagged = IsFlagged; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(item.Item)); + }); + } + + public override void RevertUIChanges() + { + Items.ForEach(item => + { + item.Item.IsFlagged = !IsFlagged; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(item.Item)); + }); + } + } +} diff --git a/Wino.Core/Requests/CreateDraftRequest.cs b/Wino.Core/Requests/CreateDraftRequest.cs new file mode 100644 index 00000000..9887ed4a --- /dev/null +++ b/Wino.Core/Requests/CreateDraftRequest.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record CreateDraftRequest(DraftPreperationRequest DraftPreperationRequest) + : RequestBase(DraftPreperationRequest.CreatedLocalDraftCopy, MailSynchronizerOperation.CreateDraft), + ICustomFolderSynchronizationRequest + { + public List SynchronizationFolderIds => + [ + DraftPreperationRequest.CreatedLocalDraftCopy.AssignedFolder.Id + ]; + + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchCreateDraftRequest(matchingItems, DraftPreperationRequest); + + public override void ApplyUIChanges() + { + // No need for it since Draft folder is automatically navigated and draft item is added + selected. + // We only need to revert changes in case of network fails to create the draft. + } + + public override void RevertUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailRemovedMessage(Item)); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record class BatchCreateDraftRequest(IEnumerable Items, DraftPreperationRequest DraftPreperationRequest) + : BatchRequestBase(Items, MailSynchronizerOperation.CreateDraft) + { + public override void ApplyUIChanges() + { + // No need for it since Draft folder is automatically navigated and draft item is added + selected. + // We only need to revert changes in case of network fails to create the draft. + } + + public override void RevertUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailRemovedMessage(item.Item))); + } + } +} diff --git a/Wino.Core/Requests/DeleteRequest.cs b/Wino.Core/Requests/DeleteRequest.cs new file mode 100644 index 00000000..f8cf966d --- /dev/null +++ b/Wino.Core/Requests/DeleteRequest.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + /// + /// Hard delete request. This request will delete the mail item from the server without moving it to the trash folder. + /// + /// Item to delete permanently. + public record DeleteRequest(MailCopy MailItem) : RequestBase(MailItem, MailSynchronizerOperation.Delete), + ICustomFolderSynchronizationRequest + { + public List SynchronizationFolderIds => [Item.FolderId]; + + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchDeleteRequest(matchingItems); + + public override void ApplyUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailRemovedMessage(Item)); + } + + public override void RevertUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailAddedMessage(Item)); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record class BatchDeleteRequest(IEnumerable Items) : BatchRequestBase(Items, MailSynchronizerOperation.Delete) + { + public override void ApplyUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailRemovedMessage(item.Item))); + } + + public override void RevertUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailAddedMessage(item.Item))); + } + } +} diff --git a/Wino.Core/Requests/MarkReadRequest.cs b/Wino.Core/Requests/MarkReadRequest.cs new file mode 100644 index 00000000..c4f138a2 --- /dev/null +++ b/Wino.Core/Requests/MarkReadRequest.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record MarkReadRequest(MailCopy Item, bool IsRead) : RequestBase(Item, MailSynchronizerOperation.MarkRead), + ICustomFolderSynchronizationRequest + { + public List SynchronizationFolderIds => [Item.FolderId]; + + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchMarkReadRequest(matchingItems, IsRead); + + public override void ApplyUIChanges() + { + Item.IsRead = IsRead; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(Item)); + } + + public override void RevertUIChanges() + { + Item.IsRead = !IsRead; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(Item)); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record BatchMarkReadRequest(IEnumerable Items, bool IsRead) : BatchRequestBase(Items, MailSynchronizerOperation.MarkRead) + { + public override void ApplyUIChanges() + { + Items.ForEach(item => + { + item.Item.IsRead = IsRead; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(item.Item)); + }); + } + + public override void RevertUIChanges() + { + Items.ForEach(item => + { + item.Item.IsRead = !IsRead; + + WeakReferenceMessenger.Default.Send(new MailUpdatedMessage(item.Item)); + }); + } + } +} diff --git a/Wino.Core/Requests/MoveRequest.cs b/Wino.Core/Requests/MoveRequest.cs new file mode 100644 index 00000000..bbae7f74 --- /dev/null +++ b/Wino.Core/Requests/MoveRequest.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record MoveRequest(MailCopy Item, MailItemFolder FromFolder, MailItemFolder ToFolder) + : RequestBase(Item, MailSynchronizerOperation.Move), ICustomFolderSynchronizationRequest + { + public List SynchronizationFolderIds => new() { FromFolder.Id, ToFolder.Id }; + + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchMoveRequest(matchingItems, FromFolder, ToFolder); + + public override void ApplyUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailRemovedMessage(Item)); + } + + public override void RevertUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailAddedMessage(Item)); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record BatchMoveRequest(IEnumerable Items, MailItemFolder FromFolder, MailItemFolder ToFolder) : BatchRequestBase(Items, MailSynchronizerOperation.Move) + { + public override void ApplyUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailRemovedMessage(item.Item))); + } + + public override void RevertUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailAddedMessage(item.Item))); + } + } +} diff --git a/Wino.Core/Requests/MoveToFocusedRequest.cs b/Wino.Core/Requests/MoveToFocusedRequest.cs new file mode 100644 index 00000000..42edefe0 --- /dev/null +++ b/Wino.Core/Requests/MoveToFocusedRequest.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record MoveToFocusedRequest(MailCopy Item, bool MoveToFocused) : RequestBase(Item, MailSynchronizerOperation.Move) + { + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchMoveToFocusedRequest(matchingItems, MoveToFocused); + + public override void ApplyUIChanges() { } + + public override void RevertUIChanges() { } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record BatchMoveToFocusedRequest(IEnumerable Items, bool MoveToFocused) : BatchRequestBase(Items, MailSynchronizerOperation.Move) + { + public override void ApplyUIChanges() { } + + public override void RevertUIChanges() { } + } +} diff --git a/Wino.Core/Requests/RenameFolderRequest.cs b/Wino.Core/Requests/RenameFolderRequest.cs new file mode 100644 index 00000000..6b431101 --- /dev/null +++ b/Wino.Core/Requests/RenameFolderRequest.cs @@ -0,0 +1,19 @@ +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record RenameFolderRequest(MailItemFolder Folder) : FolderRequestBase(Folder, MailSynchronizerOperation.RenameFolder) + { + public override void ApplyUIChanges() + { + + } + + public override void RevertUIChanges() + { + + } + } +} diff --git a/Wino.Core/Requests/SendDraftRequest.cs b/Wino.Core/Requests/SendDraftRequest.cs new file mode 100644 index 00000000..4f3ce10e --- /dev/null +++ b/Wino.Core/Requests/SendDraftRequest.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record SendDraftRequest(SendDraftPreparationRequest Request) : RequestBase(Request.MailItem, MailSynchronizerOperation.Send) + { + public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) + => new BatchSendDraftRequestRequest(matchingItems, Request); + + public override void ApplyUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailRemovedMessage(Item)); + } + + public override void RevertUIChanges() + { + WeakReferenceMessenger.Default.Send(new MailAddedMessage(Item)); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public record BatchSendDraftRequestRequest(IEnumerable Items, SendDraftPreparationRequest Request) : BatchRequestBase(Items, MailSynchronizerOperation.Send) + { + public override void ApplyUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailRemovedMessage(item.Item))); + } + + public override void RevertUIChanges() + { + Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailAddedMessage(item.Item))); + } + } +} diff --git a/Wino.Core/Requests/UIMessages.cs b/Wino.Core/Requests/UIMessages.cs new file mode 100644 index 00000000..f47c7644 --- /dev/null +++ b/Wino.Core/Requests/UIMessages.cs @@ -0,0 +1,25 @@ +using System; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Requests +{ + public record MailAddedMessage(MailCopy AddedMail) : IUIMessage; + public record MailRemovedMessage(MailCopy RemovedMail) : IUIMessage; + public record MailUpdatedMessage(MailCopy UpdatedMail) : IUIMessage; + public record MailDownloadedMessage(MailCopy DownloadedMail) : IUIMessage; + + public record FolderAddedMessage(MailItemFolder AddedFolder, MailAccount Account) : IUIMessage; + public record FolderRemovedMessage(MailItemFolder RemovedFolder, MailAccount Account) : IUIMessage; + public record FolderUpdatedMessage(MailItemFolder UpdatedFolder, MailAccount Account) : IUIMessage; + + public record AccountCreatedMessage(MailAccount Account) : IUIMessage; + public record AccountRemovedMessage(MailAccount Account) : IUIMessage; + public record AccountUpdatedMessage(MailAccount Account) : IUIMessage; + + public record DraftCreated(MailCopy DraftMail, MailAccount Account) : IUIMessage; + public record DraftFailed(MailCopy DraftMail, MailAccount Account) : IUIMessage; + public record DraftMapped(string LocalDraftCopyId, string RemoteDraftCopyId) : IUIMessage; + + public record MergedInboxRenamed(Guid MergedInboxId, string NewName) : IUIMessage; +} diff --git a/Wino.Core/Services/AccountService.cs b/Wino.Core/Services/AccountService.cs new file mode 100644 index 00000000..850139f2 --- /dev/null +++ b/Wino.Core/Services/AccountService.cs @@ -0,0 +1,403 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Diagnostics; +using CommunityToolkit.Mvvm.Messaging; +using Serilog; +using SqlKata; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Extensions; +using Wino.Core.Messages.Accounts; +using Wino.Core.Requests; + +namespace Wino.Core.Services +{ + public class AccountService : BaseDatabaseService, IAccountService + { + public IAuthenticator ExternalAuthenticationAuthenticator { get; set; } + + private readonly IAuthenticationProvider _authenticationProvider; + private readonly ISignatureService _signatureService; + private readonly IPreferencesService _preferencesService; + + private readonly ILogger _logger = Log.ForContext(); + + public AccountService(IDatabaseService databaseService, + IAuthenticationProvider authenticationProvider, + ISignatureService signatureService, + IPreferencesService preferencesService) : base(databaseService) + { + _authenticationProvider = authenticationProvider; + _signatureService = signatureService; + _preferencesService = preferencesService; + } + + + public async Task ClearAccountAttentionAsync(Guid accountId) + { + var account = await GetAccountAsync(accountId); + + Guard.IsNotNull(account); + + account.AttentionReason = AccountAttentionReason.None; + + await UpdateAccountAsync(account); + } + + public async Task UpdateMergedInboxAsync(Guid mergedInboxId, IEnumerable linkedAccountIds) + { + // First, remove all accounts from merged inbox. + await Connection.ExecuteAsync("UPDATE MailAccount SET MergedInboxId = NULL WHERE MergedInboxId = ?", mergedInboxId); + + // Then, add new accounts to merged inbox. + var query = new Query("MailAccount") + .WhereIn("Id", linkedAccountIds) + .AsUpdate(new + { + MergedInboxId = mergedInboxId + }); + + await Connection.ExecuteAsync(query.GetRawQuery()); + + WeakReferenceMessenger.Default.Send(new AccountsMenuRefreshRequested()); + } + + public async Task UnlinkMergedInboxAsync(Guid mergedInboxId) + { + var mergedInbox = await Connection.Table().FirstOrDefaultAsync(a => a.Id == mergedInboxId).ConfigureAwait(false); + + if (mergedInbox == null) + { + _logger.Warning("Could not find merged inbox with id {MergedInboxId}", mergedInboxId); + + return; + } + + var query = new Query("MailAccount") + .Where("MergedInboxId", mergedInboxId) + .AsUpdate(new + { + MergedInboxId = (Guid?)null + }); + + await Connection.ExecuteAsync(query.GetRawQuery()).ConfigureAwait(false); + await Connection.DeleteAsync(mergedInbox).ConfigureAwait(false); + + // Change the startup entity id if it was the merged inbox. + // Take the first account as startup account. + + if (_preferencesService.StartupEntityId == mergedInboxId) + { + var firstAccount = await Connection.Table().FirstOrDefaultAsync(); + + if (firstAccount != null) + { + _preferencesService.StartupEntityId = firstAccount.Id; + } + else + { + _preferencesService.StartupEntityId = null; + } + } + + WeakReferenceMessenger.Default.Send(new AccountsMenuRefreshRequested()); + } + + public async Task CreateMergeAccountsAsync(MergedInbox mergedInbox, IEnumerable accountsToMerge) + { + if (mergedInbox == null) return; + + // 0. Give the merged inbox a new Guid. + mergedInbox.Id = Guid.NewGuid(); + + var accountFolderDictionary = new Dictionary>(); + + // 1. Make all folders in the accounts unsticky. We will stick them based on common special folder types. + foreach (var account in accountsToMerge) + { + var accountFolderList = new List(); + + var folders = await Connection.Table().Where(a => a.MailAccountId == account.Id).ToListAsync(); + + foreach (var folder in folders) + { + accountFolderList.Add(folder); + folder.IsSticky = false; + + await Connection.UpdateAsync(folder); + } + + accountFolderDictionary.Add(account, accountFolderList); + } + + // 2. Find the common special folders and stick them. + // Only following types will be considered as common special folder. + SpecialFolderType[] commonSpecialTypes = + [ + SpecialFolderType.Inbox, + SpecialFolderType.Sent, + SpecialFolderType.Draft, + SpecialFolderType.Archive, + SpecialFolderType.Junk, + SpecialFolderType.Deleted + ]; + + foreach (var type in commonSpecialTypes) + { + var isCommonType = accountFolderDictionary + .Select(a => a.Value) + .Where(a => a.Any(a => a.SpecialFolderType == type)) + .Count() == accountsToMerge.Count(); + + if (isCommonType) + { + foreach (var account in accountsToMerge) + { + var folder = accountFolderDictionary[account].FirstOrDefault(a => a.SpecialFolderType == type); + + if (folder != null) + { + folder.IsSticky = true; + + await Connection.UpdateAsync(folder); + } + } + } + } + + // 3. Insert merged inbox and assign accounts. + await Connection.InsertAsync(mergedInbox); + + foreach (var account in accountsToMerge) + { + account.MergedInboxId = mergedInbox.Id; + + await Connection.UpdateAsync(account); + } + + WeakReferenceMessenger.Default.Send(new AccountsMenuRefreshRequested()); + } + + public async Task RenameMergedAccountAsync(Guid mergedInboxId, string newName) + { + var query = new Query("MergedInbox") + .Where("Id", mergedInboxId) + .AsUpdate(new + { + Name = newName + }); + + await Connection.ExecuteAsync(query.GetRawQuery()); + + ReportUIChange(new MergedInboxRenamed(mergedInboxId, newName)); + } + + public async Task FixTokenIssuesAsync(Guid accountId) + { + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + if (account == null) return; + + var authenticator = _authenticationProvider.GetAuthenticator(account.ProviderType); + + // This will re-generate token. + var token = await authenticator.GenerateTokenAsync(account, true); + + Guard.IsNotNull(token); + } + + private Task GetAccountPreferencesAsync(Guid accountId) + => Connection.Table().FirstOrDefaultAsync(a => a.AccountId == accountId); + + public async Task> GetAccountsAsync() + { + var accounts = await Connection.Table().ToListAsync(); + + foreach (var account in accounts) + { + // Load IMAP server configuration. + if (account.ProviderType == MailProviderType.IMAP4) + account.ServerInformation = await GetAccountCustomServerInformationAsync(account.Id); + + // Load MergedInbox information. + if (account.MergedInboxId != null) + account.MergedInbox = await GetMergedInboxInformationAsync(account.MergedInboxId.Value); + + account.Preferences = await GetAccountPreferencesAsync(account.Id); + } + + return accounts; + } + + private Task GetMergedInboxInformationAsync(Guid mergedInboxId) + => Connection.Table().FirstOrDefaultAsync(a => a.Id == mergedInboxId); + + public async Task DeleteAccountAsync(MailAccount account) + { + // TODO: Delete mime messages and attachments. + + await Connection.ExecuteAsync("DELETE FROM MailCopy WHERE Id IN(SELECT Id FROM MailCopy WHERE FolderId IN (SELECT Id from MailItemFolder WHERE MailAccountId == ?))", account.Id); + + await Connection.Table().Where(a => a.AccountId == account.Id).DeleteAsync(); + await Connection.Table().DeleteAsync(a => a.MailAccountId == account.Id); + + if (account.SignatureId != null) + await Connection.Table().DeleteAsync(a => a.Id == account.SignatureId); + + // Account belongs to a merged inbox. + // In case of there'll be a single account in the merged inbox, remove the merged inbox as well. + + if (account.MergedInboxId != null) + { + var mergedInboxAccountCount = await Connection.Table().Where(a => a.MergedInboxId == account.MergedInboxId.Value).CountAsync(); + + // There will be only one account in the merged inbox. Remove the link for the other account as well. + if (mergedInboxAccountCount == 2) + { + var query = new Query("MailAccount") + .Where("MergedInboxId", account.MergedInboxId.Value) + .AsUpdate(new + { + MergedInboxId = (Guid?)null + }); + + await Connection.ExecuteAsync(query.GetRawQuery()).ConfigureAwait(false); + } + } + + if (account.ProviderType == MailProviderType.IMAP4) + await Connection.Table().DeleteAsync(a => a.AccountId == account.Id); + + if (account.Preferences != null) + await Connection.DeleteAsync(account.Preferences); + + await Connection.DeleteAsync(account); + + // Clear out or set up a new startup entity id. + // Next account after the deleted one will be the startup account. + + if (_preferencesService.StartupEntityId == account.Id || _preferencesService.StartupEntityId == account.MergedInboxId) + { + var firstNonStartupAccount = await Connection.Table().FirstOrDefaultAsync(a => a.Id != account.Id); + + if (firstNonStartupAccount != null) + { + _preferencesService.StartupEntityId = firstNonStartupAccount.Id; + } + else + { + _preferencesService.StartupEntityId = null; + } + } + + ReportUIChange(new AccountRemovedMessage(account)); + } + + public async Task GetAccountAsync(Guid accountId) + { + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + if (account?.ProviderType == MailProviderType.IMAP4) + account.ServerInformation = await GetAccountCustomServerInformationAsync(account.Id); + + account.Preferences = await GetAccountPreferencesAsync(account.Id); + + return account; + } + + public Task GetAccountCustomServerInformationAsync(Guid accountId) + => Connection.Table().FirstOrDefaultAsync(a => a.AccountId == accountId); + + public async Task UpdateAccountAsync(MailAccount account) + { + if (account.Preferences == null) + { + Debugger.Break(); + } + + await Connection.UpdateAsync(account.Preferences); + await Connection.UpdateAsync(account); + + ReportUIChange(new AccountUpdatedMessage(account)); + } + + public async Task CreateAccountAsync(MailAccount account, TokenInformation tokenInformation, CustomServerInformation customServerInformation) + { + Guard.IsNotNull(account); + + var accountCount = await Connection.Table().CountAsync(); + + // If there are no accounts before this one, set it as startup account. + if (accountCount == 0) + { + _preferencesService.StartupEntityId = account.Id; + } + + await Connection.InsertAsync(account); + + var preferences = new MailAccountPreferences() + { + Id = Guid.NewGuid(), + AccountId = account.Id, + IsNotificationsEnabled = true, + ShouldAppendMessagesToSentFolder = false + }; + + account.Preferences = preferences; + + // Outlook & Office 365 supports Focused inbox. Enabled by default. + bool isMicrosoftProvider = account.ProviderType == MailProviderType.Outlook || account.ProviderType == MailProviderType.Office365; + + if (isMicrosoftProvider) + account.Preferences.IsFocusedInboxEnabled = true; + + await Connection.InsertAsync(preferences); + + // Create default signature. + var defaultSignature = await _signatureService.CreateDefaultSignatureAsync(account.Id); + + account.SignatureId = defaultSignature.Id; + + if (customServerInformation != null) + await Connection.InsertAsync(customServerInformation); + + if (tokenInformation != null) + await Connection.InsertAsync(tokenInformation); + } + + public async Task UpdateSynchronizationIdentifierAsync(Guid accountId, string newIdentifier) + { + var account = await GetAccountAsync(accountId); + + if (account == null) + { + _logger.Error("Could not find account with id {AccountId}", accountId); + return string.Empty; + } + + var currentIdentifier = account.SynchronizationDeltaIdentifier; + + bool shouldUpdateIdentifier = account.ProviderType == MailProviderType.Gmail ? + ((string.IsNullOrEmpty(currentIdentifier) ? true : !string.IsNullOrEmpty(currentIdentifier) + && ulong.TryParse(currentIdentifier, out ulong currentIdentifierValue) + && ulong.TryParse(newIdentifier, out ulong newIdentifierValue) + && newIdentifierValue > currentIdentifierValue)) : true; + + if (shouldUpdateIdentifier) + { + _logger.Debug("Updating synchronization identifier for {Name}. From: {SynchronizationDeltaIdentifier} To: {NewIdentifier}", account.Name, account.SynchronizationDeltaIdentifier, newIdentifier); + account.SynchronizationDeltaIdentifier = newIdentifier; + + await UpdateAccountAsync(account); + } + + return account.SynchronizationDeltaIdentifier; + } + + + } +} diff --git a/Wino.Core/Services/AuthenticationProvider.cs b/Wino.Core/Services/AuthenticationProvider.cs new file mode 100644 index 00000000..20c78bcc --- /dev/null +++ b/Wino.Core/Services/AuthenticationProvider.cs @@ -0,0 +1,34 @@ +using System; +using Wino.Core.Authenticators; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using IAuthenticationProvider = Wino.Core.Domain.Interfaces.IAuthenticationProvider; + +namespace Wino.Core.Services +{ + public class AuthenticationProvider : IAuthenticationProvider + { + private readonly INativeAppService _nativeAppService; + private readonly ITokenService _tokenService; + + public AuthenticationProvider(INativeAppService nativeAppService, ITokenService tokenService) + { + _nativeAppService = nativeAppService; + _tokenService = tokenService; + } + + public IAuthenticator GetAuthenticator(MailProviderType providerType) + { + return providerType switch + { + MailProviderType.Outlook => new OutlookAuthenticator(_tokenService, _nativeAppService), + MailProviderType.Office365 => new Office365Authenticator(_tokenService, _nativeAppService), + MailProviderType.Gmail => new GmailAuthenticator(_tokenService, _nativeAppService), + MailProviderType.Yahoo => new YahooAuthenticator(_tokenService), + MailProviderType.IMAP4 => new CustomAuthenticator(_tokenService), + _ => throw new ArgumentException(Translator.Exception_UnsupportedProvider), + }; + } + } +} diff --git a/Wino.Core/Services/AutoDiscoveryService.cs b/Wino.Core/Services/AutoDiscoveryService.cs new file mode 100644 index 00000000..c788b130 --- /dev/null +++ b/Wino.Core/Services/AutoDiscoveryService.cs @@ -0,0 +1,56 @@ +using System; +using System.Net.Http; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Serilog; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.AutoDiscovery; + +namespace Wino.Core.Services +{ + /// + /// We have 2 methods to do auto discovery. + /// 1. Use https://emailsettings.firetrust.com/settings?q={address} API + /// 2. TODO: Thunderbird auto discovery file. + /// + public class AutoDiscoveryService : IAutoDiscoveryService + { + private const string FiretrustURL = " https://emailsettings.firetrust.com/settings?q="; + + // TODO: Try Thunderbird Auto Discovery as second approach. + + public Task GetAutoDiscoverySettings(AutoDiscoveryMinimalSettings autoDiscoveryMinimalSettings) + => GetSettingsFromFiretrustAsync(autoDiscoveryMinimalSettings.Email); + + private async Task GetSettingsFromFiretrustAsync(string mailAddress) + { + using var client = new HttpClient(); + var response = await client.GetAsync($"{FiretrustURL}{mailAddress}"); + + if (response.IsSuccessStatusCode) + return await DeserializeFiretrustResponse(response); + else + { + Log.Warning($"Firetrust AutoDiscovery failed. ({response.StatusCode})"); + + return null; + } + } + + private async Task DeserializeFiretrustResponse(HttpResponseMessage response) + { + try + { + var content = await response.Content.ReadAsStringAsync(); + + return JsonConvert.DeserializeObject(content); + } + catch (Exception ex) + { + Log.Error(ex, "Failed to deserialize Firetrust response."); + } + + return null; + } + } +} diff --git a/Wino.Core/Services/BaseDatabaseService.cs b/Wino.Core/Services/BaseDatabaseService.cs new file mode 100644 index 00000000..cd0136e2 --- /dev/null +++ b/Wino.Core/Services/BaseDatabaseService.cs @@ -0,0 +1,22 @@ +using CommunityToolkit.Mvvm.Messaging; +using SQLite; +using Wino.Core.Domain.Models.Requests; + +namespace Wino.Core.Services +{ + public class BaseDatabaseService + { + protected IMessenger Messenger => WeakReferenceMessenger.Default; + protected SQLiteAsyncConnection Connection => _databaseService.Connection; + + private readonly IDatabaseService _databaseService; + + public BaseDatabaseService(IDatabaseService databaseService) + { + _databaseService = databaseService; + } + + public void ReportUIChange(TMessage message) where TMessage : class, IUIMessage + => Messenger.Send(message); + } +} diff --git a/Wino.Core/Services/ContactService.cs b/Wino.Core/Services/ContactService.cs new file mode 100644 index 00000000..889c141f --- /dev/null +++ b/Wino.Core/Services/ContactService.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MimeKit; +using SqlKata; +using Wino.Core.Domain.Entities; +using Wino.Core.Extensions; + +namespace Wino.Core.Services +{ + public interface IContactService + { + Task> GetAddressInformationAsync(string queryText); + Task GetAddressInformationByAddressAsync(string address); + Task SaveAddressInformationAsync(MimeMessage message); + } + + public class ContactService : BaseDatabaseService, IContactService + { + public ContactService(IDatabaseService databaseService) : base(databaseService) { } + + public Task> GetAddressInformationAsync(string queryText) + { + if (queryText == null || queryText.Length < 2) + return Task.FromResult>(null); + + var query = new Query(nameof(AddressInformation)); + query.WhereContains("Address", queryText); + query.OrWhereContains("Name", queryText); + + var rawLikeQuery = query.GetRawQuery(); + + return Connection.QueryAsync(rawLikeQuery); + } + + public async Task GetAddressInformationByAddressAsync(string address) + { + return await Connection.Table().Where(a => a.Address == address).FirstOrDefaultAsync() + ?? new AddressInformation() { Name = address, Address = address }; + } + + public async Task SaveAddressInformationAsync(MimeMessage message) + { + var recipients = message + .GetRecipients(true) + .Where(a => !string.IsNullOrEmpty(a.Name) && !string.IsNullOrEmpty(a.Address)); + + var addressInformations = recipients.Select(a => new AddressInformation() { Name = a.Name, Address = a.Address }); + + foreach (var info in addressInformations) + await Connection.InsertOrReplaceAsync(info).ConfigureAwait(false); + } + } +} diff --git a/Wino.Core/Services/ContextMenuItemService.cs b/Wino.Core/Services/ContextMenuItemService.cs new file mode 100644 index 00000000..3c1040fe --- /dev/null +++ b/Wino.Core/Services/ContextMenuItemService.cs @@ -0,0 +1,182 @@ +using System.Collections.Generic; +using System.Linq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.Core.Services +{ + public class ContextMenuItemService : IContextMenuItemService + { + public virtual IEnumerable GetFolderContextMenuActions(IBaseFolderMenuItem folderInformation) + { + var list = new List(); + + if (folderInformation.IsSticky) + list.Add(FolderOperationMenuItem.Create(FolderOperation.Unpin)); + else + list.Add(FolderOperationMenuItem.Create(FolderOperation.Pin)); + + list.Add(FolderOperationMenuItem.Create(FolderOperation.Seperator)); + + // Following 4 items are disabled for system folders. + + list.Add(FolderOperationMenuItem.Create(FolderOperation.Rename, !folderInformation.IsSystemFolder)); + list.Add(FolderOperationMenuItem.Create(FolderOperation.Delete, !folderInformation.IsSystemFolder)); + list.Add(FolderOperationMenuItem.Create(FolderOperation.CreateSubFolder, !folderInformation.IsSystemFolder)); + + list.Add(FolderOperationMenuItem.Create(FolderOperation.Seperator)); + + list.Add(FolderOperationMenuItem.Create(FolderOperation.Empty)); + + list.Add(FolderOperationMenuItem.Create(FolderOperation.MarkAllAsRead)); + + return list; + } + public virtual IEnumerable GetMailItemContextMenuActions(IEnumerable selectedMailItems) + { + if (selectedMailItems == null) + return default; + + var operationList = new List(); + + // Disable archive button for Archive folder itself. + + bool isArchiveFolder = selectedMailItems.All(a => a.AssignedFolder.SpecialFolderType == SpecialFolderType.Archive); + bool isDraftOrSent = selectedMailItems.All(a => a.AssignedFolder.SpecialFolderType == SpecialFolderType.Draft || a.AssignedFolder.SpecialFolderType == SpecialFolderType.Sent); + bool isJunkFolder = selectedMailItems.All(a => a.AssignedFolder.SpecialFolderType == SpecialFolderType.Junk); + + bool isSingleItem = selectedMailItems.Count() == 1; + + IMailItem singleItem = selectedMailItems.FirstOrDefault(); + + // Archive button. + + if (isArchiveFolder) + operationList.Add(MailOperationMenuItem.Create(MailOperation.UnArchive)); + else + operationList.Add(MailOperationMenuItem.Create(MailOperation.Archive)); + + // Delete button. + operationList.Add(MailOperationMenuItem.Create(MailOperation.SoftDelete)); + + // Move button. + operationList.Add(MailOperationMenuItem.Create(MailOperation.Move, !isDraftOrSent)); + + // Independent flag, read etc. + if (isSingleItem) + { + if (singleItem.IsFlagged) + operationList.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag)); + else + operationList.Add(MailOperationMenuItem.Create(MailOperation.SetFlag)); + + if (singleItem.IsRead) + operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread)); + else + operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsRead)); + } + else + { + bool isAllFlagged = selectedMailItems.All(a => a.IsFlagged); + bool isAllRead = selectedMailItems.All(a => a.IsRead); + bool isAllUnread = selectedMailItems.All(a => !a.IsRead); + + if (isAllRead) + operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread)); + else + { + if (!isAllUnread) + operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread)); + + operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsRead)); + } + + if (isAllFlagged) + operationList.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag)); + else + { + operationList.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag)); + operationList.Add(MailOperationMenuItem.Create(MailOperation.SetFlag)); + } + } + + // Ignore + if (!isDraftOrSent) + operationList.Add(MailOperationMenuItem.Create(MailOperation.Ignore)); + + // Seperator + operationList.Add(MailOperationMenuItem.Create(MailOperation.Seperator)); + + // Junk folder + if (isJunkFolder) + operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsNotJunk)); + else if (!isDraftOrSent) + operationList.Add(MailOperationMenuItem.Create(MailOperation.MoveToJunk)); + + // TODO: Focus folder support. + + // Remove the separator if it's the last item remaining. + // It's creating unpleasent UI glitch. + + if (operationList.LastOrDefault()?.Operation == MailOperation.Seperator) + operationList.RemoveAt(operationList.Count - 1); + + return operationList; + } + public virtual IEnumerable GetMailItemRenderMenuActions(IMailItem mailItem, bool isDarkEditor) + { + var actionList = new List(); + + bool isArchiveFolder = mailItem.AssignedFolder.SpecialFolderType == SpecialFolderType.Archive; + + // Add light/dark editor theme switch. + if (isDarkEditor) + actionList.Add(MailOperationMenuItem.Create(MailOperation.LightEditor)); + else + actionList.Add(MailOperationMenuItem.Create(MailOperation.DarkEditor)); + + actionList.Add(MailOperationMenuItem.Create(MailOperation.Seperator)); + + // You can't do these to draft items. + if (!mailItem.IsDraft) + { + // Reply + actionList.Add(MailOperationMenuItem.Create(MailOperation.Reply)); + + // Reply All + actionList.Add(MailOperationMenuItem.Create(MailOperation.ReplyAll)); + + // Forward + actionList.Add(MailOperationMenuItem.Create(MailOperation.Forward)); + } + + // Archive - Unarchive + if (isArchiveFolder) + actionList.Add(MailOperationMenuItem.Create(MailOperation.UnArchive)); + else + actionList.Add(MailOperationMenuItem.Create(MailOperation.Archive)); + + // Delete + actionList.Add(MailOperationMenuItem.Create(MailOperation.SoftDelete)); + + // Flag - Clear Flag + if (mailItem.IsFlagged) + actionList.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag)); + else + actionList.Add(MailOperationMenuItem.Create(MailOperation.SetFlag)); + + // Secondary items. + + // Read - Unread + if (mailItem.IsRead) + actionList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread, true, false)); + else + actionList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsRead, true, false)); + + return actionList; + } + } +} diff --git a/Wino.Core/Services/DatabaseService.cs b/Wino.Core/Services/DatabaseService.cs new file mode 100644 index 00000000..759df13d --- /dev/null +++ b/Wino.Core/Services/DatabaseService.cs @@ -0,0 +1,69 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using SQLite; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Services +{ + public interface IDatabaseService : IInitializeAsync + { + SQLiteAsyncConnection Connection { get; } + } + + public class DatabaseService : IDatabaseService + { + private string DatabaseName => "Wino.db"; + + private bool _isInitialized = false; + private readonly IAppInitializerService _appInitializerService; + + public SQLiteAsyncConnection Connection { get; private set; } + + public DatabaseService(IAppInitializerService appInitializerService) + { + _appInitializerService = appInitializerService; + } + + public async Task InitializeAsync() + { + if (_isInitialized) + return; + + var applicationData = _appInitializerService.GetApplicationDataFolder(); + var databaseFileName = Path.Combine(applicationData, DatabaseName); + + Connection = new SQLiteAsyncConnection(databaseFileName) + { + // Enable for debugging sqlite. + Trace = true, + Tracer = new Action((t) => + { + // Debug.WriteLine(t); + // Log.Debug(t); + }) + }; + + + await CreateTablesAsync(); + + _isInitialized = true; + } + + private async Task CreateTablesAsync() + { + await Connection.CreateTablesAsync(CreateFlags.None, + typeof(MailCopy), + typeof(MailItemFolder), + typeof(MailAccount), + typeof(TokenInformation), + typeof(AddressInformation), + typeof(CustomServerInformation), + typeof(AccountSignature), + typeof(MergedInbox), + typeof(MailAccountPreferences) + ); + } + } +} diff --git a/Wino.Core/Services/FolderService.cs b/Wino.Core/Services/FolderService.cs new file mode 100644 index 00000000..07449f1b --- /dev/null +++ b/Wino.Core/Services/FolderService.cs @@ -0,0 +1,592 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MoreLinq; +using Serilog; +using SqlKata; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Extensions; +using Wino.Core.Requests; + +namespace Wino.Core.Services +{ + public class FolderService : BaseDatabaseService, IFolderService + { + private readonly IAccountService _accountService; + private readonly IMimeFileService _mimeFileService; + private readonly ILogger _logger = Log.ForContext(); + + private readonly SpecialFolderType[] gmailCategoryFolderTypes = + [ + SpecialFolderType.Promotions, + SpecialFolderType.Social, + SpecialFolderType.Updates, + SpecialFolderType.Forums, + SpecialFolderType.Personal + ]; + + public FolderService(IDatabaseService databaseService, + IAccountService accountService, + IMimeFileService mimeFileService) : base(databaseService) + { + _accountService = accountService; + _mimeFileService = mimeFileService; + } + + public async Task ChangeStickyStatusAsync(Guid folderId, bool isSticky) + => await Connection.ExecuteAsync("UPDATE MailItemFolder SET IsSticky = ? WHERE Id = ?", isSticky, folderId); + + public async Task GetFolderNotificationBadgeAsync(Guid folderId) + { + var folder = await GetFolderAsync(folderId); + + if (folder == null || !folder.ShowUnreadCount) return default; + + var account = await _accountService.GetAccountAsync(folder.MailAccountId); + + if (account == null) return default; + + var query = new Query("MailCopy") + .Where("FolderId", folderId) + .SelectRaw("count (DISTINCT Id)"); + + // If focused inbox is enabled, we need to check if this is the inbox folder. + if (account.Preferences.IsFocusedInboxEnabled.GetValueOrDefault() && folder.SpecialFolderType == SpecialFolderType.Inbox) + { + query.Where("IsFocused", 1); + } + + // Draft and Junk folders are not counted as unread. They must return the item count instead. + + if (folder.SpecialFolderType != SpecialFolderType.Draft || folder.SpecialFolderType != SpecialFolderType.Junk) + { + query.Where("IsRead", 0); + } + + return await Connection.ExecuteScalarAsync(query.GetRawQuery()); + } + + public async Task GetFolderStructureForAccountAsync(Guid accountId, bool includeHiddenFolders) + { + var account = await _accountService.GetAccountAsync(accountId); + + if (account == null) + throw new ArgumentException(nameof(account)); + + var accountTree = new AccountFolderTree(account); + + // Account folders. + var folderQuery = Connection.Table().Where(a => a.MailAccountId == accountId); + + if (!includeHiddenFolders) + folderQuery = folderQuery.Where(a => !a.IsHidden); + + // Load child folders for each folder. + var allFolders = await folderQuery.OrderBy(a => a.SpecialFolderType).ToListAsync(); + + if (allFolders.Any()) + { + // Get sticky folders. Category type is always sticky. + // Sticky folders don't have tree structure. So they can be added to the main tree. + var stickyFolders = allFolders.Where(a => a.IsSticky && a.SpecialFolderType != SpecialFolderType.Category); + + foreach (var stickyFolder in stickyFolders) + { + var childStructure = await GetChildFolderItemsRecursiveAsync(stickyFolder.Id, accountId); + + accountTree.Folders.Add(childStructure); + } + + // Check whether we need special 'Categories' kind of folder. + var categoryExists = allFolders.Any(a => a.SpecialFolderType == SpecialFolderType.Category); + + if (categoryExists) + { + var categoryFolder = allFolders.First(a => a.SpecialFolderType == SpecialFolderType.Category); + + // Construct category items under pinned items. + var categoryFolders = allFolders.Where(a => gmailCategoryFolderTypes.Contains(a.SpecialFolderType)); + + foreach (var categoryFolderSubItem in categoryFolders) + { + categoryFolder.ChildFolders.Add(categoryFolderSubItem); + } + + accountTree.Folders.Add(categoryFolder); + allFolders.Remove(categoryFolder); + } + + // Move rest of the items into virtual More folder if any. + var nonStickyFolders = allFolders.Except(stickyFolders); + + if (nonStickyFolders.Any()) + { + var virtualMoreFolder = new MailItemFolder() + { + FolderName = Translator.More, + SpecialFolderType = SpecialFolderType.More + }; + + foreach (var unstickyItem in nonStickyFolders) + { + if (account.ProviderType == MailProviderType.Gmail) + { + // Gmail requires this check to not include child folders as + // separate folder without their parent for More folder... + + if (!string.IsNullOrEmpty(unstickyItem.ParentRemoteFolderId)) + continue; + } + else if (account.ProviderType == MailProviderType.Outlook || account.ProviderType == MailProviderType.Office365) + { + bool belongsToExistingParent = (await Connection + .Table() + .Where(a => unstickyItem.ParentRemoteFolderId == a.RemoteFolderId) + .CountAsync()) > 0; + + // No need to include this as unsticky. + if (belongsToExistingParent) continue; + } + + var structure = await GetChildFolderItemsRecursiveAsync(unstickyItem.Id, accountId); + + virtualMoreFolder.ChildFolders.Add(structure); + } + + // Only add more if there are any. + if (virtualMoreFolder.ChildFolders.Count > 0) + accountTree.Folders.Add(virtualMoreFolder); + } + } + + return accountTree; + } + + private async Task GetChildFolderItemsRecursiveAsync(Guid folderId, Guid accountId) + { + var folder = await Connection.Table().Where(a => a.Id == folderId && a.MailAccountId == accountId).FirstOrDefaultAsync(); + + if (folder == null) + return null; + + var childFolders = await Connection.Table() + .Where(a => a.ParentRemoteFolderId == folder.RemoteFolderId && a.MailAccountId == folder.MailAccountId) + .ToListAsync(); + + foreach (var childFolder in childFolders) + { + var subChild = await GetChildFolderItemsRecursiveAsync(childFolder.Id, accountId); + folder.ChildFolders.Add(subChild); + } + + return folder; + } + + public async Task GetSpecialFolderByAccountIdAsync(Guid accountId, SpecialFolderType type) + => await Connection.Table().FirstOrDefaultAsync(a => a.MailAccountId == accountId && a.SpecialFolderType == type); + + public async Task GetFolderAsync(Guid folderId) + => await Connection.Table().FirstOrDefaultAsync(a => a.Id.Equals(folderId)); + + public Task GetCurrentItemCountForFolder(Guid folderId) + => Connection.Table().Where(a => a.FolderId == folderId).CountAsync(); + + public Task> GetFoldersAsync(Guid accountId) + => Connection.Table().Where(a => a.MailAccountId == accountId).ToListAsync(); + + public async Task UpdateCustomServerMailListAsync(Guid accountId, List folders) + { + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + if (account == null) + return; + + // IMAP servers don't have unique identifier for folders all the time. + // We'll map them with parent-name relation. + + var currentFolders = await GetFoldersAsync(accountId); + + // These folders don't exist anymore. Remove them. + var localRemoveFolders = currentFolders.ExceptBy(folders, a => a.RemoteFolderId); + + foreach (var currentFolder in currentFolders) + { + // Check if we have this folder locally. + var remotelyExistFolder = folders.FirstOrDefault(a => a.RemoteFolderId == currentFolder.RemoteFolderId + && a.ParentRemoteFolderId == currentFolder.ParentRemoteFolderId); + + if (remotelyExistFolder == null) + { + // This folder is removed. + // Remove everything for this folder. + + } + } + + foreach (var folder in folders) + { + var currentFolder = await Connection.Table().FirstOrDefaultAsync(a => a.MailAccountId == accountId && a.RemoteFolderId == folder.RemoteFolderId); + + // Nothing is changed, it's still the same folder. + // Just update Id of the folder. + + if (currentFolder != null) + folder.Id = currentFolder.Id; + + await Connection.InsertOrReplaceAsync(folder); + } + } + + 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))); + } + + public async Task UpdateSystemFolderConfigurationAsync(Guid accountId, SystemFolderConfiguration configuration) + { + if (configuration == null) + throw new ArgumentNullException(nameof(configuration)); + + var account = await _accountService.GetAccountAsync(accountId); + + if (account == null) + throw new ArgumentNullException(nameof(account)); + + // Update system folders for this account. + + await Task.WhenAll(UpdateSystemFolderInternalAsync(configuration.SentFolder, SpecialFolderType.Sent), + UpdateSystemFolderInternalAsync(configuration.DraftFolder, SpecialFolderType.Draft), + UpdateSystemFolderInternalAsync(configuration.JunkFolder, SpecialFolderType.Junk), + UpdateSystemFolderInternalAsync(configuration.TrashFolder, SpecialFolderType.Deleted)); + + await _accountService.UpdateAccountAsync(account); + + return account; + } + + private Task UpdateSystemFolderInternalAsync(MailItemFolder folder, SpecialFolderType assignedSpecialFolderType) + { + if (folder == null) return Task.CompletedTask; + + folder.IsSticky = true; + folder.IsSynchronizationEnabled = true; + folder.IsSystemFolder = true; + folder.SpecialFolderType = assignedSpecialFolderType; + + return UpdateFolderAsync(folder); + } + + public async Task ChangeFolderSynchronizationStateAsync(Guid folderId, bool isSynchronizationEnabled) + { + var localFolder = await Connection.Table().FirstOrDefaultAsync(a => a.Id == folderId); + + if (localFolder != null) + { + localFolder.IsSynchronizationEnabled = isSynchronizationEnabled; + + await UpdateFolderAsync(localFolder).ConfigureAwait(false); + } + } + + #region Repository Calls + + public async Task InsertFolderAsync(MailItemFolder folder) + { + if (folder == null) + { + _logger.Warning("Folder is null. Cannot insert."); + + return; + } + + var account = await _accountService.GetAccountAsync(folder.MailAccountId); + + if (account == null) + { + _logger.Warning("Account with id {MailAccountId} does not exist. Cannot insert folder.", folder.MailAccountId); + + return; + } + + var existingFolder = await GetFolderAsync(folder.Id).ConfigureAwait(false); + + // IMAP servers don't have unique identifier for folders all the time. + // So we'll try to match them with remote folder id and account id relation. + // If we have a match, we'll update the folder instead of inserting. + + existingFolder ??= await GetFolderAsync(folder.MailAccountId, folder.RemoteFolderId).ConfigureAwait(false); + + if (existingFolder == null) + { + _logger.Debug("Inserting folder {Id} - {FolderName}", folder.Id, folder.FolderName, folder.MailAccountId); + + await Connection.InsertAsync(folder).ConfigureAwait(false); + + ReportUIChange(new FolderAddedMessage(folder, account)); + } + else + { + _logger.Debug("Folder {Id} - {FolderName} already exists. Updating.", folder.Id, folder.FolderName); + + await UpdateFolderAsync(folder).ConfigureAwait(false); + } + } + + private async Task UpdateFolderAsync(MailItemFolder folder) + { + if (folder == null) + { + _logger.Warning("Folder is null. Cannot update."); + + return; + } + + var account = await _accountService.GetAccountAsync(folder.MailAccountId).ConfigureAwait(false); + if (account == null) + { + _logger.Warning("Account with id {MailAccountId} does not exist. Cannot update folder.", folder.MailAccountId); + return; + } + +#if !DEBUG // Annoying + _logger.Debug("Updating folder {FolderName}", folder.Id, folder.FolderName); +#endif + + await Connection.UpdateAsync(folder).ConfigureAwait(false); + + ReportUIChange(new FolderUpdatedMessage(folder, account)); + } + + private async Task DeleteFolderAsync(MailItemFolder folder) + { + if (folder == null) + { + _logger.Warning("Folder is null. Cannot delete."); + + return; + } + + var account = await _accountService.GetAccountAsync(folder.MailAccountId).ConfigureAwait(false); + if (account == null) + { + _logger.Warning("Account with id {MailAccountId} does not exist. Cannot delete folder.", folder.MailAccountId); + return; + } + + _logger.Debug("Deleting folder {FolderName}", folder.FolderName); + + await Connection.DeleteAsync(folder).ConfigureAwait(false); + + ReportUIChange(new FolderRemovedMessage(folder, account)); + } + + #endregion + + private Task> GetMailCopyIdsByFolderIdAsync(Guid folderId) + { + var query = new Query("MailCopy") + .Where("FolderId", folderId) + .Select("Id"); + + return Connection.QueryScalarsAsync(query.GetRawQuery()); + } + + public async Task> GetMailFolderPairMetadatasAsync(IEnumerable mailCopyIds) + { + // Get all assignments for all items. + var query = new Query(nameof(MailCopy)) + .Join(nameof(MailItemFolder), $"{nameof(MailCopy)}.FolderId", $"{nameof(MailItemFolder)}.Id") + .WhereIn($"{nameof(MailCopy)}.Id", mailCopyIds) + .SelectRaw($"{nameof(MailCopy)}.Id as MailCopyId, {nameof(MailItemFolder)}.Id as FolderId, {nameof(MailItemFolder)}.RemoteFolderId as RemoteFolderId") + .Distinct(); + + var rowQuery = query.GetRawQuery(); + + return await Connection.QueryAsync(rowQuery); + } + + public Task> GetMailFolderPairMetadatasAsync(string mailCopyId) + => GetMailFolderPairMetadatasAsync(new List() { mailCopyId }); + + public async Task SetSpecialFolderAsync(Guid folderId, SpecialFolderType type) + => await Connection.ExecuteAsync("UPDATE MailItemFolder SET SpecialFolderType = ? WHERE Id = ?", type, folderId); + + public async Task> GetSynchronizationFoldersAsync(SynchronizationOptions options) + { + var folders = new List(); + + if (options.Type == SynchronizationType.Inbox) + { + var inboxFolder = await GetSpecialFolderByAccountIdAsync(options.AccountId, SpecialFolderType.Inbox); + var sentFolder = await GetSpecialFolderByAccountIdAsync(options.AccountId, SpecialFolderType.Sent); + var draftFolder = await GetSpecialFolderByAccountIdAsync(options.AccountId, SpecialFolderType.Draft); + + // For properly creating threads we need Sent and Draft to be synchronized as well. + + if (sentFolder != null && sentFolder.IsSynchronizationEnabled) + { + folders.Add(sentFolder); + } + + if (draftFolder != null && draftFolder.IsSynchronizationEnabled) + { + folders.Add(draftFolder); + } + + // User might've disabled inbox synchronization somehow... + if (inboxFolder != null && inboxFolder.IsSynchronizationEnabled) + { + folders.Add(inboxFolder); + } + } + else if (options.Type == SynchronizationType.Full) + { + // Only get sync enabled folders. + + var synchronizationFolders = await Connection.Table() + .Where(a => a.MailAccountId == options.AccountId && a.IsSynchronizationEnabled) + .OrderBy(a => a.SpecialFolderType) + .ToListAsync(); + + folders.AddRange(synchronizationFolders); + } + else if (options.Type == SynchronizationType.Custom) + { + // Only get the specified and enabled folders. + + var synchronizationFolders = await Connection.Table() + .Where(a => a.MailAccountId == options.AccountId && a.IsSynchronizationEnabled && options.SynchronizationFolderIds.Contains(a.Id)) + .ToListAsync(); + + folders.AddRange(synchronizationFolders); + } + + return folders; + } + + public Task GetFolderAsync(Guid accountId, string remoteFolderId) + => Connection.Table().FirstOrDefaultAsync(a => a.MailAccountId == accountId && a.RemoteFolderId == remoteFolderId); + + // v2 + public async Task BulkUpdateFolderStructureAsync(Guid accountId, List allFolders) + { + var existingFolders = await GetFoldersAsync(accountId).ConfigureAwait(false); + + var foldersToInsert = allFolders.ExceptBy(existingFolders, a => a.RemoteFolderId); + var foldersToDelete = existingFolders.ExceptBy(allFolders, a => a.RemoteFolderId); + var foldersToUpdate = allFolders.Except(foldersToInsert).Except(foldersToDelete); + + _logger.Debug("Found {0} folders to insert, {1} folders to update and {2} folders to delete.", + foldersToInsert.Count(), + foldersToUpdate.Count(), + foldersToDelete.Count()); + + foreach (var folder in foldersToInsert) + { + await InsertFolderAsync(folder).ConfigureAwait(false); + } + + foreach (var folder in foldersToUpdate) + { + await UpdateFolderAsync(folder).ConfigureAwait(false); + } + + foreach (var folder in foldersToDelete) + { + await DeleteFolderAsync(folder).ConfigureAwait(false); + } + } + + public async Task UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string synchronizationIdentifier) + { + var folder = await GetFolderAsync(folderId).ConfigureAwait(false); + + if (folder == null) + { + _logger.Warning("Folder with id {FolderId} does not exist.", folderId); + + return string.Empty; + } + + folder.DeltaToken = synchronizationIdentifier; + + await UpdateFolderAsync(folder).ConfigureAwait(false); + + return synchronizationIdentifier; + } + + public async Task DeleteFolderAsync(Guid accountId, string remoteFolderId) + { + var folder = await GetFolderAsync(accountId, remoteFolderId); + + if (folder == null) + { + _logger.Warning("Folder with id {RemoteFolderId} does not exist. Delete folder canceled.", remoteFolderId); + + return; + } + + await DeleteFolderAsync(folder).ConfigureAwait(false); + } + + public async Task ChangeFolderShowUnreadCountStateAsync(Guid folderId, bool showUnreadCount) + { + var localFolder = await GetFolderAsync(folderId); + + if (localFolder != null) + { + localFolder.ShowUnreadCount = showUnreadCount; + + await UpdateFolderAsync(localFolder).ConfigureAwait(false); + } + } + + // Inbox folder is always included for account menu item unread count. + public Task> GetUnreadUpdateFoldersAsync(Guid accountId) + => Connection.Table().Where(a => a.MailAccountId == accountId && (a.ShowUnreadCount || a.SpecialFolderType == SpecialFolderType.Inbox)).ToListAsync(); + + public async Task TestAsync() + { + var account = new MailAccount() + { + Address = "test@test.com", + ProviderType = MailProviderType.Gmail, + Name = "Test Account", + Id = Guid.NewGuid() + }; + + await Connection.InsertAsync(account); + + var pref = new MailAccountPreferences + { + Id = Guid.NewGuid(), + AccountId = account.Id + }; + + await Connection.InsertAsync(pref); + + ReportUIChange(new AccountCreatedMessage(account)); + } + + public async Task IsInboxAvailableForAccountAsync(Guid accountId) + => (await Connection.Table() + .Where(a => a.SpecialFolderType == SpecialFolderType.Inbox && a.MailAccountId == accountId) + .CountAsync()) == 1; + } +} diff --git a/Wino.Core/Services/FontService.cs b/Wino.Core/Services/FontService.cs new file mode 100644 index 00000000..b6dfc16a --- /dev/null +++ b/Wino.Core/Services/FontService.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using Serilog; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Reader; + +namespace Wino.Core.Services +{ + public class FontService : IFontService + { + private readonly IPreferencesService _preferencesService; + private ILogger _logger = Log.ForContext(); + + private readonly List _availableFonts = + [ + new ReaderFontModel(ReaderFont.Arial, "Arial"), + new ReaderFontModel(ReaderFont.Calibri, "Calibri"), + new ReaderFontModel(ReaderFont.TimesNewRoman, "Times New Roman"), + new ReaderFontModel(ReaderFont.TrebuchetMS, "Trebuchet MS"), + new ReaderFontModel(ReaderFont.Tahoma, "Tahoma"), + new ReaderFontModel(ReaderFont.Verdana, "Verdana"), + new ReaderFontModel(ReaderFont.Georgia, "Georgia"), + new ReaderFontModel(ReaderFont.CourierNew, "Courier New") + ]; + + public FontService(IPreferencesService preferencesService) + { + _preferencesService = preferencesService; + } + + public List GetReaderFonts() => _availableFonts; + + public void ChangeReaderFont(ReaderFont font) + { + _preferencesService.ReaderFont = font; + + _logger.Information("Default reader font is changed to {Font}", font); + } + + public void ChangeReaderFontSize(int size) + { + _preferencesService.ReaderFontSize = size; + + _logger.Information("Default reader font size is changed to {Size}", size); + } + + public ReaderFontModel GetCurrentReaderFont() => _availableFonts.Find(f => f.Font == _preferencesService.ReaderFont); + public int GetCurrentReaderFontSize() => _preferencesService.ReaderFontSize; + } +} diff --git a/Wino.Core/Services/ImapTestService.cs b/Wino.Core/Services/ImapTestService.cs new file mode 100644 index 00000000..c91ad119 --- /dev/null +++ b/Wino.Core/Services/ImapTestService.cs @@ -0,0 +1,53 @@ +using System.IO; +using System.Threading.Tasks; +using MailKit; +using MailKit.Net.Imap; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Services +{ + public class ImapTestService : IImapTestService + { + public const string ProtocolLogFileName = "ImapProtocolLog.log"; + + private readonly IPreferencesService _preferencesService; + private readonly IAppInitializerService _appInitializerService; + + public ImapTestService(IPreferencesService preferencesService, IAppInitializerService appInitializerService) + { + _preferencesService = preferencesService; + _appInitializerService = appInitializerService; + } + + public async Task TestImapConnectionAsync(CustomServerInformation serverInformation) + { + ImapClient client = null; + + if (_preferencesService.IsMailkitProtocolLoggerEnabled) + { + // Create new file for protocol logger. + + var localAppFolderPath = _appInitializerService.GetApplicationDataFolder(); + + var logFile = Path.Combine(localAppFolderPath, ProtocolLogFileName); + + if (File.Exists(logFile)) + File.Delete(logFile); + + var stream = File.Create(logFile); + + client = new ImapClient(new ProtocolLogger(stream)); + } + else + client = new ImapClient(); + + using (client) + { + // todo: test connection + // await client.InitializeAsync(serverInformation); + await client.DisconnectAsync(true); + } + } + } +} diff --git a/Wino.Core/Services/LogInitializer.cs b/Wino.Core/Services/LogInitializer.cs new file mode 100644 index 00000000..624723c6 --- /dev/null +++ b/Wino.Core/Services/LogInitializer.cs @@ -0,0 +1,41 @@ +using System.IO; +using Serilog; +using Serilog.Core; +using Serilog.Exceptions; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Services +{ + public class LogInitializer : ILogInitializer + { + public const string WinoLogFileName = "WinoDiagnostics.log"; + + private readonly LoggingLevelSwitch _levelSwitch = new LoggingLevelSwitch(); + private readonly IPreferencesService _preferencesService; + + public LogInitializer(IPreferencesService preferencesService) + { + _preferencesService = preferencesService; + + RefreshLoggingLevel(); + } + + public void RefreshLoggingLevel() + { + _levelSwitch.MinimumLevel = _preferencesService.IsLoggingEnabled ? Serilog.Events.LogEventLevel.Debug : Serilog.Events.LogEventLevel.Fatal; + } + + public void SetupLogger(string logFolderPath) + { + string logFilePath = Path.Combine(logFolderPath, WinoLogFileName); + + Log.Logger = new LoggerConfiguration() + .MinimumLevel.ControlledBy(_levelSwitch) + .WriteTo.File(logFilePath) + .WriteTo.Debug() + .Enrich.FromLogContext() + .Enrich.WithExceptionDetails() + .CreateLogger(); + } + } +} diff --git a/Wino.Core/Services/MailService.cs b/Wino.Core/Services/MailService.cs new file mode 100644 index 00000000..7cc0bf63 --- /dev/null +++ b/Wino.Core/Services/MailService.cs @@ -0,0 +1,833 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MimeKit; +using MimeKit.Text; +using MoreLinq; +using Serilog; +using SqlKata; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Comparers; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Extensions; +using Wino.Core.Requests; + +namespace Wino.Core.Services +{ + public class MailService : BaseDatabaseService, IMailService + { + private const int ItemLoadCount = 20; + + private readonly IFolderService _folderService; + private readonly IContactService _contactService; + private readonly IAccountService _accountService; + private readonly ISignatureService _signatureService; + private readonly IThreadingStrategyProvider _threadingStrategyProvider; + private readonly IMimeFileService _mimeFileService; + + + private readonly ILogger _logger = Log.ForContext(); + + public MailService(IDatabaseService databaseService, + IFolderService folderService, + IContactService contactService, + IAccountService accountService, + ISignatureService signatureService, + IThreadingStrategyProvider threadingStrategyProvider, + IMimeFileService mimeFileService) : base(databaseService) + { + _folderService = folderService; + _contactService = contactService; + _accountService = accountService; + _signatureService = signatureService; + _threadingStrategyProvider = threadingStrategyProvider; + _mimeFileService = mimeFileService; + } + + public async Task CreateDraftAsync(MailAccount composerAccount, + MimeMessage createdDraftMimeMessage, + MimeMessage replyingMimeMessage = null, + IMailItem replyingMailItem = null) + { + bool isImapAccount = composerAccount.ServerInformation != null; + + string fromName; + + if (isImapAccount) + fromName = composerAccount.ServerInformation.DisplayName; + else + { + var composerContact = await _contactService.GetAddressInformationByAddressAsync(composerAccount.Address); + + fromName = composerContact?.Name ?? composerAccount.Address; + } + + var draftFolder = await _folderService.GetSpecialFolderByAccountIdAsync(composerAccount.Id, SpecialFolderType.Draft); + + // Get locally created unique id from the mime headers. + // This header will be used to map the local draft copy with the remote draft copy. + var mimeUniqueId = createdDraftMimeMessage.Headers[Constants.WinoLocalDraftHeader]; + + var copy = new MailCopy + { + UniqueId = Guid.Parse(mimeUniqueId), + Id = Guid.NewGuid().ToString(), // This will be replaced after network call with the remote draft id. + CreationDate = DateTime.UtcNow, + FromAddress = composerAccount.Address, + FromName = fromName, + HasAttachments = false, + Importance = MailImportance.Normal, + Subject = createdDraftMimeMessage.Subject, + PreviewText = createdDraftMimeMessage.TextBody, + IsRead = true, + IsDraft = true, + FolderId = draftFolder.Id, + DraftId = $"{Constants.LocalDraftStartPrefix}{Guid.NewGuid()}", + AssignedFolder = draftFolder, + AssignedAccount = composerAccount, + FileId = Guid.NewGuid() + }; + + // If replying, add In-Reply-To, ThreadId and References. + bool isReplying = replyingMimeMessage != null; + + if (isReplying) + { + if (replyingMimeMessage.References != null) + copy.References = string.Join(",", replyingMimeMessage.References); + + if (!string.IsNullOrEmpty(replyingMimeMessage.MessageId)) + copy.InReplyTo = replyingMimeMessage.MessageId; + + if (!string.IsNullOrEmpty(replyingMailItem?.ThreadId)) + copy.ThreadId = replyingMailItem.ThreadId; + } + + await Connection.InsertAsync(copy); + + + await _mimeFileService.SaveMimeMessageAsync(copy.FileId, createdDraftMimeMessage, composerAccount.Id); + + ReportUIChange(new DraftCreated(copy, composerAccount)); + + return copy; + } + + public Task> GetMailIdsByFolderIdAsync(Guid folderId) + => Connection.QueryScalarsAsync("SELECT Id FROM MailCopy WHERE FolderId = ?", folderId); + + + private string BuildMailFetchQuery(MailListInitializationOptions options) + { + // If the search query is there, we should ignore some properties and trim it. + //if (!string.IsNullOrEmpty(options.SearchQuery)) + //{ + // options.IsFocusedOnly = null; + // filterType = FilterOptionType.All; + + // searchQuery = searchQuery.Trim(); + //} + + // SQLite PCL doesn't support joins. + // We make the query using SqlKatka and execute it directly on SQLite-PCL. + + var query = new Query("MailCopy") + .Join("MailItemFolder", "MailCopy.FolderId", "MailItemFolder.Id") + .WhereIn("MailCopy.FolderId", options.Folders.Select(a => a.Id)) + .Take(ItemLoadCount) + .SelectRaw("MailCopy.*"); + + if (options.SortingOptionType == SortingOptionType.ReceiveDate) + query.OrderByDesc("CreationDate"); + else if (options.SortingOptionType == SortingOptionType.Sender) + query.OrderBy("FromName"); + + // Conditional where. + switch (options.FilterType) + { + case FilterOptionType.Unread: + query.Where("MailCopy.IsRead", false); + break; + case FilterOptionType.Flagged: + query.Where("MailCopy.IsFlagged", true); + break; + } + + if (options.IsFocusedOnly != null) + query.Where("MailCopy.IsFocused", options.IsFocusedOnly.Value); + + if (!string.IsNullOrEmpty(options.SearchQuery)) + query.Where(a => + a.OrWhereContains("MailCopy.PreviewText", options.SearchQuery) + .OrWhereContains("MailCopy.Subject", options.SearchQuery) + .OrWhereContains("MailCopy.FromName", options.SearchQuery) + .OrWhereContains("MailCopy.FromAddress", options.SearchQuery)); + + if (options.ExistingUniqueIds?.Any() ?? false) + { + query.WhereNotIn("MailCopy.UniqueId", options.ExistingUniqueIds); + } + + //if (options.Skip > 0) + //{ + // query.Skip(options.Skip); + //} + + return query.GetRawQuery(); + } + + public async Task> FetchMailsAsync(MailListInitializationOptions options) + { + var query = BuildMailFetchQuery(options); + + var mails = await Connection.QueryAsync(query); + + // Fill in assigned account and folder for each mail. + // To speed things up a bit, we'll load account and assigned folder in groups + // to reduce the query time. + + var groupedByFolders = mails.GroupBy(a => a.FolderId); + + foreach (var group in groupedByFolders) + { + MailItemFolder folderAssignment = null; + MailAccount accountAssignment = null; + + folderAssignment = await _folderService.GetFolderAsync(group.Key).ConfigureAwait(false); + + if (folderAssignment != null) + { + accountAssignment = await _accountService.GetAccountAsync(folderAssignment.MailAccountId).ConfigureAwait(false); + } + + group.ForEach(a => + { + a.AssignedFolder = folderAssignment; + a.AssignedAccount = accountAssignment; + }); + } + + // Remove items that has no assigned account or folder. + mails.RemoveAll(a => a.AssignedAccount == null || a.AssignedFolder == null); + + // Each account items must be threaded separately. + + if (options.CreateThreads) + { + var threadedItems = new List(); + + var groupedByAccounts = mails.GroupBy(a => a.AssignedAccount.Id); + + foreach (var group in groupedByAccounts) + { + if (!group.Any()) continue; + + var accountId = group.Key; + var groupAccount = mails.First(a => a.AssignedAccount.Id == accountId).AssignedAccount; + + var threadingStrategy = _threadingStrategyProvider.GetStrategy(groupAccount.ProviderType); + + // Only thread items from Draft and Sent folders must present here. + // Otherwise this strategy will fetch the items that are in Deleted folder as well. + var accountThreadedItems = await threadingStrategy.ThreadItemsAsync(group.ToList()); + + if (accountThreadedItems != null) + { + threadedItems.AddRange(accountThreadedItems); + } + } + + threadedItems.Sort(options.SortingOptionType == SortingOptionType.ReceiveDate ? new DateComparer() : new NameComparer()); + + return threadedItems; + } + else + { + // Threading is disabled. Just return everything as it is. + + mails.Sort(options.SortingOptionType == SortingOptionType.ReceiveDate ? new DateComparer() : new NameComparer()); + + return new List(mails); + } + } + + private async Task> GetMailItemsAsync(string mailCopyId) + { + var mailCopies = await Connection.Table().Where(a => a.Id == mailCopyId).ToListAsync(); + + foreach (var mailCopy in mailCopies) + { + await LoadAssignedPropertiesAsync(mailCopy).ConfigureAwait(false); + } + + return mailCopies; + } + + private async Task LoadAssignedPropertiesAsync(MailCopy mailCopy) + { + if (mailCopy == null) return; + + // Load AssignedAccount and AssignedFolder. + + var folder = await _folderService.GetFolderAsync(mailCopy.FolderId); + + if (folder == null) return; + + var account = await _accountService.GetAccountAsync(folder.MailAccountId); + + if (account == null) return; + + mailCopy.AssignedAccount = account; + mailCopy.AssignedFolder = folder; + } + + public async Task GetSingleMailItemWithoutFolderAssignmentAsync(string mailCopyId) + { + var mailCopy = await Connection.Table().FirstOrDefaultAsync(a => a.Id == mailCopyId); + + if (mailCopy == null) return null; + + await LoadAssignedPropertiesAsync(mailCopy).ConfigureAwait(false); + + return mailCopy; + } + + public async Task GetSingleMailItemAsync(string mailCopyId, string remoteFolderId) + { + var query = new Query("MailCopy") + .Join("MailItemFolder", "MailCopy.FolderId", "MailItemFolder.Id") + .Where("MailCopy.Id", mailCopyId) + .Where("MailItemFolder.RemoteFolderId", remoteFolderId) + .SelectRaw("MailCopy.*") + .GetRawQuery(); + + var mailItem = await Connection.FindWithQueryAsync(query); + + if (mailItem == null) return null; + + await LoadAssignedPropertiesAsync(mailItem).ConfigureAwait(false); + + return mailItem; + } + + public async Task GetSingleMailItemAsync(Guid uniqueMailId) + { + var mailItem = await Connection.FindAsync(uniqueMailId); + + if (mailItem == null) return null; + + await LoadAssignedPropertiesAsync(mailItem).ConfigureAwait(false); + + return mailItem; + } + + // v2 + + public async Task DeleteMailAsync(Guid accountId, string mailCopyId) + { + var allMails = await GetMailItemsAsync(mailCopyId).ConfigureAwait(false); + + foreach (var mailItem in allMails) + { + await DeleteMailInternalAsync(mailItem).ConfigureAwait(false); + + // Delete mime file. + // Even though Gmail might have multiple copies for the same mail, we only have one MIME file for all. + // Their FileId is inserted same. + await _mimeFileService.DeleteMimeMessageAsync(accountId, mailItem.FileId); + } + } + + #region Repository Calls + + private async Task InsertMailAsync(MailCopy mailCopy) + { + if (mailCopy == null) + { + _logger.Warning("Null mail passed to InsertMailAsync call."); + return; + } + + if (mailCopy.FolderId == Guid.Empty) + { + _logger.Warning("Invalid FolderId for MailCopyId {Id} for InsertMailAsync", mailCopy.Id); + return; + } + + _logger.Debug("Inserting mail {MailCopyId} to Folder {FolderId}", mailCopy.Id, mailCopy.FolderId); + + await Connection.InsertAsync(mailCopy).ConfigureAwait(false); + + ReportUIChange(new MailAddedMessage(mailCopy)); + } + + public async Task UpdateMailAsync(MailCopy mailCopy) + { + if (mailCopy == null) + { + _logger.Warning("Null mail passed to UpdateMailAsync call."); + + return; + } + + _logger.Debug("Updating mail {MailCopyId} with Folder {FolderId}", mailCopy.Id, mailCopy.FolderId); + + await Connection.UpdateAsync(mailCopy).ConfigureAwait(false); + + ReportUIChange(new MailUpdatedMessage(mailCopy)); + } + + private async Task DeleteMailInternalAsync(MailCopy mailCopy) + { + if (mailCopy == null) + { + _logger.Warning("Null mail passed to DeleteMailAsync call."); + + return; + } + + _logger.Debug("Deleting mail {Id} with Folder {FolderId}", mailCopy.Id, mailCopy.FolderId); + + await Connection.DeleteAsync(mailCopy).ConfigureAwait(false); + + ReportUIChange(new MailRemovedMessage(mailCopy)); + } + + #endregion + + private async Task UpdateAllMailCopiesAsync(string mailCopyId, Func action) + { + var mailCopies = await GetMailItemsAsync(mailCopyId); + + if (mailCopies == null || !mailCopies.Any()) + { + _logger.Warning("Updating mail copies failed because there are no copies available with Id {MailCopyId}", mailCopyId); + + return; + } + + _logger.Information("Updating {MailCopyCount} mail copies with Id {MailCopyId}", mailCopies.Count, mailCopyId); + + foreach (var mailCopy in mailCopies) + { + bool shouldUpdateItem = action(mailCopy); + + if (shouldUpdateItem) + { + await UpdateMailAsync(mailCopy).ConfigureAwait(false); + } + else + _logger.Information("Skipped updating mail because it is already in the desired state."); + } + } + + public Task ChangeReadStatusAsync(string mailCopyId, bool isRead) + => UpdateAllMailCopiesAsync(mailCopyId, (item) => + { + item.IsRead = isRead; + + return true; + }); + + public Task ChangeFlagStatusAsync(string mailCopyId, bool isFlagged) + => UpdateAllMailCopiesAsync(mailCopyId, (item) => + { + item.IsFlagged = isFlagged; + + return true; + }); + + public async Task CreateAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId) + { + // Note: Folder might not be available at the moment due to user not syncing folders before the delta processing. + // This is a problem, because assignments won't be created. + // Therefore we sync folders every time before the delta processing. + + var localFolder = await _folderService.GetFolderAsync(accountId, remoteFolderId); + + if (localFolder == null) + { + _logger.Warning("Local folder not found for remote folder {RemoteFolderId}", remoteFolderId); + _logger.Warning("Skipping assignment creation for the the message {MailCopyId}", mailCopyId); + + return; + } + + var mailCopy = await GetSingleMailItemWithoutFolderAssignmentAsync(mailCopyId); + + if (mailCopy == null) + { + _logger.Warning("Can't create assignment for mail {MailCopyId} because it does not exist.", mailCopyId); + + return; + } + + // Copy one of the mail copy and assign it to the new folder. + // We don't need to create a new MIME pack. + // Therefore FileId is not changed for the new MailCopy. + + mailCopy.UniqueId = Guid.NewGuid(); + mailCopy.FolderId = localFolder.Id; + mailCopy.AssignedFolder = localFolder; + + await InsertMailAsync(mailCopy).ConfigureAwait(false); + } + + public async Task DeleteAssignmentAsync(Guid accountId, string mailCopyId, string remoteFolderId) + { + var mailItem = await GetSingleMailItemAsync(mailCopyId, remoteFolderId).ConfigureAwait(false); + + if (mailItem == null) + { + _logger.Warning("Mail not found with id {MailCopyId} with remote folder {RemoteFolderId}", mailCopyId, remoteFolderId); + + return; + } + + var localFolder = await _folderService.GetFolderAsync(accountId, remoteFolderId); + + if (localFolder == null) + { + _logger.Warning("Local folder not found for remote folder {RemoteFolderId}", remoteFolderId); + + return; + } + + await DeleteMailInternalAsync(mailItem).ConfigureAwait(false); + } + + public async Task CreateMailAsync(Guid accountId, NewMailItemPackage package) + { + var account = await _accountService.GetAccountAsync(accountId).ConfigureAwait(false); + + if (account == null) return false; + + if (string.IsNullOrEmpty(package.AssignedRemoteFolderId)) + { + _logger.Warning("Remote folder id is not set for {MailCopyId}.", package.Copy.Id); + _logger.Warning("Ignoring creation of mail."); + + return false; + } + + var assignedFolder = await _folderService.GetFolderAsync(accountId, package.AssignedRemoteFolderId).ConfigureAwait(false); + + if (assignedFolder == null) + { + _logger.Warning("Assigned folder not found for {MailCopyId}.", package.Copy.Id); + _logger.Warning("Ignoring creation of mail."); + + return false; + } + + var mailCopy = package.Copy; + var mimeMessage = package.Mime; + + mailCopy.UniqueId = Guid.NewGuid(); + mailCopy.AssignedAccount = account; + mailCopy.AssignedFolder = assignedFolder; + mailCopy.FolderId = assignedFolder.Id; + + // Only save MIME files if they don't exists. + // This is because 1 mail may have multiple copies in different folders. + // but only single MIME to represent all. + + // Save mime file to disk. + var isMimeExists = await _mimeFileService.IsMimeExistAsync(accountId, mailCopy.FileId); + + if (!isMimeExists) + { + bool isMimeSaved = await _mimeFileService.SaveMimeMessageAsync(mailCopy.FileId, mimeMessage, accountId).ConfigureAwait(false); + + if (!isMimeSaved) + { + _logger.Warning("Failed to save mime file for {MailCopyId}.", mailCopy.Id); + } + } + + // Save contact information. + await _contactService.SaveAddressInformationAsync(mimeMessage).ConfigureAwait(false); + + // Create mail copy in the database. + // Update if exists. + + var existingCopyItem = await Connection.Table() + .FirstOrDefaultAsync(a => a.Id == mailCopy.Id && a.FolderId == assignedFolder.Id); + + if (existingCopyItem != null) + { + mailCopy.UniqueId = existingCopyItem.UniqueId; + + await UpdateMailAsync(mailCopy).ConfigureAwait(false); + + return false; + } + else + { + await InsertMailAsync(mailCopy).ConfigureAwait(false); + + return true; + } + } + + public async Task CreateDraftMimeMessageAsync(Guid accountId, DraftCreationOptions draftCreationOptions) + { + // This unique id is stored in mime headers for Wino to identify remote message with local copy. + // Same unique id will be used for the local copy as well. + // Synchronizer will map this unique id to the local draft copy after synchronization. + + var messageUniqueId = Guid.NewGuid(); + + var message = new MimeMessage() + { + Headers = { { Constants.WinoLocalDraftHeader, messageUniqueId.ToString() } } + }; + + var builder = new BodyBuilder(); + + var account = await _accountService.GetAccountAsync(accountId).ConfigureAwait(false); + + if (account == null) + { + _logger.Warning("Can't create draft mime message because account {AccountId} does not exist.", accountId); + + return null; + } + + var reason = draftCreationOptions.Reason; + var referenceMessage = draftCreationOptions.ReferenceMimeMessage; + + // For API synchronizers we should get this from contacts. + if (account.ServerInformation == null) + { + var fromContact = await _contactService.GetAddressInformationByAddressAsync(account.Address).ConfigureAwait(false) + ?? new AddressInformation() { Name = account.Address, Address = account.Address }; + + message.From.Add(new MailboxAddress(fromContact.Name, fromContact.Address)); + } + else + { + // For IMAP synchronizer, we have already Display Name in the settings. + message.From.Add(new MailboxAddress(account.ServerInformation.DisplayName, account.ServerInformation.Address)); + } + + // Manage "To" + if (reason == DraftCreationReason.Reply || reason == DraftCreationReason.ReplyAll) + { + // Reply to the sender of the message + + if (referenceMessage.ReplyTo.Count > 0) + message.To.AddRange(referenceMessage.ReplyTo); + else if (referenceMessage.From.Count > 0) + message.To.AddRange(referenceMessage.From); + else if (referenceMessage.Sender != null) + message.To.Add(referenceMessage.Sender); + + if (reason == DraftCreationReason.ReplyAll) + { + // Include all of the other original recipients + message.To.AddRange(referenceMessage.To); + + // Find self and remove + var self = message.To.FirstOrDefault(a => a is MailboxAddress mailboxAddress && mailboxAddress.Address == account.Address); + + if (self != null) + message.To.Remove(self); + + message.Cc.AddRange(referenceMessage.Cc); + } + + // Manage "ThreadId-ConversationId" + if (!string.IsNullOrEmpty(referenceMessage.MessageId)) + { + message.InReplyTo = referenceMessage.MessageId; + + foreach (var id in referenceMessage.References) + message.References.Add(id); + + message.References.Add(referenceMessage.MessageId); + } + + message.Headers.Add("Thread-Topic", referenceMessage.Subject); + } + + var previewer = new HtmlTextPreviewer(); + + if (reason == DraftCreationReason.Forward) + { + var visitor = _mimeFileService.CreateHTMLPreviewVisitor(referenceMessage, string.Empty); + visitor.Visit(referenceMessage); + + builder.HtmlBody = visitor.HtmlBody; + } + else + { + // Add signature if any. + var accountSignature = await _signatureService.GetAccountSignatureAsync(account.Id); + + if (accountSignature != null) + { + // Leave some space for new mail content. + + builder.HtmlBody = @$"

{accountSignature.HtmlBody}"; + } + } + + // Manage Subject + if (reason == DraftCreationReason.Forward && !referenceMessage.Subject.StartsWith("FW: ", StringComparison.OrdinalIgnoreCase)) + message.Subject = $"FW: {referenceMessage.Subject}"; + else if ((reason == DraftCreationReason.Reply || reason == DraftCreationReason.ReplyAll) && + !referenceMessage.Subject.StartsWith("RE: ", StringComparison.OrdinalIgnoreCase)) + message.Subject = $"RE: {referenceMessage.Subject}"; + else if (referenceMessage != null) + message.Subject = referenceMessage.Subject; + + // Only include attachments if forwarding. + if (reason == DraftCreationReason.Forward && (referenceMessage?.Attachments?.Any() ?? false)) + { + foreach (var attachment in referenceMessage.Attachments) + { + builder.Attachments.Add(attachment); + } + } + + if (!string.IsNullOrEmpty(builder.HtmlBody)) + { + builder.TextBody = HtmlAgilityPackExtensions.GetPreviewText(builder.HtmlBody); + } + + message.Body = builder.ToMessageBody(); + + // Apply mail-to protocol parameters if exists. + + if (draftCreationOptions.MailtoParameters != null) + { + if (draftCreationOptions.TryGetMailtoValue(DraftCreationOptions.MailtoSubjectParameterKey, out string subjectParameter)) + message.Subject = subjectParameter; + + if (draftCreationOptions.TryGetMailtoValue(DraftCreationOptions.MailtoBodyParameterKey, out string bodyParameter)) + { + builder.TextBody = bodyParameter; + builder.HtmlBody = bodyParameter; + + message.Body = builder.ToMessageBody(); + } + + InternetAddressList ExtractRecipients(string parameterValue) + { + var list = new InternetAddressList(); + + var splittedRecipients = parameterValue.Split(','); + + foreach (var recipient in splittedRecipients) + list.Add(new MailboxAddress(recipient, recipient)); + + return list; + + } + + if (draftCreationOptions.TryGetMailtoValue(DraftCreationOptions.MailtoToParameterKey, out string toParameter)) + message.To.AddRange(ExtractRecipients(toParameter)); + + if (draftCreationOptions.TryGetMailtoValue(DraftCreationOptions.MailtoCCParameterKey, out string ccParameter)) + message.Cc.AddRange(ExtractRecipients(ccParameter)); + + if (draftCreationOptions.TryGetMailtoValue(DraftCreationOptions.MailtoBCCParameterKey, out string bccParameter)) + message.Bcc.AddRange(ExtractRecipients(bccParameter)); + } + else + { + // Update TextBody from existing HtmlBody if exists. + } + + return message; + } + + public async Task MapLocalDraftAsync(Guid accountId, Guid localDraftCopyUniqueId, string newMailCopyId, string newDraftId, string newThreadId) + { + var query = new Query("MailCopy") + .Join("MailItemFolder", "MailCopy.FolderId", "MailItemFolder.Id") + .Where("MailCopy.UniqueId", localDraftCopyUniqueId) + .Where("MailItemFolder.MailAccountId", accountId) + .SelectRaw("MailCopy.*") + .GetRawQuery(); + + var localDraftCopy = await Connection.FindWithQueryAsync(query); + + if (localDraftCopy == null) + { + _logger.Warning("Draft mapping failed because local draft copy with unique id {LocalDraftCopyUniqueId} does not exist.", localDraftCopyUniqueId); + + return false; + } + + var oldLocalDraftId = localDraftCopy.Id; + + await LoadAssignedPropertiesAsync(localDraftCopy).ConfigureAwait(false); + + bool isIdChanging = localDraftCopy.Id != newMailCopyId; + + localDraftCopy.Id = newMailCopyId; + localDraftCopy.DraftId = newDraftId; + localDraftCopy.ThreadId = newThreadId; + + await UpdateMailAsync(localDraftCopy).ConfigureAwait(false); + + ReportUIChange(new DraftMapped(oldLocalDraftId, newDraftId)); + + return true; + } + + public Task MapLocalDraftAsync(string mailCopyId, string newDraftId, string newThreadId) + { + return UpdateAllMailCopiesAsync(mailCopyId, (item) => + { + if (item.ThreadId != newThreadId || item.DraftId != newDraftId) + { + var oldDraftId = item.DraftId; + + item.DraftId = newDraftId; + item.ThreadId = newThreadId; + + ReportUIChange(new DraftMapped(oldDraftId, newDraftId)); + + return true; + } + + return false; + }); + } + + public Task> GetDownloadedUnreadMailsAsync(Guid accountId, IEnumerable downloadedMailCopyIds) + { + var rawQuery = new Query("MailCopy") + .Join("MailItemFolder", "MailCopy.FolderId", "MailItemFolder.Id") + .WhereIn("MailCopy.Id", downloadedMailCopyIds) + .Where("MailCopy.IsRead", false) + .Where("MailItemFolder.MailAccountId", accountId) + .Where("MailItemFolder.SpecialFolderType", SpecialFolderType.Inbox) + .SelectRaw("MailCopy.*") + .GetRawQuery(); + + return Connection.QueryAsync(rawQuery); + } + + public Task GetMailAccountByUniqueIdAsync(Guid uniqueMailId) + { + var query = new Query("MailCopy") + .Join("MailItemFolder", "MailCopy.FolderId", "MailItemFolder.Id") + .Join("MailAccount", "MailItemFolder.MailAccountId", "MailAccount.Id") + .Where("MailCopy.UniqueId", uniqueMailId) + .SelectRaw("MailAccount.*") + .GetRawQuery(); + + return Connection.FindWithQueryAsync(query); + } + + + } +} diff --git a/Wino.Core/Services/MimeFileService.cs b/Wino.Core/Services/MimeFileService.cs new file mode 100644 index 00000000..03cb14da --- /dev/null +++ b/Wino.Core/Services/MimeFileService.cs @@ -0,0 +1,242 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using MimeKit; +using Serilog; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.Extensions; +using Wino.Core.Mime; + +namespace Wino.Core.Services +{ + public interface IMimeFileService + { + /// + /// Finds the EML file for the given mail id for address, parses and returns MimeMessage. + /// + /// Cancellation token + /// Mime message information + Task GetMimeMessageInformationAsync(Guid fileId, Guid accountId, CancellationToken cancellationToken = default); + + /// + /// Gets the mime message information for the given EML file bytes. + /// This override is used when EML file association launch is used + /// because we may not have the access to the file path. + /// + /// Byte array of the file. + /// Cancellation token + /// Mime message information + Task GetMimeMessageInformationAsync(byte[] fileBytes, string emlFilePath, CancellationToken cancellationToken = default); + + /// + /// Saves EML file to the disk. + /// + /// MailCopy of the native message. + /// MimeMessage that is parsed from native message. + /// Which account Id to save this file for. + Task SaveMimeMessageAsync(Guid fileId, MimeMessage mimeMessage, Guid accountId); + + /// + /// Returns a path that all Mime resources (including eml) is stored for this MailCopyId + /// This is useful for storing previously rendered attachments as well. + /// + /// Account address + /// Resource mail copy id + Task GetMimeResourcePathAsync(Guid accountId, Guid fileId); + + /// + /// Returns whether mime file exists locally or not. + /// + Task IsMimeExistAsync(Guid accountId, Guid fileId); + + /// + /// Creates HtmlPreviewVisitor for the given MimeMessage. + /// + /// Mime + /// File path that mime is located to load resources. + HtmlPreviewVisitor CreateHTMLPreviewVisitor(MimeMessage message, string mimeLocalPath); + + /// + /// Deletes the given mime file from the disk. + /// + Task DeleteMimeMessageAsync(Guid accountId, Guid fileId); + + /// + /// Prepares the final model containing rendering details. + /// + /// Message to render. + /// File path that physical MimeMessage is located. + /// Rendering options + MailRenderModel GetMailRenderModel(MimeMessage message, string mimeLocalPath, MailRenderingOptions options = null); + } + + public class MimeFileService : IMimeFileService + { + private readonly INativeAppService _nativeAppService; + private ILogger _logger = Log.ForContext(); + + public MimeFileService(INativeAppService nativeAppService) + { + _nativeAppService = nativeAppService; + } + + public async Task GetMimeMessageInformationAsync(Guid fileId, Guid accountId, CancellationToken cancellationToken = default) + { + var resourcePath = await GetMimeResourcePathAsync(accountId, fileId).ConfigureAwait(false); + var mimeFilePath = GetEMLPath(resourcePath); + + var loadedMimeMessage = await MimeMessage.LoadAsync(mimeFilePath, cancellationToken).ConfigureAwait(false); + + return new MimeMessageInformation(loadedMimeMessage, resourcePath); + } + + public async Task GetMimeMessageInformationAsync(byte[] fileBytes, string emlDirectoryPath, CancellationToken cancellationToken = default) + { + var memoryStream = new MemoryStream(fileBytes); + + var loadedMimeMessage = await MimeMessage.LoadAsync(memoryStream, cancellationToken).ConfigureAwait(false); + return new MimeMessageInformation(loadedMimeMessage, emlDirectoryPath); + } + + public async Task SaveMimeMessageAsync(Guid fileId, MimeMessage mimeMessage, Guid accountId) + { + try + { + var resourcePath = await GetMimeResourcePathAsync(accountId, fileId).ConfigureAwait(false); + var completeFilePath = GetEMLPath(resourcePath); + + var fileStream = File.Create(completeFilePath); + + using (fileStream) + { + await mimeMessage.WriteToAsync(fileStream).ConfigureAwait(false); + } + + return true; + } + catch (Exception ex) + { + _logger.Error(ex, "Could not save mime file for FileId: {FileId}", fileId); + } + + return false; + } + + private string GetEMLPath(string resourcePath) => $"{resourcePath}\\mail.eml"; + + public async Task GetMimeResourcePathAsync(Guid accountId, Guid fileId) + { + var mimeFolderPath = await _nativeAppService.GetMimeMessageStoragePath().ConfigureAwait(false); + var mimeDirectory = Path.Combine(mimeFolderPath, accountId.ToString(), fileId.ToString()); + + if (!Directory.Exists(mimeDirectory)) + Directory.CreateDirectory(mimeDirectory); + + return mimeDirectory; + } + + public async Task IsMimeExistAsync(Guid accountId, Guid fileId) + { + var resourcePath = await GetMimeResourcePathAsync(accountId, fileId); + var completeFilePath = GetEMLPath(resourcePath); + + return File.Exists(completeFilePath); + } + + public HtmlPreviewVisitor CreateHTMLPreviewVisitor(MimeMessage message, string mimeLocalPath) + { + var visitor = new HtmlPreviewVisitor(mimeLocalPath); + + message.Accept(visitor); + + // TODO: Match cid with attachments if any. + + return visitor; + } + + public async Task DeleteMimeMessageAsync(Guid accountId, Guid fileId) + { + var resourcePath = await GetMimeResourcePathAsync(accountId, fileId); + var completeFilePath = GetEMLPath(resourcePath); + + if (File.Exists(completeFilePath)) + { + try + { + File.Delete(completeFilePath); + + _logger.Information("Mime file deleted for {FileId}", fileId); + + return true; + } + catch (Exception ex) + { + _logger.Error(ex, "Could not delete mime file for {FileId}", fileId); + } + + return false; + } + + return true; + } + + public MailRenderModel GetMailRenderModel(MimeMessage message, string mimeLocalPath, MailRenderingOptions options = null) + { + var visitor = CreateHTMLPreviewVisitor(message, mimeLocalPath); + + string finalRenderHtml = visitor.HtmlBody; + + // Check whether we need to purify the generated HTML from visitor. + // No need to create HtmlDocument if not required. + + if (options != null && options.IsPurifyingNeeded()) + { + var document = new HtmlAgilityPack.HtmlDocument(); + document.LoadHtml(visitor.HtmlBody); + + // Clear src attribute. + + if (!options.LoadImages) + document.ClearImages(); + + if (!options.LoadStyles) + document.ClearStyles(); + + // Update final HTML. + finalRenderHtml = document.DocumentNode.OuterHtml; + } + + var renderingModel = new MailRenderModel(finalRenderHtml, options); + + // Create attachments. + + foreach (var attachment in visitor.Attachments) + { + if (attachment.IsAttachment && attachment is MimePart attachmentPart) + { + renderingModel.Attachments.Add(attachmentPart); + } + } + + // Check for List-Unsubscribe link if possible. + + if (message.Headers.Contains(HeaderId.ListUnsubscribe)) + { + renderingModel.UnsubscribeLink = message.Headers[HeaderId.ListUnsubscribe].Normalize(); + + // Sometimes this link is wrapped with < >, remove them. + if (renderingModel.UnsubscribeLink.StartsWith("<")) + { + renderingModel.UnsubscribeLink = renderingModel.UnsubscribeLink.Substring(1, renderingModel.UnsubscribeLink.Length - 2); + } + } + + return renderingModel; + } + + + } +} diff --git a/Wino.Core/Services/ProviderService.cs b/Wino.Core/Services/ProviderService.cs new file mode 100644 index 00000000..aba85d8f --- /dev/null +++ b/Wino.Core/Services/ProviderService.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; + +namespace Wino.Core.Services +{ + /// + /// Service that is returning available provider details. + /// + public class ProviderService : IProviderService + { + public IProviderDetail GetProviderDetail(MailProviderType type) + { + var details = GetProviderDetails(); + + return details.FirstOrDefault(a => a.Type == type); + } + + public List GetProviderDetails() + { + var providerList = new List(); + + var providers = new MailProviderType[] + { + MailProviderType.Outlook, + MailProviderType.Gmail, + MailProviderType.IMAP4 + }; + + foreach (var type in providers) + { + providerList.Add(new ProviderDetail(type)); + } + + return providerList; + } + } +} diff --git a/Wino.Core/Services/SignatureService.cs b/Wino.Core/Services/SignatureService.cs new file mode 100644 index 00000000..064b9df1 --- /dev/null +++ b/Wino.Core/Services/SignatureService.cs @@ -0,0 +1,91 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.Services +{ + public class SignatureService : BaseDatabaseService, ISignatureService + { + public SignatureService(IDatabaseService databaseService) : base(databaseService) { } + + public async Task CreateDefaultSignatureAsync(Guid accountId) + { + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + var defaultSignature = GetDefaultSignature(); + + await Connection.InsertAsync(defaultSignature); + + account.SignatureId = defaultSignature.Id; + + await Connection.UpdateAsync(account); + + return defaultSignature; + } + + public async Task DeleteAccountSignatureAssignment(Guid accountId) + { + var existingSignature = await GetAccountSignatureAsync(accountId); + + if (existingSignature != null) + { + await Connection.DeleteAsync(existingSignature); + + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + account.SignatureId = null; + + await Connection.UpdateAsync(account); + } + } + + public async Task GetAccountSignatureAsync(Guid accountId) + { + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + if (account?.SignatureId == null) + return null; + + return await Connection.Table().FirstOrDefaultAsync(a => a.Id == account.SignatureId); + } + + public async Task UpdateAccountSignatureAsync(Guid accountId, string htmlBody) + { + var signature = await GetAccountSignatureAsync(accountId); + var account = await Connection.Table().FirstOrDefaultAsync(a => a.Id == accountId); + + if (signature == null) + { + signature = new AccountSignature() + { + Id = Guid.NewGuid(), + HtmlBody = htmlBody + }; + + await Connection.InsertAsync(signature); + } + else + { + signature.HtmlBody = htmlBody; + + await Connection.UpdateAsync(signature); + } + + account.SignatureId = signature.Id; + + await Connection.UpdateAsync(account); + + return signature; + } + + private AccountSignature GetDefaultSignature() + { + return new AccountSignature() + { + Id = Guid.NewGuid(), + HtmlBody = @"

Sent from Wino Mail for Windows

" + }; + } + } +} diff --git a/Wino.Core/Services/ThreadingStrategyProvider.cs b/Wino.Core/Services/ThreadingStrategyProvider.cs new file mode 100644 index 00000000..65ba8b10 --- /dev/null +++ b/Wino.Core/Services/ThreadingStrategyProvider.cs @@ -0,0 +1,32 @@ +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration.Threading; + +namespace Wino.Core.Services +{ + public class ThreadingStrategyProvider : IThreadingStrategyProvider + { + private readonly OutlookThreadingStrategy _outlookThreadingStrategy; + private readonly GmailThreadingStrategy _gmailThreadingStrategy; + private readonly ImapThreadStrategy _imapThreadStrategy; + + public ThreadingStrategyProvider(OutlookThreadingStrategy outlookThreadingStrategy, + GmailThreadingStrategy gmailThreadingStrategy, + ImapThreadStrategy imapThreadStrategy) + { + _outlookThreadingStrategy = outlookThreadingStrategy; + _gmailThreadingStrategy = gmailThreadingStrategy; + _imapThreadStrategy = imapThreadStrategy; + } + + public IThreadingStrategy GetStrategy(MailProviderType mailProviderType) + { + return mailProviderType switch + { + MailProviderType.Outlook or MailProviderType.Office365 => _outlookThreadingStrategy, + MailProviderType.Gmail => _gmailThreadingStrategy, + _ => _imapThreadStrategy, + }; + } + } +} diff --git a/Wino.Core/Services/ThumbnailService.cs b/Wino.Core/Services/ThumbnailService.cs new file mode 100644 index 00000000..bc32803a --- /dev/null +++ b/Wino.Core/Services/ThumbnailService.cs @@ -0,0 +1,64 @@ +using System; +using System.Linq; +using System.Net.Mail; + +namespace Wino.Core.Services +{ + public static class ThumbnailService + { + private static string[] knownCompanies = new string[] + { + "microsoft.com", "apple.com", "google.com", "steampowered.com", "airbnb.com", "youtube.com", "uber.com" + }; + + public static bool IsKnown(string mailHost) => !string.IsNullOrEmpty(mailHost) && knownCompanies.Contains(mailHost); + + public static string GetHost(string address) + { + if (string.IsNullOrEmpty(address)) + return string.Empty; + + if (address.Contains('@')) + { + var splitted = address.Split('@'); + + if (splitted.Length >= 2 && !string.IsNullOrEmpty(splitted[1])) + { + try + { + return new MailAddress(address).Host; + } + catch (Exception) + { + // TODO: Exceptions are ignored for now. + } + } + } + + return string.Empty; + } + + public static Tuple CheckIsKnown(string host) + { + // Check known hosts. + // Apply company logo if available. + + try + { + var last = host.Split('.'); + + if (last.Length > 2) + host = $"{last[last.Length - 2]}.{last[last.Length - 1]}"; + } + catch (Exception) + { + return new Tuple(false, host); + } + + return new Tuple(ThumbnailService.IsKnown(host), host); + } + + public static string GetKnownHostImage(string host) + => $"ms-appx:///Assets/Thumbnails/{host}.png"; + } +} diff --git a/Wino.Core/Services/TokenService.cs b/Wino.Core/Services/TokenService.cs new file mode 100644 index 00000000..175ea38d --- /dev/null +++ b/Wino.Core/Services/TokenService.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities; + +namespace Wino.Core.Services +{ + public interface ITokenService + { + Task GetTokenInformationAsync(Guid accountId); + Task SaveTokenInformationAsync(Guid accountId, TokenInformation tokenInformation); + } + + public class TokenService : BaseDatabaseService, ITokenService + { + public TokenService(IDatabaseService databaseService) : base(databaseService) { } + + public Task GetTokenInformationAsync(Guid accountId) + => Connection.Table().FirstOrDefaultAsync(a => a.AccountId == accountId); + + public async Task SaveTokenInformationAsync(Guid accountId, TokenInformation tokenInformation) + { + // Delete all tokens for this account. + await Connection.Table().DeleteAsync(a => a.AccountId == accountId); + + // Save new token info to the account. + tokenInformation.AccountId = accountId; + + await Connection.InsertOrReplaceAsync(tokenInformation); + } + } +} diff --git a/Wino.Core/Services/TranslationService.cs b/Wino.Core/Services/TranslationService.cs new file mode 100644 index 00000000..c383cf0d --- /dev/null +++ b/Wino.Core/Services/TranslationService.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Newtonsoft.Json; +using Serilog; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Translations; +using Wino.Core.Messages.Shell; + +namespace Wino.Core.Services +{ + public class TranslationService : ITranslationService + { + public const AppLanguage DefaultAppLanguage = AppLanguage.English; + + private ILogger _logger = Log.ForContext(); + private readonly IPreferencesService _preferencesService; + private bool isInitialized = false; + + public TranslationService(IPreferencesService preferencesService) + { + _preferencesService = preferencesService; + } + + // Initialize default language with ignoring current language check. + public Task InitializeAsync() => InitializeLanguageAsync(_preferencesService.CurrentLanguage, ignoreCurrentLanguageCheck: true); + + public async Task InitializeLanguageAsync(AppLanguage language, bool ignoreCurrentLanguageCheck = false) + { + if (!ignoreCurrentLanguageCheck && _preferencesService.CurrentLanguage == language) + { + _logger.Warning("Changing language is ignored because current language and requested language are same."); + + return; + } + + if (ignoreCurrentLanguageCheck && isInitialized) return; + + var currentDictionary = Translator.Resources; + using var resourceStream = currentDictionary.GetLanguageStream(language); + + var stremValue = await new StreamReader(resourceStream).ReadToEndAsync().ConfigureAwait(false); + + var translationLookups = JsonConvert.DeserializeObject>(stremValue); + + // Insert new translation key-value pairs. + // Overwrite existing values for the same keys. + + foreach (var pair in translationLookups) + { + // Replace existing value. + if (currentDictionary.ContainsKey(pair.Key)) + { + currentDictionary[pair.Key] = pair.Value; + } + else + { + currentDictionary.Add(pair.Key, pair.Value); + } + } + + _preferencesService.CurrentLanguage = language; + + isInitialized = true; + WeakReferenceMessenger.Default.Send(new LanguageChanged()); + } + + public List GetAvailableLanguages() + => + [ + new AppLanguageModel(AppLanguage.English, "English"), + new AppLanguageModel(AppLanguage.Deutsch, "Deutsch"), + new AppLanguageModel(AppLanguage.Russian, "Russian"), + new AppLanguageModel(AppLanguage.Turkish, "Türkçe"), + new AppLanguageModel(AppLanguage.Polish, "Polski"), + new AppLanguageModel(AppLanguage.Czech, "Czech"), + new AppLanguageModel(AppLanguage.Spanish, "Spanish"), + new AppLanguageModel(AppLanguage.French, "French"), + ]; + } +} diff --git a/Wino.Core/Services/WinoRequestDelegator.cs b/Wino.Core/Services/WinoRequestDelegator.cs new file mode 100644 index 00000000..8aba36b9 --- /dev/null +++ b/Wino.Core/Services/WinoRequestDelegator.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Serilog; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Messages.Synchronization; +using Wino.Core.Requests; + +namespace Wino.Core.Services +{ + public class WinoRequestDelegator : IWinoRequestDelegator + { + private readonly IWinoRequestProcessor _winoRequestProcessor; + private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; + private readonly IFolderService _folderService; + private readonly IDialogService _dialogService; + private readonly ILogger _logger = Log.ForContext(); + + public WinoRequestDelegator(IWinoRequestProcessor winoRequestProcessor, + IWinoSynchronizerFactory winoSynchronizerFactory, + IFolderService folderService, + IDialogService dialogService) + { + _winoRequestProcessor = winoRequestProcessor; + _winoSynchronizerFactory = winoSynchronizerFactory; + _folderService = folderService; + _dialogService = dialogService; + } + + public async Task ExecuteAsync(MailOperationPreperationRequest request) + { + var requests = new List(); + + try + { + requests = await _winoRequestProcessor.PrepareRequestsAsync(request); + } + catch (UnavailableSpecialFolderException unavailableSpecialFolderException) + { + _dialogService.InfoBarMessage(Translator.Info_MissingFolderTitle, + string.Format(Translator.Info_MissingFolderMessage, unavailableSpecialFolderException.SpecialFolderType), + InfoBarMessageType.Warning, + Translator.SettingConfigureSpecialFolders_Button, + () => + { + _dialogService.HandleSystemFolderConfigurationDialogAsync(unavailableSpecialFolderException.AccountId, _folderService); + }); + } + catch (InvalidMoveTargetException) + { + _dialogService.InfoBarMessage(Translator.Info_InvalidMoveTargetTitle, Translator.Info_InvalidMoveTargetMessage, InfoBarMessageType.Warning); + } + catch (NotImplementedException) + { + _dialogService.ShowNotSupportedMessage(); + } + catch (Exception ex) + { + Log.Error(ex, "Request creation failed."); + _dialogService.InfoBarMessage(Translator.Info_RequestCreationFailedTitle, ex.Message, InfoBarMessageType.Error); + } + + if (requests == null || !requests.Any()) return; + + var accountIds = requests.GroupBy(a => a.Item.AssignedAccount.Id); + + // Queue requests for each account and start synchronization. + foreach (var accountId in accountIds) + { + foreach (var accountRequest in accountId) + { + QueueRequest(accountRequest, accountId.Key); + } + + QueueSynchronization(accountId.Key); + } + } + + public async Task ExecuteAsync(FolderOperation operation, IMailItemFolder folderStructure) + { + IRequest request = null; + + try + { + request = await _winoRequestProcessor.PrepareFolderRequestAsync(operation, folderStructure); + } + catch (NotImplementedException) + { + _dialogService.ShowNotSupportedMessage(); + } + catch (Exception ex) + { + Log.Error(ex, "Folder operation execution failed."); + } + + // _synchronizationWorker.Queue(request); + } + + public Task ExecuteAsync(DraftPreperationRequest draftPreperationRequest) + { + var request = new CreateDraftRequest(draftPreperationRequest); + + QueueRequest(request, draftPreperationRequest.Account.Id); + QueueSynchronization(draftPreperationRequest.Account.Id); + + return Task.CompletedTask; + } + + public Task ExecuteAsync(SendDraftPreparationRequest sendDraftPreperationRequest) + { + var request = new SendDraftRequest(sendDraftPreperationRequest); + + QueueRequest(request, sendDraftPreperationRequest.MailItem.AssignedAccount.Id); + QueueSynchronization(sendDraftPreperationRequest.MailItem.AssignedAccount.Id); + + return Task.CompletedTask; + } + + private void QueueRequest(IRequest request, Guid accountId) + { + var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(accountId); + + if (synchronizer == null) + { + _logger.Warning("Synchronizer not found for account {AccountId}.", accountId); + _logger.Warning("Skipping queueing request {Operation}.", request.Operation); + + return; + } + + synchronizer.QueueRequest(request); + } + + private void QueueSynchronization(Guid accountId) + { + var options = new SynchronizationOptions() + { + AccountId = accountId, + Type = SynchronizationType.ExecuteRequests + }; + + WeakReferenceMessenger.Default.Send(new NewSynchronizationRequested(options)); + } + } +} diff --git a/Wino.Core/Services/WinoRequestProcessor.cs b/Wino.Core/Services/WinoRequestProcessor.cs new file mode 100644 index 00000000..598395ff --- /dev/null +++ b/Wino.Core/Services/WinoRequestProcessor.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; +using Wino.Core.Requests; + +namespace Wino.Core.Services +{ + /// + /// Intermediary processor for converting a user action to executable Wino requests. + /// Primarily responsible for batching requests by AccountId and FolderId. + /// + public class WinoRequestProcessor : BaseDatabaseService, IWinoRequestProcessor + { + private readonly IFolderService _folderService; + private readonly IKeyPressService _keyPressService; + private readonly IPreferencesService _preferencesService; + private readonly IAccountService _accountService; + private readonly IDialogService _dialogService; + + /// + /// Set of rules that defines which action should be executed if user wants to toggle an action. + /// + private readonly List _toggleRequestRules = + [ + new ToggleRequestRule(MailOperation.MarkAsRead, MailOperation.MarkAsUnread, new System.Func((item) => item.IsRead)), + new ToggleRequestRule(MailOperation.MarkAsUnread, MailOperation.MarkAsRead, new System.Func((item) => !item.IsRead)), + new ToggleRequestRule(MailOperation.SetFlag, MailOperation.ClearFlag, new System.Func((item) => item.IsFlagged)), + new ToggleRequestRule(MailOperation.ClearFlag, MailOperation.SetFlag, new System.Func((item) => !item.IsFlagged)), + ]; + + public WinoRequestProcessor(IDatabaseService databaseService, + IFolderService folderService, + IKeyPressService keyPressService, + IPreferencesService preferencesService, + IAccountService accountService, + IDialogService dialogService) : base(databaseService) + { + _folderService = folderService; + _keyPressService = keyPressService; + _preferencesService = preferencesService; + _accountService = accountService; + _dialogService = dialogService; + } + + public async Task> PrepareRequestsAsync(MailOperationPreperationRequest preperationRequest) + { + var action = preperationRequest.Action; + var moveTargetStructure = preperationRequest.MoveTargetFolder; + + // Ask confirmation for permanent delete operation. + // Drafts are always hard deleted without any protection. + + if (!preperationRequest.IgnoreHardDeleteProtection && ((action == MailOperation.SoftDelete && _keyPressService.IsShiftKeyPressed()) || action == MailOperation.HardDelete)) + { + if (_preferencesService.IsHardDeleteProtectionEnabled) + { + var shouldDelete = await _dialogService.ShowHardDeleteConfirmationAsync(); + + if (!shouldDelete) return default; + } + + action = MailOperation.HardDelete; + } + + // Make sure there is a move target folder if action is move. + // Let user pick a folder to move from the dialog. + + if (action == MailOperation.Move && moveTargetStructure == null) + { + // TODO: Handle multiple accounts for move operation. + // What happens if we move 2 different mails from 2 different accounts? + + var accountId = preperationRequest.MailItems.FirstOrDefault().AssignedAccount.Id; + + moveTargetStructure = await _dialogService.PickFolderAsync(accountId, PickFolderReason.Move, _folderService); + + if (moveTargetStructure == null) + return default; + } + + var requests = new List(); + + foreach (var item in preperationRequest.MailItems) + { + requests.Add(await GetSingleRequestAsync(item, action, moveTargetStructure, preperationRequest.ToggleExecution)); + } + + return requests; + } + + private async Task GetSingleRequestAsync(MailCopy mailItem, MailOperation action, IMailItemFolder moveTargetStructure, bool shouldToggleActions) + { + if (mailItem.AssignedAccount == null) throw new ArgumentException(Translator.Exception_NullAssignedAccount); + if (mailItem.AssignedFolder == null) throw new ArgumentException(Translator.Exception_NullAssignedFolder); + + // Rule: Soft deletes from Trash folder must perform Hard Delete. + if (action == MailOperation.SoftDelete && mailItem.AssignedFolder.SpecialFolderType == SpecialFolderType.Deleted) + action = MailOperation.HardDelete; + + // Rule: SoftDelete draft items must be performed as hard delete. + if (action == MailOperation.SoftDelete && mailItem.IsDraft) + action = MailOperation.HardDelete; + + // Rule: Toggle actions must be reverted if ToggleExecution is passed true. + if (shouldToggleActions) + { + var toggleRule = _toggleRequestRules.Find(a => a.SourceAction == action); + + if (toggleRule != null && toggleRule.Condition(mailItem)) + { + action = toggleRule.TargetAction; + } + } + + if (action == MailOperation.MarkAsRead) + return new MarkReadRequest(mailItem, true); + else if (action == MailOperation.MarkAsUnread) + return new MarkReadRequest(mailItem, false); + else if (action == MailOperation.SetFlag) + return new ChangeFlagRequest(mailItem, true); + else if (action == MailOperation.ClearFlag) + return new ChangeFlagRequest(mailItem, false); + else if (action == MailOperation.HardDelete) + return new DeleteRequest(mailItem); + else if (action == MailOperation.Move) + { + if (moveTargetStructure == null) + throw new InvalidMoveTargetException(); + + // TODO + // Rule: You can't move items to non-move target folders; + // Rule: You can't move items from a folder to itself. + + //if (!moveTargetStructure.IsMoveTarget || moveTargetStructure.FolderId == mailItem.AssignedFolder.Id) + // throw new InvalidMoveTargetException(); + + var pickedFolderItem = await _folderService.GetFolderAsync(moveTargetStructure.Id); + + return new MoveRequest(mailItem, mailItem.AssignedFolder, pickedFolderItem); + } + else if (action == MailOperation.Archive) + { + // Validate archive folder exists. + + var archiveFolder = await _folderService.GetSpecialFolderByAccountIdAsync(mailItem.AssignedAccount.Id, SpecialFolderType.Archive) + ?? throw new UnavailableSpecialFolderException(SpecialFolderType.Archive, mailItem.AssignedAccount.Id); + + return new MoveRequest(mailItem, mailItem.AssignedFolder, archiveFolder); + } + else if (action == MailOperation.UnArchive || action == MailOperation.MarkAsNotJunk) + { + var inboxFolder = await _folderService.GetSpecialFolderByAccountIdAsync(mailItem.AssignedAccount.Id, SpecialFolderType.Inbox) + ?? throw new UnavailableSpecialFolderException(SpecialFolderType.Inbox, mailItem.AssignedAccount.Id); + + return new MoveRequest(mailItem, mailItem.AssignedFolder, inboxFolder); + } + else if (action == MailOperation.SoftDelete) + { + var trashFolder = await _folderService.GetSpecialFolderByAccountIdAsync(mailItem.AssignedAccount.Id, SpecialFolderType.Deleted) + ?? throw new UnavailableSpecialFolderException(SpecialFolderType.Deleted, mailItem.AssignedAccount.Id); + + return new MoveRequest(mailItem, mailItem.AssignedFolder, trashFolder); + } + else if (action == MailOperation.MoveToJunk) + { + var junkFolder = await _folderService.GetSpecialFolderByAccountIdAsync(mailItem.AssignedAccount.Id, SpecialFolderType.Junk) + ?? throw new UnavailableSpecialFolderException(SpecialFolderType.Junk, mailItem.AssignedAccount.Id); + + return new MoveRequest(mailItem, mailItem.AssignedFolder, junkFolder); + } + else if (action == MailOperation.AlwaysMoveToFocused || action == MailOperation.AlwaysMoveToOther) + return new AlwaysMoveToRequest(mailItem, action == MailOperation.AlwaysMoveToFocused); + else + throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedAction, action)); + } + + public async Task PrepareFolderRequestAsync(FolderOperation operation, IMailItemFolder mailItemFolder) + { + if (mailItemFolder == null) return default; + + var accountId = mailItemFolder.MailAccountId; + + IRequest change = null; + + switch (operation) + { + case FolderOperation.Pin: + case FolderOperation.Unpin: + await _folderService.ChangeStickyStatusAsync(mailItemFolder.Id, operation == FolderOperation.Pin); + break; + //case FolderOperation.MarkAllAsRead: + // // Get all mails in the folder. + + // var mailItems = await _folderService.GetAllUnreadItemsByFolderIdAsync(accountId, folderStructure.RemoteFolderId).ConfigureAwait(false); + + // if (mailItems.Any()) + // change = new FolderMarkAsReadRequest(accountId, mailItems.Select(a => a.Id).Distinct(), folderStructure.RemoteFolderId, folderStructure.FolderId); + + // break; + //case FolderOperation.Empty: + // // Get all mails in the folder. + + // var mailsToDelete = await _folderService.GetMailByFolderIdAsync(folderStructure.FolderId).ConfigureAwait(false); + + // if (mailsToDelete.Any()) + // change = new FolderEmptyRequest(accountId, mailsToDelete.Select(a => a.Id).Distinct(), folderStructure.RemoteFolderId, folderStructure.FolderId); + + // break; + //case FolderOperation.Rename: + // var newFolderName = await _dialogService.ShowRenameFolderDialogAsync(folderStructure.FolderName); + + // if (!string.IsNullOrEmpty(newFolderName)) + // change = new RenameFolderRequest(accountId, folderStructure.RemoteFolderId, folderStructure.FolderId, newFolderName, folderStructure.FolderName); + + // break; + //case FolderOperation.Delete: + // var isConfirmed = await _dialogService.ShowConfirmationDialogAsync($"'{folderStructure.FolderName}' is going to be deleted. Do you want to continue?", "Are you sure?", "Yes delete."); + + // if (isConfirmed) + // change = new DeleteFolderRequest(accountId, folderStructure.RemoteFolderId, folderStructure.FolderId); + + // break; + //default: + // throw new NotImplementedException(); + } + + return change; + } + } +} diff --git a/Wino.Core/Synchronizers/BaseSynchronizer.cs b/Wino.Core/Synchronizers/BaseSynchronizer.cs new file mode 100644 index 00000000..bd97d7c0 --- /dev/null +++ b/Wino.Core/Synchronizers/BaseSynchronizer.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using MailKit; +using Serilog; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Integration; +using Wino.Core.Messages.Mails; +using Wino.Core.Messages.Synchronization; +using Wino.Core.Misc; +using Wino.Core.Requests; + +namespace Wino.Core.Synchronizers +{ + public interface IBaseSynchronizer + { + /// + /// Account that is assigned for this synchronizer. + /// + MailAccount Account { get; } + + /// + /// Synchronizer state. + /// + AccountSynchronizerState State { get; } + + /// + /// Queues a single request to be executed in the next synchronization. + /// + /// Request to queue. + void QueueRequest(IRequestBase request); + + /// + /// TODO + /// + /// Whether active synchronization is stopped or not. + bool CancelActiveSynchronization(); + + /// + /// Performs a full synchronization with the server with given options. + /// This will also prepares batch requests for execution. + /// Requests are executed in the order they are queued and happens before the synchronization. + /// Result of the execution queue is processed during the synchronization. + /// + /// Options for synchronization. + /// Cancellation token. + /// Result summary of synchronization. + Task SynchronizeAsync(SynchronizationOptions options, CancellationToken cancellationToken = default); + + /// + /// Downloads a single MIME message from the server and saves it to disk. + /// + /// Mail item to download from server. + /// Optional progress reporting for download operation. + /// Cancellation token. + Task DownloadMissingMimeMessageAsync(IMailItem mailItem, ITransferProgress transferProgress, CancellationToken cancellationToken = default); + } + + public abstract class BaseSynchronizer : BaseMailIntegrator, IBaseSynchronizer + { + private SemaphoreSlim synchronizationSemaphore = new(1); + private CancellationToken activeSynchronizationCancellationToken; + + protected ConcurrentBag changeRequestQueue = []; + protected ILogger Logger = Log.ForContext>(); + + protected BaseSynchronizer(MailAccount account) + { + Account = account; + } + + public MailAccount Account { get; } + + private AccountSynchronizerState state; + public AccountSynchronizerState State + { + get { return state; } + private set + { + state = value; + + WeakReferenceMessenger.Default.Send(new AccountSynchronizerStateChanged(this, value)); + } + } + + /// + /// Queues a single request to be executed in the next synchronization. + /// + /// Request to execute. + public void QueueRequest(IRequestBase request) => changeRequestQueue.Add(request); + + /// + /// Creates a new Wino Mail Item package out of native message type with full Mime. + /// + /// Native message type for the synchronizer. + /// Cancellation token + /// Package that encapsulates downloaded Mime and additional information for adding new mail. + public abstract Task> CreateNewMailPackagesAsync(TMessageType message, MailItemFolder assignedFolder, CancellationToken cancellationToken = default); + + /// + /// Runs existing queued requests in the queue. + /// + /// Batched requests to execute. Integrator methods will only receive batched requests. + /// Cancellation token + public abstract Task ExecuteNativeRequestsAsync(IEnumerable> batchedRequests, CancellationToken cancellationToken = default); + + public abstract Task SynchronizeInternalAsync(SynchronizationOptions options, CancellationToken cancellationToken = default); + + public async Task SynchronizeAsync(SynchronizationOptions options, CancellationToken cancellationToken = default) + { + try + { + activeSynchronizationCancellationToken = cancellationToken; + + var batches = CreateBatchRequests().Distinct(); + + if (batches.Any()) + { + Logger.Information($"{batches?.Count() ?? 0} batched requests"); + + State = AccountSynchronizerState.ExecutingRequests; + + var nativeRequests = CreateNativeRequestBundles(batches); + + Console.WriteLine($"Prepared {nativeRequests.Count()} native requests"); + + await ExecuteNativeRequestsAsync(nativeRequests, activeSynchronizationCancellationToken); + + 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 == SynchronizationType.ExecuteRequests) + options = GetSynchronizationOptionsAfterRequestExecution(batches); + } + + State = AccountSynchronizerState.Synchronizing; + + await synchronizationSemaphore.WaitAsync(activeSynchronizationCancellationToken); + + // Start the internal synchronization. + var synchronizationResult = await SynchronizeInternalAsync(options, activeSynchronizationCancellationToken).ConfigureAwait(false); + + PublishUnreadItemChanges(); + + return synchronizationResult; + } + catch (OperationCanceledException) + { + Logger.Warning("Synchronization cancelled."); + return SynchronizationResult.Canceled; + } + catch (Exception) + { + // Disable maybe? + throw; + } + finally + { + // Reset account progress to hide the progress. + options.ProgressListener?.AccountProgressUpdated(Account.Id, 0); + + State = AccountSynchronizerState.Idle; + synchronizationSemaphore.Release(); + } + } + + /// + /// Updates unread item counts for some folders and account. + /// Sends a message that shell can pick up and update the UI. + /// + private void PublishUnreadItemChanges() + => WeakReferenceMessenger.Default.Send(new RefreshUnreadCountsMessage(Account.Id)); + + /// + /// 1. Group all requests by operation type. + /// 2. Group all individual operation type requests with equality check. + /// Equality comparison in the records are done with RequestComparer + /// to ignore Item property. Each request can have their own logic for comparison. + /// For example, move requests for different mails from the same folder to the same folder + /// must be dispatched in the same batch. This is much faster for the server. Specially IMAP + /// since all folders must be asynchronously opened/closed. + /// + /// Batch request collection for all these single requests. + private List CreateBatchRequests() + { + var batchList = new List(); + var comparer = new RequestComparer(); + + while (changeRequestQueue.Count > 0) + { + if (changeRequestQueue.TryPeek(out IRequestBase request)) + { + // Mail request, must be batched. + if (request is IRequest mailRequest) + { + var equalItems = changeRequestQueue + .Where(a => a is IRequest && comparer.Equals(a, request)) + .Cast() + .ToList(); + + batchList.Add(mailRequest.CreateBatch(equalItems)); + + // Remove these items from the queue. + foreach (var item in equalItems) + { + changeRequestQueue.TryTake(out _); + } + } + else + batchList.Add(request); + } + } + + return batchList; + } + + /// + /// Converts batched requests into HTTP/Task calls that derived synchronizers can execute. + /// + /// Batch requests to be converted. + /// Collection of native requests for individual synchronizer type. + private IEnumerable> CreateNativeRequestBundles(IEnumerable batchChangeRequests) + { + IEnumerable>> GetNativeRequests() + { + foreach (var item in batchChangeRequests) + { + switch (item.Operation) + { + case MailSynchronizerOperation.Send: + yield return SendDraft((BatchSendDraftRequestRequest)item); + break; + case MailSynchronizerOperation.MarkRead: + yield return MarkRead((BatchMarkReadRequest)item); + break; + case MailSynchronizerOperation.Move: + yield return Move((BatchMoveRequest)item); + break; + case MailSynchronizerOperation.Delete: + yield return Delete((BatchDeleteRequest)item); + break; + case MailSynchronizerOperation.ChangeFlag: + yield return ChangeFlag((BatchChangeFlagRequest)item); + break; + case MailSynchronizerOperation.AlwaysMoveTo: + yield return AlwaysMoveTo((BatchAlwaysMoveToRequest)item); + break; + case MailSynchronizerOperation.MoveToFocused: + yield return MoveToFocused((BatchMoveToFocusedRequest)item); + break; + case MailSynchronizerOperation.CreateDraft: + yield return CreateDraft((BatchCreateDraftRequest)item); + break; + } + } + }; + + return GetNativeRequests().SelectMany(collections => collections); + } + + /// + /// Attempts to find out the best possible synchronization options after the batch request execution. + /// + /// Batch requests to run in synchronization. + /// New synchronization options with minimal HTTP effort. + private SynchronizationOptions GetSynchronizationOptionsAfterRequestExecution(IEnumerable batches) + { + // TODO: Check folders only. + var batchItems = batches.Where(a => a is IBatchChangeRequest).Cast(); + + var requests = batchItems.SelectMany(a => a.Items); + + var options = new SynchronizationOptions() + { + AccountId = Account.Id, + Type = SynchronizationType.FoldersOnly + }; + + bool isCustomSynchronization = requests.All(a => a is ICustomFolderSynchronizationRequest); + + if (isCustomSynchronization) + { + // Gather FolderIds to synchronize. + + options.Type = SynchronizationType.Custom; + options.SynchronizationFolderIds = requests.Cast().SelectMany(a => a.SynchronizationFolderIds).ToList(); + } + else + { + // At this point it's a mix of everything. Do full sync. + options.Type = SynchronizationType.Full; + } + + return options; + } + + public virtual IEnumerable> Move(BatchMoveRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> ChangeFlag(BatchChangeFlagRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> MarkRead(BatchMarkReadRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> Delete(BatchDeleteRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> AlwaysMoveTo(BatchAlwaysMoveToRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> MoveToFocused(BatchMoveToFocusedRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> CreateDraft(BatchCreateDraftRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + public virtual IEnumerable> SendDraft(BatchSendDraftRequestRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + + /// + /// Downloads a single missing message from synchronizer and saves it to given FileId from IMailItem. + /// + /// Mail item that its mime file does not exist on the disk. + /// Optional download progress for IMAP synchronizer. + /// 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 bool CancelActiveSynchronization() + { + // TODO: What if account is deleted during synchronization? + return true; + } + } +} diff --git a/Wino.Core/Synchronizers/GmailSynchronizer.cs b/Wino.Core/Synchronizers/GmailSynchronizer.cs new file mode 100644 index 00000000..217ad727 --- /dev/null +++ b/Wino.Core/Synchronizers/GmailSynchronizer.cs @@ -0,0 +1,917 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Google.Apis.Gmail.v1; +using Google.Apis.Gmail.v1.Data; +using Google.Apis.Http; +using Google.Apis.Requests; +using Google.Apis.Services; +using MailKit; +using Microsoft.IdentityModel.Tokens; +using MimeKit; +using MoreLinq; +using Serilog; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Extensions; +using Wino.Core.Http; +using Wino.Core.Integration.Processors; +using Wino.Core.Requests; + +namespace Wino.Core.Synchronizers +{ + public class GmailSynchronizer : BaseSynchronizer, IHttpClientFactory + { + public override uint BatchModificationSize => 1000; + public override uint InitialMessageDownloadCountPerFolder => 1200; + + // It's actually 100. But Gmail SDK has internal bug for Out of Memory exception. + // https://github.com/googleapis/google-api-dotnet-client/issues/2603 + private const uint MaximumAllowedBatchRequestSize = 10; + + private readonly ConfigurableHttpClient _gmailHttpClient; + private readonly GmailService _gmailService; + private readonly IAuthenticator _authenticator; + private readonly IDefaultChangeProcessor _gmailChangeProcessor; + private readonly ILogger _logger = Log.ForContext(); + + public GmailSynchronizer(MailAccount account, + IAuthenticator authenticator, + IDefaultChangeProcessor gmailChangeProcessor) : base(account) + { + var messageHandler = new GmailClientMessageHandler(() => _authenticator.GetTokenAsync(Account)); + + var initializer = new BaseClientService.Initializer() + { + HttpClientFactory = this + }; + + _gmailHttpClient = new ConfigurableHttpClient(messageHandler); + _gmailService = new GmailService(initializer); + _authenticator = authenticator; + _gmailChangeProcessor = gmailChangeProcessor; + } + + public ConfigurableHttpClient CreateHttpClient(CreateHttpClientArgs args) => _gmailHttpClient; + + public override async Task SynchronizeInternalAsync(SynchronizationOptions options, CancellationToken cancellationToken = default) + { + _logger.Information("Internal synchronization started for {Name}", Account.Name); + + // Gmail must always synchronize folders before because it doesn't have a per-folder sync. + bool shouldSynchronizeFolders = true; + + if (shouldSynchronizeFolders) + { + _logger.Information("Synchronizing folders for {Name}", Account.Name); + + await SynchronizeFoldersAsync(cancellationToken).ConfigureAwait(false); + + _logger.Information("Synchronizing folders for {Name} is completed", Account.Name); + } + + // There is no specific folder synchronization in Gmail. + // Therefore we need to stop the synchronization at this point + // if type is only folder metadata sync. + + if (options.Type == SynchronizationType.FoldersOnly) return SynchronizationResult.Empty; + + cancellationToken.ThrowIfCancellationRequested(); + + bool isInitialSync = string.IsNullOrEmpty(Account.SynchronizationDeltaIdentifier); + + _logger.Debug("Is initial synchronization: {IsInitialSync}", isInitialSync); + + var missingMessageIds = new List(); + + var deltaChanges = new List(); // For tracking delta changes. + var listChanges = new List(); // For tracking initial sync changes. + + /* Processing flow order is important to preserve the validity of history. + * 1 - Process added mails. Because we need to create the mail first before assigning it to labels. + * 2 - Process label assignments. + * 3 - Process removed mails. + * This affects reporting progres if done individually for each history change. + * Therefore we need to process all changes in one go after the fetch. + */ + + if (isInitialSync) + { + // Initial synchronization. + // Google sends message id and thread id in this query. + // We'll collect them and send a Batch request to get details of the messages. + + var messageRequest = _gmailService.Users.Messages.List("me"); + + // Gmail doesn't do per-folder sync. So our per-folder count is the same as total message count. + messageRequest.MaxResults = InitialMessageDownloadCountPerFolder; + messageRequest.IncludeSpamTrash = true; + + ListMessagesResponse result = null; + + string nextPageToken = string.Empty; + + while (true) + { + if (!string.IsNullOrEmpty(nextPageToken)) + { + messageRequest.PageToken = nextPageToken; + } + + result = await messageRequest.ExecuteAsync(cancellationToken); + + nextPageToken = result.NextPageToken; + + listChanges.Add(result); + + // Nothing to fetch anymore. Break the loop. + if (nextPageToken == null) + break; + } + } + else + { + var startHistoryId = ulong.Parse(Account.SynchronizationDeltaIdentifier); + var nextPageToken = ulong.Parse(Account.SynchronizationDeltaIdentifier).ToString(); + + var historyRequest = _gmailService.Users.History.List("me"); + historyRequest.StartHistoryId = startHistoryId; + + while (!string.IsNullOrEmpty(nextPageToken)) + { + // If this is the first delta check, start from the last history id. + // Otherwise start from the next page token. We set them both to the same value for start. + // For each different page we set the page token to the next page token. + + bool isFirstDeltaCheck = nextPageToken == startHistoryId.ToString(); + + if (!isFirstDeltaCheck) + historyRequest.PageToken = nextPageToken; + + var historyResponse = await historyRequest.ExecuteAsync(cancellationToken); + + nextPageToken = historyResponse.NextPageToken; + + if (historyResponse.History == null) + continue; + + deltaChanges.Add(historyResponse); + } + } + + // Add initial message ids from initial sync. + missingMessageIds.AddRange(listChanges.Where(a => a.Messages != null).SelectMany(a => a.Messages).Select(a => a.Id)); + + // Add missing message ids from delta changes. + foreach (var historyResponse in deltaChanges) + { + var addedMessageIds = historyResponse.History + .Where(a => a.MessagesAdded != null) + .SelectMany(a => a.MessagesAdded) + .Where(a => a.Message != null) + .Select(a => a.Message.Id); + + missingMessageIds.AddRange(addedMessageIds); + } + + // Consolidate added/deleted elements. + // For example: History change might report downloading a mail first, then deleting it in another history change. + // In that case, downloading mail will return entity not found error. + // Plus, it's a redundant download the mail. + // Purge missing message ids from potentially deleted mails to prevent this. + + var messageDeletedHistoryChanges = deltaChanges + .Where(a => a.History != null) + .SelectMany(a => a.History) + .Where(a => a.MessagesDeleted != null) + .SelectMany(a => a.MessagesDeleted); + + var deletedMailIdsInHistory = messageDeletedHistoryChanges.Select(a => a.Message.Id); + + if (deletedMailIdsInHistory.Any()) + { + var mailIdsToConsolidate = missingMessageIds.Where(a => deletedMailIdsInHistory.Contains(a)).ToList(); + + int consolidatedMessageCount = missingMessageIds.RemoveAll(a => deletedMailIdsInHistory.Contains(a)); + + if (consolidatedMessageCount > 0) + { + // TODO: Also delete the history changes that are related to these mails. + // This will prevent unwanted logs and additional queries to look for them in processing. + + _logger.Information($"Purged {consolidatedMessageCount} missing mail downloads. ({string.Join(",", mailIdsToConsolidate)})"); + } + } + + // Start downloading missing messages. + await BatchDownloadMessagesAsync(missingMessageIds, options.ProgressListener, cancellationToken).ConfigureAwait(false); + + // Map remote drafts to local drafts. + await MapDraftIdsAsync(cancellationToken).ConfigureAwait(false); + + // Start processing delta changes. + foreach (var historyResponse in deltaChanges) + { + await ProcessHistoryChangesAsync(historyResponse).ConfigureAwait(false); + } + + // Take the max history id from delta changes and update the account sync modifier. + var maxHistoryId = deltaChanges.Max(a => a.HistoryId); + + if (maxHistoryId != null) + { + // TODO: This is not good. Centralize the identifier fetch and prevent direct access here. + Account.SynchronizationDeltaIdentifier = await _gmailChangeProcessor.UpdateAccountDeltaSynchronizationIdentifierAsync(Account.Id, maxHistoryId.ToString()).ConfigureAwait(false); + + _logger.Debug("Final sync identifier {SynchronizationDeltaIdentifier}", Account.SynchronizationDeltaIdentifier); + } + + // Get all unred new downloaded items and return in the result. + // This is primarily used in notifications. + + var unreadNewItems = await _gmailChangeProcessor.GetDownloadedUnreadMailsAsync(Account.Id, missingMessageIds).ConfigureAwait(false); + + return SynchronizationResult.Completed(unreadNewItems); + } + + private async Task SynchronizeFoldersAsync(CancellationToken cancellationToken = default) + { + var folderRequest = _gmailService.Users.Labels.List("me"); + + var labelsResponse = await folderRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false); + + if (labelsResponse.Labels == null) + { + _logger.Warning("No folders found for {Name}", Account.Name); + return; + } + + _logger.Debug($"Gmail folders found: {string.Join(",", labelsResponse.Labels.Select(a => a.Name))}"); + + // Gmail has special Categories parent folder. + var categoriesFolder = new MailItemFolder() + { + SpecialFolderType = SpecialFolderType.Category, + MailAccountId = Account.Id, + FolderName = "Categories", + IsSynchronizationEnabled = false, + IsSticky = true, + Id = Guid.NewGuid(), + RemoteFolderId = "Categories" + }; + + var initializedFolders = new List() { categoriesFolder }; + + foreach (var label in labelsResponse.Labels) + { + var localFolder = label.GetLocalFolder(Account.Id); + + localFolder.MailAccountId = Account.Id; + + initializedFolders.Add(localFolder); + } + + // 1. Create parent-child relations but first order by name desc to be able to not mess up FolderNames in memory. + // 2. Mark special folder types that belong to categories folder. + + var ordered = initializedFolders.OrderByDescending(a => a.FolderName); + + // TODO: This can be refactored better. + foreach (var label in ordered) + { + // Gmail categorizes sub-labels by '/' For example: + // ParentTest/SubTest in the name of label means + // SubTest is a sub-label of ParentTest label. + + if (label.SpecialFolderType == SpecialFolderType.Promotions || + label.SpecialFolderType == SpecialFolderType.Updates || + label.SpecialFolderType == SpecialFolderType.Social || + label.SpecialFolderType == SpecialFolderType.Forums || + label.SpecialFolderType == SpecialFolderType.Personal) + { + label.ParentRemoteFolderId = categoriesFolder.RemoteFolderId; + + // These folders can not be a sub folder. + continue; + } + + var isSubFolder = label.FolderName.Contains("/"); + + if (isSubFolder) + { + var splittedFolderName = label.FolderName.Split('/'); + var partCount = splittedFolderName.Length; + + if (partCount > 1) + { + // Only make the last part connection since other relations will build up in the loop. + + var realChildFolderName = splittedFolderName[splittedFolderName.Length - 1]; + + var childFolder = initializedFolders.Find(a => a.FolderName.EndsWith(realChildFolderName)); + + string GetParentFolderName(string[] parts) + { + var builder = new StringBuilder(); + + for (int i = 0; i < parts.Length - 1; i++) + { + builder.Append(parts[i]); + + if (i != parts.Length - 2) + builder.Append("/"); + } + + return builder.ToString(); + } + + var parentFolderName = GetParentFolderName(splittedFolderName); + + var parentFolder = initializedFolders.Find(a => a.FolderName == parentFolderName); + + if (childFolder != null && parentFolder != null) + { + childFolder.FolderName = realChildFolderName; + childFolder.ParentRemoteFolderId = parentFolder.RemoteFolderId; + } + } + } + } + + await _gmailChangeProcessor.UpdateFolderStructureAsync(Account.Id, initializedFolders).ConfigureAwait(false); + } + + /// + /// Returns a single get request to retrieve the raw message with the given id + /// + /// Message to download. + /// Get request for raw mail. + private UsersResource.MessagesResource.GetRequest CreateSingleMessageGet(string messageId) + { + var singleRequest = _gmailService.Users.Messages.Get("me", messageId); + singleRequest.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw; + + return singleRequest; + } + + /// + /// Downloads given message ids per batch and processes them. + /// + /// Gmail message ids to download. + /// Cancellation token. + private async Task BatchDownloadMessagesAsync(IEnumerable messageIds, ISynchronizationProgress progressListener = null, CancellationToken cancellationToken = default) + { + var totalDownloadCount = messageIds.Count(); + + if (totalDownloadCount == 0) return; + + var downloadedItemCount = 0; + + _logger.Debug("Batch downloading {Count} messages for {Name}", messageIds.Count(), Account.Name); + + var allDownloadRequests = messageIds.Select(CreateSingleMessageGet); + + // Respect the batch size limit for batch requests. + var batchedDownloadRequests = allDownloadRequests.Batch((int)MaximumAllowedBatchRequestSize); + + _logger.Debug("Total items to download: {TotalDownloadCount}. Created {Count} batch download requests for {Name}.", batchedDownloadRequests.Count(), Account.Name, totalDownloadCount); + + // Gmail SDK's BatchRequest has Action delegate for callback, not Task. + // Therefore it's not possible to make sure that downloaded item is processed in the database before this + // async callback is finished. Therefore we need to wrap all local database processings into task list and wait all of them to finish + // Batch execution finishes after response parsing is done. + + var batchProcessCallbacks = new List(); + + foreach (var batchBundle in batchedDownloadRequests) + { + cancellationToken.ThrowIfCancellationRequested(); + + var batchRequest = new BatchRequest(_gmailService); + + // Queue each request into this batch. + batchBundle.ForEach(request => + { + batchRequest.Queue(request, (content, error, index, message) => + { + var downloadingMessageId = messageIds.ElementAt(index); + + batchProcessCallbacks.Add(HandleSingleItemDownloadedCallbackAsync(content, error, downloadingMessageId, cancellationToken)); + + downloadedItemCount++; + + var progressValue = downloadedItemCount * 100 / Math.Max(1, totalDownloadCount); + + progressListener?.AccountProgressUpdated(Account.Id, progressValue); + }); + }); + + _logger.Information("Executing batch download with {Count} items.", batchRequest.Count); + + await batchRequest.ExecuteAsync(cancellationToken); + + // This is important due to bug in Gmail SDK. + // We force GC here to prevent Out of Memory exception. + // https://github.com/googleapis/google-api-dotnet-client/issues/2603 + + GC.Collect(); + } + + // Wait for all processing to finish. + await Task.WhenAll(batchProcessCallbacks).ConfigureAwait(false); + } + + /// + /// Processes the delta changes for the given history changes. + /// Message downloads are not handled here since it's better to batch them. + /// + /// List of history changes. + private async Task ProcessHistoryChangesAsync(ListHistoryResponse listHistoryResponse) + { + _logger.Debug("Processing delta change {HistoryId} for {Name}", Account.Name, listHistoryResponse.HistoryId.GetValueOrDefault()); + + foreach (var history in listHistoryResponse.History) + { + // Handle label additions. + if (history.LabelsAdded is not null) + { + foreach (var addedLabel in history.LabelsAdded) + { + await HandleLabelAssignmentAsync(addedLabel); + } + } + + // Handle label removals. + if (history.LabelsRemoved is not null) + { + foreach (var removedLabel in history.LabelsRemoved) + { + await HandleLabelRemovalAsync(removedLabel); + } + } + + // Handle removed messages. + if (history.MessagesDeleted is not null) + { + foreach (var deletedMessage in history.MessagesDeleted) + { + var messageId = deletedMessage.Message.Id; + + _logger.Debug("Processing message deletion for {MessageId}", messageId); + + await _gmailChangeProcessor.DeleteMailAsync(Account.Id, messageId).ConfigureAwait(false); + } + } + } + } + + private async Task HandleLabelAssignmentAsync(HistoryLabelAdded addedLabel) + { + var messageId = addedLabel.Message.Id; + + _logger.Debug("Processing label assignment for message {MessageId}", messageId); + + foreach (var labelId in addedLabel.LabelIds) + { + // When UNREAD label is added mark the message as un-read. + if (labelId == GoogleIntegratorExtensions.UNREAD_LABEL_ID) + await _gmailChangeProcessor.ChangeMailReadStatusAsync(messageId, false).ConfigureAwait(false); + + // When STARRED label is added mark the message as flagged. + if (labelId == GoogleIntegratorExtensions.STARRED_LABEL_ID) + await _gmailChangeProcessor.ChangeFlagStatusAsync(messageId, true).ConfigureAwait(false); + + await _gmailChangeProcessor.CreateAssignmentAsync(Account.Id, messageId, labelId).ConfigureAwait(false); + } + } + + private async Task HandleLabelRemovalAsync(HistoryLabelRemoved removedLabel) + { + var messageId = removedLabel.Message.Id; + + _logger.Debug("Processing label removed for message {MessageId}", messageId); + + foreach (var labelId in removedLabel.LabelIds) + { + // When UNREAD label is removed mark the message as read. + if (labelId == GoogleIntegratorExtensions.UNREAD_LABEL_ID) + await _gmailChangeProcessor.ChangeMailReadStatusAsync(messageId, true).ConfigureAwait(false); + + // When STARRED label is removed mark the message as un-flagged. + if (labelId == GoogleIntegratorExtensions.STARRED_LABEL_ID) + await _gmailChangeProcessor.ChangeFlagStatusAsync(messageId, false).ConfigureAwait(false); + + // For other labels remove the mail assignment. + await _gmailChangeProcessor.DeleteAssignmentAsync(Account.Id, messageId, labelId).ConfigureAwait(false); + } + } + + /// + /// Prepares Gmail Draft object from Google SDK. + /// If provided, ThreadId ties the draft to a thread. Used when replying messages. + /// If provided, DraftId updates the draft instead of creating a new one. + /// + /// MailKit MimeMessage to include as raw message into Gmail request. + /// ThreadId that this draft should be tied to. + /// Existing DraftId from Gmail to update existing draft. + /// + private Draft PrepareGmailDraft(MimeMessage mimeMessage, string messageThreadId = "", string messageDraftId = "") + { + mimeMessage.Prepare(EncodingConstraint.None); + + var mimeString = mimeMessage.ToString(); + var base64UrlEncodedMime = Base64UrlEncoder.Encode(mimeString); + + var nativeMessage = new Message() + { + Raw = base64UrlEncodedMime, + }; + + if (!string.IsNullOrEmpty(messageThreadId)) + nativeMessage.ThreadId = messageThreadId; + + var draft = new Draft() + { + Message = nativeMessage, + Id = messageDraftId + }; + + return draft; + } + + #region Mail Integrations + + public override IEnumerable> Move(BatchMoveRequest request) + { + return CreateBatchedHttpBundleFromGroup(request, (items) => + { + var batchModifyRequest = new BatchModifyMessagesRequest + { + Ids = items.Select(a => a.Item.Id.ToString()).ToList(), + AddLabelIds = new[] { request.ToFolder.RemoteFolderId }, + RemoveLabelIds = new[] { request.FromFolder.RemoteFolderId } + }; + + return _gmailService.Users.Messages.BatchModify(batchModifyRequest, "me"); + }); + } + + public override IEnumerable> ChangeFlag(BatchChangeFlagRequest request) + { + return CreateBatchedHttpBundleFromGroup(request, (items) => + { + var batchModifyRequest = new BatchModifyMessagesRequest + { + Ids = items.Select(a => a.Item.Id.ToString()).ToList(), + }; + + if (request.IsFlagged) + batchModifyRequest.AddLabelIds = new List() { GoogleIntegratorExtensions.STARRED_LABEL_ID }; + else + batchModifyRequest.RemoveLabelIds = new List() { GoogleIntegratorExtensions.STARRED_LABEL_ID }; + + return _gmailService.Users.Messages.BatchModify(batchModifyRequest, "me"); + }); + } + + public override IEnumerable> MarkRead(BatchMarkReadRequest request) + { + return CreateBatchedHttpBundleFromGroup(request, (items) => + { + var batchModifyRequest = new BatchModifyMessagesRequest + { + Ids = items.Select(a => a.Item.Id.ToString()).ToList(), + }; + + if (request.IsRead) + batchModifyRequest.RemoveLabelIds = new List() { GoogleIntegratorExtensions.UNREAD_LABEL_ID }; + else + batchModifyRequest.AddLabelIds = new List() { GoogleIntegratorExtensions.UNREAD_LABEL_ID }; + + return _gmailService.Users.Messages.BatchModify(batchModifyRequest, "me"); + }); + } + + public override IEnumerable> Delete(BatchDeleteRequest request) + { + return CreateBatchedHttpBundleFromGroup(request, (items) => + { + var batchModifyRequest = new BatchDeleteMessagesRequest + { + Ids = items.Select(a => a.Item.Id.ToString()).ToList(), + }; + + return _gmailService.Users.Messages.BatchDelete(batchModifyRequest, "me"); + }); + } + + public override IEnumerable> CreateDraft(BatchCreateDraftRequest request) + { + return CreateHttpBundle(request, (item) => + { + if (item is not CreateDraftRequest singleRequest) + throw new ArgumentException("BatchCreateDraftRequest collection must be of type CreateDraftRequest."); + + Draft draft = null; + + // It's new mail. Not a reply + if (singleRequest.DraftPreperationRequest.ReferenceMailCopy == null) + draft = PrepareGmailDraft(singleRequest.DraftPreperationRequest.CreatedLocalDraftMimeMessage); + else + draft = PrepareGmailDraft(singleRequest.DraftPreperationRequest.CreatedLocalDraftMimeMessage, + singleRequest.DraftPreperationRequest.ReferenceMailCopy.ThreadId, + singleRequest.DraftPreperationRequest.ReferenceMailCopy.DraftId); + + return _gmailService.Users.Drafts.Create(draft, "me"); + }); + } + + public override IEnumerable> SendDraft(BatchSendDraftRequestRequest request) + { + return CreateHttpBundle(request, (item) => + { + if (item is not SendDraftRequest singleDraftRequest) + throw new ArgumentException("BatchSendDraftRequestRequest collection must be of type SendDraftRequest."); + + var message = new Message(); + + singleDraftRequest.Request.Mime.Prepare(EncodingConstraint.None); + + var mimeString = singleDraftRequest.Request.Mime.ToString(); + var base64UrlEncodedMime = Base64UrlEncoder.Encode(mimeString); + message.Raw = base64UrlEncodedMime; + + var draft = new Draft() + { + Id = singleDraftRequest.Request.MailItem.DraftId, + Message = message + }; + + return _gmailService.Users.Drafts.Send(draft, "me"); + }); + } + + public override async Task DownloadMissingMimeMessageAsync(IMailItem mailItem, + ITransferProgress transferProgress = null, + CancellationToken cancellationToken = default) + { + var gmailMessage = await _gmailService.Users.Messages.Get("me", mailItem.Id).ExecuteAsync(cancellationToken).ConfigureAwait(false); + var mimeMessage = gmailMessage.GetGmailMimeMessage(); + + await _gmailChangeProcessor.SaveMimeFileAsync(mailItem.FileId, mimeMessage, Account.Id).ConfigureAwait(false); + } + + #endregion + + #region Request Execution + + public override async Task ExecuteNativeRequestsAsync(IEnumerable> batchedRequests, + CancellationToken cancellationToken = default) + { + var batchedBundles = batchedRequests.Batch((int)MaximumAllowedBatchRequestSize); + var bundleCount = batchedBundles.Count(); + + for (int i = 0; i < bundleCount; i++) + { + var bundle = batchedBundles.ElementAt(i); + + var nativeBatchRequest = new BatchRequest(_gmailService); + + var bundleRequestCount = bundle.Count(); + + for (int k = 0; k < bundleRequestCount; k++) + { + var requestBundle = bundle.ElementAt(k); + + var nativeRequest = requestBundle.NativeRequest; + var request = requestBundle.Request; + + request.ApplyUIChanges(); + + // TODO: Queue is synchronous. Create a task bucket to await all processing. + nativeBatchRequest.Queue(nativeRequest, async (content, error, index, message) + => await ProcessSingleNativeRequestResponseAsync(requestBundle, error, message, cancellationToken).ConfigureAwait(false)); + } + + await nativeBatchRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false); + } + } + + private void ProcessGmailRequestError(RequestError error) + { + if (error == null) return; + + // OutOfMemoryException is a known bug in Gmail SDK. + if (error.Code == 0) + { + throw new OutOfMemoryException(error.Message); + } + + // Entity not found. + if (error.Code == 404) + { + throw new SynchronizerEntityNotFoundException(error.Message); + } + + if (!string.IsNullOrEmpty(error.Message)) + { + error.Errors?.ForEach(error => _logger.Error("Unknown Gmail SDK error for {Name}\n{Error}", Account.Name, error)); + + // TODO: Debug + // throw new SynchronizerException(error.Message); + } + } + + /// + /// Handles after each single message download. + /// This involves adding the Gmail message into Wino database. + /// + /// + /// + /// + /// + private async Task HandleSingleItemDownloadedCallbackAsync(Message message, + RequestError error, + string downloadingMessageId, + CancellationToken cancellationToken = default) + { + try + { + ProcessGmailRequestError(error); + } + catch (OutOfMemoryException) + { + _logger.Warning("Gmail SDK got OutOfMemoryException due to bug in the SDK"); + } + catch (SynchronizerEntityNotFoundException) + { + _logger.Warning("Resource not found for {DownloadingMessageId}", downloadingMessageId); + } + catch (SynchronizerException synchronizerException) + { + _logger.Error("Gmail SDK returned error for {DownloadingMessageId}\n{SynchronizerException}", downloadingMessageId, synchronizerException); + } + + if (message == null) + { + _logger.Warning("Skipped GMail message download for {DownloadingMessageId}", downloadingMessageId); + + return; + } + + // Gmail has LabelId property for each message. + // Therefore we can pass null as the assigned folder safely. + var mailPackage = await CreateNewMailPackagesAsync(message, null, cancellationToken); + + // If CreateNewMailPackagesAsync returns null it means local draft mapping is done. + // We don't need to insert anything else. + if (mailPackage == null) + return; + + foreach (var package in mailPackage) + { + await _gmailChangeProcessor.CreateMailAsync(Account.Id, package).ConfigureAwait(false); + } + + // Try updating the history change identifier if any. + if (message.HistoryId == null) return; + + // Delta changes also has history id but the maximum id is preserved in the account service. + // TODO: This is not good. Centralize the identifier fetch and prevent direct access here. + Account.SynchronizationDeltaIdentifier = await _gmailChangeProcessor.UpdateAccountDeltaSynchronizationIdentifierAsync(Account.Id, message.HistoryId.ToString()); + } + + private async Task ProcessSingleNativeRequestResponseAsync(IRequestBundle bundle, + RequestError error, + HttpResponseMessage httpResponseMessage, + CancellationToken cancellationToken = default) + { + ProcessGmailRequestError(error); + + if (bundle is HttpRequestBundle messageBundle) + { + var gmailMessage = await messageBundle.DeserializeBundleAsync(httpResponseMessage, cancellationToken).ConfigureAwait(false); + + if (gmailMessage == null) return; + + await HandleSingleItemDownloadedCallbackAsync(gmailMessage, error, "unknown", cancellationToken); + } + else if (bundle is HttpRequestBundle folderBundle) + { + var gmailLabel = await folderBundle.DeserializeBundleAsync(httpResponseMessage, cancellationToken).ConfigureAwait(false); + + if (gmailLabel == null) return; + + // TODO: Handle new Gmail Label added or updated. + } + else if (bundle is HttpRequestBundle draftBundle && draftBundle.Request is CreateDraftRequest createDraftRequest) + { + // New draft mail is created. + + var messageDraft = await draftBundle.DeserializeBundleAsync(httpResponseMessage, cancellationToken).ConfigureAwait(false); + + if (messageDraft == null) return; + + var localDraftCopy = createDraftRequest.DraftPreperationRequest.CreatedLocalDraftCopy; + + // Here we have DraftId, MessageId and ThreadId. + // Update the local copy properties and re-synchronize to get the original message and update history. + + // We don't fetch the single message here because it may skip some of the history changes when the + // fetch updates the historyId. Therefore we need to re-synchronize to get the latest history changes + // which will have the original message downloaded eventually. + + await _gmailChangeProcessor.MapLocalDraftAsync(Account.Id, localDraftCopy.UniqueId, messageDraft.Message.Id, messageDraft.Id, messageDraft.Message.ThreadId); + + var options = new SynchronizationOptions() + { + AccountId = Account.Id, + Type = SynchronizationType.Full + }; + + await SynchronizeInternalAsync(options, cancellationToken); + } + } + + + /// + /// Maps existing Gmail Draft resources to local mail copies. + /// This uses indexed search, therefore it's quite fast. + /// It's safe to execute this after each Draft creation + batch message download. + /// + private async Task MapDraftIdsAsync(CancellationToken cancellationToken = default) + { + // TODO: This call is not necessary if we don't have any local drafts. + // Remote drafts will be downloaded in missing message batches anyways. + // Fix it by checking whether we need to do this or not. + + var drafts = await _gmailService.Users.Drafts.List("me").ExecuteAsync(cancellationToken); + + if (drafts.Drafts == null) + { + _logger.Information("There are no drafts to map for {Name}", Account.Name); + + return; + } + + foreach (var draft in drafts.Drafts) + { + await _gmailChangeProcessor.MapLocalDraftAsync(draft.Message.Id, draft.Id, draft.Message.ThreadId); + } + } + + /// + /// Creates new mail packages for the given message. + /// AssignedFolder is null since the LabelId is parsed out of the Message. + /// + /// Gmail message to create package for. + /// Null, not used. + /// Cancellation token + /// New mail package that change processor can use to insert new mail into database. + public override async Task> CreateNewMailPackagesAsync(Message message, + MailItemFolder assignedFolder, + CancellationToken cancellationToken = default) + { + var packageList = new List(); + + MimeMessage mimeMessage = message.GetGmailMimeMessage(); + var mailCopy = message.AsMailCopy(mimeMessage); + + // Check whether this message is mapped to any local draft. + // Previously we were using Draft resource response as mapping drafts. + // This seem to be a worse approach. Now both Outlook and Gmail use X-Wino-Draft-Id header to map drafts. + // This is a better approach since we don't need to fetch the draft resource to get the draft id. + + if (mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader) + && Guid.TryParse(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. + + bool isMappingSuccesfull = await _gmailChangeProcessor.MapLocalDraftAsync(Account.Id, localDraftCopyUniqueId, mailCopy.Id, mailCopy.DraftId, mailCopy.ThreadId); + + if (isMappingSuccesfull) return null; + + // Local copy doesn't exists. Continue execution to insert mail copy. + } + + foreach (var labelId in message.LabelIds) + { + packageList.Add(new NewMailItemPackage(mailCopy, mimeMessage, labelId)); + } + + return packageList; + } + + #endregion + } +} diff --git a/Wino.Core/Synchronizers/ImapSynchronizer.cs b/Wino.Core/Synchronizers/ImapSynchronizer.cs new file mode 100644 index 00000000..05227106 --- /dev/null +++ b/Wino.Core/Synchronizers/ImapSynchronizer.cs @@ -0,0 +1,866 @@ +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 MimeKit; +using MoreLinq; +using Serilog; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +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; +using Wino.Core.Requests.Bundles; + +namespace Wino.Core.Synchronizers +{ + public class ImapSynchronizer : BaseSynchronizer + { + private CancellationTokenSource idleDoneToken; + private CancellationTokenSource cancelInboxListeningToken = new CancellationTokenSource(); + + private IMailFolder inboxFolder; + + private readonly ILogger _logger = Log.ForContext(); + private readonly ImapClientPool _clientPool; + private readonly IDefaultChangeProcessor _imapChangeProcessor; + + // 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 => 500; + + public ImapSynchronizer(MailAccount account, IDefaultChangeProcessor imapChangeProcessor) : base(account) + { + _clientPool = new ImapClientPool(Account.ServerInformation); + + idleDoneToken = new CancellationTokenSource(); + _imapChangeProcessor = imapChangeProcessor; + } + + // 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)))); + + #region Mail Integrations + + // Items are grouped before being passed to this method. + // Meaning that all items will come from and to the same folder. + // It's fine to assume that here. + + public override IEnumerable> Move(BatchMoveRequest request) + { + return CreateTaskBundle(async (ImapClient client) => + { + var uniqueIds = GetUniqueIds(request.Items.Select(a => a.Item.Id)); + + var sourceFolder = await client.GetFolderAsync(request.FromFolder.RemoteFolderId); + var destinationFolder = await client.GetFolderAsync(request.ToFolder.RemoteFolderId); + + // Only opening source folder is enough. + await sourceFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false); + await sourceFolder.MoveToAsync(uniqueIds, destinationFolder).ConfigureAwait(false); + await sourceFolder.CloseAsync().ConfigureAwait(false); + }, request); + } + + public override IEnumerable> ChangeFlag(BatchChangeFlagRequest request) + { + return CreateTaskBundle(async (ImapClient client) => + { + var folder = request.Items.First().Item.AssignedFolder; + var remoteFolder = await client.GetFolderAsync(folder.RemoteFolderId); + var uniqueIds = GetUniqueIds(request.Items.Select(a => a.Item.Id)); + + await remoteFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false); + await remoteFolder.StoreAsync(uniqueIds, new StoreFlagsRequest(request.IsFlagged ? StoreAction.Add : StoreAction.Remove, MessageFlags.Flagged) { Silent = true }).ConfigureAwait(false); + await remoteFolder.CloseAsync().ConfigureAwait(false); + }, request); + } + + public override IEnumerable> Delete(BatchDeleteRequest request) + { + return CreateTaskBundle(async (ImapClient client) => + { + var folder = request.Items.First().Item.AssignedFolder; + var remoteFolder = await client.GetFolderAsync(folder.RemoteFolderId).ConfigureAwait(false); + var uniqueIds = GetUniqueIds(request.Items.Select(a => a.Item.Id)); + + await remoteFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false); + await remoteFolder.StoreAsync(uniqueIds, new StoreFlagsRequest(StoreAction.Add, MessageFlags.Deleted) { Silent = true }).ConfigureAwait(false); + await remoteFolder.ExpungeAsync().ConfigureAwait(false); + await remoteFolder.CloseAsync().ConfigureAwait(false); + }, request); + } + + public override IEnumerable> MarkRead(BatchMarkReadRequest request) + { + return CreateTaskBundle(async (ImapClient client) => + { + var folder = request.Items.First().Item.AssignedFolder; + var remoteFolder = await client.GetFolderAsync(folder.RemoteFolderId); + var uniqueIds = GetUniqueIds(request.Items.Select(a => a.Item.Id)); + + await remoteFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false); + await remoteFolder.StoreAsync(uniqueIds, new StoreFlagsRequest(request.IsRead ? StoreAction.Add : StoreAction.Remove, MessageFlags.Seen) { Silent = true }).ConfigureAwait(false); + await remoteFolder.CloseAsync().ConfigureAwait(false); + }, request); + } + + public override IEnumerable> CreateDraft(BatchCreateDraftRequest request) + { + return CreateTaskBundle(async (ImapClient client) => + { + + var remoteDraftFolder = await client.GetFolderAsync(request.DraftPreperationRequest.CreatedLocalDraftCopy.AssignedFolder.RemoteFolderId).ConfigureAwait(false); + + await remoteDraftFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false); + await remoteDraftFolder.AppendAsync(request.DraftPreperationRequest.CreatedLocalDraftMimeMessage, MessageFlags.Draft).ConfigureAwait(false); + await remoteDraftFolder.CloseAsync().ConfigureAwait(false); + }, request); + } + + public override IEnumerable> SendDraft(BatchSendDraftRequestRequest request) + { + return CreateTaskBundle(async (ImapClient client) => + { + // Batch sending is not supported. It will always be a single request therefore no need for a loop here. + + var singleRequest = request.Request; + + singleRequest.Mime.Prepare(EncodingConstraint.None); + + using var smtpClient = new MailKit.Net.Smtp.SmtpClient(); + + if (smtpClient.IsConnected && client.IsAuthenticated) return; + + if (!smtpClient.IsConnected) + await smtpClient.ConnectAsync(Account.ServerInformation.OutgoingServer, int.Parse(Account.ServerInformation.OutgoingServerPort), MailKit.Security.SecureSocketOptions.Auto); + + if (!smtpClient.IsAuthenticated) + await smtpClient.AuthenticateAsync(Account.ServerInformation.OutgoingServerUsername, Account.ServerInformation.OutgoingServerPassword); + + // TODO: Transfer progress implementation as popup in the UI. + await smtpClient.SendAsync(singleRequest.Mime, default); + await smtpClient.DisconnectAsync(true); + + // SMTP sent the message, but we need to remove it from the Draft folder. + var draftFolder = singleRequest.MailItem.AssignedFolder; + + var folder = await client.GetFolderAsync(draftFolder.RemoteFolderId); + + await folder.OpenAsync(FolderAccess.ReadWrite); + + var notUpdatedIds = await folder.StoreAsync(new UniqueId(MailkitClientExtensions.ResolveUid(singleRequest.MailItem.Id)), new StoreFlagsRequest(StoreAction.Add, MessageFlags.Deleted) { Silent = true }); + + await folder.ExpungeAsync(); + await folder.CloseAsync(); + + // Check whether we need to create a copy of the message to Sent folder. + // This comes from the account preferences. + + if (singleRequest.AccountPreferences.ShouldAppendMessagesToSentFolder && singleRequest.SentFolder != null) + { + var sentFolder = await client.GetFolderAsync(singleRequest.SentFolder.RemoteFolderId); + + await sentFolder.OpenAsync(FolderAccess.ReadWrite); + + // Delete local Wino draft header. Otherwise mapping will be applied on re-sync. + singleRequest.Mime.Headers.Remove(Domain.Constants.WinoLocalDraftHeader); + + await sentFolder.AppendAsync(singleRequest.Mime, MessageFlags.Seen); + await sentFolder.CloseAsync(); + } + }, request); + } + + public override async Task DownloadMissingMimeMessageAsync(IMailItem mailItem, + ITransferProgress transferProgress = null, + CancellationToken cancellationToken = default) + { + var folder = mailItem.AssignedFolder; + var remoteFolderId = folder.RemoteFolderId; + + var client = await _clientPool.GetClientAsync().ConfigureAwait(false); + var remoteFolder = await client.GetFolderAsync(remoteFolderId, cancellationToken).ConfigureAwait(false); + + var uniqueId = new UniqueId(MailkitClientExtensions.ResolveUid(mailItem.Id)); + + await remoteFolder.OpenAsync(FolderAccess.ReadOnly, cancellationToken).ConfigureAwait(false); + + var message = await remoteFolder.GetMessageAsync(uniqueId, cancellationToken, transferProgress).ConfigureAwait(false); + + await _imapChangeProcessor.SaveMimeFileAsync(mailItem.FileId, message, Account.Id).ConfigureAwait(false); + await remoteFolder.CloseAsync(false, cancellationToken).ConfigureAwait(false); + + _clientPool.Release(client); + } + + #endregion + + 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); + + // Draft folder message updates must be updated as IsDraft. + // I couldn't find it in MimeMessage... + + 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)) + { + // 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. + + bool isMappingSuccessful = await _imapChangeProcessor.MapLocalDraftAsync(Account.Id, localDraftCopyUniqueId, mailCopy.Id, mailCopy.DraftId, mailCopy.ThreadId); + + if (isMappingSuccessful) return null; + + // Local copy doesn't exists. Continue execution to insert mail copy. + } + + var package = new NewMailItemPackage(mailCopy, mimeMessage, assignedFolder.RemoteFolderId); + + return + [ + package + ]; + } + + public override async Task SynchronizeInternalAsync(SynchronizationOptions options, CancellationToken cancellationToken = default) + { + // options.Type = SynchronizationType.FoldersOnly; + + var downloadedMessageIds = new List(); + + _logger.Information("Internal synchronization started for {Name}", Account.Name); + _logger.Information("Options: {Options}", options); + + options.ProgressListener?.AccountProgressUpdated(Account.Id, 1); + + // Only do folder sync for these types. + // Opening folder and checking their UidValidity is slow. + // Therefore this should be avoided as many times as possible. + + // This may create some inconsistencies, but nothing we can do... + if (options.Type == SynchronizationType.FoldersOnly || options.Type == SynchronizationType.Full) + { + await SynchronizeFoldersAsync(cancellationToken).ConfigureAwait(false); + } + + if (options.Type != SynchronizationType.FoldersOnly) + { + var synchronizationFolders = await _imapChangeProcessor.GetSynchronizationFoldersAsync(options).ConfigureAwait(false); + + for (int i = 0; i < synchronizationFolders.Count; i++) + { + var folder = synchronizationFolders[i]; + var progress = (int)Math.Round((double)(i + 1) / synchronizationFolders.Count * 100); + + options.ProgressListener?.AccountProgressUpdated(Account.Id, progress); + + var folderDownloadedMessageIds = await SynchronizeFolderInternalAsync(folder, cancellationToken).ConfigureAwait(false); + downloadedMessageIds.AddRange(folderDownloadedMessageIds); + } + } + + options.ProgressListener?.AccountProgressUpdated(Account.Id, 100); + + // Get all unread new downloaded items and return in the result. + // This is primarily used in notifications. + + var unreadNewItems = await _imapChangeProcessor.GetDownloadedUnreadMailsAsync(Account.Id, downloadedMessageIds).ConfigureAwait(false); + + return SynchronizationResult.Completed(unreadNewItems); + } + + public override async Task ExecuteNativeRequestsAsync(IEnumerable> batchedRequests, CancellationToken cancellationToken = default) + { + // First apply the UI changes for each bundle. + // This is important to reflect changes to the UI before the network call is done. + + foreach (var item in batchedRequests) + { + item.Request.ApplyUIChanges(); + } + + // All task bundles will execute on the same client. + // Tasks themselves don't pull the client from the pool + // because exception handling is easier this way. + // Also we might parallelize these bundles later on for additional performance. + + foreach (var item in batchedRequests) + { + // 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; + + try + { + executorClient = await _clientPool.GetClientAsync(); + } + catch (ImapClientPoolException) + { + // Client pool failed to get a client. + // Requests may not be executed at this point. + + item.Request.RevertUIChanges(); + + throw; + } + finally + { + if (executorClient != null) + { + _clientPool.Release(executorClient); + } + } + + // TODO: Retry pattern. + // TODO: Error handling. + try + { + await item.NativeRequest.IntegratorTask(executorClient).ConfigureAwait(false); + } + catch (Exception) + { + + throw; + } + finally + { + _clientPool.Release(executorClient); + } + } + } + + // TODO: This can be optimized by starting checking the local folders UidValidtyNext first. + // TODO: We need to determine deleted folders here. Also for that we need to start by local folders. + // TODO: UpdateFolderStructureAsync + private async Task SynchronizeFoldersAsync(CancellationToken cancellationToken = default) + { + // https://www.rfc-editor.org/rfc/rfc4549#section-1.1 + + var _synchronizationClient = await _clientPool.GetClientAsync(); + + var nameSpace = _synchronizationClient.PersonalNamespaces[0]; + + var folders = (await _synchronizationClient.GetFoldersAsync(nameSpace, cancellationToken: cancellationToken)).ToList(); + + // Special folders + + bool isSpecialFoldersSupported = _synchronizationClient.Capabilities.HasFlag(ImapCapabilities.SpecialUse) || _synchronizationClient.Capabilities.HasFlag(ImapCapabilities.XList); + + // Inbox is always available. + IMailFolder inbox = _synchronizationClient.Inbox, drafts = null, junk = null, trash = null, sent = null, archive = null, important = null, starred = null; + + if (isSpecialFoldersSupported) + { + drafts = _synchronizationClient.GetFolder(SpecialFolder.Drafts); + junk = _synchronizationClient.GetFolder(SpecialFolder.Junk); + trash = _synchronizationClient.GetFolder(SpecialFolder.Trash); + sent = _synchronizationClient.GetFolder(SpecialFolder.Sent); + archive = _synchronizationClient.GetFolder(SpecialFolder.Archive); + important = _synchronizationClient.GetFolder(SpecialFolder.Important); + starred = _synchronizationClient.GetFolder(SpecialFolder.Flagged); + } + + var mailItemFolders = new List(); + + // Sometimes Inbox is the root namespace. We need to check for that. + if (inbox != null && !folders.Contains(inbox)) + folders.Add(inbox); + + foreach (var item in folders) + { + // Namespaces are not needed as folders. + // Non-existed folders don't need to be synchronized. + + if ((item.IsNamespace && !item.Attributes.HasFlag(FolderAttributes.Inbox)) || !item.Exists) + continue; + + // Try to synchronize all folders. + + try + { + var localFolder = item.GetLocalFolder(); + + if (item == inbox) + localFolder.SpecialFolderType = SpecialFolderType.Inbox; + + if (isSpecialFoldersSupported) + { + if (item == drafts) + localFolder.SpecialFolderType = SpecialFolderType.Draft; + else if (item == junk) + localFolder.SpecialFolderType = SpecialFolderType.Junk; + else if (item == trash) + localFolder.SpecialFolderType = SpecialFolderType.Deleted; + else if (item == sent) + localFolder.SpecialFolderType = SpecialFolderType.Sent; + else if (item == archive) + localFolder.SpecialFolderType = SpecialFolderType.Archive; + else if (item == important) + localFolder.SpecialFolderType = SpecialFolderType.Important; + else if (item == starred) + localFolder.SpecialFolderType = SpecialFolderType.Starred; + } + + if (localFolder.SpecialFolderType != SpecialFolderType.Other) + { + localFolder.IsSystemFolder = true; + localFolder.IsSticky = true; + localFolder.IsSynchronizationEnabled = true; + } + else + { + localFolder.IsSynchronizationEnabled = false; + } + + // By default, all special folders update unread count in the UI except Trash. + localFolder.ShowUnreadCount = localFolder.SpecialFolderType != SpecialFolderType.Deleted || localFolder.SpecialFolderType != SpecialFolderType.Other; + + localFolder.MailAccountId = Account.Id; + + // Sometimes sub folders are parented under Inbox. + // Even though this makes sense in server level, in the client it sucks. + // That will make sub folders to be parented under Inbox in the client. + // Instead, we will mark them as non-parented folders. + // This is better. Model allows personalized folder structure anyways + // even though we don't have the page/control to adjust it. + + if (item.ParentFolder == _synchronizationClient.Inbox) + localFolder.ParentRemoteFolderId = string.Empty; + + // Set UidValidity for cache expiration. + // Folder must be opened for this. + + await item.OpenAsync(FolderAccess.ReadOnly); + + localFolder.UidValidity = item.UidValidity; + + await item.CloseAsync(); + + mailItemFolders.Add(localFolder); + } + catch (Exception ex) + { + Log.Error(ex, $"Folder with name '{item.Name}' failed to be synchronized."); + } + } + + await _imapChangeProcessor.UpdateFolderStructureAsync(Account.Id, mailItemFolders); + } + + 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; + + 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); + }; + + try + { + imapFolder = await _synchronizationClient.GetFolderAsync(folder.RemoteFolderId, cancellationToken); + + imapFolder.MessageFlagsChanged += MessageFlagsChangedHandler; + + // 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 = MailkitClientExtensions.GetIsFlagged(changedItem.Flags); + var isRead = MailkitClientExtensions.GetIsRead(changedItem.Flags); + + 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 > TAKE_COUNT) + //{ + // missingMailIds = new UniqueIdSet(missingMailIds.TakeLast(TAKE_COUNT)); + //} + + // 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.Descending)); + + foreach (var batchMissingMailIds in batchedMissingMailIds) + { + var summaries = await imapFolder.FetchAsync(batchMissingMailIds, mailSynchronizationFlags, cancellationToken); + + 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) + { + await _imapChangeProcessor.CreateMailAsync(Account.Id, mailPackage); + } + } + } + + if (folder.HighestModeSeq != (long)imapFolder.HighestModSeq) + { + folder.HighestModeSeq = (long)imapFolder.HighestModSeq; + await _imapChangeProcessor.InsertFolderAsync(folder); + } + + // Update last synchronization identifier. + // This will update last sync date for the folder. + + await _imapChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, string.Empty).ConfigureAwait(false); + + return downloadedMessageIds; + } + catch (FolderNotFoundException) + { + await _imapChangeProcessor.DeleteFolderAsync(Account.Id, folder.RemoteFolderId); + + return default; + } + 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); + } + } + } +} diff --git a/Wino.Core/Synchronizers/OutlookSynchronizer.cs b/Wino.Core/Synchronizers/OutlookSynchronizer.cs new file mode 100644 index 00000000..738b8672 --- /dev/null +++ b/Wino.Core/Synchronizers/OutlookSynchronizer.cs @@ -0,0 +1,632 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Graph; +using Microsoft.Graph.Models; +using Microsoft.Kiota.Abstractions; +using Microsoft.Kiota.Abstractions.Authentication; +using MimeKit; +using MoreLinq.Extensions; +using Serilog; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Requests; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Extensions; +using Wino.Core.Http; +using Wino.Core.Integration.Processors; +using Wino.Core.Requests; + +namespace Wino.Core.Synchronizers +{ + public class OutlookSynchronizer : BaseSynchronizer + { + public override uint BatchModificationSize => 20; + public override uint InitialMessageDownloadCountPerFolder => 250; + private const uint MaximumAllowedBatchRequestSize = 20; + + private const string INBOX_NAME = "inbox"; + private const string SENT_NAME = "sentitems"; + private const string DELETED_NAME = "deleteditems"; + private const string JUNK_NAME = "junkemail"; + private const string DRAFTS_NAME = "drafts"; + private const string ARCHIVE_NAME = "archive"; + + private readonly string[] outlookMessageSelectParameters = + [ + "InferenceClassification", + "Flag", + "Importance", + "IsRead", + "IsDraft", + "ReceivedDateTime", + "HasAttachments", + "BodyPreview", + "Id", + "ConversationId", + "From", + "Subject", + "ParentFolderId", + "InternetMessageId", + ]; + + private readonly ILogger _logger = Log.ForContext(); + private readonly IDefaultChangeProcessor _outlookChangeProcessor; + private readonly GraphServiceClient _graphClient; + public OutlookSynchronizer(MailAccount account, + IAuthenticator authenticator, + IDefaultChangeProcessor outlookChangeProcessor) : base(account) + { + var tokenProvider = new MicrosoftTokenProvider(Account, authenticator); + + // Add immutable id preffered client. + var handlers = GraphClientFactory.CreateDefaultHandlers(); + handlers.Add(new MicrosoftImmutableIdHandler()); + + var httpClient = GraphClientFactory.Create(handlers); + + _graphClient = new GraphServiceClient(httpClient, new BaseBearerTokenAuthenticationProvider(tokenProvider)); + _outlookChangeProcessor = outlookChangeProcessor; + + // Specify to use TLS 1.2 as default connection + System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + } + + public override async Task SynchronizeInternalAsync(SynchronizationOptions options, CancellationToken cancellationToken = default) + { + var downloadedMessageIds = new List(); + + _logger.Information("Internal synchronization started for {Name}", Account.Name); + _logger.Information("Options: {Options}", options); + + try + { + + options.ProgressListener?.AccountProgressUpdated(Account.Id, 1); + + await SynchronizeFoldersAsync(cancellationToken).ConfigureAwait(false); + + if (options.Type != SynchronizationType.FoldersOnly) + { + var synchronizationFolders = await _outlookChangeProcessor.GetSynchronizationFoldersAsync(options).ConfigureAwait(false); + + for (int i = 0; i < synchronizationFolders.Count; i++) + { + var folder = synchronizationFolders[i]; + var progress = (int)Math.Round((double)(i + 1) / synchronizationFolders.Count * 100); + + options.ProgressListener?.AccountProgressUpdated(Account.Id, progress); + + var folderDownloadedMessageIds = await SynchronizeFolderAsync(folder, cancellationToken).ConfigureAwait(false); + downloadedMessageIds.AddRange(folderDownloadedMessageIds); + } + } + } + catch (Exception ex) + { + _logger.Error(ex, "Synchronization failed for {Name}", Account.Name); + + throw; + } + finally + { + options.ProgressListener?.AccountProgressUpdated(Account.Id, 100); + } + + // Get all unred new downloaded items and return in the result. + // This is primarily used in notifications. + + var unreadNewItems = await _outlookChangeProcessor.GetDownloadedUnreadMailsAsync(Account.Id, downloadedMessageIds).ConfigureAwait(false); + + return SynchronizationResult.Completed(unreadNewItems); + } + + private async Task> SynchronizeFolderAsync(MailItemFolder folder, CancellationToken cancellationToken = default) + { + var downloadedMessageIds = new List(); + + _logger.Debug("Started synchronization for folder {FolderName}", folder.FolderName); + + cancellationToken.ThrowIfCancellationRequested(); + + string latestDeltaLink = string.Empty; + + bool isInitialSync = string.IsNullOrEmpty(folder.DeltaToken); + + Microsoft.Graph.Me.MailFolders.Item.Messages.Delta.DeltaGetResponse messageCollectionPage = null; + + if (isInitialSync) + { + // No delta link. Performing initial sync. + + messageCollectionPage = await _graphClient.Me.MailFolders[folder.RemoteFolderId].Messages.Delta.GetAsDeltaGetResponseAsync((config) => + { + config.QueryParameters.Top = (int)InitialMessageDownloadCountPerFolder; + config.QueryParameters.Select = outlookMessageSelectParameters; + config.QueryParameters.Orderby = ["receivedDateTime desc"]; + }, cancellationToken).ConfigureAwait(false); + } + else + { + var currentDeltaToken = folder.DeltaToken; + + var requestInformation = _graphClient.Me.MailFolders[folder.RemoteFolderId].Messages.Delta.ToGetRequestInformation((config) => + { + config.QueryParameters.Top = (int)InitialMessageDownloadCountPerFolder; + config.QueryParameters.Select = outlookMessageSelectParameters; + config.QueryParameters.Orderby = ["receivedDateTime desc"]; + }); + + requestInformation.UrlTemplate = requestInformation.UrlTemplate.Insert(requestInformation.UrlTemplate.Length - 1, ",%24deltatoken"); + requestInformation.QueryParameters.Add("%24deltatoken", currentDeltaToken); + + messageCollectionPage = await _graphClient.RequestAdapter.SendAsync(requestInformation, Microsoft.Graph.Me.MailFolders.Item.Messages.Delta.DeltaGetResponse.CreateFromDiscriminatorValue); + } + + var messageIteratorAsync = PageIterator.CreatePageIterator(_graphClient, messageCollectionPage, async (item) => + { + return await HandleItemRetrievedAsync(item, folder, downloadedMessageIds, cancellationToken); + }); + + await messageIteratorAsync + .IterateAsync(cancellationToken) + .ConfigureAwait(false); + + latestDeltaLink = messageIteratorAsync.Deltalink; + + //Store delta link for tracking new changes. + if (!string.IsNullOrEmpty(latestDeltaLink)) + { + // Parse Delta Token from Delta Link since v5 of Graph SDK works based on the token, not the link. + + var deltaToken = Regex.Split(messageIteratorAsync.Deltalink, "deltatoken=")[1]; + + await _outlookChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, deltaToken).ConfigureAwait(false); + } + + return downloadedMessageIds; + } + + private bool IsResourceDeleted(IDictionary additionalData) + => additionalData != null && additionalData.ContainsKey("@removed"); + + private bool IsResourceUpdated(IDictionary additionalData) + => additionalData == null || !additionalData.Any(); + + private async Task HandleFolderRetrievedAsync(MailFolder folder, OutlookSpecialFolderIdInformation outlookSpecialFolderIdInformation, CancellationToken cancellationToken = default) + { + if (IsResourceDeleted(folder.AdditionalData)) + { + await _outlookChangeProcessor.DeleteFolderAsync(Account.Id, folder.Id).ConfigureAwait(false); + } + else if (IsResourceUpdated(folder.AdditionalData)) + { + // TODO + Debugger.Break(); + } + else + { + // New folder created. + + var item = folder.GetLocalFolder(Account.Id); + + if (item.RemoteFolderId.Equals(outlookSpecialFolderIdInformation.InboxId)) + item.SpecialFolderType = SpecialFolderType.Inbox; + else if (item.RemoteFolderId.Equals(outlookSpecialFolderIdInformation.SentId)) + item.SpecialFolderType = SpecialFolderType.Sent; + else if (item.RemoteFolderId.Equals(outlookSpecialFolderIdInformation.DraftId)) + item.SpecialFolderType = SpecialFolderType.Draft; + else if (item.RemoteFolderId.Equals(outlookSpecialFolderIdInformation.TrashId)) + item.SpecialFolderType = SpecialFolderType.Deleted; + else if (item.RemoteFolderId.Equals(outlookSpecialFolderIdInformation.JunkId)) + item.SpecialFolderType = SpecialFolderType.Junk; + else if (item.RemoteFolderId.Equals(outlookSpecialFolderIdInformation.ArchiveId)) + item.SpecialFolderType = SpecialFolderType.Archive; + else + item.SpecialFolderType = SpecialFolderType.Other; + + // Automatically mark special folders as Sticky for better visibility. + item.IsSticky = item.SpecialFolderType != SpecialFolderType.Other; + + // By default, all non-others are system folder. + item.IsSystemFolder = item.SpecialFolderType != SpecialFolderType.Other; + + // By default, all special folders update unread count in the UI except Trash. + item.ShowUnreadCount = item.SpecialFolderType != SpecialFolderType.Deleted || item.SpecialFolderType != SpecialFolderType.Other; + + await _outlookChangeProcessor.InsertFolderAsync(item).ConfigureAwait(false); + } + + return true; + } + + private async Task HandleItemRetrievedAsync(Message item, MailItemFolder folder, IList downloadedMessageIds, CancellationToken cancellationToken = default) + { + if (IsResourceDeleted(item.AdditionalData)) + { + // Deleting item with this override instead of the other one that deletes all mail copies. + // Outlook mails have 1 assignment per-folder, unlike Gmail that has one to many. + + await _outlookChangeProcessor.DeleteAssignmentAsync(Account.Id, item.Id, folder.RemoteFolderId).ConfigureAwait(false); + } + else if (IsResourceUpdated(item.AdditionalData)) + { + // Some of the properties of the item are updated. + + if (item.IsRead != null) + { + await _outlookChangeProcessor.ChangeMailReadStatusAsync(item.Id, item.IsRead.GetValueOrDefault()).ConfigureAwait(false); + } + + if (item.Flag?.FlagStatus != null) + { + await _outlookChangeProcessor.ChangeFlagStatusAsync(item.Id, item.Flag.FlagStatus.GetValueOrDefault() == FollowupFlagStatus.Flagged) + .ConfigureAwait(false); + } + } + else + { + // Package may return null on some cases mapping the remote draft to existing local draft. + + var newMailPackages = await CreateNewMailPackagesAsync(item, folder, cancellationToken); + + if (newMailPackages != null) + { + foreach (var package in newMailPackages) + { + // Only add to downloaded message ids if it's inserted successfuly. + // Updates should not be added to the list because they are not new. + bool isInserted = await _outlookChangeProcessor.CreateMailAsync(Account.Id, package).ConfigureAwait(false); + + if (isInserted) + { + downloadedMessageIds.Add(package.Copy.Id); + } + } + } + } + + return true; + } + + private async Task SynchronizeFoldersAsync(CancellationToken cancellationToken = default) + { + // Gather special folders by default. + // Others will be other type. + + // Get well known folder ids by batch. + + var wellKnownFolderIdBatch = new BatchRequestContentCollection(_graphClient); + + var inboxRequest = _graphClient.Me.MailFolders[INBOX_NAME].ToGetRequestInformation((t) => { t.QueryParameters.Select = ["id"]; }); + var sentRequest = _graphClient.Me.MailFolders[SENT_NAME].ToGetRequestInformation((t) => { t.QueryParameters.Select = ["id"]; }); + var deletedRequest = _graphClient.Me.MailFolders[DELETED_NAME].ToGetRequestInformation((t) => { t.QueryParameters.Select = ["id"]; }); + var junkRequest = _graphClient.Me.MailFolders[JUNK_NAME].ToGetRequestInformation((t) => { t.QueryParameters.Select = ["id"]; }); + var draftsRequest = _graphClient.Me.MailFolders[DRAFTS_NAME].ToGetRequestInformation((t) => { t.QueryParameters.Select = ["id"]; }); + var archiveRequest = _graphClient.Me.MailFolders[ARCHIVE_NAME].ToGetRequestInformation((t) => { t.QueryParameters.Select = ["id"]; }); + + var inboxId = await wellKnownFolderIdBatch.AddBatchRequestStepAsync(inboxRequest); + var sentId = await wellKnownFolderIdBatch.AddBatchRequestStepAsync(sentRequest); + var deletedId = await wellKnownFolderIdBatch.AddBatchRequestStepAsync(deletedRequest); + var junkId = await wellKnownFolderIdBatch.AddBatchRequestStepAsync(junkRequest); + var draftsId = await wellKnownFolderIdBatch.AddBatchRequestStepAsync(draftsRequest); + var archiveId = await wellKnownFolderIdBatch.AddBatchRequestStepAsync(archiveRequest); + + var returnedResponse = await _graphClient.Batch.PostAsync(wellKnownFolderIdBatch, cancellationToken).ConfigureAwait(false); + + var inboxFolderId = (await returnedResponse.GetResponseByIdAsync(inboxId)).Id; + var sentFolderId = (await returnedResponse.GetResponseByIdAsync(sentId)).Id; + var deletedFolderId = (await returnedResponse.GetResponseByIdAsync(deletedId)).Id; + var junkFolderId = (await returnedResponse.GetResponseByIdAsync(junkId)).Id; + var draftsFolderId = (await returnedResponse.GetResponseByIdAsync(draftsId)).Id; + var archiveFolderId = (await returnedResponse.GetResponseByIdAsync(archiveId)).Id; + + var specialFolderInfo = new OutlookSpecialFolderIdInformation(inboxFolderId, deletedFolderId, junkFolderId, draftsFolderId, sentFolderId, archiveFolderId); + + Microsoft.Graph.Me.MailFolders.Delta.DeltaGetResponse graphFolders = null; + + if (string.IsNullOrEmpty(Account.SynchronizationDeltaIdentifier)) + { + // Initial folder sync. + + var deltaRequest = _graphClient.Me.MailFolders.Delta.ToGetRequestInformation(); + + deltaRequest.UrlTemplate = deltaRequest.UrlTemplate.Insert(deltaRequest.UrlTemplate.Length - 1, ",includehiddenfolders"); + deltaRequest.QueryParameters.Add("includehiddenfolders", "true"); + + graphFolders = await _graphClient.RequestAdapter.SendAsync(deltaRequest, + Microsoft.Graph.Me.MailFolders.Delta.DeltaGetResponse.CreateFromDiscriminatorValue, + cancellationToken: cancellationToken); + } + else + { + var currentDeltaLink = Account.SynchronizationDeltaIdentifier; + + var deltaRequest = _graphClient.Me.MailFolders.Delta.ToGetRequestInformation(); + + deltaRequest.UrlTemplate = deltaRequest.UrlTemplate.Insert(deltaRequest.UrlTemplate.Length - 1, ",%24deltaToken"); + deltaRequest.QueryParameters.Add("%24deltaToken", currentDeltaLink); + graphFolders = await _graphClient.RequestAdapter.SendAsync(deltaRequest, + Microsoft.Graph.Me.MailFolders.Delta.DeltaGetResponse.CreateFromDiscriminatorValue, + cancellationToken: cancellationToken); + } + + var iterator = PageIterator.CreatePageIterator(_graphClient, graphFolders, (folder) => + { + return HandleFolderRetrievedAsync(folder, specialFolderInfo, cancellationToken); + }); + + await iterator.IterateAsync(); + + if (!string.IsNullOrEmpty(iterator.Deltalink)) + { + // Get the second part of the query that its the deltaToken + var deltaToken = iterator.Deltalink.Split('=')[1]; + + var latestAccountDeltaToken = await _outlookChangeProcessor.UpdateAccountDeltaSynchronizationIdentifierAsync(Account.Id, deltaToken); + + if (!string.IsNullOrEmpty(latestAccountDeltaToken)) + { + Account.SynchronizationDeltaIdentifier = latestAccountDeltaToken; + } + } + } + + #region Mail Integration + + public override IEnumerable> Move(BatchMoveRequest request) + { + var requestBody = new Microsoft.Graph.Me.Messages.Item.Move.MovePostRequestBody() + { + DestinationId = request.ToFolder.RemoteFolderId + }; + + return CreateBatchedHttpBundle(request, (item) => + { + return _graphClient.Me.Messages[item.Item.Id.ToString()].Move.ToPostRequestInformation(requestBody); + }); + } + + public override IEnumerable> ChangeFlag(BatchChangeFlagRequest request) + { + return CreateBatchedHttpBundle(request, (item) => + { + var message = new Message() + { + Flag = new FollowupFlag() { FlagStatus = request.IsFlagged ? FollowupFlagStatus.Flagged : FollowupFlagStatus.NotFlagged } + }; + + return _graphClient.Me.Messages[item.Item.Id.ToString()].ToPatchRequestInformation(message); + }); + } + + public override IEnumerable> MarkRead(BatchMarkReadRequest request) + { + return CreateBatchedHttpBundle(request, (item) => + { + var message = new Message() + { + IsRead = request.IsRead + }; + + return _graphClient.Me.Messages[item.Item.Id].ToPatchRequestInformation(message); + }); + } + + public override IEnumerable> Delete(BatchDeleteRequest request) + { + return CreateBatchedHttpBundle(request, (item) => + { + return _graphClient.Me.Messages[item.Item.Id].ToDeleteRequestInformation(); + }); + } + + public override IEnumerable> MoveToFocused(BatchMoveToFocusedRequest request) + { + return CreateBatchedHttpBundleFromGroup(request, (item) => + { + if (item is MoveToFocusedRequest moveToFocusedRequest) + { + var message = new Message() + { + InferenceClassification = moveToFocusedRequest.MoveToFocused ? InferenceClassificationType.Focused : InferenceClassificationType.Other + }; + + return _graphClient.Me.Messages[moveToFocusedRequest.Item.Id].ToPatchRequestInformation(message); + } + + throw new Exception("Invalid request type."); + }); + + } + + public override IEnumerable> AlwaysMoveTo(BatchAlwaysMoveToRequest request) + { + return CreateBatchedHttpBundle(request, (item) => + { + if (item is AlwaysMoveToRequest alwaysMoveToRequest) + { + var inferenceClassificationOverride = new InferenceClassificationOverride + { + ClassifyAs = alwaysMoveToRequest.MoveToFocused ? InferenceClassificationType.Focused : InferenceClassificationType.Other, + SenderEmailAddress = new EmailAddress + { + Name = alwaysMoveToRequest.Item.FromName, + Address = alwaysMoveToRequest.Item.FromAddress + } + }; + + return _graphClient.Me.InferenceClassification.Overrides.ToPostRequestInformation(inferenceClassificationOverride); + } + + throw new Exception("Invalid request type."); + }); + } + + public override IEnumerable> CreateDraft(BatchCreateDraftRequest request) + { + return CreateHttpBundle(request, (item) => + { + if (item is CreateDraftRequest createDraftRequest) + { + createDraftRequest.DraftPreperationRequest.CreatedLocalDraftMimeMessage.Prepare(EncodingConstraint.None); + + var plainTextBytes = Encoding.UTF8.GetBytes(createDraftRequest.DraftPreperationRequest.CreatedLocalDraftMimeMessage.ToString()); + var base64Encoded = Convert.ToBase64String(plainTextBytes); + + var requestInformation = _graphClient.Me.Messages.ToPostRequestInformation(new Message()); + + requestInformation.Headers.Clear();// replace the json content header + requestInformation.Headers.Add("Content-Type", "text/plain"); + + requestInformation.SetStreamContent(new MemoryStream(Encoding.UTF8.GetBytes(base64Encoded)), "text/plain"); + + return requestInformation; + } + + return default; + }); + } + + public override async Task DownloadMissingMimeMessageAsync(IMailItem mailItem, + MailKit.ITransferProgress transferProgress = null, + CancellationToken cancellationToken = default) + { + var mimeMessage = await DownloadMimeMessageAsync(mailItem.Id, cancellationToken).ConfigureAwait(false); + await _outlookChangeProcessor.SaveMimeFileAsync(mailItem.FileId, mimeMessage, Account.Id).ConfigureAwait(false); + } + + #endregion + + public override async Task ExecuteNativeRequestsAsync(IEnumerable> batchedRequests, CancellationToken cancellationToken = default) + { + var batchRequestInformations = BatchExtension.Batch(batchedRequests, (int)MaximumAllowedBatchRequestSize); + + foreach (var batch in batchRequestInformations) + { + var batchContent = new BatchRequestContentCollection(_graphClient); + + var itemCount = batch.Count(); + + for (int i = 0; i < itemCount; i++) + { + var bundle = batch.ElementAt(i); + + var request = bundle.Request; + var nativeRequest = bundle.NativeRequest; + + request.ApplyUIChanges(); + + await batchContent.AddBatchRequestStepAsync(nativeRequest).ConfigureAwait(false); + + // Map BundleId to batch request step's key. + // This is how we can identify which step succeeded or failed in the bundle. + + bundle.BundleId = batchContent.BatchRequestSteps.ElementAt(i).Key; + } + + if (!batchContent.BatchRequestSteps.Any()) + continue; + + // Execute batch. This will collect responses from network call for each batch step. + var batchRequestResponse = await _graphClient.Batch.PostAsync(batchContent).ConfigureAwait(false); + + // Check responses for each bundle id. + // Each bundle id must return some HttpResponseMessage ideally. + + var bundleIds = batchContent.BatchRequestSteps.Select(a => a.Key); + + // TODO: Handling responses. They used to work in v1 core, but not in v2. + + foreach (var bundleId in bundleIds) + { + var bundle = batch.FirstOrDefault(a => a.BundleId == bundleId); + + if (bundle == null) + continue; + + var httpResponseMessage = await batchRequestResponse.GetResponseByIdAsync(bundleId); + + using (httpResponseMessage) + { + await ProcessSingleNativeRequestResponseAsync(bundle, httpResponseMessage, cancellationToken).ConfigureAwait(false); + } + } + } + } + + private async Task ProcessSingleNativeRequestResponseAsync(IRequestBundle bundle, + HttpResponseMessage httpResponseMessage, + CancellationToken cancellationToken = default) + { + if (bundle is HttpRequestBundle messageBundle) + { + var outlookMessage = await messageBundle.DeserializeBundleAsync(httpResponseMessage, cancellationToken); + + if (outlookMessage == null) return; + + // TODO: Handle new message added or updated. + } + else if (bundle is HttpRequestBundle folderBundle) + { + var outlookFolder = await folderBundle.DeserializeBundleAsync(httpResponseMessage, cancellationToken); + + if (outlookFolder == null) return; + + // TODO: Handle new folder added or updated. + } + else if (bundle is HttpRequestBundle mimeBundle) + { + // TODO: Handle mime retrieve message. + } + else if (!httpResponseMessage.IsSuccessStatusCode) + { + // TODO: Should we even handle this? + throw new SynchronizerException(string.Format(Translator.Exception_SynchronizerFailureHTTP, httpResponseMessage.StatusCode)); + } + } + + private async Task DownloadMimeMessageAsync(string messageId, CancellationToken cancellationToken = default) + { + var mimeContentStream = await _graphClient.Me.Messages[messageId].Content.GetAsync(null, cancellationToken).ConfigureAwait(false); + return await MimeMessage.LoadAsync(mimeContentStream).ConfigureAwait(false); + } + + public override async Task> CreateNewMailPackagesAsync(Message message, MailItemFolder assignedFolder, CancellationToken cancellationToken = default) + { + var mimeMessage = await DownloadMimeMessageAsync(message.Id).ConfigureAwait(false); + var mailCopy = message.AsMailCopy(); + + if (mimeMessage.Headers.Contains(Domain.Constants.WinoLocalDraftHeader) + && Guid.TryParse(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. + + bool isMappingSuccessful = await _outlookChangeProcessor.MapLocalDraftAsync(Account.Id, localDraftCopyUniqueId, mailCopy.Id, mailCopy.DraftId, mailCopy.ThreadId); + + if (isMappingSuccessful) return null; + + // Local copy doesn't exists. Continue execution to insert mail copy. + } + + // Outlook messages can only be assigned to 1 folder at a time. + // Therefore we don't need to create multiple copies of the same message for different folders. + var package = new NewMailItemPackage(mailCopy, mimeMessage, assignedFolder.RemoteFolderId); + + return [package]; + } + } +} diff --git a/Wino.Core/Wino.Core.csproj b/Wino.Core/Wino.Core.csproj new file mode 100644 index 00000000..7e12fb03 --- /dev/null +++ b/Wino.Core/Wino.Core.csproj @@ -0,0 +1,48 @@ + + + + netstandard2.0 + Wino.Core + Debug;Release + 12 + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Core/WinoErrors.cs b/Wino.Core/WinoErrors.cs new file mode 100644 index 00000000..1ef74d87 --- /dev/null +++ b/Wino.Core/WinoErrors.cs @@ -0,0 +1,42 @@ +namespace Wino.Core +{ + /// + /// Error codes for Wino application. + /// Pretty outdated. + /// + public static class WinoErrors + { + public const string AccountStructureRender = nameof(AccountStructureRender); + public const string MimeRendering = nameof(MimeRendering); + public const string MailRendering = nameof(MailRendering); + public const string FolderOperationExecution = nameof(FolderOperationExecution); + public const string StartupAccountExtendFail = nameof(StartupAccountExtendFail); + public const string AccountNavigateInboxFail = nameof(AccountNavigateInboxFail); + public const string AccountCreation = nameof(AccountCreation); + + public const string OutlookIntegratorFolderSync = nameof(OutlookIntegratorFolderSync); + public const string GoogleSynchronizerAccountSync = nameof(GoogleSynchronizerAccountSync); + public const string ImapFolderSync = nameof(ImapFolderSync); + + public const string RendererCommandMailOperation = nameof(RendererCommandMailOperation); + public const string MailListingMailOperation = nameof(MailListingMailOperation); + + public const string AutoMarkAsRead = nameof(AutoMarkAsRead); + public const string MailListGetItem = nameof(MailListGetItem); + public const string MailListCollectionUpdate = nameof(MailListCollectionUpdate); + public const string MailListRefreshFolder = nameof(MailListRefreshFolder); + public const string ProcessorTaskFailed = nameof(ProcessorTaskFailed); + public const string SearchFailed = nameof(SearchFailed); + + public const string BatchExecutionFailed = nameof(BatchExecutionFailed); + public const string SingleBatchExecutionFailedGoogle = nameof(SingleBatchExecutionFailedGoogle); + + public const string SynchronizationWorkerException = nameof(SynchronizationWorkerException); + public const string StoreRatingSubmission = nameof(StoreRatingSubmission); + + public const string OpenAttachment = nameof(OpenAttachment); + public const string SaveAttachment = nameof(SaveAttachment); + + public const string OutlookMimeSaveFailure = nameof(OutlookMimeSaveFailure); + } +} diff --git a/Wino.Core/WinoSynchronizerFactory.cs b/Wino.Core/WinoSynchronizerFactory.cs new file mode 100644 index 00000000..58a31ee6 --- /dev/null +++ b/Wino.Core/WinoSynchronizerFactory.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Wino.Core.Authenticators; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Integration.Processors; +using Wino.Core.Services; +using Wino.Core.Synchronizers; + +namespace Wino.Core +{ + public interface IWinoSynchronizerFactory : IInitializeAsync + { + IBaseSynchronizer GetAccountSynchronizer(Guid accountId); + IBaseSynchronizer CreateNewSynchronizer(MailAccount account); + void DeleteSynchronizer(MailAccount account); + } + + /// + /// Factory that keeps track of all integrator with associated mail accounts. + /// Synchronizer per-account makes sense because re-generating synchronizers are not ideal. + /// Users might interact with multiple accounts in 1 app session. + /// + public class WinoSynchronizerFactory : IWinoSynchronizerFactory + { + private readonly List synchronizerCache = new List(); + + private bool isInitialized = false; + private readonly INativeAppService _nativeAppService; + private readonly ITokenService _tokenService; + private readonly IFolderService _folderService; + private readonly IAccountService _accountService; + private readonly IContactService _contactService; + + private readonly INotificationBuilder _notificationBuilder; + private readonly ISignatureService _signatureService; + private readonly IDatabaseService _databaseService; + private readonly IMimeFileService _mimeFileService; + private readonly IDefaultChangeProcessor _defaultChangeProcessor; + + public WinoSynchronizerFactory(INativeAppService nativeAppService, + ITokenService tokenService, + IFolderService folderService, + IAccountService accountService, + IContactService contactService, + INotificationBuilder notificationBuilder, + ISignatureService signatureService, + IDatabaseService databaseService, + IMimeFileService mimeFileService, + IDefaultChangeProcessor defaultChangeProcessor) + { + _contactService = contactService; + _notificationBuilder = notificationBuilder; + _nativeAppService = nativeAppService; + _tokenService = tokenService; + _folderService = folderService; + _accountService = accountService; + _signatureService = signatureService; + _databaseService = databaseService; + _mimeFileService = mimeFileService; + _defaultChangeProcessor = defaultChangeProcessor; + } + + public IBaseSynchronizer GetAccountSynchronizer(Guid accountId) + => synchronizerCache.Find(a => a.Account.Id == accountId); + + private IBaseSynchronizer CreateIntegratorWithDefaultProcessor(MailAccount mailAccount) + { + var providerType = mailAccount.ProviderType; + + switch (providerType) + { + case Domain.Enums.MailProviderType.Outlook: + var outlookAuthenticator = new OutlookAuthenticator(_tokenService, _nativeAppService); + return new OutlookSynchronizer(mailAccount, outlookAuthenticator, _defaultChangeProcessor); + case Domain.Enums.MailProviderType.Gmail: + var gmailAuthenticator = new GmailAuthenticator(_tokenService, _nativeAppService); + + return new GmailSynchronizer(mailAccount, gmailAuthenticator, _defaultChangeProcessor); + case Domain.Enums.MailProviderType.Office365: + break; + case Domain.Enums.MailProviderType.Yahoo: + break; + case Domain.Enums.MailProviderType.IMAP4: + return new ImapSynchronizer(mailAccount, _defaultChangeProcessor); + default: + break; + } + + return null; + } + + public void DeleteSynchronizer(MailAccount account) + { + var synchronizer = GetAccountSynchronizer(account.Id); + + if (synchronizer == null) return; + + synchronizerCache.Remove(synchronizer); + } + + public async Task InitializeAsync() + { + if (isInitialized) return; + + var accounts = await _accountService.GetAccountsAsync(); + + foreach (var account in accounts) + { + CreateNewSynchronizer(account); + } + + isInitialized = true; + } + + public IBaseSynchronizer CreateNewSynchronizer(MailAccount account) + { + var synchronizer = CreateIntegratorWithDefaultProcessor(account); + + synchronizerCache.Add(synchronizer); + + return synchronizer; + } + } +} diff --git a/Wino.Mail.ViewModels/AboutPageViewModel.cs b/Wino.Mail.ViewModels/AboutPageViewModel.cs new file mode 100644 index 00000000..3b363854 --- /dev/null +++ b/Wino.Mail.ViewModels/AboutPageViewModel.cs @@ -0,0 +1,120 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Input; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Mail.ViewModels +{ + public class AboutPageViewModel : BaseViewModel + { + private readonly IStoreRatingService _storeRatingService; + private readonly INativeAppService _nativeAppService; + private readonly IAppInitializerService _appInitializerService; + private readonly IFileService _fileService; + private readonly ILogInitializer _logInitializer; + + public string VersionName => _nativeAppService.GetFullAppVersion(); + public string DiscordChannelUrl => "https://discord.gg/windows-apps-hub-714581497222398064"; + public string GitHubUrl => "https://github.com/bkaankose/Wino-Mail/"; + public string PrivacyPolicyUrl => "https://www.winomail.app/privacy_policy.html"; + public string PaypalUrl => "https://paypal.me/bkaankose?country.x=PL&locale.x=en_US"; + + public AsyncRelayCommand NavigateCommand { get; set; } + public AsyncRelayCommand ShareWinoLogCommand { get; set; } + public AsyncRelayCommand ShareProtocolLogCommand { get; set; } + public IPreferencesService PreferencesService { get; } + + public AboutPageViewModel(IStoreRatingService storeRatingService, + IDialogService dialogService, + INativeAppService nativeAppService, + IPreferencesService preferencesService, + IAppInitializerService appInitializerService, + IFileService fileService, + ILogInitializer logInitializer) : base(dialogService) + { + _storeRatingService = storeRatingService; + _nativeAppService = nativeAppService; + _logInitializer = logInitializer; + _appInitializerService = appInitializerService; + _fileService = fileService; + + PreferencesService = preferencesService; + NavigateCommand = new AsyncRelayCommand(Navigate); + ShareWinoLogCommand = new AsyncRelayCommand(ShareWinoLogAsync); + ShareProtocolLogCommand = new AsyncRelayCommand(ShareProtocolLogAsync); + } + + protected override void OnActivated() + { + base.OnActivated(); + + PreferencesService.PreferenceChanged -= PreferencesChanged; + PreferencesService.PreferenceChanged += PreferencesChanged; + } + + protected override void OnDeactivated() + { + base.OnDeactivated(); + + PreferencesService.PreferenceChanged -= PreferencesChanged; + } + + private void PreferencesChanged(object sender, string e) + { + if (e == nameof(PreferencesService.IsLoggingEnabled)) + { + _logInitializer.RefreshLoggingLevel(); + } + } + + private Task ShareProtocolLogAsync() + => SaveLogInternalAsync(ImapTestService.ProtocolLogFileName); + private Task ShareWinoLogAsync() + => SaveLogInternalAsync(LogInitializer.WinoLogFileName); + + private async Task SaveLogInternalAsync(string sourceFileName) + { + var appDataFolder = _appInitializerService.GetApplicationDataFolder(); + + var logFile = Path.Combine(appDataFolder, sourceFileName); + + if (!File.Exists(logFile)) + { + DialogService.InfoBarMessage(Translator.Info_LogsNotFoundTitle, Translator.Info_LogsNotFoundMessage, Core.Domain.Enums.InfoBarMessageType.Warning); + return; + } + + var selectedFolderPath = await DialogService.PickWindowsFolderAsync(); + + if (string.IsNullOrEmpty(selectedFolderPath)) return; + + var copiedFilePath = await _fileService.CopyFileAsync(logFile, selectedFolderPath); + + var copiedFileName = Path.GetFileName(copiedFilePath); + + DialogService.InfoBarMessage(Translator.Info_LogsSavedTitle, string.Format(Translator.Info_LogsSavedMessage, copiedFileName), Core.Domain.Enums.InfoBarMessageType.Success); + } + + private async Task Navigate(object url) + { + if (url is string stringUrl) + { + if (stringUrl == "Store") + await ShowRateDialogAsync(); + else + { + // Discord disclaimer message about server. + if (stringUrl == DiscordChannelUrl) + await DialogService.ShowMessageAsync(Translator.DiscordChannelDisclaimerMessage, Translator.DiscordChannelDisclaimerTitle); + + await _nativeAppService.LaunchUriAsync(new Uri(stringUrl)); + } + } + } + + private Task ShowRateDialogAsync() => _storeRatingService.LaunchStorePageForReviewAsync(); + } +} diff --git a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs new file mode 100644 index 00000000..1a60a282 --- /dev/null +++ b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Messages.Navigation; +using Wino.Core.Requests; + +namespace Wino.Mail.ViewModels +{ + public partial class AccountDetailsPageViewModel : BaseViewModel + { + private readonly IWinoSynchronizerFactory _synchronizerFactory; + private readonly IAccountService _accountService; + private readonly IFolderService _folderService; + + public MailAccount Account { get; set; } + public ObservableCollection CurrentFolders { get; set; } = new ObservableCollection(); + + [ObservableProperty] + private bool isFocusedInboxEnabled; + + [ObservableProperty] + private bool areNotificationsEnabled; + + [ObservableProperty] + private bool isAppendMessageSettingVisible; + + [ObservableProperty] + private bool isAppendMessageSettinEnabled; + + public bool IsFocusedInboxSupportedForAccount => Account != null && Account.Preferences.IsFocusedInboxEnabled != null; + + + public AccountDetailsPageViewModel(IDialogService dialogService, + IWinoSynchronizerFactory synchronizerFactory, + IAccountService accountService, + IFolderService folderService) : base(dialogService) + { + _synchronizerFactory = synchronizerFactory; + _accountService = accountService; + _folderService = folderService; + } + + [RelayCommand] + private Task SetupSpecialFolders() + => DialogService.HandleSystemFolderConfigurationDialogAsync(Account.Id, _folderService); + + [RelayCommand] + private void EditSignature() + => Messenger.Send(new BreadcrumbNavigationRequested("Signature", WinoPage.SignatureManagementPage, Account.Id)); + + public Task FolderSyncToggledAsync(IMailItemFolder folderStructure, bool isEnabled) + => _folderService.ChangeFolderSynchronizationStateAsync(folderStructure.Id, isEnabled); + + public Task FolderShowUnreadToggled(IMailItemFolder folderStructure, bool isEnabled) + => _folderService.ChangeFolderShowUnreadCountStateAsync(folderStructure.Id, isEnabled); + + [RelayCommand] + private async Task RenameAccount() + { + if (Account == null) + return; + + var updatedAccount = await DialogService.ShowEditAccountDialogAsync(Account); + + if (updatedAccount != null) + { + await _accountService.UpdateAccountAsync(updatedAccount); + + ReportUIChange(new AccountUpdatedMessage(updatedAccount)); + } + } + + [RelayCommand] + private async Task DeleteAccount() + { + if (Account == null) + return; + + var confirmation = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_DeleteAccountConfirmationTitle, + string.Format(Translator.DialogMessage_DeleteAccountConfirmationMessage, Account.Name), + Translator.Buttons_Delete); + + if (!confirmation) + return; + + await _accountService.DeleteAccountAsync(Account); + + _synchronizerFactory.DeleteSynchronizer(Account); + + // TODO: Clear existing requests. + // _synchronizationWorker.ClearRequests(Account.Id); + + 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) + { + base.OnNavigatedTo(mode, parameters); + + if (parameters is Guid accountId) + { + Account = await _accountService.GetAccountAsync(accountId); + + IsFocusedInboxEnabled = Account.Preferences.IsFocusedInboxEnabled.GetValueOrDefault(); + AreNotificationsEnabled = Account.Preferences.IsNotificationsEnabled; + + IsAppendMessageSettingVisible = Account.ProviderType == MailProviderType.IMAP4; + IsAppendMessageSettinEnabled = Account.Preferences.ShouldAppendMessagesToSentFolder; + + OnPropertyChanged(nameof(IsFocusedInboxSupportedForAccount)); + + var folderStructures = (await _folderService.GetFolderStructureForAccountAsync(Account.Id, true)).Folders; + + foreach (var folder in folderStructures) + { + CurrentFolders.Add(folder); + } + } + } + + protected override async void OnPropertyChanged(PropertyChangedEventArgs e) + { + base.OnPropertyChanged(e); + + if (e.PropertyName == nameof(IsFocusedInboxEnabled) && IsFocusedInboxSupportedForAccount) + { + Account.Preferences.IsFocusedInboxEnabled = IsFocusedInboxEnabled; + + await _accountService.UpdateAccountAsync(Account); + } + else if (e.PropertyName == nameof(AreNotificationsEnabled)) + { + Account.Preferences.IsNotificationsEnabled = AreNotificationsEnabled; + + await _accountService.UpdateAccountAsync(Account); + } + else if (e.PropertyName == nameof(IsAppendMessageSettinEnabled)) + { + Account.Preferences.ShouldAppendMessagesToSentFolder = IsAppendMessageSettinEnabled; + + await _accountService.UpdateAccountAsync(Account); + } + } + } +} diff --git a/Wino.Mail.ViewModels/AccountManagementViewModel.cs b/Wino.Mail.ViewModels/AccountManagementViewModel.cs new file mode 100644 index 00000000..d2f53972 --- /dev/null +++ b/Wino.Mail.ViewModels/AccountManagementViewModel.cs @@ -0,0 +1,377 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.AppCenter.Crashes; +using Serilog; +using Wino.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Store; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Messages.Authorization; +using Wino.Core.Messages.Navigation; +using Wino.Core.Requests; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels +{ + public partial class AccountManagementViewModel : BaseViewModel, IRecipient + { + public int FREE_ACCOUNT_COUNT { get; } = 3; + + private readonly IDialogService _dialogService; + private readonly IAccountService _accountService; + private readonly IProviderService _providerService; + private readonly IFolderService _folderService; + private readonly IStoreManagementService _storeManagementService; + private readonly IPreferencesService _preferencesService; + private readonly IAuthenticationProvider _authenticationProvider; + private readonly IWinoSynchronizerFactory _synchronizerFactory; + + public ObservableCollection Accounts { get; set; } = []; + + public bool IsPurchasePanelVisible => !HasUnlimitedAccountProduct; + public bool IsAccountCreationAlmostOnLimit => Accounts != null && Accounts.Count == FREE_ACCOUNT_COUNT - 1; + public bool HasAccountsDefined => Accounts != null && Accounts.Any(); + + public string UsedAccountsString => string.Format(Translator.WinoUpgradeRemainingAccountsMessage, Accounts.Count, FREE_ACCOUNT_COUNT); + + [ObservableProperty] + private IAccountProviderDetailViewModel _startupAccount; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsPurchasePanelVisible))] + private bool hasUnlimitedAccountProduct; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsAccountCreationAlmostOnLimit))] + [NotifyPropertyChangedFor(nameof(IsPurchasePanelVisible))] + private bool isAccountCreationBlocked; + + public AccountManagementViewModel(IDialogService dialogService, + IWinoNavigationService navigationService, + IWinoSynchronizerFactory synchronizerFactory, + IAccountService accountService, + IProviderService providerService, + IFolderService folderService, + IStoreManagementService storeManagementService, + IPreferencesService preferencesService, + IAuthenticationProvider authenticationProvider) : base(dialogService) + { + _accountService = accountService; + _synchronizerFactory = synchronizerFactory; + _dialogService = dialogService; + _providerService = providerService; + _folderService = folderService; + _storeManagementService = storeManagementService; + _preferencesService = preferencesService; + _authenticationProvider = authenticationProvider; + } + + [RelayCommand] + private void NavigateAccountDetails(AccountProviderDetailViewModel accountDetails) + { + Messenger.Send(new BreadcrumbNavigationRequested(accountDetails.Account.Name, + WinoPage.AccountDetailsPage, + accountDetails.Account.Id)); + } + + [RelayCommand] + private async Task CreateMergedAccountAsync() + { + var linkName = await DialogService.ShowTextInputDialogAsync(string.Empty, Translator.DialogMessage_CreateLinkedAccountTitle, Translator.DialogMessage_CreateLinkedAccountMessage); + + if (string.IsNullOrEmpty(linkName)) return; + + // Create arbitary empty merged inbox with an empty Guid and go to edit page. + var mergedInbox = new MergedInbox() + { + Id = Guid.Empty, + Name = linkName + }; + + var mergedAccountProviderDetailViewModel = new MergedAccountProviderDetailViewModel(mergedInbox, new List()); + + Messenger.Send(new BreadcrumbNavigationRequested(mergedAccountProviderDetailViewModel.MergedInbox.Name, + WinoPage.MergedAccountDetailsPage, + mergedAccountProviderDetailViewModel)); + } + + [RelayCommand] + private async Task PurchaseUnlimitedAccountAsync() + { + var purchaseResult = await _storeManagementService.PurchaseAsync(StoreProductType.UnlimitedAccounts); + + if (purchaseResult == StorePurchaseResult.Succeeded) + DialogService.InfoBarMessage(Translator.Info_PurchaseThankYouTitle, Translator.Info_PurchaseThankYouMessage, InfoBarMessageType.Success); + else if (purchaseResult == StorePurchaseResult.AlreadyPurchased) + DialogService.InfoBarMessage(Translator.Info_PurchaseExistsTitle, Translator.Info_PurchaseExistsMessage, InfoBarMessageType.Warning); + + bool shouldRefreshPurchasePanel = purchaseResult == StorePurchaseResult.Succeeded || purchaseResult == StorePurchaseResult.AlreadyPurchased; + + if (shouldRefreshPurchasePanel) + { + await ManageStorePurchasesAsync(); + } + } + + [RelayCommand] + private async Task AddNewAccountAsync() + { + if (IsAccountCreationBlocked) + { + var isPurchaseClicked = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_AccountLimitMessage, Translator.DialogMessage_AccountLimitTitle, Translator.Buttons_Purchase); + + if (!isPurchaseClicked) return; + + await PurchaseUnlimitedAccountAsync(); + + return; + } + + MailAccount createdAccount = null; + IAccountCreationDialog creationDialog = null; + + try + { + var providers = _providerService.GetProviderDetails(); + + // Select provider. + var accountInformationTuple = await _dialogService.ShowNewAccountMailProviderDialogAsync(providers); + + if (accountInformationTuple != null) + { + creationDialog = _dialogService.GetAccountCreationDialog(accountInformationTuple.Item2); + + var accountName = accountInformationTuple.Item1; + var providerType = accountInformationTuple.Item2; + + _accountService.ExternalAuthenticationAuthenticator = _authenticationProvider.GetAuthenticator(providerType); + + CustomServerInformation customServerInformation = null; + + createdAccount = new MailAccount() + { + ProviderType = providerType, + Name = accountName, + Id = Guid.NewGuid() + }; + + creationDialog.ShowDialog(); + creationDialog.State = AccountCreationDialogState.SigningIn; + + TokenInformation tokenInformation = null; + + // Custom server implementation requires more async waiting. + if (creationDialog is ICustomServerAccountCreationDialog customServerDialog) + { + customServerInformation = await customServerDialog.GetCustomServerInformationAsync() + ?? throw new AccountSetupCanceledException(); + + // At this point connection is successful. + // Save the server setup information and later on we'll fetch folders. + + customServerInformation.AccountId = createdAccount.Id; + + createdAccount.Address = customServerInformation.Address; + createdAccount.ServerInformation = customServerInformation; + } + else + { + // For OAuth authentications, we just generate token and assign it to the MailAccount. + + tokenInformation = await _accountService.ExternalAuthenticationAuthenticator.GenerateTokenAsync(createdAccount, false) + ?? throw new AuthenticationException(Translator.Exception_TokenInfoRetrivalFailed); + + createdAccount.Address = tokenInformation.Address; + tokenInformation.AccountId = createdAccount.Id; + } + + await _accountService.CreateAccountAsync(createdAccount, tokenInformation, customServerInformation); + + // Local account has been created. + // Create new synchronizer and start synchronization. + + var synchronizer = _synchronizerFactory.CreateNewSynchronizer(createdAccount); + + if (creationDialog is ICustomServerAccountCreationDialog customServerAccountCreationDialog) + customServerAccountCreationDialog.ShowPreparingFolders(); + else + creationDialog.State = AccountCreationDialogState.PreparingFolders; + + var options = new SynchronizationOptions() + { + AccountId = createdAccount.Id, + Type = SynchronizationType.FoldersOnly + }; + + var synchronizationResult = await synchronizer.SynchronizeAsync(options); + + if (synchronizationResult.CompletedState != SynchronizationCompletedState.Success) + throw new Exception(Translator.Exception_FailedToSynchronizeFolders); + + // 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)); + + // Notify success. + _dialogService.InfoBarMessage(Translator.Info_AccountCreatedTitle, string.Format(Translator.Info_AccountCreatedMessage, createdAccount.Address), InfoBarMessageType.Success); + } + } + catch (AccountSetupCanceledException) + { + // Ignore + } + catch (Exception ex) + { + Log.Error(ex, WinoErrors.AccountCreation); + Crashes.TrackError(ex); + + _dialogService.InfoBarMessage(Translator.Info_AccountCreationFailedTitle, ex.Message, InfoBarMessageType.Error); + + // Delete account in case of failure. + if (createdAccount != null) + { + await _accountService.DeleteAccountAsync(createdAccount); + } + } + finally + { + creationDialog?.Complete(); + } + } + + [RelayCommand] + private void EditMergedAccounts(MergedAccountProviderDetailViewModel mergedAccountProviderDetailViewModel) + { + Messenger.Send(new BreadcrumbNavigationRequested(mergedAccountProviderDetailViewModel.MergedInbox.Name, + WinoPage.MergedAccountDetailsPage, + mergedAccountProviderDetailViewModel)); + } + + public override void OnNavigatedFrom(NavigationMode mode, object parameters) + { + base.OnNavigatedFrom(mode, parameters); + + Accounts.CollectionChanged -= AccountCollectionChanged; + + PropertyChanged -= PagePropertyChanged; + } + + private void AccountCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + OnPropertyChanged(nameof(HasAccountsDefined)); + OnPropertyChanged(nameof(UsedAccountsString)); + } + + private void PagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(StartupAccount) && StartupAccount != null) + { + _preferencesService.StartupEntityId = StartupAccount.StartupEntityId; + } + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + Accounts.CollectionChanged -= AccountCollectionChanged; + Accounts.CollectionChanged += AccountCollectionChanged; + + await InitializeAccountsAsync(); + + PropertyChanged -= PagePropertyChanged; + PropertyChanged += PagePropertyChanged; + } + + private async Task InitializeAccountsAsync() + { + StartupAccount = null; + + Accounts.Clear(); + + var accounts = await _accountService.GetAccountsAsync().ConfigureAwait(false); + + // Group accounts and display merged ones at the top. + var groupedAccounts = accounts.GroupBy(a => a.MergedInboxId); + + await ExecuteUIThread(() => + { + foreach (var accountGroup in groupedAccounts) + { + var mergedInboxId = accountGroup.Key; + + if (mergedInboxId == null) + { + foreach (var account in accountGroup) + { + var accountDetails = GetAccountProviderDetails(account); + + Accounts.Add(accountDetails); + } + } + else + { + var mergedInbox = accountGroup.First(a => a.MergedInboxId == mergedInboxId).MergedInbox; + + var holdingAccountProviderDetails = accountGroup.Select(a => GetAccountProviderDetails(a)).ToList(); + var mergedAccountViewModel = new MergedAccountProviderDetailViewModel(mergedInbox, holdingAccountProviderDetails); + + Accounts.Add(mergedAccountViewModel); + } + } + + // Handle startup entity. + if (_preferencesService.StartupEntityId != null) + { + StartupAccount = Accounts.FirstOrDefault(a => a.StartupEntityId == _preferencesService.StartupEntityId); + } + }); + + + await ManageStorePurchasesAsync().ConfigureAwait(false); + } + + private async Task ManageStorePurchasesAsync() + { + await ExecuteUIThread(async () => + { + HasUnlimitedAccountProduct = await _storeManagementService.HasProductAsync(StoreProductType.UnlimitedAccounts); + + if (!HasUnlimitedAccountProduct) + IsAccountCreationBlocked = Accounts.Count >= FREE_ACCOUNT_COUNT; + else + IsAccountCreationBlocked = false; + }); + } + + private AccountProviderDetailViewModel GetAccountProviderDetails(MailAccount account) + { + var provider = _providerService.GetProviderDetail(account.ProviderType); + + return new AccountProviderDetailViewModel(provider, account); + } + + public void Receive(ProtocolAuthorizationCallbackReceived message) + { + // Authorization must be completed in account service. + + _accountService.ExternalAuthenticationAuthenticator?.ContinueAuthorization(message.AuthorizationResponseUri); + } + } +} diff --git a/Wino.Mail.ViewModels/AppShellViewModel.cs b/Wino.Mail.ViewModels/AppShellViewModel.cs new file mode 100644 index 00000000..3067d2b9 --- /dev/null +++ b/Wino.Mail.ViewModels/AppShellViewModel.cs @@ -0,0 +1,1063 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.AppCenter.Crashes; +using MoreLinq; +using MoreLinq.Extensions; +using Serilog; +using Wino.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Extensions; +using Wino.Core.MenuItems; +using Wino.Core.Messages.Accounts; +using Wino.Core.Messages.Mails; +using Wino.Core.Messages.Navigation; +using Wino.Core.Messages.Shell; +using Wino.Core.Messages.Synchronization; +using Wino.Core.Requests; +using Wino.Core.Services; + +namespace Wino.Mail.ViewModels +{ + public partial class AppShellViewModel : BaseViewModel, + ISynchronizationProgress, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient + { + #region Menu Items + + [ObservableProperty] + private object selectedMenuItem; + + private IAccountMenuItem latestSelectedAccountMenuItem; + + public MenuItemCollection FooterItems { get; set; } = []; + public MenuItemCollection MenuItems { get; set; } = []; + + private readonly SettingsItem SettingsItem = new SettingsItem(); + + private readonly RateMenuItem RatingItem = new RateMenuItem(); + + private readonly ManageAccountsMenuItem ManageAccountsMenuItem = new ManageAccountsMenuItem(); + + public NewMailMenuItem CreateMailMenuItem = new NewMailMenuItem(); + + #endregion + + public IStatePersistanceService StatePersistenceService { get; } + public IPreferencesService PreferencesService { get; } + public IWinoNavigationService NavigationService { get; } + + private readonly IFolderService _folderService; + private readonly IAccountService _accountService; + private readonly IContextMenuItemService _contextMenuItemService; + private readonly IStoreRatingService _storeRatingService; + private readonly ILaunchProtocolService _launchProtocolService; + private readonly INotificationBuilder _notificationBuilder; + private readonly IWinoRequestDelegator _winoRequestDelegator; + + private readonly IWinoSynchronizerFactory _synchronizerFactory; + private readonly IBackgroundTaskService _backgroundTaskService; + private readonly IMimeFileService _mimeFileService; + + private readonly INativeAppService _nativeAppService; + private readonly IMailService _mailService; + + private readonly SemaphoreSlim accountInitFolderUpdateSlim = new SemaphoreSlim(1); + + public AppShellViewModel(IDialogService dialogService, + IWinoNavigationService navigationService, + IWinoSynchronizerFactory synchronizerFactory, + IBackgroundTaskService backgroundTaskService, + IMimeFileService mimeFileService, + INativeAppService nativeAppService, + IMailService mailService, + IAccountService accountService, + IContextMenuItemService contextMenuItemService, + IStoreRatingService storeRatingService, + IPreferencesService preferencesService, + ILaunchProtocolService launchProtocolService, + INotificationBuilder notificationBuilder, + IWinoRequestDelegator winoRequestDelegator, + IFolderService folderService, + IStatePersistanceService statePersistanceService) : base(dialogService) + { + StatePersistenceService = statePersistanceService; + PreferencesService = preferencesService; + NavigationService = navigationService; + + _synchronizerFactory = synchronizerFactory; + _backgroundTaskService = backgroundTaskService; + _mimeFileService = mimeFileService; + _nativeAppService = nativeAppService; + _mailService = mailService; + _folderService = folderService; + _accountService = accountService; + _contextMenuItemService = contextMenuItemService; + _storeRatingService = storeRatingService; + _launchProtocolService = launchProtocolService; + _notificationBuilder = notificationBuilder; + _winoRequestDelegator = winoRequestDelegator; + } + + public IEnumerable GetFolderContextMenuActions(IBaseFolderMenuItem folder) + { + if (folder == null || folder.SpecialFolderType == SpecialFolderType.Category || folder.SpecialFolderType == SpecialFolderType.More) + return default; + + return _contextMenuItemService.GetFolderContextMenuActions(folder); + } + + private async Task CreateFooterItemsAsync() + { + await ExecuteUIThread(() => + { + // TODO: Selected footer item container still remains selected after re-creation. + // To reproduce, go settings and change the language. + + foreach (var item in FooterItems) + { + item.IsExpanded = false; + item.IsSelected = false; + } + + FooterItems.Clear(); + + FooterItems.Add(ManageAccountsMenuItem); + FooterItems.Add(RatingItem); + FooterItems.Add(SettingsItem); + }); + } + + private async Task LoadAccountsAsync() + { + var accounts = await _accountService.GetAccountsAsync(); + + // Group accounts by merged account. + var groupedAccounts = accounts.GroupBy(a => a.MergedInboxId); + + foreach (var accountGroup in groupedAccounts) + { + var mergedInbox = accountGroup.Key; + + if (mergedInbox == null) + { + // This account is not merged. Create menu item for each account. + foreach (var account in accountGroup) + { + await CreateNestedAccountMenuItem(account); + } + } + else + { + // Accounts are merged. Create menu item for merged inbox. + await CreateMergedInboxMenuItemAsync(accountGroup); + } + } + + // Re-assign latest selected account menu item for containers to reflect changes better. + // Also , this will ensure that the latest selected account is still selected after re-creation. + + if (latestSelectedAccountMenuItem != null) + { + latestSelectedAccountMenuItem = MenuItems.GetAccountMenuItem(latestSelectedAccountMenuItem.EntityId.GetValueOrDefault()); + + if (latestSelectedAccountMenuItem != null) + { + latestSelectedAccountMenuItem.IsSelected = true; + } + } + } + + protected override async void OnFolderUpdated(MailItemFolder updatedFolder, MailAccount account) + { + base.OnFolderUpdated(updatedFolder, account); + + if (updatedFolder == null) return; + + var folderMenuItemsToUpdate = MenuItems.GetFolderItems(updatedFolder.Id); + + foreach (var item in folderMenuItemsToUpdate) + { + await ExecuteUIThread(() => + { + item.UpdateFolder(updatedFolder); + }); + } + } + + private async Task CreateMergedInboxMenuItemAsync(IEnumerable accounts) + { + var mergedInbox = accounts.First().MergedInbox; + var mergedInboxMenuItem = new MergedAccountMenuItem(mergedInbox, null); // Merged accounts are parentless. + + // Store common special type folders. + var commonFolderList = new Dictionary(); + + // Map special folder types for each account. + var accountTreeList = new List(); + + foreach (var account in accounts) + { + var accountStructure = await _folderService.GetFolderStructureForAccountAsync(account.Id, includeHiddenFolders: true); + accountTreeList.Add(accountStructure); + } + + var allFolders = accountTreeList.SelectMany(a => a.Folders); + + // 1. Group sticky folders by special folder type. + // 2. Merge all folders that are sticky and have the same special folder type. + // 3. Add merged folder menu items to the merged inbox menu item. + // 4. Add remaining sticky folders that doesn't exist in all accounts as plain folder menu items. + + var stickyFolders = allFolders.Where(a => a.IsSticky); + + var grouped = stickyFolders + .GroupBy(a => a.SpecialFolderType) + .Where(a => accountTreeList.All(b => b.HasSpecialTypeFolder(a.Key))); + + var mergedInboxItems = grouped.Select(a => new MergedAccountFolderMenuItem(a.ToList(), mergedInboxMenuItem, mergedInbox)); + + // Shared common folders. + foreach (var mergedInboxFolder in mergedInboxItems) + { + mergedInboxMenuItem.SubMenuItems.Add(mergedInboxFolder); + } + + var usedFolderIds = mergedInboxItems.SelectMany(a => a.Parameter.Select(a => a.Id)); + var remainingStickyFolders = stickyFolders.Where(a => !usedFolderIds.Contains(a.Id)); + + // Marked as sticky, but doesn't exist in all accounts. Add as plain folder menu item. + foreach (var remainingStickyFolder in remainingStickyFolders) + { + var account = accounts.FirstOrDefault(a => a.Id == remainingStickyFolder.MailAccountId); + mergedInboxMenuItem.SubMenuItems.Add(new FolderMenuItem(remainingStickyFolder, account, mergedInboxMenuItem)); + } + + + var mergedMoreItem = new MergedAccountMoreFolderMenuItem(null, null, mergedInboxMenuItem); + + // 2. Sticky folder preparation is done. Continue with regular account menu items. + + foreach (var accountTree in accountTreeList) + { + var tree = accountTree.GetAccountMenuTree(mergedInboxMenuItem); + + mergedMoreItem.SubMenuItems.Add(tree); + } + + mergedInboxMenuItem.SubMenuItems.Add(mergedMoreItem); + + MenuItems.Add(mergedInboxMenuItem); + + // Instead of refreshing all accounts, refresh the merged account only. + // Receiver will handle it. + + Messenger.Send(new RefreshUnreadCountsMessage(mergedInbox.Id)); + } + + private async Task CreateNestedAccountMenuItem(MailAccount account) + { + try + { + await accountInitFolderUpdateSlim.WaitAsync(); + + // Don't remove but replace existing record. + int existingIndex = -1; + + var existingAccountMenuItem = MenuItems.FirstOrDefault(a => a is AccountMenuItem accountMenuItem && accountMenuItem.Parameter.Id == account.Id); + + if (existingAccountMenuItem != null) + { + existingIndex = MenuItems.IndexOf(existingAccountMenuItem); + } + + // Create account structure with integrator for this menu item. + var accountStructure = await _folderService.GetFolderStructureForAccountAsync(account.Id, includeHiddenFolders: false); + + var createdMenuItem = accountStructure.GetAccountMenuTree(); + + await ExecuteUIThread(() => + { + if (existingIndex >= 0) + { + createdMenuItem.IsExpanded = existingAccountMenuItem.IsExpanded; + + MenuItems.RemoveAt(existingIndex); + MenuItems.Insert(existingIndex, createdMenuItem); + } + else + { + MenuItems.AddAccountMenuItem(createdMenuItem); + } + }); + + Messenger.Send(new RefreshUnreadCountsMessage(account.Id)); + + return createdMenuItem; + } + catch (Exception ex) + { + Log.Error(ex, WinoErrors.AccountStructureRender); + } + finally + { + accountInitFolderUpdateSlim.Release(); + } + + return null; + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + await CreateFooterItemsAsync(); + + await RecreateMenuItemsAsync(); + await ProcessLaunchOptionsAsync(); + +#if !DEBUG + await ForceAllAccountSynchronizationsAsync(); +#endif + await ConfigureBackgroundTasksAsync(); + } + + private async Task ConfigureBackgroundTasksAsync() + { + try + { + await _backgroundTaskService.HandleBackgroundTaskRegistrations(); + } + catch (BackgroundTaskExecutionRequestDeniedException) + { + await DialogService.ShowMessageAsync(Translator.Info_BackgroundExecutionDeniedMessage, Translator.Info_BackgroundExecutionDeniedTitle); + } + catch (Exception ex) + { + Crashes.TrackError(ex); + + DialogService.InfoBarMessage(Translator.Info_BackgroundExecutionUnknownErrorTitle, Translator.Info_BackgroundExecutionUnknownErrorMessage, InfoBarMessageType.Error); + } + } + + private async Task ForceAllAccountSynchronizationsAsync() + { + // Run Inbox synchronization for all accounts on startup. + var accounts = await _accountService.GetAccountsAsync(); + + foreach (var account in accounts) + { + var options = new SynchronizationOptions() + { + AccountId = account.Id, + Type = SynchronizationType.Inbox + }; + + + Messenger.Send(new NewSynchronizationRequested(options)); + } + } + + // Navigate to startup account's Inbox. + private async Task ProcessLaunchOptionsAsync() + { + try + { + // Check whether we have saved navigation item from toast. + + bool hasToastActivation = _launchProtocolService.LaunchParameter != null; + + if (hasToastActivation) + { + if (_launchProtocolService.LaunchParameter is AccountMenuItemExtended accountExtendedMessage) + { + // Find the account that this folder and mail belongs to. + var account = await _mailService.GetMailAccountByUniqueIdAsync(accountExtendedMessage.NavigateMailItem.UniqueId).ConfigureAwait(false); + + if (account != null && MenuItems.GetAccountMenuItem(account.Id) is IAccountMenuItem accountMenuItem) + { + ChangeLoadedAccount(accountMenuItem); + + WeakReferenceMessenger.Default.Send(accountExtendedMessage); + + _launchProtocolService.LaunchParameter = null; + } + else + { + ProcessLaunchDefault(); + } + } + } + else + { + bool hasMailtoActivation = _launchProtocolService.MailtoParameters != null; + + if (hasMailtoActivation) + { + // mailto activation. Create new mail with specific delivered address as receiver. + + WeakReferenceMessenger.Default.Send(new MailtoProtocolMessageRequested()); + } + else + { + // Use default startup extending. + ProcessLaunchDefault(); + } + } + } + catch (Exception ex) + { + Log.Error(ex, WinoErrors.StartupAccountExtendFail); + } + } + + private void ProcessLaunchDefault() + { + if (PreferencesService.StartupEntityId == null) + { + NavigationService.Navigate(WinoPage.WelcomePage); + } + else + { + var startupEntityId = PreferencesService.StartupEntityId.Value; + + // startupEntityId is the id of the entity to be expanded on startup. + // This can be either AccountId or MergedAccountId right now. + // If accountId, we'll find the root account and extend Inbox folder for it. + // If mergedAccountId, merged account's Inbox folder will be extended. + + var startupEntityMenuItem = MenuItems.FirstOrDefault(a => a.EntityId == startupEntityId); + + if (startupEntityMenuItem != null) + { + startupEntityMenuItem.Expand(); + + if (startupEntityMenuItem is IAccountMenuItem startupAccountMenuItem) + { + ChangeLoadedAccount(startupAccountMenuItem); + } + } + } + } + + public async Task NavigateFolderAsync(IBaseFolderMenuItem baseFolderMenuItem) + { + // It's already there. Don't navigate again. + if (SelectedMenuItem == baseFolderMenuItem) return; + + SelectedMenuItem = baseFolderMenuItem; + baseFolderMenuItem.IsSelected = true; + + var mailInitCompletionSource = new TaskCompletionSource(); + var args = new NavigateMailFolderEventArgs(baseFolderMenuItem, mailInitCompletionSource); + + NavigationService.NavigateFolder(args); + StatePersistenceService.CoreWindowTitle = $"{baseFolderMenuItem.AssignedAccountName} - {baseFolderMenuItem.FolderName}"; + + // Wait until mail list page picks up the event and finish initialization of the mails. + await mailInitCompletionSource.Task; + } + + private async Task NavigateSpecialFolderAsync(MailAccount account, SpecialFolderType specialFolderType, bool extendAccountMenu) + { + try + { + if (account == null) return; + + // If the account is inside a merged account, expand the merged account and navigate to shared folder. + if (MenuItems.TryGetMergedAccountRootFolderMenuItemByAccountId(account.Id, specialFolderType, out MergedAccountFolderMenuItem mergedFolderItem)) + { + mergedFolderItem.Expand(); + await NavigateFolderAsync(mergedFolderItem); + } + else if (MenuItems.TryGetRootSpecialFolderMenuItem(account.Id, specialFolderType, out FolderMenuItem rootFolderMenuItem)) + { + // Account is not in merged account. Navigate to root folder. + + rootFolderMenuItem.Expand(); + await NavigateFolderAsync(rootFolderMenuItem); + } + } + catch (Exception ex) + { + Log.Error(ex, WinoErrors.AccountNavigateInboxFail); + } + } + + /// + /// Performs move operation for given items to target folder. + /// Used with drag and drop from Shell. + /// + /// Items to move. + /// Folder menu item to move to. Can be merged folder as well. + public async Task PerformMoveOperationAsync(IEnumerable items, IBaseFolderMenuItem targetFolderMenuItem) + { + if (!items.Any() || targetFolderMenuItem == null) return; + + // User dropped mails to merged account folder. + if (targetFolderMenuItem is IMergedAccountFolderMenuItem mergedAccountFolderMenuItem) + { + // Mail items must be grouped by their account and move + // operation should be targeted towards that account's special type. + // Multiple move packages will be created if there are multiple accounts. + + var folderSpecialType = mergedAccountFolderMenuItem.SpecialFolderType; + + var groupedByAccount = items.GroupBy(a => a.AssignedAccount.Id); + + foreach (var group in groupedByAccount) + { + var accountId = group.Key; + + // Find the target folder for this account. + var handlingAccountFolder = mergedAccountFolderMenuItem.HandlingFolders.FirstOrDefault(a => a.MailAccountId == accountId); + + if (handlingAccountFolder == null) + { + Log.Warning("Failed to find the account in the merged account folder menu item for account id {AccountId}", accountId); + continue; + } + + var package = new MailOperationPreperationRequest(MailOperation.Move, group, false, handlingAccountFolder); + await _winoRequestDelegator.ExecuteAsync(package); + } + } + else if (targetFolderMenuItem is IFolderMenuItem singleFolderMenuItem) + { + // User dropped mails to a single folder. + // Create a single move package for this folder. + + var package = new MailOperationPreperationRequest(MailOperation.Move, items, false, targetFolderMenuItem.HandlingFolders.First()); + + await _winoRequestDelegator.ExecuteAsync(package); + } + } + + public async Task PerformFolderOperationAsync(FolderOperation operation, IBaseFolderMenuItem folderMenuItem) + { + if (folderMenuItem == null) + return; + + // Ask confirmation for cleaning up the folder. + if (operation == FolderOperation.Empty) + { + var result = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_CleanupFolderMessage, Translator.DialogMessage_CleanupFolderTitle, Translator.Buttons_Yes); + + if (!result) return; + } + + foreach (var folder in folderMenuItem.HandlingFolders) + { + await _winoRequestDelegator.ExecuteAsync(operation, folder); + } + + // Refresh the pins. + if (operation == FolderOperation.Pin || operation == FolderOperation.Unpin) + { + Messenger.Send(new AccountsMenuRefreshRequested(true)); + } + } + + private async Task FixAccountIssuesAsync(MailAccount account) + { + // TODO: This area is very unclear. Needs to be rewritten with care. + // Fix account issues are expected to not work, but may work for some cases. + + try + { + if (account.AttentionReason == AccountAttentionReason.InvalidCredentials) + await _accountService.FixTokenIssuesAsync(account.Id); + else if (account.AttentionReason == AccountAttentionReason.MissingSystemFolderConfiguration) + await DialogService.HandleSystemFolderConfigurationDialogAsync(account.Id, _folderService); + + await _accountService.ClearAccountAttentionAsync(account.Id); + + DialogService.InfoBarMessage(Translator.Info_AccountIssueFixFailedTitle, Translator.Info_AccountIssueFixSuccessMessage, InfoBarMessageType.Success); + } + catch (Exception ex) + { + DialogService.InfoBarMessage(Translator.Info_AccountIssueFixFailedTitle, ex.Message, InfoBarMessageType.Error); + } + } + + public void NavigatePage(WinoPage winoPage) + { + NavigationService.Navigate(winoPage); + + StatePersistenceService.CoreWindowTitle = "Wino Mail"; + } + + public async Task MenuItemInvokedOrSelectedAsync(IMenuItem clickedMenuItem) + { + if (clickedMenuItem == null) return; + + // Regular menu item clicked without page navigation. + if (clickedMenuItem is FixAccountIssuesMenuItem fixAccountItem) + { + await FixAccountIssuesAsync(fixAccountItem.Account); + } + else if (clickedMenuItem is RateMenuItem) + { + await _storeRatingService.LaunchStorePageForReviewAsync(); + } + else if (clickedMenuItem is NewMailMenuItem) + { + await HandleCreateNewMailAsync(); + } + else if (clickedMenuItem is IBaseFolderMenuItem baseFolderMenuItem && baseFolderMenuItem.HandlingFolders.All(a => a.IsMoveTarget)) + { + // Don't navigate to base folders that contain non-move target folders. + // Theory: This is a special folder like Categories or More. Don't navigate to it. + + // Prompt user rating dialog if eligible. + _ = _storeRatingService.PromptRatingDialogAsync(); + + await NavigateFolderAsync(baseFolderMenuItem); + } + else if (clickedMenuItem is SettingsItem) + { + NavigationService.Navigate(WinoPage.SettingsPage); + } + else if (clickedMenuItem is ManageAccountsMenuItem) + { + NavigationService.Navigate(WinoPage.AccountManagementPage); + } + else if (clickedMenuItem is IAccountMenuItem clickedAccountMenuItem && latestSelectedAccountMenuItem != clickedAccountMenuItem) + { + ChangeLoadedAccount(clickedAccountMenuItem); + } + } + + private async void ChangeLoadedAccount(IAccountMenuItem clickedBaseAccountMenuItem, bool navigateInbox = true) + { + if (clickedBaseAccountMenuItem == null) return; + + // User clicked an account in Windows Mail style menu. + // List folders for this account and select Inbox. + + await ExecuteUIThread(() => + { + if (latestSelectedAccountMenuItem != null) + { + latestSelectedAccountMenuItem.IsSelected = false; + } + + clickedBaseAccountMenuItem.IsSelected = true; + + + latestSelectedAccountMenuItem = clickedBaseAccountMenuItem; + + + if (clickedBaseAccountMenuItem is AccountMenuItem accountMenuItem) + { + MenuItems.ReplaceFolders(accountMenuItem.SubMenuItems); + } + else if (clickedBaseAccountMenuItem is MergedAccountMenuItem mergedAccountMenuItem) + { + MenuItems.ReplaceFolders(mergedAccountMenuItem.SubMenuItems); + } + }); + + if (navigateInbox) + { + await Task.Yield(); + + await ExecuteUIThread(() => + { + NavigateInbox(clickedBaseAccountMenuItem); + }); + } + } + + private async void NavigateInbox(IAccountMenuItem clickedBaseAccountMenuItem) + { + if (clickedBaseAccountMenuItem is AccountMenuItem accountMenuItem) + { + if (MenuItems.TryGetWindowsStyleRootSpecialFolderMenuItem(accountMenuItem.AccountId, SpecialFolderType.Inbox, out FolderMenuItem inboxFolder)) + { + await NavigateFolderAsync(inboxFolder); + } + } + else if (clickedBaseAccountMenuItem is MergedAccountMenuItem mergedAccountMenuItem) + { + if (MenuItems.TryGetMergedAccountSpecialFolderMenuItem(mergedAccountMenuItem.EntityId.GetValueOrDefault(), SpecialFolderType.Inbox, out IBaseFolderMenuItem inboxFolder)) + { + await NavigateFolderAsync(inboxFolder); + } + } + } + + public async Task HandleCreateNewMailAsync() + { + _ = _storeRatingService.PromptRatingDialogAsync(); + + MailAccount operationAccount = null; + + // Check whether we have active folder item selected for any account. + // We have selected account. New mail creation should be targeted for this account. + + if (SelectedMenuItem is FolderMenuItem selectedFolderMenuItem) + { + operationAccount = selectedFolderMenuItem.ParentAccount; + } + + // We couldn't find any account so far. + // If there is only 1 account to use, use it. If not, + // send a message for flyout so user can pick from it. + + if (operationAccount == null) + { + // No selected account. + // List all accounts and let user pick one. + + var accounts = await _accountService.GetAccountsAsync(); + + if (!accounts.Any()) + { + await DialogService.ShowMessageAsync(Translator.DialogMessage_NoAccountsForCreateMailMessage, Translator.DialogMessage_NoAccountsForCreateMailTitle); + return; + } + + if (accounts.Count() == 1) + operationAccount = accounts.FirstOrDefault(); + else + { + // There are multiple accounts and there is no selection. + Messenger.Send(new CreateNewMailWithMultipleAccountsRequested(accounts)); + } + } + + if (operationAccount != null) + await CreateNewMailForAsync(operationAccount); + } + + public async Task CreateNewMailForAsync(MailAccount account) + { + if (account == null) return; + + // Find draft folder. + var draftFolder = await _folderService.GetSpecialFolderByAccountIdAsync(account.Id, SpecialFolderType.Draft); + + if (draftFolder == null) + { + DialogService.InfoBarMessage(Translator.Info_DraftFolderMissingTitle, + Translator.Info_DraftFolderMissingMessage, + InfoBarMessageType.Error, + Translator.SettingConfigureSpecialFolders_Button, + () => + { + DialogService.HandleSystemFolderConfigurationDialogAsync(account.Id, _folderService); + }); + return; + } + + // Navigate to draft folder. + await NavigateSpecialFolderAsync(account, SpecialFolderType.Draft, true); + + // Generate empty mime message. + var draftOptions = new DraftCreationOptions + { + Reason = DraftCreationReason.Empty, + + // Include mail to parameters for parsing mailto if any. + MailtoParameters = _launchProtocolService.MailtoParameters + }; + + var createdMimeMessage = await _mailService.CreateDraftMimeMessageAsync(account.Id, draftOptions).ConfigureAwait(false); + var createdDraftMailMessage = await _mailService.CreateDraftAsync(account, createdMimeMessage).ConfigureAwait(false); + + var draftPreperationRequest = new DraftPreperationRequest(account, createdDraftMailMessage, createdMimeMessage); + await _winoRequestDelegator.ExecuteAsync(draftPreperationRequest); + } + + + + public async void Receive(NewSynchronizationRequested message) + { + // Don't send message for sync completion when we execute requests. + // People are usually interested in seeing the notification after they trigger the synchronization. + + bool shouldReportSynchronizationResult = message.Options.Type != SynchronizationType.ExecuteRequests; + + var synchronizer = _synchronizerFactory.GetAccountSynchronizer(message.Options.AccountId); + + if (synchronizer == null) return; + + var accountId = message.Options.AccountId; + + message.Options.ProgressListener = this; + + bool isSynchronizationSucceeded = false; + + try + { + // TODO: Cancellation Token + var synchronizationResult = await synchronizer.SynchronizeAsync(message.Options); + + isSynchronizationSucceeded = synchronizationResult.CompletedState == SynchronizationCompletedState.Success; + + // Create notification for synchronization result. + if (synchronizationResult.DownloadedMessages.Any()) + { + var accountInboxFolder = await _folderService.GetSpecialFolderByAccountIdAsync(message.Options.AccountId, SpecialFolderType.Inbox); + + if (accountInboxFolder == null) return; + + await _notificationBuilder.CreateNotificationsAsync(accountInboxFolder.Id, synchronizationResult.DownloadedMessages); + } + } + catch (AuthenticationAttentionException) + { + await SetAccountAttentionAsync(accountId, AccountAttentionReason.InvalidCredentials); + } + catch (SystemFolderConfigurationMissingException) + { + await SetAccountAttentionAsync(accountId, AccountAttentionReason.MissingSystemFolderConfiguration); + } + catch (OperationCanceledException) + { + DialogService.InfoBarMessage(Translator.Info_SyncCanceledMessage, Translator.Info_SyncCanceledMessage, InfoBarMessageType.Warning); + } + catch (Exception ex) + { + DialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, ex.Message, InfoBarMessageType.Error); + } + finally + { + if (shouldReportSynchronizationResult) + Messenger.Send(new AccountSynchronizationCompleted(accountId, + isSynchronizationSucceeded ? SynchronizationCompletedState.Success : SynchronizationCompletedState.Failed, + message.Options.GroupedSynchronizationTrackingId)); + } + } + + + protected override async void OnAccountUpdated(MailAccount updatedAccount) + => await ExecuteUIThread(() => { MenuItems.GetAccountMenuItem(updatedAccount.Id)?.UpdateAccount(updatedAccount); }); + + protected override void OnAccountRemoved(MailAccount removedAccount) + => Messenger.Send(new AccountsMenuRefreshRequested(true)); + + protected override async void OnAccountCreated(MailAccount createdAccount) + { + var createdMenuItem = await CreateNestedAccountMenuItem(createdAccount); + + if (createdMenuItem == null) return; + + ChangeLoadedAccount(createdMenuItem); + + // Each created account should start a new synchronization automatically. + var options = new SynchronizationOptions() + { + AccountId = createdAccount.Id, + Type = SynchronizationType.Full, + }; + + Messenger.Send(new NewSynchronizationRequested(options)); + + await _nativeAppService.PinAppToTaskbarAsync(); + } + + /// + /// Updates given single account menu item's unread count for all folders. + /// + /// Menu item to update unread count for. + /// Unread item count for Inbox only. + private async Task UpdateSingleAccountMenuItemUnreadCountAsync(AccountMenuItem accountMenuItem) + { + var accountId = accountMenuItem.AccountId; + int inboxItemCount = 0; + + // Get the folders needed to be refreshed. + var allFolders = await _folderService.GetUnreadUpdateFoldersAsync(accountId); + + foreach (var folder in allFolders) + { + var unreadItemCount = await UpdateAccountFolderUnreadItemCountAsync(accountMenuItem, folder.Id); + + if (folder.SpecialFolderType == SpecialFolderType.Inbox) + { + inboxItemCount = unreadItemCount; + + await ExecuteUIThread(() => { accountMenuItem.UnreadItemCount = unreadItemCount; }); + } + } + + return inboxItemCount; + } + + private async Task RefreshUnreadCountsForAccountAsync(Guid accountId) + { + // TODO: Merged accounts unread item count. + + var accountMenuItem = MenuItems.GetAccountMenuItem(accountId); + + if (accountMenuItem == null) return; + + if (accountMenuItem is AccountMenuItem singleAccountMenuItem) + { + await UpdateSingleAccountMenuItemUnreadCountAsync(singleAccountMenuItem); + + } + else if (accountMenuItem is MergedAccountMenuItem mergedAccountMenuItem) + { + // Merged account. + // Root account should include all parent accounts' unread item count. + + int totalUnreadCount = 0; + + var individualAccountMenuItems = mergedAccountMenuItem.GetAccountMenuItems(); + + foreach (var singleMenuItem in individualAccountMenuItems) + { + totalUnreadCount += await UpdateSingleAccountMenuItemUnreadCountAsync(singleMenuItem); + } + + // At this point all single accounts are calculated. + // Merge account folder's menu items can be calculated from those values for precision. + + await ExecuteUIThread(() => + { + mergedAccountMenuItem.RefreshFolderItemCount(); + mergedAccountMenuItem.UnreadItemCount = totalUnreadCount; + }); + } + + await ExecuteUIThread(async () => { await _notificationBuilder.UpdateTaskbarIconBadgeAsync(); }); + } + + private async Task UpdateAccountFolderUnreadItemCountAsync(AccountMenuItem accountMenuItem, Guid folderId) + { + if (accountMenuItem == null) return 0; + + var folder = accountMenuItem.FlattenedFolderHierarchy.Find(a => a.Parameter?.Id == folderId); + + if (folder == null) return 0; + + int folderUnreadItemCount = 0; + + folderUnreadItemCount = await _folderService.GetFolderNotificationBadgeAsync(folder.Parameter.Id).ConfigureAwait(false); + + await ExecuteUIThread(() => { folder.UnreadItemCount = folderUnreadItemCount; }); + + return folderUnreadItemCount; + } + + private async Task SetAccountAttentionAsync(Guid accountId, AccountAttentionReason reason) + { + var accountMenuItem = MenuItems.GetAccountMenuItem(accountId); + + if (accountMenuItem == null) return; + + var accountModel = accountMenuItem.HoldingAccounts.First(a => a.Id == accountId); + + accountModel.AttentionReason = reason; + + await _accountService.UpdateAccountAsync(accountModel); + + accountMenuItem.UpdateAccount(accountModel); + } + + public void Receive(NavigateSettingsRequested message) => SelectedMenuItem = ManageAccountsMenuItem; + + public async void Receive(MailtoProtocolMessageRequested message) + { + var accounts = await _accountService.GetAccountsAsync(); + + MailAccount targetAccount = null; + + if (!accounts.Any()) + { + await DialogService.ShowMessageAsync(Translator.DialogMessage_NoAccountsForCreateMailMessage, Translator.DialogMessage_NoAccountsForCreateMailTitle); + } + else if (accounts.Count == 1) + { + targetAccount = accounts[0]; + } + else + { + // User must pick an account. + + targetAccount = await DialogService.ShowAccountPickerDialogAsync(accounts); + } + + if (targetAccount == null) return; + + await CreateNewMailForAsync(targetAccount); + } + + public async void AccountProgressUpdated(Guid accountId, int progress) + { + var accountMenuItem = MenuItems.GetSpecificAccountMenuItem(accountId); + + if (accountMenuItem == null) return; + + await ExecuteUIThread(() => { accountMenuItem.SynchronizationProgress = progress; }); + } + + private async Task RecreateMenuItemsAsync() + { + await ExecuteUIThread(() => + { + MenuItems.Clear(); + MenuItems.Add(CreateMailMenuItem); + }); + + await LoadAccountsAsync(); + } + + public async void Receive(RefreshUnreadCountsMessage message) + => await RefreshUnreadCountsForAccountAsync(message.AccountId); + + public async void Receive(AccountsMenuRefreshRequested message) + { + await RecreateMenuItemsAsync(); + + if (message.AutomaticallyNavigateFirstItem) + { + if (MenuItems.FirstOrDefault(a => a is IAccountMenuItem) is IAccountMenuItem firstAccount) + { + ChangeLoadedAccount(firstAccount); + } + } + } + + public async void Receive(MergedInboxRenamed message) + { + var mergedInboxMenuItem = MenuItems.FirstOrDefault(a => a.EntityId == message.MergedInboxId); + + if (mergedInboxMenuItem == null) return; + + if (mergedInboxMenuItem is MergedAccountMenuItem mergedAccountMenuItemCasted) + { + await ExecuteUIThread(() => { mergedAccountMenuItemCasted.MergedAccountName = message.NewName; }); + } + } + + public async void Receive(LanguageChanged message) + { + await CreateFooterItemsAsync(); + await RecreateMenuItemsAsync(); + + ChangeLoadedAccount(latestSelectedAccountMenuItem, navigateInbox: false); + } + } +} diff --git a/Wino.Mail.ViewModels/BaseViewModel.cs b/Wino.Mail.ViewModels/BaseViewModel.cs new file mode 100644 index 00000000..d454b43c --- /dev/null +++ b/Wino.Mail.ViewModels/BaseViewModel.cs @@ -0,0 +1,95 @@ +using System; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Requests; +using Wino.Core.Requests; + +namespace Wino.Mail.ViewModels +{ + public class BaseViewModel : ObservableRecipient, + INavigationAware, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient + { + private IDispatcher _dispatcher; + public IDispatcher Dispatcher + { + get + { + return _dispatcher; + } + set + { + _dispatcher = value; + + if (value != null) + { + OnDispatcherAssigned(); + } + } + } + + protected IDialogService DialogService { get; } + + public BaseViewModel(IDialogService dialogService) => DialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService)); + + public async Task ExecuteUIThread(Action action) => await Dispatcher?.ExecuteOnUIThread(action); + + public virtual void OnNavigatedTo(NavigationMode mode, object parameters) { IsActive = true; } + + public virtual void OnNavigatedFrom(NavigationMode mode, object parameters) { IsActive = false; } + + protected virtual void OnDispatcherAssigned() { } + + protected virtual void OnMailAdded(MailCopy addedMail) { } + protected virtual void OnMailRemoved(MailCopy removedMail) { } + protected virtual void OnMailUpdated(MailCopy updatedMail) { } + protected virtual void OnMailDownloaded(MailCopy downloadedMail) { } + + protected virtual void OnAccountCreated(MailAccount createdAccount) { } + protected virtual void OnAccountRemoved(MailAccount removedAccount) { } + protected virtual void OnAccountUpdated(MailAccount updatedAccount) { } + + protected virtual void OnFolderAdded(MailItemFolder addedFolder, MailAccount account) { } + protected virtual void OnFolderRemoved(MailItemFolder removedFolder, MailAccount account) { } + protected virtual void OnFolderUpdated(MailItemFolder updatedFolder, MailAccount account) { } + + protected virtual void OnDraftCreated(MailCopy draftMail, MailAccount account) { } + protected virtual void OnDraftFailed(MailCopy draftMail, MailAccount account) { } + protected virtual void OnDraftMapped(string localDraftCopyId, string remoteDraftCopyId) { } + + public void ReportUIChange(TMessage message) where TMessage : class, IUIMessage + => Messenger.Send(message); + + void IRecipient.Receive(AccountCreatedMessage message) => OnAccountCreated(message.Account); + void IRecipient.Receive(AccountRemovedMessage message) => OnAccountRemoved(message.Account); + void IRecipient.Receive(AccountUpdatedMessage message) => OnAccountUpdated(message.Account); + + void IRecipient.Receive(FolderAddedMessage message) => OnFolderAdded(message.AddedFolder, message.Account); + void IRecipient.Receive(FolderUpdatedMessage message) => OnFolderUpdated(message.UpdatedFolder, message.Account); + void IRecipient.Receive(FolderRemovedMessage message) => OnFolderAdded(message.RemovedFolder, message.Account); + + void IRecipient.Receive(MailAddedMessage message) => OnMailAdded(message.AddedMail); + void IRecipient.Receive(MailRemovedMessage message) => OnMailRemoved(message.RemovedMail); + void IRecipient.Receive(MailUpdatedMessage message) => OnMailUpdated(message.UpdatedMail); + void IRecipient.Receive(MailDownloadedMessage message) => OnMailDownloaded(message.DownloadedMail); + void IRecipient.Receive(DraftMapped message) => OnDraftMapped(message.LocalDraftCopyId, message.RemoteDraftCopyId); + void IRecipient.Receive(DraftFailed message) => OnDraftFailed(message.DraftMail, message.Account); + void IRecipient.Receive(DraftCreated message) => OnDraftCreated(message.DraftMail, message.Account); + } +} diff --git a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs new file mode 100644 index 00000000..dc5e3d82 --- /dev/null +++ b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs @@ -0,0 +1,467 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Collections; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Comparers; +using Wino.Core.Domain.Models.MailItem; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels.Collections +{ + public class WinoMailCollection + { + // We cache each mail copy id for faster access on updates. + // If the item provider here for update or removal doesn't exist here + // we can ignore the operation. + + public HashSet MailCopyIdHashSet = new HashSet(); + + private ListItemComparer listComparer = new ListItemComparer(); + + private readonly ObservableGroupedCollection _mailItemSource = new ObservableGroupedCollection(); + + public ReadOnlyObservableGroupedCollection MailItems { get; } + + /// + /// Property that defines how the item sorting should be done in the collection. + /// + public SortingOptionType SortingType { get; set; } + + /// + /// Threading strategy that will help thread items according to the account type. + /// + public IThreadingStrategyProvider ThreadingStrategyProvider { get; set; } + + /// + /// Automatically deletes single mail items after the delete operation or thread->single transition. + /// This is useful when reply draft is discarded in the thread. Only enabled for Draft folder for now. + /// + public bool PruneSingleNonDraftItems { get; set; } + + public int Count => _mailItemSource.Count; + + public IDispatcher CoreDispatcher { get; set; } + + public WinoMailCollection() + { + MailItems = new ReadOnlyObservableGroupedCollection(_mailItemSource); + } + + public void Clear() => _mailItemSource.Clear(); + + private object GetGroupingKey(IMailItem mailItem) + { + if (SortingType == SortingOptionType.ReceiveDate) + return mailItem.CreationDate.ToLocalTime().Date; + else + return mailItem.FromName; + } + + private async Task InsertItemInternalAsync(object groupKey, IMailItem mailItem) + => await ExecuteUIThread(() => + { + if (mailItem is MailCopy mailCopy) + { + MailCopyIdHashSet.Add(mailCopy.UniqueId); + + _mailItemSource.InsertItem(groupKey, listComparer, new MailItemViewModel(mailCopy), listComparer.GetItemComparer()); + } + else if (mailItem is ThreadMailItem threadMailItem) + { + foreach (var item in threadMailItem.ThreadItems) + { + MailCopyIdHashSet.Add(item.UniqueId); + } + + _mailItemSource.InsertItem(groupKey, listComparer, new ThreadMailItemViewModel(threadMailItem), listComparer.GetItemComparer()); + } + else if (mailItem is MailItemViewModel) + { + MailCopyIdHashSet.Add(mailItem.UniqueId); + + _mailItemSource.InsertItem(groupKey, listComparer, mailItem, listComparer.GetItemComparer()); + } + }); + + private async Task RemoveItemInternalAsync(ObservableGroup group, IMailItem mailItem) + { + MailCopyIdHashSet.Remove(mailItem.UniqueId); + + await ExecuteUIThread(() => + { + group.Remove(mailItem); + + if (group.Count == 0) + { + _mailItemSource.RemoveGroup(group.Key); + } + }); + } + + public async Task AddAsync(MailCopy addedItem) + { + // Check all items for whether this item should be threaded with them. + bool shouldExit = false; + + var groupCount = _mailItemSource.Count; + + for (int i = 0; i < groupCount; i++) + { + if (shouldExit) break; + + var group = _mailItemSource[i]; + + for (int k = 0; k < group.Count; k++) + { + var item = group[k]; + + var addedAccountProviderType = addedItem.AssignedAccount.ProviderType; + + var threadingStrategy = ThreadingStrategyProvider.GetStrategy(addedAccountProviderType); + + if (threadingStrategy?.ShouldThreadWithItem(addedItem, item) ?? false) + { + shouldExit = true; + + if (item is ThreadMailItemViewModel threadMailItemViewModel) + { + // Item belongs to existing thread. + + /* Add original item to the thread. + * If new group key is not the same as existing thread: + * -> Remove the whole thread from list + * -> Add the thread to the list again for sorting. + * Update thread properties. + */ + + var existingGroupKey = GetGroupingKey(threadMailItemViewModel); + + threadMailItemViewModel.AddMailItemViewModel(addedItem); + + var newGroupKey = GetGroupingKey(threadMailItemViewModel); + + if (!existingGroupKey.Equals(newGroupKey)) + { + await RemoveItemInternalAsync(group, threadMailItemViewModel); + await InsertItemInternalAsync(newGroupKey, threadMailItemViewModel); + } + + await ExecuteUIThread(() => { threadMailItemViewModel.NotifyPropertyChanges(); }); + + break; + } + else + { + // Item belongs to a single mail item that is not threaded yet. + // Same item might've been tried to added as well. + // In that case we must just update the item but not thread it. + + /* Remove target item. + * Create a new thread with both items. + * Add new thread to the list. + */ + + if (item.Id == addedItem.Id) + { + // Item is already added to the list. + // We need to update the copy it holds. + + if (item is MailItemViewModel itemViewModel) + { + itemViewModel.Update(addedItem); + } + } + else + { + // Single item that must be threaded together with added item. + + var threadMailItem = new ThreadMailItem(); + + threadMailItem.AddThreadItem(item); + threadMailItem.AddThreadItem(addedItem); + + if (threadMailItem.ThreadItems.Count == 1) return; + + var newGroupKey = GetGroupingKey(threadMailItem); + + await RemoveItemInternalAsync(group, item); + await InsertItemInternalAsync(newGroupKey, threadMailItem); + } + + break; + } + } + else + { + // Update properties. + if (item.Id == addedItem.Id && item is MailItemViewModel itemViewModel) + { + await ExecuteUIThread(() => { itemViewModel.Update(addedItem); }); + + shouldExit = true; + } + } + } + } + + if (!shouldExit) + { + // At this point all items are already checked and not suitable option was available. + // Item doesn't belong to any thread. + // Just add it to the collection. + + var groupKey = GetGroupingKey(addedItem); + + await InsertItemInternalAsync(groupKey, addedItem); + } + } + + public void AddRange(IEnumerable items, bool clearIdCache) + { + if (clearIdCache) + { + MailCopyIdHashSet.Clear(); + } + + var groupedByName = items + .GroupBy(a => GetGroupingKey(a)) + .Select(a => new ObservableGroup(a.Key, a)); + + foreach (var group in groupedByName) + { + // Store all mail copy ids for faster access. + foreach (var item in group) + { + if (item is MailItemViewModel mailCopyItem && !MailCopyIdHashSet.Contains(item.UniqueId)) + { + MailCopyIdHashSet.Add(item.UniqueId); + } + else if (item is ThreadMailItemViewModel threadMailItem) + { + foreach (var mailItem in threadMailItem.ThreadItems) + { + if (!MailCopyIdHashSet.Contains(mailItem.UniqueId)) + { + MailCopyIdHashSet.Add(mailItem.UniqueId); + } + } + } + } + + var existingGroup = _mailItemSource.FirstGroupByKeyOrDefault(group.Key); + + if (existingGroup == null) + { + _mailItemSource.AddGroup(group.Key, group); + } + else + { + + foreach (var item in group) + { + existingGroup.Add(item); + + // _mailItemSource.InsertItem(existingGroup, item); + } + } + } + } + + public MailItemContainer GetMailItemContainer(Guid uniqueMailId) + { + var groupCount = _mailItemSource.Count; + + for (int i = 0; i < groupCount; i++) + { + var group = _mailItemSource[i]; + + for (int k = 0; k < group.Count; k++) + { + var item = group[k]; + + if (item is MailItemViewModel singleMailItemViewModel && singleMailItemViewModel.UniqueId == uniqueMailId) + return new MailItemContainer(singleMailItemViewModel); + else if (item is ThreadMailItemViewModel threadMailItemViewModel && threadMailItemViewModel.HasUniqueId(uniqueMailId)) + { + var singleItemViewModel = threadMailItemViewModel.GetItemById(uniqueMailId) as MailItemViewModel; + + return new MailItemContainer(singleItemViewModel, threadMailItemViewModel); + } + } + } + + return null; + } + + /// + /// Fins the item container that updated mail copy belongs to and updates it. + /// + /// Updated mail copy. + /// + public async Task UpdateMailCopy(MailCopy updatedMailCopy) + { + // This item doesn't exist in the list. + if (!MailCopyIdHashSet.Contains(updatedMailCopy.UniqueId)) + + { + return; + } + + await ExecuteUIThread(() => + { + var itemContainer = GetMailItemContainer(updatedMailCopy.UniqueId); + + if (itemContainer == null) return; + + // mailCopyIdHashSet.Remove(itemContainer.ItemViewModel.UniqueId); + + itemContainer.ItemViewModel?.Update(updatedMailCopy); + + // mailCopyIdHashSet.Add(updatedMailCopy.UniqueId); + + // Call thread notifications if possible. + itemContainer.ThreadViewModel?.NotifyPropertyChanges(); + }); + } + + public MailItemViewModel GetNextItem(MailCopy mailCopy) + { + var groupCount = _mailItemSource.Count; + + for (int i = 0; i < groupCount; i++) + { + var group = _mailItemSource[i]; + + for (int k = 0; k < group.Count; k++) + { + var item = group[k]; + + if (item is MailItemViewModel singleMailItemViewModel && singleMailItemViewModel.UniqueId == mailCopy.UniqueId) + { + if (k + 1 < group.Count) + { + return group[k + 1] as MailItemViewModel; + } + else if (i + 1 < groupCount) + { + return _mailItemSource[i + 1][0] as MailItemViewModel; + } + else + { + return null; + } + } + else if (item is ThreadMailItemViewModel threadMailItemViewModel && threadMailItemViewModel.HasUniqueId(mailCopy.UniqueId)) + { + var singleItemViewModel = threadMailItemViewModel.GetItemById(mailCopy.UniqueId) as MailItemViewModel; + + if (singleItemViewModel == null) return null; + + var singleItemIndex = threadMailItemViewModel.ThreadItems.IndexOf(singleItemViewModel); + + if (singleItemIndex + 1 < threadMailItemViewModel.ThreadItems.Count) + { + return threadMailItemViewModel.ThreadItems[singleItemIndex + 1] as MailItemViewModel; + } + else if (i + 1 < groupCount) + { + return _mailItemSource[i + 1][0] as MailItemViewModel; + } + else + { + return null; + } + } + } + } + + return null; + } + + public async Task RemoveAsync(MailCopy removeItem) + { + // This item doesn't exist in the list. + if (!MailCopyIdHashSet.Contains(removeItem.UniqueId)) return; + + // Check all items for whether this item should be threaded with them. + bool shouldExit = false; + + var groupCount = _mailItemSource.Count; + + for (int i = 0; i < groupCount; i++) + { + if (shouldExit) break; + + var group = _mailItemSource[i]; + + for (int k = 0; k < group.Count; k++) + { + var item = group[k]; + + if (item is ThreadMailItemViewModel threadMailItemViewModel && threadMailItemViewModel.HasUniqueId(removeItem.UniqueId)) + { + var removalItem = threadMailItemViewModel.GetItemById(removeItem.UniqueId); + + if (removalItem == null) return; + + // Threads' Id is equal to the last item they hold. + // We can't do Id check here because that'd remove the whole thread. + + /* Remove item from the thread. + * If thread had 1 item inside: + * -> Remove the thread and insert item as single item. + * If thread had 0 item inside: + * -> Remove the thread. + */ + + await ExecuteUIThread(() => { threadMailItemViewModel.RemoveCopyItem(removalItem); }); + + if (threadMailItemViewModel.ThreadItems.Count == 1) + { + // Convert to single item. + + var singleViewModel = threadMailItemViewModel.GetSingleItemViewModel(); + var groupKey = GetGroupingKey(singleViewModel); + + await RemoveItemInternalAsync(group, threadMailItemViewModel); + + // If thread->single conversion is being done, we should ignore it for non-draft items. + // eg. Deleting a reply message from draft folder. Single non-draft item should not be re-added. + + if (!PruneSingleNonDraftItems || singleViewModel.IsDraft) + { + await InsertItemInternalAsync(groupKey, singleViewModel); + } + } + else if (threadMailItemViewModel.ThreadItems.Count == 0) + { + await RemoveItemInternalAsync(group, threadMailItemViewModel); + } + else + { + // Item inside the thread is removed. + + threadMailItemViewModel.ThreadItems.Remove(removalItem); + } + + shouldExit = true; + break; + } + else if (item.UniqueId == removeItem.UniqueId) + { + await RemoveItemInternalAsync(group, item); + shouldExit = true; + + break; + } + } + } + } + + private async Task ExecuteUIThread(Action action) => await CoreDispatcher?.ExecuteOnUIThread(action); + } +} diff --git a/Wino.Mail.ViewModels/ComposePageViewModel.cs b/Wino.Mail.ViewModels/ComposePageViewModel.cs new file mode 100644 index 00000000..e2e30b34 --- /dev/null +++ b/Wino.Mail.ViewModels/ComposePageViewModel.cs @@ -0,0 +1,494 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using MimeKit; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.Extensions; +using Wino.Core.Messages.Mails; +using Wino.Core.Services; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels +{ + public partial class ComposePageViewModel : BaseViewModel + { + public Func> GetHTMLBodyFunction; + + // When we send the message or discard it, we need to block the mime update + // Update is triggered when we leave the page. + private bool isUpdatingMimeBlocked = false; + + public bool CanSendMail => ComposingAccount != null && !IsLocalDraft && currentMimeMessage != null; + + private MimeMessage currentMimeMessage = null; + private readonly BodyBuilder bodyBuilder = new BodyBuilder(); + + public bool IsLocalDraft => CurrentMailDraftItem != null + && !string.IsNullOrEmpty(CurrentMailDraftItem.DraftId) + && CurrentMailDraftItem.DraftId.StartsWith(Constants.LocalDraftStartPrefix); + + + #region Properties + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsLocalDraft))] + [NotifyPropertyChangedFor(nameof(CanSendMail))] + private MailItemViewModel currentMailDraftItem; + + [ObservableProperty] + private bool isImportanceSelected; + + [ObservableProperty] + private MessageImportance selectedMessageImportance; + + [ObservableProperty] + private bool isCCBCCVisible = true; + + [ObservableProperty] + private string subject; + + [ObservableProperty] + private MailAccount composingAccount; + + public ObservableCollection IncludedAttachments { get; set; } = new ObservableCollection(); + + public ObservableCollection Accounts { get; set; } = new ObservableCollection(); + public ObservableCollection ToItems { get; set; } = new ObservableCollection(); + public ObservableCollection CCItemsItems { get; set; } = new ObservableCollection(); + public ObservableCollection BCCItems { get; set; } = new ObservableCollection(); + + + public List ToolbarSections { get; set; } = new List() + { + new EditorToolbarSection(){ SectionType = EditorToolbarSectionType.Format }, + new EditorToolbarSection(){ SectionType = EditorToolbarSectionType.Insert }, + new EditorToolbarSection(){ SectionType = EditorToolbarSectionType.Draw }, + new EditorToolbarSection(){ SectionType = EditorToolbarSectionType.Options } + }; + + private EditorToolbarSection selectedToolbarSection; + + public EditorToolbarSection SelectedToolbarSection + { + get => selectedToolbarSection; + set => SetProperty(ref selectedToolbarSection, value); + } + + #endregion + + public INativeAppService NativeAppService { get; } + + private readonly IMailService _mailService; + private readonly ILaunchProtocolService _launchProtocolService; + private readonly IMimeFileService _mimeFileService; + private readonly IStatePersistanceService _statePersistanceService; + private readonly IFolderService _folderService; + private readonly IAccountService _accountService; + private readonly IWinoRequestDelegator _worker; + public readonly IContactService ContactService; + + public ComposePageViewModel(IDialogService dialogService, + IMailService mailService, + ILaunchProtocolService launchProtocolService, + IMimeFileService mimeFileService, + IStatePersistanceService statePersistanceService, + INativeAppService nativeAppService, + IFolderService folderService, + IAccountService accountService, + IWinoRequestDelegator worker, + IContactService contactService) : base(dialogService) + { + NativeAppService = nativeAppService; + _folderService = folderService; + ContactService = contactService; + + _mailService = mailService; + _launchProtocolService = launchProtocolService; + _mimeFileService = mimeFileService; + _statePersistanceService = statePersistanceService; + _accountService = accountService; + _worker = worker; + + SelectedToolbarSection = ToolbarSections[0]; + } + + [RelayCommand] + private void RemoveAttachment(MailAttachmentViewModel attachmentViewModel) + => IncludedAttachments.Remove(attachmentViewModel); + + [RelayCommand] + private async Task SendAsync() + { + // TODO: More detailed mail validations. + + if (!ToItems.Any()) + { + await DialogService.ShowMessageAsync(Translator.DialogMessage_ComposerMissingRecipientMessage, Translator.DialogMessage_ComposerValidationFailedTitle); + return; + } + + if (string.IsNullOrEmpty(Subject)) + { + var isConfirmed = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_EmptySubjectConfirmationMessage, Translator.DialogMessage_EmptySubjectConfirmation, Translator.Buttons_Yes); + + if (!isConfirmed) return; + } + + // Save mime changes before sending. + await UpdateMimeChangesAsync().ConfigureAwait(false); + + isUpdatingMimeBlocked = true; + + var assignedAccount = CurrentMailDraftItem.AssignedAccount; + + MailItemFolder sentFolder = null; + + // Load the Sent folder if user wanted to have a copy there. + if (assignedAccount.Preferences.ShouldAppendMessagesToSentFolder) + { + sentFolder = await _folderService.GetSpecialFolderByAccountIdAsync(assignedAccount.Id, SpecialFolderType.Sent); + } + + var draftSendPreparationRequest = new SendDraftPreparationRequest(CurrentMailDraftItem.MailCopy, currentMimeMessage, CurrentMailDraftItem.AssignedFolder, sentFolder, CurrentMailDraftItem.AssignedAccount.Preferences); + + await _worker.ExecuteAsync(draftSendPreparationRequest); + } + + private async Task UpdateMimeChangesAsync() + { + if (isUpdatingMimeBlocked || currentMimeMessage == null || ComposingAccount == null || CurrentMailDraftItem == null) return; + + // Save recipients. + + SaveAddressInfo(ToItems, currentMimeMessage.To); + SaveAddressInfo(CCItemsItems, currentMimeMessage.Cc); + SaveAddressInfo(BCCItems, currentMimeMessage.Bcc); + + SaveImportance(); + SaveSubject(); + + await SaveAttachmentsAsync(); + await SaveBodyAsync(); + await UpdateMailCopyAsync(); + + // Save mime file. + await _mimeFileService.SaveMimeMessageAsync(CurrentMailDraftItem.MailCopy.FileId, currentMimeMessage, ComposingAccount.Id).ConfigureAwait(false); + } + + private async Task UpdateMailCopyAsync() + { + CurrentMailDraftItem.Subject = currentMimeMessage.Subject; + CurrentMailDraftItem.PreviewText = currentMimeMessage.TextBody; + + // Update database. + await _mailService.UpdateMailAsync(CurrentMailDraftItem.MailCopy); + } + + private async Task SaveAttachmentsAsync() + { + bodyBuilder.Attachments.Clear(); + + foreach (var path in IncludedAttachments) + { + if (path.Content == null) continue; + + await bodyBuilder.Attachments.AddAsync(path.FileName, new MemoryStream(path.Content)); + } + } + + private void SaveImportance() { currentMimeMessage.Importance = IsImportanceSelected ? SelectedMessageImportance : MessageImportance.Normal; } + + private void SaveSubject() + { + if (Subject != null) + { + currentMimeMessage.Subject = Subject; + } + } + + private async Task SaveBodyAsync() + { + if (GetHTMLBodyFunction != null) + bodyBuilder.HtmlBody = Regex.Unescape(await GetHTMLBodyFunction()); + + if (!string.IsNullOrEmpty(bodyBuilder.HtmlBody)) + bodyBuilder.TextBody = HtmlAgilityPackExtensions.GetPreviewText(bodyBuilder.HtmlBody); + + if (bodyBuilder.HtmlBody != null && bodyBuilder.TextBody != null) + currentMimeMessage.Body = bodyBuilder.ToMessageBody(); + } + + [RelayCommand] + private async Task DiscardAsync() + { + if (ComposingAccount == null) + { + DialogService.InfoBarMessage(Translator.Info_MessageCorruptedTitle, Translator.Info_MessageCorruptedMessage, InfoBarMessageType.Error); + return; + } + + var confirmation = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_DiscardDraftConfirmationMessage, + Translator.DialogMessage_DiscardDraftConfirmationTitle, + Translator.Buttons_Yes); + + if (confirmation) + { + isUpdatingMimeBlocked = true; + + // Don't send delete request for local drafts. Just delete the record and mime locally. + if (CurrentMailDraftItem.IsLocalDraft) + { + await _mailService.DeleteMailAsync(ComposingAccount.Id, CurrentMailDraftItem.Id); + } + else + { + var deletePackage = new MailOperationPreperationRequest(MailOperation.HardDelete, CurrentMailDraftItem.MailCopy, ignoreHardDeleteProtection: true); + await _worker.ExecuteAsync(deletePackage).ConfigureAwait(false); + } + } + } + + public override async void OnNavigatedFrom(NavigationMode mode, object parameters) + { + base.OnNavigatedFrom(mode, parameters); + + await UpdateMimeChangesAsync().ConfigureAwait(false); + + await ExecuteUIThread(() => { _statePersistanceService.IsReadingMail = false; }); + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + if (parameters != null && parameters is MailItemViewModel mailItem) + { + await LoadAccountsAsync(); + + CurrentMailDraftItem = mailItem; + + _ = TryPrepareComposeAsync(true); + } + + ToItems.CollectionChanged -= ContactListCollectionChanged; + ToItems.CollectionChanged += ContactListCollectionChanged; + + _statePersistanceService.IsReadingMail = true; + + // Check if there is any delivering mail address from protocol launch. + + if (_launchProtocolService.MailtoParameters != null) + { + // TODO + //var requestedMailContact = await GetAddressInformationAsync(_launchProtocolService.MailtoParameters, ToItems); + + //if (requestedMailContact != null) + //{ + // ToItems.Add(requestedMailContact); + //} + //else + // DialogService.InfoBarMessage("Invalid Address", "Address is not a valid e-mail address.", InfoBarMessageType.Warning); + + // Clear the address. + _launchProtocolService.MailtoParameters = null; + } + } + + private void ContactListCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) + { + // Prevent duplicates. + if (!(sender is ObservableCollection list)) + return; + + foreach (var item in e.NewItems) + { + if (item is AddressInformation addedInfo && list.Count(a => a == addedInfo) > 1) + { + var addedIndex = list.IndexOf(addedInfo); + list.RemoveAt(addedIndex); + } + } + } + } + + private async Task LoadAccountsAsync() + { + // Load accounts + + var accounts = await _accountService.GetAccountsAsync(); + + foreach (var account in accounts) + { + Accounts.Add(account); + } + } + + private async Task InitializeComposerAccountAsync() + { + if (ComposingAccount != null) return true; + + if (CurrentMailDraftItem == null) + return false; + + await ExecuteUIThread(() => + { + ComposingAccount = Accounts.FirstOrDefault(a => a.Id == CurrentMailDraftItem.AssignedAccount.Id); + }); + + return ComposingAccount != null; + } + + private async Task TryPrepareComposeAsync(bool downloadIfNeeded) + { + if (CurrentMailDraftItem == null) + return; + + bool isComposerInitialized = await InitializeComposerAccountAsync(); + + if (!isComposerInitialized) + { + return; + } + + // Replying existing message. + MimeMessageInformation mimeMessageInformation = null; + + try + { + mimeMessageInformation = await _mimeFileService.GetMimeMessageInformationAsync(CurrentMailDraftItem.MailCopy.FileId, ComposingAccount.Id).ConfigureAwait(false); + } + catch (FileNotFoundException) + { + if (downloadIfNeeded) + { + // TODO: Folder id needs to be passed. + // TODO: Send mail retrieve request. + // _worker.Queue(new FetchSingleItemRequest(ComposingAccount.Id, CurrentMailDraftItem.Id, string.Empty)); + } + //else + // DialogService.ShowMIMENotFoundMessage(); + + return; + } + catch (ComposerMimeNotFoundException) + { + DialogService.InfoBarMessage(Translator.Info_ComposerMissingMIMETitle, Translator.Info_ComposerMissingMIMEMessage, InfoBarMessageType.Error); + } + + if (mimeMessageInformation == null) + return; + + var replyingMime = mimeMessageInformation.MimeMessage; + var mimeFilePath = mimeMessageInformation.Path; + + var renderModel = _mimeFileService.GetMailRenderModel(replyingMime, mimeFilePath); + + await ExecuteUIThread(() => + { + // Extract information + + ToItems.Clear(); + CCItemsItems.Clear(); + BCCItems.Clear(); + + LoadAddressInfo(replyingMime.To, ToItems); + LoadAddressInfo(replyingMime.Cc, CCItemsItems); + LoadAddressInfo(replyingMime.Bcc, BCCItems); + + LoadAttachments(replyingMime.Attachments); + + Subject = replyingMime.Subject; + + currentMimeMessage = replyingMime; + + OnPropertyChanged(nameof(CanSendMail)); + Messenger.Send(new CreateNewComposeMailRequested(renderModel)); + }); + } + + private void LoadAttachments(IEnumerable mimeEntities) + { + foreach (var attachment in mimeEntities) + { + if (attachment.IsAttachment && attachment is MimePart attachmentPart) + { + IncludedAttachments.Add(new MailAttachmentViewModel(attachmentPart)); + } + } + } + + private void LoadAddressInfo(InternetAddressList list, ObservableCollection collection) + { + foreach (var item in list) + { + if (item is MailboxAddress mailboxAddress) + collection.Add(mailboxAddress.ToAddressInformation()); + else if (item is GroupAddress groupAddress) + LoadAddressInfo(groupAddress.Members, collection); + } + } + + private void SaveAddressInfo(IEnumerable addresses, InternetAddressList list) + { + list.Clear(); + + foreach (var item in addresses) + list.Add(new MailboxAddress(item.Name, item.Address)); + } + + public async Task GetAddressInformationAsync(string tokenText, ObservableCollection collection) + { + // Get model from the service. This will make sure the name is properly included if there is any record. + + var info = await ContactService.GetAddressInformationByAddressAsync(tokenText); + + // Don't add if there is already that address in the collection. + if (collection.Any(a => a.Address == info.Address)) + return null; + + return info; + } + + public void NotifyAddressExists() + { + DialogService.InfoBarMessage(Translator.Info_ContactExistsTitle, Translator.Info_ContactExistsMessage, InfoBarMessageType.Warning); + } + + public void NotifyInvalidEmail(string address) + { + DialogService.InfoBarMessage(Translator.Info_InvalidAddressTitle, string.Format(Translator.Info_InvalidAddressMessage, address), InfoBarMessageType.Warning); + } + + protected override async void OnMailUpdated(MailCopy updatedMail) + { + base.OnMailUpdated(updatedMail); + + if (CurrentMailDraftItem == null) return; + + if (updatedMail.UniqueId == CurrentMailDraftItem.UniqueId) + { + await ExecuteUIThread(() => + { + CurrentMailDraftItem.Update(updatedMail); + OnPropertyChanged(nameof(CanSendMail)); + }); + } + } + } +} diff --git a/Wino.Mail.ViewModels/Data/AccountProviderDetailViewModel.cs b/Wino.Mail.ViewModels/Data/AccountProviderDetailViewModel.cs new file mode 100644 index 00000000..4f629e99 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/AccountProviderDetailViewModel.cs @@ -0,0 +1,26 @@ +using System; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Mail.ViewModels.Data +{ + public partial class AccountProviderDetailViewModel : ObservableObject, IAccountProviderDetailViewModel + { + + [ObservableProperty] + private MailAccount account; + + public IProviderDetail ProviderDetail { get; set; } + + public Guid StartupEntityId => Account.Id; + + public string StartupEntityTitle => Account.Name; + + public AccountProviderDetailViewModel(IProviderDetail providerDetail, MailAccount account) + { + ProviderDetail = providerDetail; + Account = account; + } + } +} diff --git a/Wino.Mail.ViewModels/Data/AppColorViewModel.cs b/Wino.Mail.ViewModels/Data/AppColorViewModel.cs new file mode 100644 index 00000000..4f3072d0 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/AppColorViewModel.cs @@ -0,0 +1,23 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Wino.Mail.ViewModels.Data +{ + public class AppColorViewModel : ObservableObject + { + private string _hex; + + public string Hex + { + get => _hex; + set => SetProperty(ref _hex, value); + } + + public bool IsAccentColor { get; } + + public AppColorViewModel(string hex, bool isAccentColor = false) + { + IsAccentColor = isAccentColor; + Hex = hex; + } + } +} diff --git a/Wino.Mail.ViewModels/Data/BreadcrumbNavigationItemViewModel.cs b/Wino.Mail.ViewModels/Data/BreadcrumbNavigationItemViewModel.cs new file mode 100644 index 00000000..616e2dea --- /dev/null +++ b/Wino.Mail.ViewModels/Data/BreadcrumbNavigationItemViewModel.cs @@ -0,0 +1,33 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Messages.Navigation; + +namespace Wino.Mail.ViewModels.Data +{ + public class BreadcrumbNavigationItemViewModel : ObservableObject + { + public BreadcrumbNavigationRequested Request { get; set; } + + public BreadcrumbNavigationItemViewModel(BreadcrumbNavigationRequested request, bool isActive) + { + Request = request; + Title = request.PageTitle; + + this.isActive = isActive; + } + + private string title; + public string Title + { + get => title; + set => SetProperty(ref title, value); + } + + private bool isActive; + + public bool IsActive + { + get => isActive; + set => SetProperty(ref isActive, value); + } + } +} diff --git a/Wino.Mail.ViewModels/Data/FolderPivotViewModel.cs b/Wino.Mail.ViewModels/Data/FolderPivotViewModel.cs new file mode 100644 index 00000000..69620759 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/FolderPivotViewModel.cs @@ -0,0 +1,33 @@ +using System.Diagnostics; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain; + +namespace Wino.Mail.ViewModels.Data +{ + [DebuggerDisplay("{FolderTitle}")] + public partial class FolderPivotViewModel : ObservableObject + { + public bool? IsFocused { get; set; } + public string FolderTitle { get; } + + public bool ShouldDisplaySelectedItemCount => IsExtendedMode ? SelectedItemCount > 1 : SelectedItemCount > 0; + + [ObservableProperty] + private bool isSelected; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(ShouldDisplaySelectedItemCount))] + private int selectedItemCount; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(ShouldDisplaySelectedItemCount))] + private bool isExtendedMode = true; + + public FolderPivotViewModel(string folderName, bool? isFocused) + { + IsFocused = isFocused; + + FolderTitle = IsFocused == null ? folderName : (IsFocused == true ? Translator.Focused : Translator.Other); + } + } +} diff --git a/Wino.Mail.ViewModels/Data/MailAttachmentViewModel.cs b/Wino.Mail.ViewModels/Data/MailAttachmentViewModel.cs new file mode 100644 index 00000000..90387ce4 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/MailAttachmentViewModel.cs @@ -0,0 +1,100 @@ +using System.IO; +using CommunityToolkit.Mvvm.ComponentModel; +using MimeKit; +using Wino.Core.Domain.Enums; +using Wino.Core.Extensions; + +namespace Wino.Mail.ViewModels.Data +{ + public class MailAttachmentViewModel : ObservableObject + { + private bool isBusy; + private readonly MimePart _mimePart; + + public MailAttachmentType AttachmentType { get; } + public string FileName { get; } + public string FilePath { get; set; } + public string ReadableSize { get; } + public byte[] Content { get; set; } + + public IMimeContent MimeContent => _mimePart.Content; + + /// + /// Gets or sets whether attachment is busy with opening or saving etc. + /// + public bool IsBusy + { + get => isBusy; + set => SetProperty(ref isBusy, value); + } + + public MailAttachmentViewModel(MimePart mimePart) + { + _mimePart = mimePart; + + var array = new byte[_mimePart.Content.Stream.Length]; + _mimePart.Content.Stream.Read(array, 0, (int)_mimePart.Content.Stream.Length); + + Content = array; + + FileName = mimePart.FileName; + ReadableSize = mimePart.Content.Stream.Length.GetBytesReadable(); + + var extension = Path.GetExtension(FileName); + AttachmentType = GetAttachmentType(extension); + } + + public MailAttachmentViewModel(string fullFilePath, byte[] content) + { + Content = content; + + FileName = Path.GetFileName(fullFilePath); + FilePath = fullFilePath; + + ReadableSize = ((long)content.Length).GetBytesReadable(); + + var extension = Path.GetExtension(FileName); + AttachmentType = GetAttachmentType(extension); + } + + public MailAttachmentType GetAttachmentType(string mediaSubtype) + { + if (string.IsNullOrEmpty(mediaSubtype)) + return MailAttachmentType.None; + + switch (mediaSubtype.ToLower()) + { + case ".exe": + return MailAttachmentType.Executable; + case ".rar": + return MailAttachmentType.RarArchive; + case ".zip": + return MailAttachmentType.Archive; + case ".ogg": + case ".mp3": + case ".wav": + case ".aac": + case ".alac": + return MailAttachmentType.Audio; + case ".mp4": + case ".wmv": + case ".avi": + case ".flv": + return MailAttachmentType.Video; + case ".pdf": + return MailAttachmentType.PDF; + case ".htm": + case ".html": + return MailAttachmentType.HTML; + case ".png": + case ".jpg": + case ".jpeg": + case ".gif": + case ".jiff": + return MailAttachmentType.Image; + default: + return MailAttachmentType.Other; + } + } + } +} diff --git a/Wino.Mail.ViewModels/Data/MailItemContainer.cs b/Wino.Mail.ViewModels/Data/MailItemContainer.cs new file mode 100644 index 00000000..da845606 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/MailItemContainer.cs @@ -0,0 +1,20 @@ +using System; + +namespace Wino.Mail.ViewModels.Data +{ + public class MailItemContainer + { + public MailItemViewModel ItemViewModel { get; set; } + public ThreadMailItemViewModel ThreadViewModel { get; set; } + + public MailItemContainer(MailItemViewModel itemViewModel, ThreadMailItemViewModel threadViewModel) : this(itemViewModel) + { + ThreadViewModel = threadViewModel ?? throw new ArgumentNullException(nameof(threadViewModel)); + } + + public MailItemContainer(MailItemViewModel itemViewModel) + { + ItemViewModel = itemViewModel ?? throw new ArgumentNullException(nameof(itemViewModel)); + } + } +} diff --git a/Wino.Mail.ViewModels/Data/MailItemViewModel.cs b/Wino.Mail.ViewModels/Data/MailItemViewModel.cs new file mode 100644 index 00000000..26d82931 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/MailItemViewModel.cs @@ -0,0 +1,106 @@ +using System; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Mail.ViewModels.Data +{ + /// + /// Single view model for IMailItem representation. + /// + public partial class MailItemViewModel(MailCopy mailCopy) : ObservableObject, IMailItem + { + public MailCopy MailCopy { get; private set; } = mailCopy; + + public bool IsLocalDraft => !string.IsNullOrEmpty(DraftId) && DraftId.StartsWith(Constants.LocalDraftStartPrefix); + + public Guid UniqueId => ((IMailItem)MailCopy).UniqueId; + public string ThreadId => ((IMailItem)MailCopy).ThreadId; + public string MessageId => ((IMailItem)MailCopy).MessageId; + public string FromName => ((IMailItem)MailCopy).FromName ?? FromAddress; + public DateTime CreationDate => ((IMailItem)MailCopy).CreationDate; + public string FromAddress => ((IMailItem)MailCopy).FromAddress; + public bool HasAttachments => ((IMailItem)MailCopy).HasAttachments; + public string References => ((IMailItem)MailCopy).References; + public string InReplyTo => ((IMailItem)MailCopy).InReplyTo; + + [ObservableProperty] + private bool isCustomFocused; + + [ObservableProperty] + private bool isSelected; + + public bool IsFlagged + { + get => MailCopy.IsFlagged; + set => SetProperty(MailCopy.IsFlagged, value, MailCopy, (u, n) => u.IsFlagged = n); + } + + public bool IsFocused + { + get => MailCopy.IsFocused; + set => SetProperty(MailCopy.IsFocused, value, MailCopy, (u, n) => u.IsFocused = n); + } + + public bool IsRead + { + get => MailCopy.IsRead; + set => SetProperty(MailCopy.IsRead, value, MailCopy, (u, n) => u.IsRead = n); + } + + public bool IsDraft + { + get => MailCopy.IsDraft; + set => SetProperty(MailCopy.IsDraft, value, MailCopy, (u, n) => u.IsDraft = n); + } + + public string DraftId + { + get => MailCopy.DraftId; + set => SetProperty(MailCopy.DraftId, value, MailCopy, (u, n) => u.DraftId = n); + } + + public string Id + { + get => MailCopy.Id; + set => SetProperty(MailCopy.Id, value, MailCopy, (u, n) => u.Id = n); + } + + public string Subject + { + get => MailCopy.Subject; + set => SetProperty(MailCopy.Subject, value, MailCopy, (u, n) => u.Subject = n); + } + + public string PreviewText + { + get => MailCopy.PreviewText; + set => SetProperty(MailCopy.PreviewText, value, MailCopy, (u, n) => u.PreviewText = n); + } + + public MailItemFolder AssignedFolder => ((IMailItem)MailCopy).AssignedFolder; + + public MailAccount AssignedAccount => ((IMailItem)MailCopy).AssignedAccount; + + public Guid FileId => ((IMailItem)MailCopy).FileId; + + public void Update(MailCopy updatedMailItem) + { + MailCopy = updatedMailItem; + + // DEBUG + //if (updatedMailItem.AssignedAccount == null || updatedMailItem.AssignedFolder == null) + // throw new Exception("Assigned account or folder is null."); + + OnPropertyChanged(nameof(IsRead)); + OnPropertyChanged(nameof(IsFocused)); + OnPropertyChanged(nameof(IsFlagged)); + OnPropertyChanged(nameof(IsDraft)); + OnPropertyChanged(nameof(DraftId)); + OnPropertyChanged(nameof(Subject)); + OnPropertyChanged(nameof(PreviewText)); + OnPropertyChanged(nameof(IsLocalDraft)); + } + } +} diff --git a/Wino.Mail.ViewModels/Data/MergedAccountProviderDetailViewModel.cs b/Wino.Mail.ViewModels/Data/MergedAccountProviderDetailViewModel.cs new file mode 100644 index 00000000..6dda7ac3 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/MergedAccountProviderDetailViewModel.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Mail.ViewModels.Data +{ + public partial class MergedAccountProviderDetailViewModel : ObservableObject, IAccountProviderDetailViewModel + { + public List HoldingAccounts { get; } + public MergedInbox MergedInbox { get; } + + public string AccountAddresses => string.Join(", ", HoldingAccounts.Select(a => a.Account.Address)); + + public Guid StartupEntityId => MergedInbox.Id; + + public string StartupEntityTitle => MergedInbox.Name; + + public MergedAccountProviderDetailViewModel(MergedInbox mergedInbox, List holdingAccounts) + { + MergedInbox = mergedInbox; + HoldingAccounts = holdingAccounts; + } + } +} diff --git a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs new file mode 100644 index 00000000..74360ff5 --- /dev/null +++ b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Models.MailItem; + +namespace Wino.Mail.ViewModels.Data +{ + /// + /// Thread mail item (multiple IMailItem) view model representation. + /// + public class ThreadMailItemViewModel : ObservableObject, IMailItemThread, IComparable, IComparable + { + public ObservableCollection ThreadItems => ((IMailItemThread)_threadMailItem).ThreadItems; + + private readonly ThreadMailItem _threadMailItem; + + private bool isThreadExpanded; + public bool IsThreadExpanded + { + get => isThreadExpanded; + set => SetProperty(ref isThreadExpanded, value); + } + + public ThreadMailItemViewModel(ThreadMailItem threadMailItem) + { + _threadMailItem = new ThreadMailItem(); + + // Local copies + foreach (var item in threadMailItem.ThreadItems) + { + AddMailItemViewModel(item); + } + } + + public IEnumerable GetMailCopies() + => ThreadItems.OfType().Select(a => a.MailCopy); + + public void AddMailItemViewModel(IMailItem mailItem) + { + if (mailItem == null) return; + + if (mailItem is MailCopy mailCopy) + _threadMailItem.AddThreadItem(new MailItemViewModel(mailCopy)); + else if (mailItem is MailItemViewModel mailItemViewModel) + _threadMailItem.AddThreadItem(mailItemViewModel); + else + Debugger.Break(); + } + + public bool HasUniqueId(Guid uniqueMailId) + => ThreadItems.Any(a => a.UniqueId == uniqueMailId); + + public IMailItem GetItemById(Guid uniqueMailId) + => ThreadItems.FirstOrDefault(a => a.UniqueId == uniqueMailId); + + public void RemoveCopyItem(IMailItem item) + { + MailCopy copyToRemove = null; + + if (item is MailItemViewModel mailItemViewModel) + copyToRemove = mailItemViewModel.MailCopy; + else if (item is MailCopy copyItem) + copyToRemove = copyItem; + + var existedItem = ThreadItems.FirstOrDefault(a => a.Id == copyToRemove.Id); + + if (existedItem == null) return; + + ThreadItems.Remove(existedItem); + + NotifyPropertyChanges(); + } + + public void NotifyPropertyChanges() + { + OnPropertyChanged(nameof(Subject)); + OnPropertyChanged(nameof(PreviewText)); + OnPropertyChanged(nameof(FromName)); + OnPropertyChanged(nameof(FromAddress)); + OnPropertyChanged(nameof(HasAttachments)); + + OnPropertyChanged(nameof(IsFlagged)); + OnPropertyChanged(nameof(IsDraft)); + OnPropertyChanged(nameof(IsRead)); + OnPropertyChanged(nameof(IsFocused)); + OnPropertyChanged(nameof(CreationDate)); + } + + public IMailItem LatestMailItem => ((IMailItemThread)_threadMailItem).LatestMailItem; + public IMailItem FirstMailItem => ((IMailItemThread)_threadMailItem).FirstMailItem; + + public string Id => ((IMailItem)_threadMailItem).Id; + public string Subject => ((IMailItem)_threadMailItem).Subject; + public string ThreadId => ((IMailItem)_threadMailItem).ThreadId; + public string MessageId => ((IMailItem)_threadMailItem).MessageId; + public string References => ((IMailItem)_threadMailItem).References; + public string PreviewText => ((IMailItem)_threadMailItem).PreviewText; + public string FromName => ((IMailItem)_threadMailItem).FromName; + public DateTime CreationDate => ((IMailItem)_threadMailItem).CreationDate; + public string FromAddress => ((IMailItem)_threadMailItem).FromAddress; + public bool HasAttachments => ((IMailItem)_threadMailItem).HasAttachments; + public bool IsFlagged => ((IMailItem)_threadMailItem).IsFlagged; + public bool IsFocused => ((IMailItem)_threadMailItem).IsFocused; + public bool IsRead => ((IMailItem)_threadMailItem).IsRead; + public bool IsDraft => ((IMailItem)_threadMailItem).IsDraft; + public string DraftId => string.Empty; + public string InReplyTo => ((IMailItem)_threadMailItem).InReplyTo; + + public MailItemFolder AssignedFolder => ((IMailItem)_threadMailItem).AssignedFolder; + + public MailAccount AssignedAccount => ((IMailItem)_threadMailItem).AssignedAccount; + + public Guid UniqueId => ((IMailItem)_threadMailItem).UniqueId; + + public Guid FileId => ((IMailItem)_threadMailItem).FileId; + + public int CompareTo(DateTime other) => CreationDate.CompareTo(other); + public int CompareTo(string other) => FromName.CompareTo(other); + + // Get single mail item view model out of the only item in thread items. + public MailItemViewModel GetSingleItemViewModel() => ThreadItems.First() as MailItemViewModel; + } +} diff --git a/Wino.Mail.ViewModels/GlobalSuppressions.cs b/Wino.Mail.ViewModels/GlobalSuppressions.cs new file mode 100644 index 00000000..5fe2a5bb --- /dev/null +++ b/Wino.Mail.ViewModels/GlobalSuppressions.cs @@ -0,0 +1,8 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~F:Wino.Mail.ViewModels.ComposePageViewModel.isImportanceSelected")] diff --git a/Wino.Mail.ViewModels/IdlePageViewModel.cs b/Wino.Mail.ViewModels/IdlePageViewModel.cs new file mode 100644 index 00000000..a164f85b --- /dev/null +++ b/Wino.Mail.ViewModels/IdlePageViewModel.cs @@ -0,0 +1,38 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Messages.Mails; + +namespace Wino.Mail.ViewModels +{ + public partial class IdlePageViewModel : BaseViewModel, IRecipient + { + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(HasSelectedItems))] + [NotifyPropertyChangedFor(nameof(SelectedMessageText))] + private int selectedItemCount; + + public bool HasSelectedItems => SelectedItemCount > 0; + + public string SelectedMessageText => HasSelectedItems ? string.Format(Translator.MailsSelected, SelectedItemCount) : Translator.NoMailSelected; + + public IdlePageViewModel(IDialogService dialogService) : base(dialogService) { } + + public void Receive(SelectedMailItemsChanged message) + { + SelectedItemCount = message.SelectedItemCount; + } + + public override void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + if (parameters != null && parameters is int selectedItemCount) + SelectedItemCount = selectedItemCount; + else + SelectedItemCount = 0; + } + } +} diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs new file mode 100644 index 00000000..8fd1f0cf --- /dev/null +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -0,0 +1,922 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Diagnostics; +using System.Linq; +using System.Reactive.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.AppCenter.Crashes; +using MoreLinq; +using Nito.AsyncEx; +using Serilog; +using Wino.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Menus; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Messages.Mails; +using Wino.Core.Messages.Synchronization; +using Wino.Mail.ViewModels.Collections; +using Wino.Mail.ViewModels.Data; +using Wino.Mail.ViewModels.Messages; + +namespace Wino.Mail.ViewModels +{ + public partial class MailListPageViewModel : BaseViewModel, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient, + IRecipient + { + private bool isChangingFolder = false; + + private Guid? trackingSynchronizationId = null; + private int completedTrackingSynchronizationCount = 0; + + private IObservable> selectionChangedObservable = null; + + public WinoMailCollection MailCollection { get; } = new WinoMailCollection(); + + public ObservableCollection SelectedItems { get; set; } = new ObservableCollection(); + public ObservableCollection PivotFolders { get; set; } = new ObservableCollection(); + + private readonly SemaphoreSlim listManipulationSemepahore = new SemaphoreSlim(1); + private CancellationTokenSource listManipulationCancellationTokenSource = new CancellationTokenSource(); + + public IWinoNavigationService NavigationService { get; } + public IStatePersistanceService StatePersistanceService { get; } + public IPreferencesService PreferencesService { get; } + + private readonly IMailService _mailService; + private readonly INotificationBuilder _notificationBuilder; + private readonly IFolderService _folderService; + private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; + private readonly IThreadingStrategyProvider _threadingStrategyProvider; + private readonly IContextMenuItemService _contextMenuItemService; + private readonly IWinoRequestDelegator _winoRequestDelegator; + private readonly IKeyPressService _keyPressService; + + private MailItemViewModel _activeMailItem; + + public List SortingOptions { get; } = + [ + new(Translator.SortingOption_Date, SortingOptionType.ReceiveDate), + new(Translator.SortingOption_Name, SortingOptionType.Sender), + ]; + + public List FilterOptions { get; } = + [ + new (Translator.FilteringOption_All, FilterOptionType.All), + new (Translator.FilteringOption_Unread, FilterOptionType.Unread), + new (Translator.FilteringOption_Flagged, FilterOptionType.Flagged) + ]; + + private FolderPivotViewModel _selectedFolderPivot; + + [ObservableProperty] + private string searchQuery; + + [ObservableProperty] + private FilterOption _selectedFilterOption; + private SortingOption _selectedSortingOption; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsEmpty))] + [NotifyPropertyChangedFor(nameof(IsCriteriaFailed))] + [NotifyPropertyChangedFor(nameof(IsFolderEmpty))] + private bool isInitializingFolder; + + [ObservableProperty] + private InfoBarMessageType barSeverity; + + [ObservableProperty] + private string barMessage; + + [ObservableProperty] + private string barTitle; + + [ObservableProperty] + private bool isBarOpen; + + public MailListPageViewModel(IDialogService dialogService, + IWinoNavigationService navigationService, + IMailService mailService, + INotificationBuilder notificationBuilder, + IStatePersistanceService statePersistanceService, + IFolderService folderService, + IWinoSynchronizerFactory winoSynchronizerFactory, + IThreadingStrategyProvider threadingStrategyProvider, + IContextMenuItemService contextMenuItemService, + IWinoRequestDelegator winoRequestDelegator, + IKeyPressService keyPressService, + IPreferencesService preferencesService) : base(dialogService) + { + PreferencesService = preferencesService; + StatePersistanceService = statePersistanceService; + NavigationService = navigationService; + + _mailService = mailService; + _notificationBuilder = notificationBuilder; + _folderService = folderService; + _winoSynchronizerFactory = winoSynchronizerFactory; + _threadingStrategyProvider = threadingStrategyProvider; + _contextMenuItemService = contextMenuItemService; + _winoRequestDelegator = winoRequestDelegator; + _keyPressService = keyPressService; + + SelectedFilterOption = FilterOptions[0]; + SelectedSortingOption = SortingOptions[0]; + + selectionChangedObservable = Observable.FromEventPattern(SelectedItems, nameof(SelectedItems.CollectionChanged)); + selectionChangedObservable + .Throttle(TimeSpan.FromMilliseconds(100)) + .Subscribe(async a => + { + await ExecuteUIThread(() => { SelectedItemCollectionUpdated(a.EventArgs); }); + }); + } + + /// + /// Executes the requested mail operation for currently selected items. + /// + /// Action to execute for selected items. + [RelayCommand] + private async Task MailOperationAsync(int mailOperationIndex) + { + if (!SelectedItems.Any()) return; + + // Commands don't like enums. So it has to be int. + var operation = (MailOperation)mailOperationIndex; + + var package = new MailOperationPreperationRequest(operation, SelectedItems.Select(a => a.MailCopy)); + + await ExecuteMailOperationAsync(package); + } + + /// + /// Sens a new message to synchronize current folder. + /// + [RelayCommand] + private void SyncFolder() + { + if (!CanSynchronize) return; + + // Only synchronize listed folders. + + // When doing linked inbox sync, we need to save the sync id to report progress back only once. + // Otherwise, we will report progress for each folder and that's what we don't want. + + trackingSynchronizationId = Guid.NewGuid(); + completedTrackingSynchronizationCount = 0; + + foreach (var folder in ActiveFolder.HandlingFolders) + { + var options = new SynchronizationOptions() + { + AccountId = folder.MailAccountId, + Type = SynchronizationType.Custom, + SynchronizationFolderIds = [folder.Id], + GroupedSynchronizationTrackingId = trackingSynchronizationId + }; + + Messenger.Send(new NewSynchronizationRequested(options)); + } + } + + private async void ActiveMailItemChanged(MailItemViewModel selectedMailItemViewModel) + { + if (_activeMailItem == selectedMailItemViewModel) return; + + // Don't update active mail item if Ctrl key is pressed. + // User is probably trying to select multiple items. + // This is not the same behavior in Windows Mail, + // but it's a trash behavior. + + var isCtrlKeyPressed = _keyPressService.IsCtrlKeyPressed(); + + if (isCtrlKeyPressed) return; + + _activeMailItem = selectedMailItemViewModel; + + Messenger.Send(new ActiveMailItemChangedEvent(selectedMailItemViewModel)); + + if (selectedMailItemViewModel == null) return; + + // Automatically set mark as read or not based on preferences. + + var markAsPreference = PreferencesService.MarkAsPreference; + + if (markAsPreference == MailMarkAsOption.WhenSelected) + { + if (selectedMailItemViewModel != null && !selectedMailItemViewModel.IsRead) + { + var operation = MailOperation.MarkAsRead; + var package = new MailOperationPreperationRequest(operation,_activeMailItem.MailCopy); + + await ExecuteMailOperationAsync(package); + } + } + else if (markAsPreference == MailMarkAsOption.AfterDelay && PreferencesService.MarkAsDelay >= 0) + { + // TODO: Start a timer then queue. + } + } + + /// + /// Selected internal folder. This can be either folder's own name or Focused-Other. + /// + public FolderPivotViewModel SelectedFolderPivot + { + get => _selectedFolderPivot; + set + { + if (_selectedFolderPivot != null) + _selectedFolderPivot.SelectedItemCount = 0; + + SetProperty(ref _selectedFolderPivot, value); + } + } + + /// + /// Selected sorting option. + /// + public SortingOption SelectedSortingOption + { + get => _selectedSortingOption; + set + { + if (SetProperty(ref _selectedSortingOption, value)) + { + if (value != null && MailCollection != null) + { + MailCollection.SortingType = value.Type; + } + } + } + } + + /// + /// Current folder that is being represented from the menu. + /// + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(CanSynchronize))] + [NotifyPropertyChangedFor(nameof(IsFolderSynchronizationEnabled))] + private IBaseFolderMenuItem activeFolder; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(CanSynchronize))] + private bool isAccountSynchronizerInSynchronization; + + public bool CanSynchronize => !IsAccountSynchronizerInSynchronization && IsFolderSynchronizationEnabled; + + public bool IsFolderSynchronizationEnabled => ActiveFolder?.IsSynchronizationEnabled ?? false; + + #region Properties + + public int SelectedItemCount => SelectedItems.Count; + public bool HasMultipleItemSelections => SelectedItemCount > 1; + public bool HasSelectedItems => SelectedItems.Any(); + public bool IsArchiveSpecialFolder => ActiveFolder?.SpecialFolderType == SpecialFolderType.Archive; + public bool IsEmpty => !IsPerformingSearch && MailCollection.Count == 0; + public bool IsCriteriaFailed => IsEmpty && IsInSearchMode; + public bool IsFolderEmpty => !IsInitializingFolder && IsEmpty && !IsInSearchMode; + + private bool _isPerformingSearch; + + public bool IsPerformingSearch + { + get => _isPerformingSearch; + set + { + if (SetProperty(ref _isPerformingSearch, value)) + { + NotifyItemFoundState(); + } + } + } + + public bool IsInSearchMode => !string.IsNullOrEmpty(SearchQuery); + + #endregion + + public void NotifyItemSelected() + { + OnPropertyChanged(nameof(HasSelectedItems)); + OnPropertyChanged(nameof(SelectedItemCount)); + OnPropertyChanged(nameof(HasMultipleItemSelections)); + + if (SelectedFolderPivot != null) + SelectedFolderPivot.SelectedItemCount = SelectedItemCount; + } + + private void NotifyItemFoundState() + { + OnPropertyChanged(nameof(IsEmpty)); + OnPropertyChanged(nameof(IsCriteriaFailed)); + OnPropertyChanged(nameof(IsFolderEmpty)); + } + + [RelayCommand] + public Task ExecuteHoverAction(MailOperationPreperationRequest request) => ExecuteMailOperationAsync(request); + + public Task ExecuteMailOperationAsync(MailOperationPreperationRequest package) => _winoRequestDelegator.ExecuteAsync(package); + + protected override void OnDispatcherAssigned() + { + base.OnDispatcherAssigned(); + + MailCollection.CoreDispatcher = Dispatcher; + } + + protected override async void OnFolderUpdated(MailItemFolder updatedFolder, MailAccount account) + { + base.OnFolderUpdated(updatedFolder, account); + + // Don't need to update if the folder update does not belong to the current folder menu item. + if (ActiveFolder == null || updatedFolder == null || !ActiveFolder.HandlingFolders.Any(a => a.Id == updatedFolder.Id)) return; + + await ExecuteUIThread(() => + { + ActiveFolder.UpdateFolder(updatedFolder); + + OnPropertyChanged(nameof(CanSynchronize)); + OnPropertyChanged(nameof(IsFolderSynchronizationEnabled)); + }); + + // Force synchronization after enabling the folder. + SyncFolder(); + } + + private async void UpdateBarMessage(InfoBarMessageType severity, string title, string message) + { + await ExecuteUIThread(() => + { + BarSeverity = severity; + BarTitle = title; + BarMessage = message; + + IsBarOpen = true; + }); + } + + private void SelectedItemCollectionUpdated(NotifyCollectionChangedEventArgs e) + { + if (SelectedItems.Count == 1) + { + ActiveMailItemChanged(SelectedItems[0]); + } + else + { + // At this point, either we don't have any item selected + // or we have multiple item selected. In either case + // there should be no active item. + + ActiveMailItemChanged(null); + } + + NotifyItemSelected(); + + Messenger.Send(new SelectedMailItemsChanged(SelectedItems.Count)); + } + + private void UpdateFolderPivots() + { + PivotFolders.Clear(); + SelectedFolderPivot = null; + + if (ActiveFolder == null) return; + + // Merged folders don't support focused feature. + + if (ActiveFolder is IMergedAccountFolderMenuItem) + { + PivotFolders.Add(new FolderPivotViewModel(ActiveFolder.FolderName, null)); + } + else if (ActiveFolder is IFolderMenuItem singleFolderMenuItem) + { + var parentAccount = singleFolderMenuItem.ParentAccount; + + bool isAccountSupportsFocusedInbox = parentAccount.Preferences.IsFocusedInboxEnabled != null; + bool isFocusedInboxEnabled = isAccountSupportsFocusedInbox && parentAccount.Preferences.IsFocusedInboxEnabled.GetValueOrDefault(); + bool isInboxFolder = ActiveFolder.SpecialFolderType == SpecialFolderType.Inbox; + + // Folder supports Focused - Other + if (isInboxFolder && isFocusedInboxEnabled) + { + // Can be passed as empty string. Focused - Other will be used regardless. + var focusedItem = new FolderPivotViewModel(string.Empty, true); + var otherItem = new FolderPivotViewModel(string.Empty, false); + + PivotFolders.Add(focusedItem); + PivotFolders.Add(otherItem); + } + else + { + // If the account and folder doesn't support focused feature, just add itself. + PivotFolders.Add(new FolderPivotViewModel(singleFolderMenuItem.FolderName, null)); + } + } + + // This will trigger refresh. + SelectedFolderPivot = PivotFolders.FirstOrDefault(); + } + + [RelayCommand] + private async Task SelectedPivotChanged() + { + if (isChangingFolder) return; + + await InitializeFolderAsync(); + } + + [RelayCommand] + private async Task SelectedSortingChanged(SortingOption option) + { + SelectedSortingOption = option; + + if (isChangingFolder) return; + + await InitializeFolderAsync(); + } + + [RelayCommand] + private async Task SelectedFilterChanged(FilterOption option) + { + SelectedFilterOption = option; + + if (isChangingFolder) return; + + await InitializeFolderAsync(); + } + + public IEnumerable GetTargetMailItemViewModels(IMailItem clickedItem) + { + // Threat threads as a whole and include everything in the group. Except single selections outside of the thread. + IEnumerable contextMailItems = null; + + if (clickedItem is ThreadMailItemViewModel clickedThreadItem) + { + // Clicked item is a thread. + + clickedThreadItem.IsThreadExpanded = true; + contextMailItems = clickedThreadItem.ThreadItems.Cast(); + + // contextMailItems = clickedThreadItem.GetMailCopies(); + } + else if (clickedItem is MailItemViewModel clickedMailItemViewModel) + { + // If the clicked item is included in SelectedItems, then we need to thing them as whole. + // If there are selected items, but clicked item is not one of them, then it's a single context menu. + + bool includedInSelectedItems = SelectedItems.Contains(clickedItem); + + if (includedInSelectedItems) + contextMailItems = SelectedItems; + else + contextMailItems = new List() { clickedMailItemViewModel }; + } + + return contextMailItems; + } + + public IEnumerable GetAvailableMailActions(IEnumerable contextMailItems) + => _contextMenuItemService.GetMailItemContextMenuActions(contextMailItems); + + public void ChangeCustomFocusedState(IEnumerable mailItems, bool isFocused) + => mailItems.Where(a => a is MailItemViewModel).Cast().ForEach(a => a.IsCustomFocused = isFocused); + + private bool ShouldPreventItemAdd(IMailItem mailItem) + { + bool condition2 = false; + + bool condition1 = mailItem.IsRead + && SelectedFilterOption.Type == FilterOptionType.Unread + || !mailItem.IsFlagged + && SelectedFilterOption.Type == FilterOptionType.Flagged; + + return condition1 || condition2; + } + + protected override async void OnMailAdded(MailCopy addedMail) + { + base.OnMailAdded(addedMail); + + try + { + await listManipulationSemepahore.WaitAsync(); + + if (ActiveFolder == null) return; + + // Messages coming to sent or draft folder must be inserted regardless of the filter. + bool shouldPreventIgnoringFilter = addedMail.AssignedFolder.SpecialFolderType == SpecialFolderType.Draft || + addedMail.AssignedFolder.SpecialFolderType == SpecialFolderType.Sent; + + // Item does not belong to this folder and doesn't have special type to be inserted. + if (!shouldPreventIgnoringFilter && !ActiveFolder.HandlingFolders.Any(a => a.Id == addedMail.AssignedFolder.Id)) return; + + if (!shouldPreventIgnoringFilter && ShouldPreventItemAdd(addedMail)) return; + + await ExecuteUIThread(async () => + { + await MailCollection.AddAsync(addedMail); + + NotifyItemFoundState(); + }); + } + catch (Exception) { } + finally + { + listManipulationSemepahore.Release(); + } + } + + protected override async void OnMailUpdated(MailCopy updatedMail) + { + base.OnMailUpdated(updatedMail); + + Debug.WriteLine($"Updating {updatedMail.Id}-> {updatedMail.UniqueId}"); + + await MailCollection.UpdateMailCopy(updatedMail); + } + + protected override async void OnMailRemoved(MailCopy removedMail) + { + base.OnMailRemoved(removedMail); + + // We should delete the items only if: + // 1. They are deleted from the active folder. + // 2. Deleted from draft or sent folder. + // Delete/sent are special folders that can list their items in other folders. + + bool removedFromActiveFolder = ActiveFolder.HandlingFolders.Any(a => a.Id == removedMail.AssignedFolder.Id); + bool removedFromDraftOrSent = removedMail.AssignedFolder.SpecialFolderType == SpecialFolderType.Draft || + removedMail.AssignedFolder.SpecialFolderType == SpecialFolderType.Sent; + + if (removedFromActiveFolder || removedFromDraftOrSent) + { + bool isDeletedMailSelected = SelectedItems.Any(a => a.MailCopy.UniqueId == removedMail.UniqueId); + + // Automatically select the next item in the list if the setting is enabled. + MailItemViewModel nextItem = null; + + if (isDeletedMailSelected && PreferencesService.AutoSelectNextItem) + { + nextItem = MailCollection.GetNextItem(removedMail); + } + + // Remove the deleted item from the list. + await MailCollection.RemoveAsync(removedMail); + + if (nextItem != null) + WeakReferenceMessenger.Default.Send(new SelectMailItemContainerEvent(nextItem, ScrollToItem: true)); + else if (isDeletedMailSelected) + { + // There are no next item to select, but we removed the last item which was selected. + // Clearing selected item will dispose rendering page. + + SelectedItems.Clear(); + } + + await ExecuteUIThread(() => { NotifyItemFoundState(); }); + } + } + protected override async void OnDraftCreated(MailCopy draftMail, MailAccount account) + { + base.OnDraftCreated(draftMail, account); + + try + { + // If the draft is created in another folder, we need to wait for that folder to be initialized. + // Otherwise the draft mail item will be duplicated on the next add execution. + await listManipulationSemepahore.WaitAsync(); + + // Create the item. Draft folder navigation is already done at this point. + await ExecuteUIThread(async () => + { + await MailCollection.AddAsync(draftMail); + + // New draft is created by user. Select the item. + Messenger.Send(new MailItemNavigationRequested(draftMail.UniqueId, ScrollToItem: true)); + + NotifyItemFoundState(); + }); + } + finally + { + listManipulationSemepahore.Release(); + } + } + + private IEnumerable PrepareMailViewModels(IEnumerable mailItems) + { + foreach (var item in mailItems) + { + if (item is MailCopy singleMailItem) + yield return new MailItemViewModel(singleMailItem); + else if (item is ThreadMailItem threadMailItem) + yield return new ThreadMailItemViewModel(threadMailItem); + } + } + + [RelayCommand] + private async Task LoadMoreItemsAsync() + { + if (IsInitializingFolder) return; + + await ExecuteUIThread(() => { IsInitializingFolder = true; }); + + var initializationOptions = new MailListInitializationOptions(ActiveFolder.HandlingFolders, + SelectedFilterOption.Type, + SelectedSortingOption.Type, + PreferencesService.IsThreadingEnabled, + SelectedFolderPivot.IsFocused, + SearchQuery, + MailCollection.MailCopyIdHashSet); + + var items = await _mailService.FetchMailsAsync(initializationOptions).ConfigureAwait(false); + + var viewModels = PrepareMailViewModels(items); + + await ExecuteUIThread(() => { MailCollection.AddRange(viewModels, clearIdCache: false); }); + await ExecuteUIThread(() => { IsInitializingFolder = false; }); + } + + private async Task InitializeFolderAsync() + { + if (SelectedFilterOption == null || SelectedFolderPivot == null || SelectedSortingOption == null) + return; + + try + { + // Clear search query if not performing search. + if (!IsPerformingSearch) + SearchQuery = string.Empty; + + MailCollection.Clear(); + MailCollection.MailCopyIdHashSet.Clear(); + + SelectedItems.Clear(); + + if (ActiveFolder == null) + return; + + await ExecuteUIThread(() => { IsInitializingFolder = true; }); + + // Folder is changed during initialization. + // Just cancel the existing one and wait for new initialization. + + if (listManipulationSemepahore.CurrentCount == 0) + { + Debug.WriteLine("Canceling initialization of mails."); + + listManipulationCancellationTokenSource.Cancel(); + listManipulationCancellationTokenSource.Token.ThrowIfCancellationRequested(); + } + + listManipulationCancellationTokenSource = new CancellationTokenSource(); + + var cancellationToken = listManipulationCancellationTokenSource.Token; + + await listManipulationSemepahore.WaitAsync(cancellationToken); + + // Setup MailCollection configuration. + + // Don't pass any threading strategy if disabled in settings. + MailCollection.ThreadingStrategyProvider = PreferencesService.IsThreadingEnabled ? _threadingStrategyProvider : null; + + // TODO: This should go inside + MailCollection.PruneSingleNonDraftItems = ActiveFolder.SpecialFolderType == SpecialFolderType.Draft; + + // Here items are sorted and filtered. + + var initializationOptions = new MailListInitializationOptions(ActiveFolder.HandlingFolders, + SelectedFilterOption.Type, + SelectedSortingOption.Type, + PreferencesService.IsThreadingEnabled, + SelectedFolderPivot.IsFocused, + SearchQuery, + MailCollection.MailCopyIdHashSet); + + var items = await _mailService.FetchMailsAsync(initializationOptions).ConfigureAwait(false); + + // Here they are already threaded if needed. + // We don't need to insert them one by one. + // Just create VMs and do bulk insert. + + var viewModels = PrepareMailViewModels(items); + + await ExecuteUIThread(() => { MailCollection.AddRange(viewModels, true); }); + } + catch (OperationCanceledException) + { + Debug.WriteLine("Initialization of mails canceled."); + } + catch (Exception ex) + { + Debugger.Break(); + + if (IsInSearchMode) + Log.Error(ex, WinoErrors.SearchFailed); + else + Log.Error(ex, WinoErrors.MailListRefreshFolder); + + Crashes.TrackError(ex); + } + finally + { + listManipulationSemepahore.Release(); + + await ExecuteUIThread(() => + { + IsInitializingFolder = false; + + OnPropertyChanged(nameof(CanSynchronize)); + NotifyItemFoundState(); + }); + } + } + + [RelayCommand] + private async Task EnableFolderSynchronizationAsync() + { + if (ActiveFolder == null) return; + + foreach (var folder in ActiveFolder.HandlingFolders) + { + await _folderService.ChangeFolderSynchronizationStateAsync(folder.Id, true); + } + + // TODO + //ActiveFolder.IsSynchronizationEnabled = true; + + //OnPropertyChanged(nameof(IsFolderSynchronizationEnabled)); + //OnPropertyChanged(nameof(CanSynchronize)); + + //SyncFolderCommand?.Execute(null); + } + + void IRecipient.Receive(MailItemNavigationRequested message) + { + // Find mail item and add to selected items. + + MailItemViewModel navigatingMailItem = null; + ThreadMailItemViewModel threadMailItemViewModel = null; + + for (int i = 0; i < 3; i++) + { + var mailContainer = MailCollection.GetMailItemContainer(message.UniqueMailId); + + if (mailContainer != null) + { + navigatingMailItem = mailContainer.ItemViewModel; + threadMailItemViewModel = mailContainer.ThreadViewModel; + + break; + } + } + + if (threadMailItemViewModel != null) + threadMailItemViewModel.IsThreadExpanded = true; + + if (navigatingMailItem != null) + WeakReferenceMessenger.Default.Send(new SelectMailItemContainerEvent(navigatingMailItem, message.ScrollToItem)); + else + Debugger.Break(); + } + + async void IRecipient.Receive(ActiveMailFolderChangedEvent message) + { + isChangingFolder = true; + + ActiveFolder = message.BaseFolderMenuItem; + + trackingSynchronizationId = null; + completedTrackingSynchronizationCount = 0; + + // Check whether the account synchronizer that this folder belongs to is already in synchronization. + await CheckIfAccountIsSynchronizingAsync(); + + // Notify change for archive-unarchive app bar button. + OnPropertyChanged(nameof(IsArchiveSpecialFolder)); + + // Prepare Focused - Other or folder name tabs. + UpdateFolderPivots(); + + await InitializeFolderAsync(); + + // TODO: This should be done in a better way. + while (IsInitializingFolder) + { + await Task.Delay(100); + } + + // Let awaiters know about the completion of mail init. + message.FolderInitLoadAwaitTask?.TrySetResult(true); + + isChangingFolder = false; + } + + void IRecipient.Receive(MailItemSelectedEvent message) + => SelectedItems.Add(message.SelectedMailItem); + + void IRecipient.Receive(MailItemSelectionRemovedEvent message) + => SelectedItems.Remove(message.RemovedMailItem); + + public void Receive(AccountSynchronizationCompleted message) + { + if (ActiveFolder == null) return; + + bool isLinkedInboxSyncResult = message.SynchronizationTrackingId == trackingSynchronizationId; + + if (isLinkedInboxSyncResult) + { + var isCompletedAccountListed = ActiveFolder.HandlingFolders.Any(a => a.MailAccountId == message.AccountId); + + if (isCompletedAccountListed) completedTrackingSynchronizationCount++; + + // Group sync is started but not all folders are synchronized yet. Don't report progress. + if (completedTrackingSynchronizationCount < ActiveFolder.HandlingFolders.Count()) return; + } + + bool isReportingActiveAccountResult = ActiveFolder.HandlingFolders.Any(a => a.MailAccountId == message.AccountId); + + if (!isReportingActiveAccountResult) return; + + // At this point either all folders or a single folder sync is completed. + switch (message.Result) + { + case SynchronizationCompletedState.Success: + UpdateBarMessage(InfoBarMessageType.Success, ActiveFolder.FolderName, Translator.SynchronizationFolderReport_Success); + break; + case SynchronizationCompletedState.Failed: + UpdateBarMessage(InfoBarMessageType.Error, ActiveFolder.FolderName, Translator.SynchronizationFolderReport_Failed); + break; + default: + break; + } + } + + public async void Receive(NewSynchronizationRequested message) + => await ExecuteUIThread(() => { OnPropertyChanged(nameof(CanSynchronize)); }); + + [RelayCommand] + public async Task PerformSearchAsync() + { + try + { + IsPerformingSearch = !string.IsNullOrEmpty(SearchQuery); + + await InitializeFolderAsync(); + } + finally + { + IsPerformingSearch = false; + } + } + + public async void Receive(AccountSynchronizerStateChanged message) + => await CheckIfAccountIsSynchronizingAsync(); + + private async Task CheckIfAccountIsSynchronizingAsync() + { + bool isAnyAccountSynchronizing = false; + + // Check each account that this page is listing folders from. + // If any of the synchronizers are synchronizing, we disable sync. + + if (ActiveFolder != null) + { + var accountIds = ActiveFolder.HandlingFolders.Select(a => a.MailAccountId); + + foreach (var accountId in accountIds) + { + var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(accountId); + + if (synchronizer == null) continue; + + bool isAccountSynchronizing = synchronizer.State != AccountSynchronizerState.Idle; + + if (isAccountSynchronizing) + { + isAnyAccountSynchronizing = true; + break; + } + } + } + + await ExecuteUIThread(() => { IsAccountSynchronizerInSynchronization = isAnyAccountSynchronizing; }); + } + } +} diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs new file mode 100644 index 00000000..d51d2073 --- /dev/null +++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs @@ -0,0 +1,619 @@ +using System; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using MailKit; +using Microsoft.AppCenter.Crashes; +using MimeKit; +using Serilog; +using Wino.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Menus; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.Extensions; +using Wino.Core.Messages.Mails; +using Wino.Core.Services; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels +{ + public partial class MailRenderingPageViewModel : BaseViewModel, + ITransferProgress // For listening IMAP message download progress. + { + private readonly IUnderlyingThemeService _underlyingThemeService; + + private readonly IMimeFileService _mimeFileService; + private readonly Core.Domain.Interfaces.IMailService _mailService; + private readonly IFileService _fileService; + private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; + private readonly IWinoRequestDelegator _requestDelegator; + private readonly IClipboardService _clipboardService; + + private bool forceImageLoading = false; + + private MailItemViewModel initializedMailItemViewModel = null; + private MimeMessageInformation initializedMimeMessageInformation = null; + + #region Properties + + public bool ShouldDisplayDownloadProgress => IsIndetermineProgress || (CurrentDownloadPercentage > 0 && CurrentDownloadPercentage <= 100); + public bool CanUnsubscribe => CurrentRenderModel?.CanUnsubscribe ?? false; + public bool IsJunkMail => initializedMailItemViewModel?.AssignedFolder != null && initializedMailItemViewModel.AssignedFolder.SpecialFolderType == SpecialFolderType.Junk; + + public bool IsImageRenderingDisabled + { + get + { + if (IsJunkMail) + { + return !forceImageLoading; + } + else + { + return !CurrentRenderModel?.MailRenderingOptions?.LoadImages ?? false; + } + } + } + + private bool isDarkWebviewRenderer; + public bool IsDarkWebviewRenderer + { + get => isDarkWebviewRenderer; + set + { + if (SetProperty(ref isDarkWebviewRenderer, value)) + { + InitializeCommandBarItems(); + } + } + } + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(ShouldDisplayDownloadProgress))] + private bool isIndetermineProgress; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(ShouldDisplayDownloadProgress))] + private double currentDownloadPercentage; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(CanUnsubscribe))] + private MailRenderModel currentRenderModel; + + [ObservableProperty] + private string subject; + + [ObservableProperty] + private string fromAddress; + + [ObservableProperty] + private string fromName; + + [ObservableProperty] + private DateTime creationDate; + + + public ObservableCollection ToItems { get; set; } = new ObservableCollection(); + public ObservableCollection CCItemsItems { get; set; } = new ObservableCollection(); + public ObservableCollection BCCItems { get; set; } = new ObservableCollection(); + public ObservableCollection Attachments { get; set; } = new ObservableCollection(); + public ObservableCollection MenuItems { get; set; } = new ObservableCollection(); + + #endregion + + public INativeAppService NativeAppService { get; } + public IStatePersistanceService StatePersistanceService { get; } + public IPreferencesService PreferencesService { get; } + + public MailRenderingPageViewModel(IDialogService dialogService, + INativeAppService nativeAppService, + IUnderlyingThemeService underlyingThemeService, + IMimeFileService mimeFileService, + Core.Domain.Interfaces.IMailService mailService, + IFileService fileService, + IWinoSynchronizerFactory winoSynchronizerFactory, + IWinoRequestDelegator requestDelegator, + IStatePersistanceService statePersistanceService, + IClipboardService clipboardService, + IPreferencesService preferencesService) : base(dialogService) + { + NativeAppService = nativeAppService; + StatePersistanceService = statePersistanceService; + PreferencesService = preferencesService; + + _clipboardService = clipboardService; + _underlyingThemeService = underlyingThemeService; + _mimeFileService = mimeFileService; + _mailService = mailService; + _fileService = fileService; + _winoSynchronizerFactory = winoSynchronizerFactory; + _requestDelegator = requestDelegator; + } + + + [RelayCommand] + private async Task CopyClipboard(string copyText) + { + try + { + await _clipboardService.CopyClipboardAsync(copyText); + + DialogService.InfoBarMessage(Translator.ClipboardTextCopied_Title, string.Format(Translator.ClipboardTextCopied_Message, copyText), InfoBarMessageType.Information); + } + catch (Exception) + { + DialogService.InfoBarMessage(Translator.GeneralTitle_Error, string.Format(Translator.ClipboardTextCopyFailed_Message, copyText), InfoBarMessageType.Error); + } + } + + [RelayCommand] + private async Task ForceImageLoading() + { + forceImageLoading = true; + + if (initializedMailItemViewModel == null && initializedMimeMessageInformation == null) return; + + if (initializedMailItemViewModel != null) + await RenderAsync(initializedMimeMessageInformation); + else + await RenderAsync(initializedMimeMessageInformation); + } + + [RelayCommand] + private async Task UnsubscribeAsync() + { + if (!CurrentRenderModel?.CanUnsubscribe ?? false) return; + + // TODO: Support for List-Unsubscribe-Post header. It can be done without launching browser. + // https://certified-senders.org/wp-content/uploads/2017/07/CSA_one-click_list-unsubscribe.pdf + + // TODO: Sometimes unsubscribe link can be a mailto: link. + // or sometimes with mailto AND http link. We need to handle this. + + if (Uri.IsWellFormedUriString(CurrentRenderModel.UnsubscribeLink, UriKind.RelativeOrAbsolute)) + await NativeAppService.LaunchUriAsync(new Uri((CurrentRenderModel.UnsubscribeLink))); + else + DialogService.InfoBarMessage(Translator.Info_UnsubscribeLinkInvalidTitle, Translator.Info_UnsubscribeLinkInvalidMessage, InfoBarMessageType.Error); + } + + [RelayCommand] + private async Task OperationClicked(MailOperationMenuItem menuItem) + { + if (menuItem == null) return; + + await HandleMailOperationAsync(menuItem.Operation); + } + + private async Task HandleMailOperationAsync(MailOperation operation) + { + // Toggle theme + if (operation == MailOperation.DarkEditor || operation == MailOperation.LightEditor) + IsDarkWebviewRenderer = !IsDarkWebviewRenderer; + else if (operation == MailOperation.SaveAs) + { + // Save as PDF + var pickedFolder = await DialogService.PickWindowsFolderAsync(); + + if (!string.IsNullOrEmpty(pickedFolder)) + { + var fullPath = Path.Combine(pickedFolder, $"{initializedMailItemViewModel.FromAddress}.pdf"); + Messenger.Send(new SaveAsPDFRequested(fullPath)); + } + } + else if (operation == MailOperation.Reply || operation == MailOperation.ReplyAll || operation == MailOperation.Forward) + { + if (initializedMailItemViewModel == null) return; + + // Create new draft. + var draftOptions = new DraftCreationOptions(); + + if (operation == MailOperation.Reply) + draftOptions.Reason = DraftCreationReason.Reply; + else if (operation == MailOperation.ReplyAll) + draftOptions.Reason = DraftCreationReason.ReplyAll; + else if (operation == MailOperation.Forward) + draftOptions.Reason = DraftCreationReason.Forward; + + // TODO: Separate mailto related stuff out of DraftCreationOptions and provide better + // model for draft preperation request. Right now it's a mess. + + draftOptions.ReferenceMailCopy = initializedMailItemViewModel.MailCopy; + draftOptions.ReferenceMimeMessage = initializedMimeMessageInformation.MimeMessage; + + var createdMimeMessage = await _mailService.CreateDraftMimeMessageAsync(initializedMailItemViewModel.AssignedAccount.Id, draftOptions).ConfigureAwait(false); + + var createdDraftMailMessage = await _mailService.CreateDraftAsync(initializedMailItemViewModel.AssignedAccount, + createdMimeMessage, + initializedMimeMessageInformation.MimeMessage, + initializedMailItemViewModel).ConfigureAwait(false); + + var draftPreperationRequest = new DraftPreperationRequest(initializedMailItemViewModel.AssignedAccount, createdDraftMailMessage, createdMimeMessage) + { + ReferenceMimeMessage = initializedMimeMessageInformation.MimeMessage, + ReferenceMailCopy = initializedMailItemViewModel.MailCopy + }; + + await _requestDelegator.ExecuteAsync(draftPreperationRequest); + + } + else if (initializedMailItemViewModel != null) + { + // All other operations require a mail item. + var prepRequest = new MailOperationPreperationRequest(operation, initializedMailItemViewModel.MailCopy); + await _requestDelegator.ExecuteAsync(prepRequest); + } + } + + private CancellationTokenSource renderCancellationTokenSource = new CancellationTokenSource(); + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + renderCancellationTokenSource.Cancel(); + + initializedMailItemViewModel = null; + initializedMimeMessageInformation = null; + + // This page can be accessed for 2 purposes. + // 1. Rendering a mail item when the user selects. + // 2. Rendering an existing EML file with MimeMessage. + + // MimeMessage rendering must be readonly and no command bar items must be shown except common + // items like dark/light editor, zoom, print etc. + + // Configure common rendering properties first. + IsDarkWebviewRenderer = _underlyingThemeService.IsUnderlyingThemeDark(); + + await ResetPagePropertiesAsync(); + + renderCancellationTokenSource = new CancellationTokenSource(); + + // Mime content might not be available for now and might require a download. + try + { + if (parameters is MailItemViewModel selectedMailItemViewModel) + await RenderAsync(selectedMailItemViewModel, renderCancellationTokenSource.Token); + else if (parameters is MimeMessageInformation mimeMessageInformation) + await RenderAsync(mimeMessageInformation); + + InitializeCommandBarItems(); + } + catch (OperationCanceledException) + { + Log.Information("Canceled mail rendering."); + } + catch (Exception ex) + { + DialogService.InfoBarMessage(Translator.Info_MailRenderingFailedTitle, string.Format(Translator.Info_MailRenderingFailedMessage, ex.Message), InfoBarMessageType.Error); + + Crashes.TrackError(ex); + Log.Error(ex, "Render Failed"); + } + finally + { + StatePersistanceService.IsReadingMail = true; + } + } + + + private async Task HandleSingleItemDownloadAsync(MailItemViewModel mailItemViewModel) + { + var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(mailItemViewModel.AssignedAccount.Id); + + try + { + // To show the progress on the UI. + CurrentDownloadPercentage = 1; + + await synchronizer.DownloadMissingMimeMessageAsync(mailItemViewModel.MailCopy, this, renderCancellationTokenSource.Token); + } + catch (OperationCanceledException) + { + Log.Information("MIME download is canceled."); + } + catch (Exception ex) + { + DialogService.InfoBarMessage(Translator.GeneralTitle_Error, ex.Message, InfoBarMessageType.Error); + } + finally + { + ResetProgress(); + } + } + + private async Task RenderAsync(MailItemViewModel mailItemViewModel, CancellationToken cancellationToken = default) + { + var isMimeExists = await _mimeFileService.IsMimeExistAsync(mailItemViewModel.AssignedAccount.Id, mailItemViewModel.MailCopy.FileId); + + if (!isMimeExists) + { + await HandleSingleItemDownloadAsync(mailItemViewModel); + } + + // Find the MIME for this item and render it. + var mimeMessageInformation = await _mimeFileService.GetMimeMessageInformationAsync(mailItemViewModel.MailCopy.FileId, + mailItemViewModel.AssignedAccount.Id, + cancellationToken) + .ConfigureAwait(false); + + if (mimeMessageInformation == null) + { + DialogService.InfoBarMessage(Translator.Info_MessageCorruptedTitle, Translator.Info_MessageCorruptedMessage, InfoBarMessageType.Error); + return; + } + + initializedMailItemViewModel = mailItemViewModel; + await RenderAsync(mimeMessageInformation); + } + + private async Task RenderAsync(MimeMessageInformation mimeMessageInformation) + { + var message = mimeMessageInformation.MimeMessage; + var messagePath = mimeMessageInformation.Path; + + initializedMimeMessageInformation = mimeMessageInformation; + + // TODO: Handle S/MIME decryption. + // initializedMimeMessageInformation.MimeMessage.Body is MultipartSigned + + var renderingOptions = PreferencesService.GetRenderingOptions(); + + await ExecuteUIThread(() => + { + Subject = message.Subject; + + // TODO: FromName and FromAddress is probably not correct here for mail lists. + FromAddress = message.From.Mailboxes.FirstOrDefault()?.Address ?? Translator.UnknownAddress; + FromName = message.From.Mailboxes.FirstOrDefault()?.Name ?? Translator.UnknownSender; + CreationDate = message.Date.DateTime; + + // Extract to,cc and bcc + LoadAddressInfo(message.To, ToItems); + LoadAddressInfo(message.Cc, CCItemsItems); + LoadAddressInfo(message.Bcc, BCCItems); + + // Automatically disable images for Junk folder to prevent pixel tracking. + // This can only work for selected mail item rendering, not for EML file rendering. + if (initializedMailItemViewModel != null && + initializedMailItemViewModel.AssignedFolder.SpecialFolderType == SpecialFolderType.Junk) + { + renderingOptions.LoadImages = false; + } + + // Load images if forced. + if (forceImageLoading) + { + renderingOptions.LoadImages = true; + } + + CurrentRenderModel = _mimeFileService.GetMailRenderModel(message, messagePath, renderingOptions); + + Messenger.Send(new HtmlRenderingRequested(CurrentRenderModel.RenderHtml)); + + foreach (var attachment in CurrentRenderModel.Attachments) + { + Attachments.Add(new MailAttachmentViewModel(attachment)); + } + + OnPropertyChanged(nameof(IsImageRenderingDisabled)); + }); + } + + public override void OnNavigatedFrom(NavigationMode mode, object parameters) + { + base.OnNavigatedFrom(mode, parameters); + + renderCancellationTokenSource.Cancel(); + CurrentDownloadPercentage = 0d; + + initializedMailItemViewModel = null; + initializedMimeMessageInformation = null; + + StatePersistanceService.IsReadingMail = false; + forceImageLoading = false; + } + + private void LoadAddressInfo(InternetAddressList list, ObservableCollection collection) + { + foreach (var item in list) + { + if (item is MailboxAddress mailboxAddress) + collection.Add(mailboxAddress.ToAddressInformation()); + else if (item is GroupAddress groupAddress) + LoadAddressInfo(groupAddress.Members, collection); + } + } + + private void ResetProgress() + { + CurrentDownloadPercentage = 0; + IsIndetermineProgress = false; + } + + private async Task ResetPagePropertiesAsync() + { + await ExecuteUIThread(() => + { + ResetProgress(); + + ToItems.Clear(); + CCItemsItems.Clear(); + BCCItems.Clear(); + Attachments.Clear(); + + // Dispose existing content first. + Messenger.Send(new CancelRenderingContentRequested()); + }); + } + + private void InitializeCommandBarItems() + { + MenuItems.Clear(); + + // Add light/dark editor theme switch. + if (_underlyingThemeService.IsUnderlyingThemeDark()) + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.LightEditor)); + else + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.DarkEditor)); + + // Save As PDF + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.SaveAs, true, true)); + + if (initializedMailItemViewModel == null) + return; + + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.Seperator)); + + // You can't do these to draft items. + if (!initializedMailItemViewModel.IsDraft) + { + // Reply + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.Reply)); + + // Reply All + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.ReplyAll)); + + // Forward + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.Forward)); + } + + // Archive - Unarchive + if (initializedMailItemViewModel.AssignedFolder.SpecialFolderType == SpecialFolderType.Archive) + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.UnArchive)); + else + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.Archive)); + + // Delete + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.SoftDelete)); + + // Flag - Clear Flag + if (initializedMailItemViewModel.IsFlagged) + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag)); + else + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.SetFlag)); + + // Secondary items. + + // Read - Unread + if (initializedMailItemViewModel.IsRead) + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread, true, false)); + else + MenuItems.Add(MailOperationMenuItem.Create(MailOperation.MarkAsRead, true, false)); + } + + protected override async void OnMailUpdated(MailCopy updatedMail) + { + base.OnMailUpdated(updatedMail); + + if (initializedMailItemViewModel == null) return; + + // Check if the updated mail is the same mail item we are rendering. + // This is done with UniqueId to include FolderId into calculations. + if (initializedMailItemViewModel.UniqueId != updatedMail.UniqueId) return; + + // Mail operation might change the mail item like mark read/unread or change flag. + // So we need to update the mail item view model when this happens. + // Also command bar items must be re-initialized since the items loaded based on the mail item. + + await ExecuteUIThread(() => { InitializeCommandBarItems(); }); + } + + [RelayCommand] + private async Task OpenAttachmentAsync(MailAttachmentViewModel attachmentViewModel) + { + try + { + var fileFolderPath = Path.Combine(initializedMimeMessageInformation.Path, attachmentViewModel.FileName); + var directoryInfo = new DirectoryInfo(initializedMimeMessageInformation.Path); + + var fileExists = File.Exists(fileFolderPath); + + if (!fileExists) + await SaveAttachmentInternalAsync(attachmentViewModel, initializedMimeMessageInformation.Path); + + await LaunchFileInternalAsync(fileFolderPath); + } + catch (Exception ex) + { + Log.Error(ex, WinoErrors.OpenAttachment); + Crashes.TrackError(ex); + + DialogService.InfoBarMessage(Translator.Info_AttachmentOpenFailedTitle, Translator.Info_AttachmentOpenFailedMessage, InfoBarMessageType.Error); + } + } + + [RelayCommand] + private async Task SaveAttachmentAsync(MailAttachmentViewModel attachmentViewModel) + { + if (attachmentViewModel == null) + return; + + try + { + attachmentViewModel.IsBusy = true; + + var pickedPath = await DialogService.PickWindowsFolderAsync(); + + if (string.IsNullOrEmpty(pickedPath)) return; + + await SaveAttachmentInternalAsync(attachmentViewModel, pickedPath); + + DialogService.InfoBarMessage(Translator.Info_AttachmentSaveSuccessTitle, Translator.Info_AttachmentSaveSuccessMessage, InfoBarMessageType.Success); + } + catch (Exception ex) + { + Log.Error(ex, WinoErrors.SaveAttachment); + Crashes.TrackError(ex); + + DialogService.InfoBarMessage(Translator.Info_AttachmentSaveFailedTitle, Translator.Info_AttachmentSaveFailedMessage, InfoBarMessageType.Error); + } + finally + { + attachmentViewModel.IsBusy = false; + } + } + + // Returns created file path. + private async Task SaveAttachmentInternalAsync(MailAttachmentViewModel attachmentViewModel, string saveFolderPath) + { + var fullFilePath = Path.Combine(saveFolderPath, attachmentViewModel.FileName); + var stream = await _fileService.GetFileStreamAsync(saveFolderPath, attachmentViewModel.FileName); + + using (stream) + { + await attachmentViewModel.MimeContent.DecodeToAsync(stream); + } + + return fullFilePath; + } + + private async Task LaunchFileInternalAsync(string filePath) + { + try + { + await NativeAppService.LaunchFileAsync(filePath); + } + catch (Exception ex) + { + DialogService.InfoBarMessage(Translator.Info_FileLaunchFailedTitle, ex.Message, InfoBarMessageType.Error); + } + } + + void ITransferProgress.Report(long bytesTransferred, long totalSize) + => _ = ExecuteUIThread(() => { CurrentDownloadPercentage = bytesTransferred * 100 / Math.Max(1, totalSize); }); + + // For upload. + void ITransferProgress.Report(long bytesTransferred) { } + } +} diff --git a/Wino.Mail.ViewModels/MergedAccountDetailsPageViewModel.cs b/Wino.Mail.ViewModels/MergedAccountDetailsPageViewModel.cs new file mode 100644 index 00000000..430ca336 --- /dev/null +++ b/Wino.Mail.ViewModels/MergedAccountDetailsPageViewModel.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Messages.Navigation; +using Wino.Core.Requests; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels +{ + public partial class MergedAccountDetailsPageViewModel : BaseViewModel, + IRecipient + { + [ObservableProperty] + private MergedAccountProviderDetailViewModel editingMergedAccount; + + [ObservableProperty] + private string mergedAccountName; + + public ObservableCollection LinkedAccounts { get; set; } = []; + public ObservableCollection UnlinkedAccounts { get; set; } = []; + + // Empty Guid is passed for new created merged inboxes. + public bool IsMergedInboxSaved => EditingMergedAccount != null && EditingMergedAccount.MergedInbox.Id != Guid.Empty; + + public bool CanUnlink => IsMergedInboxSaved; + + // There must be at least 2 accounts linked to a merged account for link to exist. + public bool ShouldDeleteMergedAccount => LinkedAccounts.Count < 2; + + public bool CanSaveChanges + { + get + { + if (IsMergedInboxSaved) + { + return ShouldDeleteMergedAccount || IsEditingAccountsDirty(); + } + else + { + return LinkedAccounts.Any(); + } + } + } + + private readonly IAccountService _accountService; + private readonly IPreferencesService _preferencesService; + private readonly IProviderService _providerService; + + public MergedAccountDetailsPageViewModel(IDialogService dialogService, + IAccountService accountService, + IPreferencesService preferencesService, + IProviderService providerService) : base(dialogService) + { + _accountService = accountService; + _preferencesService = preferencesService; + _providerService = providerService; + } + + [RelayCommand(CanExecute = nameof(CanUnlink))] + private async Task UnlinkAccountsAsync() + { + if (EditingMergedAccount == null) return; + + var isConfirmed = await DialogService.ShowConfirmationDialogAsync(Translator.DialogMessage_UnlinkAccountsConfirmationMessage, Translator.DialogMessage_UnlinkAccountsConfirmationTitle, Translator.Buttons_Yes); + + if (!isConfirmed) return; + + await _accountService.UnlinkMergedInboxAsync(EditingMergedAccount.MergedInbox.Id); + + Messenger.Send(new BackBreadcrumNavigationRequested()); + } + + [RelayCommand(CanExecute = nameof(CanSaveChanges))] + private async Task SaveChangesAsync() + { + if (ShouldDeleteMergedAccount) + { + await UnlinkAccountsAsync(); + } + else + { + if (IsMergedInboxSaved) + { + await _accountService.UpdateMergedInboxAsync(EditingMergedAccount.MergedInbox.Id, LinkedAccounts.Select(a => a.Account.Id).ToList()); + } + else + { + await _accountService.CreateMergeAccountsAsync(EditingMergedAccount.MergedInbox, LinkedAccounts.Select(a => a.Account).ToList()); + } + + // Startup entity is linked now. Change the startup entity. + if (_preferencesService.StartupEntityId != null && LinkedAccounts.Any(a => a.StartupEntityId == _preferencesService.StartupEntityId)) + { + _preferencesService.StartupEntityId = EditingMergedAccount.MergedInbox.Id; + } + } + + Messenger.Send(new BackBreadcrumNavigationRequested()); + } + + [RelayCommand] + private async Task RenameLinkAsync() + { + if (EditingMergedAccount == null) return; + + var newName = await DialogService.ShowTextInputDialogAsync(EditingMergedAccount.MergedInbox.Name, + Translator.DialogMessage_RenameLinkedAccountsTitle, + Translator.DialogMessage_RenameLinkedAccountsMessage); + + if (string.IsNullOrWhiteSpace(newName)) return; + + EditingMergedAccount.MergedInbox.Name = newName; + + // Update database record as well. + if (IsMergedInboxSaved) + { + await _accountService.RenameMergedAccountAsync(EditingMergedAccount.MergedInbox.Id, newName); + } + else + { + // Publish the message manually since the merged inbox is not saved yet. + // This is only for breadcrump item update. + + Messenger.Send(new MergedInboxRenamed(EditingMergedAccount.MergedInbox.Id, newName)); + } + } + + [RelayCommand] + private void LinkAccount(AccountProviderDetailViewModel account) + { + LinkedAccounts.Add(account); + UnlinkedAccounts.Remove(account); + } + + [RelayCommand] + private void UnlinkAccount(AccountProviderDetailViewModel account) + { + UnlinkedAccounts.Add(account); + LinkedAccounts.Remove(account); + } + + private bool IsEditingAccountsDirty() + { + if (EditingMergedAccount == null) return false; + + return EditingMergedAccount.HoldingAccounts.Count != LinkedAccounts.Count || + EditingMergedAccount.HoldingAccounts.Any(a => !LinkedAccounts.Any(la => la.Account.Id == a.Account.Id)); + } + + public override void OnNavigatedFrom(NavigationMode mode, object parameters) + { + base.OnNavigatedFrom(mode, parameters); + + LinkedAccounts.CollectionChanged -= LinkedAccountsUpdated; + } + + private void LinkedAccountsUpdated(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + OnPropertyChanged(nameof(ShouldDeleteMergedAccount)); + SaveChangesCommand.NotifyCanExecuteChanged(); + + // TODO: Preview common folders for all linked accounts. + // Basically showing a preview of how menu items will look. + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + LinkedAccounts.CollectionChanged -= LinkedAccountsUpdated; + LinkedAccounts.CollectionChanged += LinkedAccountsUpdated; + + if (parameters is MergedAccountProviderDetailViewModel editingMergedAccount) + { + MergedAccountName = editingMergedAccount.MergedInbox.Name; + EditingMergedAccount = editingMergedAccount; + + foreach (var account in editingMergedAccount.HoldingAccounts) + { + LinkedAccounts.Add(account); + } + + // Load unlinked accounts. + + var allAccounts = await _accountService.GetAccountsAsync(); + + foreach (var account in allAccounts) + { + if (!LinkedAccounts.Any(a => a.Account.Id == account.Id)) + { + var provider = _providerService.GetProviderDetail(account.ProviderType); + + UnlinkedAccounts.Add(new AccountProviderDetailViewModel(provider, account)); + } + } + } + + UnlinkAccountsCommand.NotifyCanExecuteChanged(); + } + + public void Receive(MergedInboxRenamed message) + { + if (EditingMergedAccount?.MergedInbox.Id == message.MergedInboxId) + { + EditingMergedAccount.MergedInbox.Name = message.NewName; + } + } + } +} diff --git a/Wino.Mail.ViewModels/MessageListPageViewModel.cs b/Wino.Mail.ViewModels/MessageListPageViewModel.cs new file mode 100644 index 00000000..8ec9dc68 --- /dev/null +++ b/Wino.Mail.ViewModels/MessageListPageViewModel.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Mail.ViewModels +{ + public class MessageListPageViewModel : BaseViewModel + { + public IPreferencesService PreferencesService { get; } + + private List availableHoverActions = new List + { + MailOperation.Archive, + MailOperation.SoftDelete, + MailOperation.SetFlag, + MailOperation.MarkAsRead, + MailOperation.MoveToJunk + }; + + public List AvailableHoverActionsTranslations { get; set; } = new List() + { + Translator.HoverActionOption_Archive, + Translator.HoverActionOption_Delete, + Translator.HoverActionOption_ToggleFlag, + Translator.HoverActionOption_ToggleRead, + Translator.HoverActionOption_MoveJunk + }; + + #region Properties + + private int leftHoverActionIndex; + + public int LeftHoverActionIndex + { + get => leftHoverActionIndex; + set + { + if (SetProperty(ref leftHoverActionIndex, value)) + { + PreferencesService.LeftHoverAction = availableHoverActions[value]; + } + } + } + + + private int centerHoverActionIndex; + + public int CenterHoverActionIndex + { + get => centerHoverActionIndex; + set + { + if (SetProperty(ref centerHoverActionIndex, value)) + { + PreferencesService.CenterHoverAction = availableHoverActions[value]; + } + } + } + + private int rightHoverActionIndex; + + public int RightHoverActionIndex + { + get => rightHoverActionIndex; + set + { + if (SetProperty(ref rightHoverActionIndex, value)) + { + PreferencesService.RightHoverAction = availableHoverActions[value]; + } + } + } + + #endregion + + public MessageListPageViewModel(IDialogService dialogService, + IPreferencesService preferencesService) : base(dialogService) + { + PreferencesService = preferencesService; + + leftHoverActionIndex = availableHoverActions.IndexOf(PreferencesService.LeftHoverAction); + centerHoverActionIndex = availableHoverActions.IndexOf(PreferencesService.CenterHoverAction); + rightHoverActionIndex = availableHoverActions.IndexOf(PreferencesService.RightHoverAction); + } + } +} diff --git a/Wino.Mail.ViewModels/Messages/ActiveMailFolderChangedEvent.cs b/Wino.Mail.ViewModels/Messages/ActiveMailFolderChangedEvent.cs new file mode 100644 index 00000000..4cd8cce7 --- /dev/null +++ b/Wino.Mail.ViewModels/Messages/ActiveMailFolderChangedEvent.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; + +namespace Wino.Mail.ViewModels.Messages +{ + public class ActiveMailFolderChangedEvent : NavigateMailFolderEventArgs + { + public ActiveMailFolderChangedEvent(IBaseFolderMenuItem baseFolderMenuItem, + TaskCompletionSource folderInitLoadAwaitTask = null) : base(baseFolderMenuItem, folderInitLoadAwaitTask) + { + } + } +} diff --git a/Wino.Mail.ViewModels/Messages/ActiveMailItemChangedEvent.cs b/Wino.Mail.ViewModels/Messages/ActiveMailItemChangedEvent.cs new file mode 100644 index 00000000..fb0fc2b9 --- /dev/null +++ b/Wino.Mail.ViewModels/Messages/ActiveMailItemChangedEvent.cs @@ -0,0 +1,20 @@ +using System; +using Wino.Core.MenuItems; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels.Messages +{ + /// + /// When active mail item in the reader is updated. + /// + public class ActiveMailItemChangedEvent + { + public ActiveMailItemChangedEvent(MailItemViewModel selectedMailItemViewModel) + { + // SelectedMailItemViewModel can be null. + SelectedMailItemViewModel = selectedMailItemViewModel; + } + + public MailItemViewModel SelectedMailItemViewModel { get; set; } + } +} diff --git a/Wino.Mail.ViewModels/Messages/MailItemSelectedEvent.cs b/Wino.Mail.ViewModels/Messages/MailItemSelectedEvent.cs new file mode 100644 index 00000000..abf21811 --- /dev/null +++ b/Wino.Mail.ViewModels/Messages/MailItemSelectedEvent.cs @@ -0,0 +1,19 @@ +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels.Messages +{ + /// + /// Wino has complex selected item detection mechanism with nested ListViews that + /// supports multi selection with threads. Each list view will raise this for mail list page + /// to react. + /// + public class MailItemSelectedEvent + { + public MailItemSelectedEvent(MailItemViewModel selectedMailItem) + { + SelectedMailItem = selectedMailItem; + } + + public MailItemViewModel SelectedMailItem { get; set; } + } +} diff --git a/Wino.Mail.ViewModels/Messages/MailItemSelectionRemovedEvent.cs b/Wino.Mail.ViewModels/Messages/MailItemSelectionRemovedEvent.cs new file mode 100644 index 00000000..909b7a24 --- /dev/null +++ b/Wino.Mail.ViewModels/Messages/MailItemSelectionRemovedEvent.cs @@ -0,0 +1,17 @@ +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels.Messages +{ + /// + /// Selected item removed event. + /// + public class MailItemSelectionRemovedEvent + { + public MailItemSelectionRemovedEvent(MailItemViewModel removedMailItem) + { + RemovedMailItem = removedMailItem; + } + + public MailItemViewModel RemovedMailItem { get; set; } + } +} diff --git a/Wino.Mail.ViewModels/Messages/ResetSingleMailItemSelectionEvent.cs b/Wino.Mail.ViewModels/Messages/ResetSingleMailItemSelectionEvent.cs new file mode 100644 index 00000000..f90907e2 --- /dev/null +++ b/Wino.Mail.ViewModels/Messages/ResetSingleMailItemSelectionEvent.cs @@ -0,0 +1,19 @@ +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels.Messages +{ + + /// + /// When a thread conversation listview has single selection, all other listviews + /// must unselect all their items. + /// + public class ResetSingleMailItemSelectionEvent + { + public ResetSingleMailItemSelectionEvent(MailItemViewModel selectedViewModel) + { + SelectedViewModel = selectedViewModel; + } + + public MailItemViewModel SelectedViewModel { get; set; } + } +} diff --git a/Wino.Mail.ViewModels/Messages/SelectMailItemContainerEvent.cs b/Wino.Mail.ViewModels/Messages/SelectMailItemContainerEvent.cs new file mode 100644 index 00000000..7db82a86 --- /dev/null +++ b/Wino.Mail.ViewModels/Messages/SelectMailItemContainerEvent.cs @@ -0,0 +1,9 @@ +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels.Messages +{ + /// + /// When listing view model manipulated the selected mail container in the UI. + /// + public record SelectMailItemContainerEvent(MailItemViewModel SelectedMailViewModel, bool ScrollToItem = false); +} diff --git a/Wino.Mail.ViewModels/NewAccountManagementPageViewModel.cs b/Wino.Mail.ViewModels/NewAccountManagementPageViewModel.cs new file mode 100644 index 00000000..2cf70adc --- /dev/null +++ b/Wino.Mail.ViewModels/NewAccountManagementPageViewModel.cs @@ -0,0 +1,11 @@ +using Wino.Core.Domain.Interfaces; + +namespace Wino.Mail.ViewModels +{ + public class NewAccountManagementPageViewModel : BaseViewModel + { + public NewAccountManagementPageViewModel(IDialogService dialogService) : base(dialogService) + { + } + } +} diff --git a/Wino.Mail.ViewModels/PersonalizationPageViewModel.cs b/Wino.Mail.ViewModels/PersonalizationPageViewModel.cs new file mode 100644 index 00000000..1e302f88 --- /dev/null +++ b/Wino.Mail.ViewModels/PersonalizationPageViewModel.cs @@ -0,0 +1,303 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Personalization; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Mail.ViewModels +{ + public partial class PersonalizationPageViewModel : BaseViewModel + { + public IStatePersistanceService StatePersistanceService { get; } + public IPreferencesService PreferencesService { get; } + + private readonly IThemeService _themeService; + + private bool isPropChangeDisabled = false; + + #region Personalization + + public bool IsSelectedWindowsAccentColor => SelectedAppColor == Colors.LastOrDefault(); + + public ObservableCollection Colors { get; set; } = new ObservableCollection(); + + public List ElementThemes { get; set; } = new List() + { + new ElementThemeContainer(ApplicationElementTheme.Light, Translator.ElementTheme_Light), + new ElementThemeContainer(ApplicationElementTheme.Dark, Translator.ElementTheme_Dark), + new ElementThemeContainer(ApplicationElementTheme.Default, Translator.ElementTheme_Default), + }; + + public List PaneLengths { get; set; } = new List() + { + new MailListPaneLengthPreferences(Translator.PaneLengthOption_Micro, 300), + new MailListPaneLengthPreferences(Translator.PaneLengthOption_Small, 350), + new MailListPaneLengthPreferences(Translator.PaneLengthOption_Default, 420), + new MailListPaneLengthPreferences(Translator.PaneLengthOption_Medium, 700), + new MailListPaneLengthPreferences(Translator.PaneLengthOption_Large, 900), + new MailListPaneLengthPreferences(Translator.PaneLengthOption_ExtraLarge, 1200), + }; + + public List InformationDisplayModes { get; set; } = new List() + { + MailListDisplayMode.Compact, + MailListDisplayMode.Medium, + MailListDisplayMode.Spacious + }; + + public List AppThemes { get; set; } + + [ObservableProperty] + private MailListPaneLengthPreferences selectedMailListPaneLength; + + [ObservableProperty] + private ElementThemeContainer selectedElementTheme; + + [ObservableProperty] + private MailListDisplayMode selectedInfoDisplayMode; + + private AppColorViewModel _selectedAppColor; + + public AppColorViewModel SelectedAppColor + { + get => _selectedAppColor; + set + { + if (SetProperty(ref _selectedAppColor, value)) + { + UseAccentColor = value == Colors?.LastOrDefault(); + } + } + } + + private bool _useAccentColor; + public bool UseAccentColor + { + get => _useAccentColor; + set + { + if (SetProperty(ref _useAccentColor, value)) + { + if (value) + { + SelectedAppColor = Colors?.LastOrDefault(); + } + else if (SelectedAppColor == Colors?.LastOrDefault()) + { + // Unchecking from accent color. + + SelectedAppColor = Colors?.FirstOrDefault(); + } + } + } + } + + // Allow app theme change for system themes. + public bool CanSelectElementTheme => SelectedAppTheme != null && + (SelectedAppTheme.AppThemeType == AppThemeType.System || SelectedAppTheme.AppThemeType == AppThemeType.Custom); + + private AppThemeBase _selectedAppTheme; + + public AppThemeBase SelectedAppTheme + { + get => _selectedAppTheme; + set + { + if (SetProperty(ref _selectedAppTheme, value)) + { + OnPropertyChanged(nameof(CanSelectElementTheme)); + + if (!CanSelectElementTheme) + { + SelectedElementTheme = null; + } + } + } + } + + #endregion + + public AsyncRelayCommand CreateCustomThemeCommand { get; set; } + public PersonalizationPageViewModel(IDialogService dialogService, + IStatePersistanceService statePersistanceService, + IThemeService themeService, + IPreferencesService preferencesService) : base(dialogService) + { + CreateCustomThemeCommand = new AsyncRelayCommand(CreateCustomThemeAsync); + + StatePersistanceService = statePersistanceService; + + _themeService = themeService; + PreferencesService = preferencesService; + } + + private async Task CreateCustomThemeAsync() + { + bool isThemeCreated = await DialogService.ShowCustomThemeBuilderDialogAsync(); + + if (isThemeCreated) + { + // Reload themes. + + await InitializeSettingsAsync(); + } + } + + private void InitializeColors() + { + Colors.Add(new AppColorViewModel("#0078d7")); + Colors.Add(new AppColorViewModel("#00838c")); + Colors.Add(new AppColorViewModel("#e3008c")); + Colors.Add(new AppColorViewModel("#ca4f07")); + Colors.Add(new AppColorViewModel("#e81123")); + Colors.Add(new AppColorViewModel("#00819e")); + Colors.Add(new AppColorViewModel("#10893e")); + Colors.Add(new AppColorViewModel("#881798")); + Colors.Add(new AppColorViewModel("#c239b3")); + Colors.Add(new AppColorViewModel("#767676")); + Colors.Add(new AppColorViewModel("#e1b12c")); + Colors.Add(new AppColorViewModel("#16a085")); + Colors.Add(new AppColorViewModel("#0984e3")); + Colors.Add(new AppColorViewModel("#4a69bd")); + Colors.Add(new AppColorViewModel("#05c46b")); + + // Add system accent color as last item. + + Colors.Add(new AppColorViewModel(_themeService.GetSystemAccentColorHex(), true)); + } + + /// + /// Set selections from settings service. + /// + private void SetInitialValues() + { + SelectedElementTheme = ElementThemes.Find(a => a.NativeTheme == _themeService.RootTheme); + SelectedInfoDisplayMode = PreferencesService.MailItemDisplayMode; + SelectedMailListPaneLength = PaneLengths.Find(a => a.Length == StatePersistanceService.MailListPaneLength); + + var currentAccentColor = _themeService.AccentColor; + + bool isWindowsColor = string.IsNullOrEmpty(currentAccentColor); + + if (isWindowsColor) + { + SelectedAppColor = Colors.LastOrDefault(); + UseAccentColor = true; + } + else + SelectedAppColor = Colors.FirstOrDefault(a => a.Hex == currentAccentColor); + + SelectedAppTheme = AppThemes.Find(a => a.Id == _themeService.CurrentApplicationThemeId); + } + + protected override async void OnActivated() + { + base.OnActivated(); + + await InitializeSettingsAsync(); + } + + private async Task InitializeSettingsAsync() + { + Deactivate(); + + AppThemes = await _themeService.GetAvailableThemesAsync(); + + OnPropertyChanged(nameof(AppThemes)); + + InitializeColors(); + SetInitialValues(); + + PropertyChanged -= PersonalizationSettingsUpdated; + PropertyChanged += PersonalizationSettingsUpdated; + + _themeService.AccentColorChanged -= AccentColorChanged; + _themeService.ElementThemeChanged -= ElementThemeChanged; + _themeService.AccentColorChangedBySystem -= AccentColorChangedBySystem; + + _themeService.AccentColorChanged += AccentColorChanged; + _themeService.ElementThemeChanged += ElementThemeChanged; + _themeService.AccentColorChangedBySystem += AccentColorChangedBySystem; + } + + private void AccentColorChangedBySystem(object sender, string newAccentColorHex) + { + var accentInList = Colors.FirstOrDefault(a => a.IsAccentColor); + + if (accentInList != null) + { + accentInList.Hex = newAccentColorHex; + } + } + + private void AccentColorChanged(object sender, string e) + { + isPropChangeDisabled = true; + + SelectedAppColor = Colors.FirstOrDefault(a => a.Hex == e); + + isPropChangeDisabled = false; + } + + private void ElementThemeChanged(object sender, ApplicationElementTheme e) + { + isPropChangeDisabled = true; + + SelectedElementTheme = ElementThemes.Find(a => a.NativeTheme == e); + + isPropChangeDisabled = false; + } + + protected override void OnDeactivated() + { + base.OnDeactivated(); + + Deactivate(); + } + + private void Deactivate() + { + PropertyChanged -= PersonalizationSettingsUpdated; + + _themeService.AccentColorChanged -= AccentColorChanged; + _themeService.ElementThemeChanged -= ElementThemeChanged; + _themeService.AccentColorChangedBySystem -= AccentColorChangedBySystem; + + if (AppThemes != null) + { + AppThemes.Clear(); + AppThemes = null; + } + } + + private void PersonalizationSettingsUpdated(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (isPropChangeDisabled) + return; + + if (e.PropertyName == nameof(SelectedElementTheme) && SelectedElementTheme != null) + { + _themeService.RootTheme = SelectedElementTheme.NativeTheme; + } + else if (e.PropertyName == nameof(SelectedAppTheme)) + { + _themeService.CurrentApplicationThemeId = SelectedAppTheme.Id; + } + else if (e.PropertyName == nameof(SelectedMailListPaneLength) && SelectedMailListPaneLength != null) + StatePersistanceService.MailListPaneLength = SelectedMailListPaneLength.Length; + else + { + if (e.PropertyName == nameof(SelectedInfoDisplayMode)) + PreferencesService.MailItemDisplayMode = SelectedInfoDisplayMode; + else if (e.PropertyName == nameof(SelectedAppColor)) + _themeService.AccentColor = SelectedAppColor.Hex; + } + } + } +} diff --git a/Wino.Mail.ViewModels/ReadingPanePageViewModel.cs b/Wino.Mail.ViewModels/ReadingPanePageViewModel.cs new file mode 100644 index 00000000..5acd18f3 --- /dev/null +++ b/Wino.Mail.ViewModels/ReadingPanePageViewModel.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Reader; + +namespace Wino.Mail.ViewModels +{ + public partial class ReadingPanePageViewModel : BaseViewModel, + IRecipient>, + IRecipient> + { + public IPreferencesService PreferencesService { get; set; } + + private int selectedMarkAsOptionIndex; + private readonly IFontService _fontService; + + public int SelectedMarkAsOptionIndex + { + get => selectedMarkAsOptionIndex; + set + { + if (SetProperty(ref selectedMarkAsOptionIndex, value)) + { + if (value >= 0) + { + PreferencesService.MarkAsPreference = (MailMarkAsOption)Enum.GetValues(typeof(MailMarkAsOption)).GetValue(value); + } + } + } + } + + public List ReaderFonts => _fontService.GetReaderFonts(); + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + ReaderFontModel currentReaderFont; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + int currentReaderFontSize; + + public ReadingPanePageViewModel(IDialogService dialogService, + IFontService fontService, + IPreferencesService preferencesService) : base(dialogService) + { + _fontService = fontService; + + PreferencesService = preferencesService; + SelectedMarkAsOptionIndex = Array.IndexOf(Enum.GetValues(typeof(MailMarkAsOption)), PreferencesService.MarkAsPreference); + + CurrentReaderFont = fontService.GetCurrentReaderFont(); + CurrentReaderFontSize = fontService.GetCurrentReaderFontSize(); + } + + public void Receive(PropertyChangedMessage message) + { + if (message.OldValue != message.NewValue) + { + _fontService.ChangeReaderFont(message.NewValue.Font); + Debug.WriteLine("Changed reader font."); + } + } + + public void Receive(PropertyChangedMessage message) + { + if (message.PropertyName == nameof(CurrentReaderFontSize)) + { + _fontService.ChangeReaderFontSize(CurrentReaderFontSize); + } + } + } +} diff --git a/Wino.Mail.ViewModels/SettingOptionsPageViewModel.cs b/Wino.Mail.ViewModels/SettingOptionsPageViewModel.cs new file mode 100644 index 00000000..01ad29de --- /dev/null +++ b/Wino.Mail.ViewModels/SettingOptionsPageViewModel.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Translations; +using Wino.Core.Messages.Navigation; + +namespace Wino.Mail.ViewModels +{ + public partial class SettingOptionsPageViewModel : BaseViewModel + { + private readonly ITranslationService _translationService; + private readonly IPreferencesService _preferencesService; + + [ObservableProperty] + private List _availableLanguages; + + [ObservableProperty] + private AppLanguageModel _selectedLanguage; + + private bool isInitialized = false; + + public SettingOptionsPageViewModel(IDialogService dialogService, + ITranslationService translationService, + IPreferencesService preferencesService) : base(dialogService) + { + _translationService = translationService; + _preferencesService = preferencesService; + } + + [RelayCommand] + private void GoAccountSettings() => Messenger.Send(); + + public override void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + AvailableLanguages = _translationService.GetAvailableLanguages(); + + SelectedLanguage = AvailableLanguages.FirstOrDefault(a => a.Language == _preferencesService.CurrentLanguage); + + isInitialized = true; + } + + protected override async void OnPropertyChanged(PropertyChangedEventArgs e) + { + base.OnPropertyChanged(e); + + if (!isInitialized) return; + + if (e.PropertyName == nameof(SelectedLanguage)) + { + await _translationService.InitializeLanguageAsync(SelectedLanguage.Language); + } + } + + [RelayCommand] + public void NavigateSubDetail(object type) + { + if (type is string stringParameter) + { + WinoPage pageType = default; + + string pageTitle = stringParameter; + + // They are just params and don't have to be localized. Don't change. + if (stringParameter == "Personalization") + pageType = WinoPage.PersonalizationPage; + else if (stringParameter == "About") + pageType = WinoPage.AboutPage; + else if (stringParameter == "Message List") + pageType = WinoPage.MessageListPage; + else if (stringParameter == "Reading Pane") + pageType = WinoPage.ReadingPanePage; + + Messenger.Send(new BreadcrumbNavigationRequested(pageTitle, pageType)); + } + } + } +} diff --git a/Wino.Mail.ViewModels/SettingsPageViewModel.cs b/Wino.Mail.ViewModels/SettingsPageViewModel.cs new file mode 100644 index 00000000..212e698f --- /dev/null +++ b/Wino.Mail.ViewModels/SettingsPageViewModel.cs @@ -0,0 +1,11 @@ +using Wino.Core.Domain.Interfaces; + +namespace Wino.Mail.ViewModels +{ + public class SettingsPageViewModel : BaseViewModel + { + public SettingsPageViewModel(IDialogService dialogService) : base(dialogService) + { + } + } +} diff --git a/Wino.Mail.ViewModels/SettingsViewModel.cs b/Wino.Mail.ViewModels/SettingsViewModel.cs new file mode 100644 index 00000000..b905f9c5 --- /dev/null +++ b/Wino.Mail.ViewModels/SettingsViewModel.cs @@ -0,0 +1,11 @@ +using Wino.Core.Domain.Interfaces; + +namespace Wino.Mail.ViewModels +{ + public class SettingsDialogViewModel : BaseViewModel + { + public SettingsDialogViewModel(IDialogService dialogService) : base(dialogService) + { + } + } +} diff --git a/Wino.Mail.ViewModels/SignatureManagementPageViewModel.cs b/Wino.Mail.ViewModels/SignatureManagementPageViewModel.cs new file mode 100644 index 00000000..bd161bce --- /dev/null +++ b/Wino.Mail.ViewModels/SignatureManagementPageViewModel.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.Messages.Mails; + +namespace Wino.Mail.ViewModels +{ + public partial class SignatureManagementPageViewModel : BaseViewModel + { + public Func> GetHTMLBodyFunction; + public Func> GetTextBodyFunction; + + public List ToolbarSections { get; set; } = new List() + { + new EditorToolbarSection(){ SectionType = EditorToolbarSectionType.Format }, + new EditorToolbarSection(){ SectionType = EditorToolbarSectionType.Insert }, + }; + + [ObservableProperty] + private EditorToolbarSection selectedToolbarSection; + + [ObservableProperty] + private bool isSignatureEnabled; + + public MailAccount Account { get; set; } + + public AsyncRelayCommand SaveSignatureCommand { get; set; } + + public INativeAppService NativeAppService { get; } + private readonly ISignatureService _signatureService; + private readonly IAccountService _accountService; + + public SignatureManagementPageViewModel(IDialogService dialogService, + INativeAppService nativeAppService, + ISignatureService signatureService, + IAccountService accountService) : base(dialogService) + { + SelectedToolbarSection = ToolbarSections[0]; + NativeAppService = nativeAppService; + _signatureService = signatureService; + _accountService = accountService; + SaveSignatureCommand = new AsyncRelayCommand(SaveSignatureAsync); + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + if (parameters is Guid accountId) + Account = await _accountService.GetAccountAsync(accountId); + + if (Account != null) + { + var accountSignature = await _signatureService.GetAccountSignatureAsync(Account.Id); + + IsSignatureEnabled = accountSignature != null; + + if (IsSignatureEnabled) + Messenger.Send(new HtmlRenderingRequested(accountSignature.HtmlBody)); + else + Messenger.Send(new HtmlRenderingRequested(string.Empty)); // To get the theme changes. Render empty html. + } + } + + private async Task SaveSignatureAsync() + { + if (IsSignatureEnabled) + { + var newSignature = Regex.Unescape(await GetHTMLBodyFunction()); + + await _signatureService.UpdateAccountSignatureAsync(Account.Id, newSignature); + + DialogService.InfoBarMessage(Translator.Info_SignatureSavedTitle, Translator.Info_SignatureSavedMessage, Core.Domain.Enums.InfoBarMessageType.Success); + } + else + { + await _signatureService.DeleteAccountSignatureAssignment(Account.Id); + + DialogService.InfoBarMessage(Translator.Info_SignatureDisabledTitle, Translator.Info_SignatureDisabledMessage, Core.Domain.Enums.InfoBarMessageType.Success); + } + } + } +} diff --git a/Wino.Mail.ViewModels/WelcomePageViewModel.cs b/Wino.Mail.ViewModels/WelcomePageViewModel.cs new file mode 100644 index 00000000..ffcbf56e --- /dev/null +++ b/Wino.Mail.ViewModels/WelcomePageViewModel.cs @@ -0,0 +1,37 @@ +using System; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; + +namespace Wino.Mail.ViewModels +{ + public partial class WelcomePageViewModel : BaseViewModel + { + public const string VersionFile = "170.md"; + + private readonly IFileService _fileService; + + [ObservableProperty] + private string currentVersionNotes; + + public WelcomePageViewModel(IDialogService dialogService, IFileService fileService) : base(dialogService) + { + _fileService = fileService; + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + try + { + CurrentVersionNotes = await _fileService.GetFileContentByApplicationUriAsync($"ms-appx:///Assets/ReleaseNotes/{VersionFile}"); + } + catch (Exception) + { + DialogService.InfoBarMessage(Translator.GeneralTitle_Error, "Can't find the patch notes.", Core.Domain.Enums.InfoBarMessageType.Information); + } + } + } +} diff --git a/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj b/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj new file mode 100644 index 00000000..16a363ee --- /dev/null +++ b/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj @@ -0,0 +1,22 @@ + + + + netstandard2.0 + 12 + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + diff --git a/Wino.Mail/Activation/ActivationHandler.cs b/Wino.Mail/Activation/ActivationHandler.cs new file mode 100644 index 00000000..5beef227 --- /dev/null +++ b/Wino.Mail/Activation/ActivationHandler.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; + +namespace Wino.Activation +{ + // For more information on understanding and extending activation flow see + // https://github.com/microsoft/TemplateStudio/blob/main/docs/UWP/activation.md + internal abstract class ActivationHandler + { + public abstract bool CanHandle(object args); + + public abstract Task HandleAsync(object args); + } + + // Extend this class to implement new ActivationHandlers + internal abstract class ActivationHandler : ActivationHandler + where T : class + { + // Override this method to add the activation logic in your activation handler + protected abstract Task HandleInternalAsync(T args); + + public override async Task HandleAsync(object args) + { + await HandleInternalAsync(args as T); + } + + public override bool CanHandle(object args) + { + // CanHandle checks the args is of type you have configured + return args is T && CanHandleInternal(args as T); + } + + // You can override this method to add extra validation on activation args + // to determine if your ActivationHandler should handle this activation args + protected virtual bool CanHandleInternal(T args) + { + return true; + } + } +} diff --git a/Wino.Mail/Activation/BackgroundActivationHandler.cs b/Wino.Mail/Activation/BackgroundActivationHandler.cs new file mode 100644 index 00000000..a88f1107 --- /dev/null +++ b/Wino.Mail/Activation/BackgroundActivationHandler.cs @@ -0,0 +1,174 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using Microsoft.Toolkit.Uwp.Notifications; +using Serilog; +using Windows.ApplicationModel.Activation; +using Windows.ApplicationModel.Background; +using Windows.ApplicationModel.Core; +using Windows.UI.Core; +using Windows.UI.Notifications; +using Wino.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.UWP.Services; +using Wino.Services; + +namespace Wino.Activation +{ + internal class BackgroundActivationHandler : ActivationHandler + { + private const string BackgroundExecutionLogTag = "[BackgroundExecution] "; + + private readonly IWinoRequestDelegator _winoRequestDelegator; + private readonly IBackgroundSynchronizer _backgroundSynchronizer; + private readonly INativeAppService _nativeAppService; + private readonly IWinoRequestProcessor _winoRequestProcessor; + private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; + private readonly IMailService _mailService; + private ToastArguments _toastArguments; + + BackgroundTaskDeferral _deferral; + public BackgroundActivationHandler(IWinoRequestDelegator winoRequestDelegator, + IBackgroundSynchronizer backgroundSynchronizer, + INativeAppService nativeAppService, + IWinoRequestProcessor winoRequestProcessor, + IWinoSynchronizerFactory winoSynchronizerFactory, + IMailService mailService) + { + _winoRequestDelegator = winoRequestDelegator; + _backgroundSynchronizer = backgroundSynchronizer; + _nativeAppService = nativeAppService; + _winoRequestProcessor = winoRequestProcessor; + _winoSynchronizerFactory = winoSynchronizerFactory; + _mailService = mailService; + } + + protected override async Task HandleInternalAsync(BackgroundActivatedEventArgs args) + { + var instance = args.TaskInstance; + var taskName = instance.Task.Name; + + instance.Canceled -= OnBackgroundExecutionCanceled; + instance.Canceled += OnBackgroundExecutionCanceled; + + _deferral = instance.GetDeferral(); + + if (taskName == BackgroundTaskService.ToastActivationTaskEx) + { + // ToastNotificationActionTriggerDetail somehow use UI thread. + // Calling this without a dispatcher will result in error. + + await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, () => + { + if (instance.TriggerDetails is ToastNotificationActionTriggerDetail toastNotificationActionTriggerDetail) + _toastArguments = ToastArguments.Parse(toastNotificationActionTriggerDetail.Argument); + }); + + // All toast activation mail actions are handled here like mark as read or delete. + // This should not launch the application on the foreground. + + // Get the action and mail item id. + // Prepare package and send to delegator. + + if (_toastArguments.TryGetValue(Constants.ToastMailItemIdKey, out string mailItemId) && + _toastArguments.TryGetValue(Constants.ToastActionKey, out MailOperation action)) + { + // TODO: Remote folder id. + var mailItem = await _mailService.GetSingleMailItemAsync(mailItemId, string.Empty); + + if (mailItem == null) return; + + if (_nativeAppService.IsAppRunning()) + { + // Just send the package. We should reflect the UI changes as well. + var package = new MailOperationPreperationRequest(action, mailItem); + + await _winoRequestDelegator.ExecuteAsync(package); + } + else + { + // We need to synchronize changes without reflection the UI changes. + + var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(mailItem.AssignedAccount.Id); + var prepRequest = new MailOperationPreperationRequest(action, mailItem); + + var requests = await _winoRequestProcessor.PrepareRequestsAsync(prepRequest); + + foreach (var request in requests) + { + synchronizer.QueueRequest(request); + } + + var options = new SynchronizationOptions() + { + Type = SynchronizationType.ExecuteRequests, + AccountId = mailItem.AssignedAccount.Id + }; + + await synchronizer.SynchronizeAsync(options); + } + } + } + else if (taskName == BackgroundTaskService.BackgroundSynchronizationTimerTaskNameEx) + { + var watch = new Stopwatch(); + watch.Start(); + + // Run timer based background synchronization. + + await _backgroundSynchronizer.RunBackgroundSynchronizationAsync(BackgroundSynchronizationReason.Timer); + + watch.Stop(); + Log.Information($"{BackgroundExecutionLogTag}Background synchronization is completed in {watch.Elapsed.TotalSeconds} seconds."); + } + + instance.Canceled -= OnBackgroundExecutionCanceled; + + _deferral.Complete(); + } + + private void OnBackgroundExecutionCanceled(Windows.ApplicationModel.Background.IBackgroundTaskInstance sender, Windows.ApplicationModel.Background.BackgroundTaskCancellationReason reason) + { + Log.Error($"{BackgroundExecutionLogTag} ({sender.Task.Name}) Background task is canceled. Reason -> {reason}"); + + _deferral?.Complete(); + } + + protected override bool CanHandleInternal(BackgroundActivatedEventArgs args) + { + var instance = args.TaskInstance; + var taskName = instance.Task.Name; + + if (taskName == BackgroundTaskService.ToastActivationTaskEx) + { + // User clicked Mark as Read or Delete in toast notification. + // MailId and Action must present in the arguments. + + return true; + + //if (instance.TriggerDetails is ToastNotificationActionTriggerDetail toastNotificationActionTriggerDetail) + //{ + // _toastArguments = ToastArguments.Parse(toastNotificationActionTriggerDetail.Argument); + + // return + // _toastArguments.Contains(Constants.ToastMailItemIdKey) && + // _toastArguments.Contains(Constants.ToastActionKey); + //} + + } + else if (taskName == BackgroundTaskService.BackgroundSynchronizationTimerTaskNameEx) + { + // This is timer based background synchronization. + + + return true; + } + + return false; + } + } +} diff --git a/Wino.Mail/Activation/DefaultActivationHandler.cs b/Wino.Mail/Activation/DefaultActivationHandler.cs new file mode 100644 index 00000000..6a6563fa --- /dev/null +++ b/Wino.Mail/Activation/DefaultActivationHandler.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media.Animation; +using Wino.Views; + +namespace Wino.Activation +{ + internal class DefaultActivationHandler : ActivationHandler + { + protected override Task HandleInternalAsync(IActivatedEventArgs args) + { + (Window.Current.Content as Frame).Navigate(typeof(AppShell), null, new DrillInNavigationTransitionInfo()); + + return Task.CompletedTask; + } + + // Only navigate if Frame content doesn't exist. + protected override bool CanHandleInternal(IActivatedEventArgs args) + => (Window.Current?.Content as Frame)?.Content == null; + } +} diff --git a/Wino.Mail/Activation/FileActivationHandler.cs b/Wino.Mail/Activation/FileActivationHandler.cs new file mode 100644 index 00000000..6aa7ca47 --- /dev/null +++ b/Wino.Mail/Activation/FileActivationHandler.cs @@ -0,0 +1,68 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Windows.ApplicationModel.Activation; +using Windows.Storage; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media.Animation; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; +using Wino.Helpers; +using Wino.Views; + +namespace Wino.Activation +{ + internal class FileActivationHandler : ActivationHandler + { + private readonly INativeAppService _nativeAppService; + private readonly IMimeFileService _mimeFileService; + private readonly IStatePersistanceService _statePersistanceService; + private readonly IWinoNavigationService _winoNavigationService; + + public FileActivationHandler(INativeAppService nativeAppService, + IMimeFileService mimeFileService, + IStatePersistanceService statePersistanceService, + IWinoNavigationService winoNavigationService) + { + _nativeAppService = nativeAppService; + _mimeFileService = mimeFileService; + _statePersistanceService = statePersistanceService; + _winoNavigationService = winoNavigationService; + } + + protected override async Task HandleInternalAsync(FileActivatedEventArgs args) + { + // Always handle the last item passed. + // Multiple files are not supported. + + var file = args.Files.Last() as StorageFile; + + // Only EML files are supported now. + var fileExtension = Path.GetExtension(file.Path); + + if (string.Equals(fileExtension, ".eml", StringComparison.OrdinalIgnoreCase)) + { + var fileBytes = await file.ReadBytesAsync(); + var directoryName = Path.GetDirectoryName(file.Path); + + var messageInformation = await _mimeFileService.GetMimeMessageInformationAsync(fileBytes, directoryName).ConfigureAwait(false); + + if (_nativeAppService.IsAppRunning()) + { + // TODO: Activate another Window and go to mail rendering page. + _winoNavigationService.NavigateRendering(messageInformation); + } + else + { + _statePersistanceService.ShouldShiftMailRenderingDesign = true; + (Window.Current.Content as Frame).Navigate(typeof(MailRenderingPage), messageInformation, new DrillInNavigationTransitionInfo()); + } + } + } + + protected override bool CanHandleInternal(FileActivatedEventArgs args) => args.Files.Any(); + + } +} diff --git a/Wino.Mail/Activation/ProtocolActivationHandler.cs b/Wino.Mail/Activation/ProtocolActivationHandler.cs new file mode 100644 index 00000000..f6ad3aa9 --- /dev/null +++ b/Wino.Mail/Activation/ProtocolActivationHandler.cs @@ -0,0 +1,56 @@ +using System.Threading.Tasks; +using System.Web; +using CommunityToolkit.Mvvm.Messaging; +using Windows.ApplicationModel.Activation; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Messages.Authorization; +using Wino.Core.Messages.Shell; + +namespace Wino.Activation +{ + internal class ProtocolActivationHandler : ActivationHandler + { + private const string GoogleAuthorizationProtocolTag = "google.pw.oauth2"; + private const string MailtoProtocolTag = "mailto:"; + + private readonly INativeAppService _nativeAppService; + private readonly ILaunchProtocolService _launchProtocolService; + + public ProtocolActivationHandler(INativeAppService nativeAppService, ILaunchProtocolService launchProtocolService) + { + _nativeAppService = nativeAppService; + _launchProtocolService = launchProtocolService; + } + + protected override Task HandleInternalAsync(ProtocolActivatedEventArgs args) + { + // Check URI prefix. + + var protocolString = args.Uri.AbsoluteUri; + + // Google OAuth Response + if (protocolString.StartsWith(GoogleAuthorizationProtocolTag)) + { + // App must be working already. No need to check for running state. + WeakReferenceMessenger.Default.Send(new ProtocolAuthorizationCallbackReceived(args.Uri)); + } + else if (protocolString.StartsWith(MailtoProtocolTag)) + { + // mailto activation. Try to parse params. + + var replaced = protocolString.Replace(MailtoProtocolTag, "mailto="); + replaced = Wino.Core.Extensions.StringExtensions.ReplaceFirst(replaced, "?", "&"); + + _launchProtocolService.MailtoParameters = HttpUtility.ParseQueryString(replaced); + + if (_nativeAppService.IsAppRunning()) + { + // Just send publish a message. Shell will continue. + WeakReferenceMessenger.Default.Send(new MailtoProtocolMessageRequested()); + } + } + + return Task.CompletedTask; + } + } +} diff --git a/Wino.Mail/Activation/ToastNotificationActivationHandler.cs b/Wino.Mail/Activation/ToastNotificationActivationHandler.cs new file mode 100644 index 00000000..212d37da --- /dev/null +++ b/Wino.Mail/Activation/ToastNotificationActivationHandler.cs @@ -0,0 +1,79 @@ +using System; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Toolkit.Uwp.Notifications; +using Serilog; +using Windows.ApplicationModel.Activation; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Messages.Accounts; + +namespace Wino.Activation +{ + /// + /// This handler will only handle the toasts that runs on foreground. + /// Background executions are not handled here like mark as read or delete. + /// + internal class ToastNotificationActivationHandler : ActivationHandler + { + private readonly INativeAppService _nativeAppService; + private readonly IMailService _mailService; + private readonly IFolderService _folderService; + + private ToastArguments _toastArguments; + + public ToastNotificationActivationHandler(INativeAppService nativeAppService, + IMailService mailService, + IFolderService folderService) + { + _nativeAppService = nativeAppService; + _mailService = mailService; + _folderService = folderService; + } + + protected override async Task HandleInternalAsync(ToastNotificationActivatedEventArgs args) + { + // Create the mail item navigation event. + // If the app is running, it'll be picked up by the Messenger. + // Otherwise we'll save it and handle it when the shell loads all accounts. + + // Parse the mail unique id and perform above actions. + if (Guid.TryParse(_toastArguments[Constants.ToastMailItemIdKey], out Guid mailItemUniqueId)) + { + var account = await _mailService.GetMailAccountByUniqueIdAsync(mailItemUniqueId).ConfigureAwait(false); + if (account == null) return; + + var mailItem = await _mailService.GetSingleMailItemAsync(mailItemUniqueId).ConfigureAwait(false); + if (mailItem == null) return; + + var message = new AccountMenuItemExtended(mailItem.AssignedFolder.Id, mailItem); + + // Delegate this event to LaunchProtocolService so app shell can pick it up on launch if app doesn't work. + var launchProtocolService = App.Current.Services.GetService(); + launchProtocolService.LaunchParameter = message; + + // Send the messsage anyways. Launch protocol service will be ignored if the message is picked up by subscriber shell. + WeakReferenceMessenger.Default.Send(message); + } + } + + protected override bool CanHandleInternal(ToastNotificationActivatedEventArgs args) + { + try + { + _toastArguments = ToastArguments.Parse(args.Argument); + + return + _toastArguments.Contains(Constants.ToastMailItemIdKey) && + _toastArguments.Contains(Constants.ToastActionKey); + } + catch (Exception ex) + { + Log.Error(ex, "Couldn't handle parsing toast notification arguments for foreground navigate."); + } + + return false; + } + } +} diff --git a/Wino.Mail/App.xaml b/Wino.Mail/App.xaml new file mode 100644 index 00000000..cae3f997 --- /dev/null +++ b/Wino.Mail/App.xaml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + 19 + 19 + 24,24,24,24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/App.xaml.cs b/Wino.Mail/App.xaml.cs new file mode 100644 index 00000000..e854c1e4 --- /dev/null +++ b/Wino.Mail/App.xaml.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AppCenter; +using Microsoft.AppCenter.Analytics; +using Microsoft.AppCenter.Crashes; +using Microsoft.Extensions.DependencyInjection; +using Serilog; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.ApplicationModel.Core; +using Windows.ApplicationModel.Resources; +using Windows.Foundation.Metadata; +using Windows.Globalization; +using Windows.Storage; +using Windows.System.Profile; +using Windows.UI; +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Activation; +using Wino.Core; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; +using Wino.Core.UWP; +using Wino.Core.UWP.Services; +using Wino.Mail.ViewModels; +using Wino.Services; + +namespace Wino +{ + public sealed partial class App : Application + { + private const string WinoLaunchLogPrefix = "[Wino Launch] "; + private const string AppCenterKey = "90deb1d0-a77f-47d0-8a6b-7eaf111c6b72"; + + public new static App Current => (App)Application.Current; + public IServiceProvider Services { get; } + + private readonly ILogInitializer _logInitializer; + private readonly IThemeService _themeService; + private readonly IDatabaseService _databaseService; + private readonly IAppInitializerService _appInitializerService; + private readonly IWinoSynchronizerFactory _synchronizerFactory; + private readonly ITranslationService _translationService; + + // Order matters. + private List initializeServices => new List() + { + _translationService, + _databaseService, + _themeService, + _synchronizerFactory + }; + + public App() + { + InitializeComponent(); + + UnhandledException += OnAppUnhandledException; + EnteredBackground += OnEnteredBackground; + LeavingBackground += OnLeavingBackground; + + Services = ConfigureServices(); + + _logInitializer = Services.GetService(); + + ConfigureLogger(); + ConfigureAppCenter(); + ConfigurePrelaunch(); + ConfigureXbox(); + + _themeService = Services.GetService(); + _databaseService = Services.GetService(); + _appInitializerService = Services.GetService(); + _synchronizerFactory = Services.GetService(); + _translationService = Services.GetService(); + + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + } + + private void LogActivation(string log) => Log.Information($"{WinoLaunchLogPrefix}{log}"); + private void OnLeavingBackground(object sender, LeavingBackgroundEventArgs e) => LogActivation($"Wino went foreground."); + private void OnEnteredBackground(object sender, EnteredBackgroundEventArgs e) => LogActivation($"Wino went background."); + private IServiceProvider ConfigureServices() + { + var services = new ServiceCollection(); + + services.RegisterCoreServices(); + services.RegisterCoreUWPServices(); + + RegisterUWPServices(services); + RegisterViewModels(services); + RegisterActivationHandlers(services); + + return services.BuildServiceProvider(); + } + + #region Dependency Injection + + private void RegisterActivationHandlers(IServiceCollection services) + { + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + } + + private void RegisterUWPServices(IServiceCollection services) + { + services.AddSingleton, ApplicationResourceManager>(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + } + + private void RegisterViewModels(IServiceCollection services) + { + services.AddSingleton(typeof(AppShellViewModel)); + services.AddTransient(typeof(SettingsDialogViewModel)); + services.AddTransient(typeof(PersonalizationPageViewModel)); + services.AddTransient(typeof(SettingOptionsPageViewModel)); + services.AddTransient(typeof(MailListPageViewModel)); + services.AddTransient(typeof(MailRenderingPageViewModel)); + services.AddTransient(typeof(AccountManagementViewModel)); + services.AddTransient(typeof(WelcomePageViewModel)); + services.AddTransient(typeof(AboutPageViewModel)); + services.AddTransient(typeof(ComposePageViewModel)); + services.AddTransient(typeof(IdlePageViewModel)); + services.AddTransient(typeof(SettingsPageViewModel)); + services.AddTransient(typeof(NewAccountManagementPageViewModel)); + services.AddTransient(typeof(AccountDetailsPageViewModel)); + services.AddTransient(typeof(SignatureManagementPageViewModel)); + services.AddTransient(typeof(MessageListPageViewModel)); + services.AddTransient(typeof(ReadingPanePageViewModel)); + services.AddTransient(typeof(MergedAccountDetailsPageViewModel)); + } + + #endregion + + #region Misc Configuration + + private void ConfigureLogger() => _logInitializer.SetupLogger(ApplicationData.Current.LocalFolder.Path); + + private void ConfigureAppCenter() => AppCenter.Start(AppCenterKey, typeof(Analytics), typeof(Crashes)); + + private void ConfigurePrelaunch() + { + if (ApiInformation.IsMethodPresent("Windows.ApplicationModel.Core.CoreApplication", "EnablePrelaunch")) + CoreApplication.EnablePrelaunch(true); + } + + private void ConfigureXbox() + { + // Xbox users should use Reveal focus. + if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 6)) + { + FocusVisualKind = AnalyticsInfo.VersionInfo.DeviceFamily == "Xbox" ? FocusVisualKind.Reveal : FocusVisualKind.HighVisibility; + } + } + + private void ConfigureTitleBar() + { + var coreTitleBar = CoreApplication.GetCurrentView().TitleBar; + var applicationViewTitleBar = ApplicationView.GetForCurrentView().TitleBar; + + // Extend shell content into core window to meet design requirements. + coreTitleBar.ExtendViewIntoTitleBar = true; + + // Change system buttons and background colors to meet design requirements. + applicationViewTitleBar.ButtonBackgroundColor = Colors.Transparent; + applicationViewTitleBar.BackgroundColor = Colors.Transparent; + applicationViewTitleBar.ButtonInactiveBackgroundColor = Colors.Transparent; + applicationViewTitleBar.ButtonForegroundColor = Colors.White; + } + + #endregion + + protected override void OnWindowCreated(WindowCreatedEventArgs args) + { + base.OnWindowCreated(args); + + LogActivation("Window is created."); + + ConfigureTitleBar(); + } + + protected override async void OnLaunched(LaunchActivatedEventArgs args) + { + LogActivation($"OnLaunched -> {args.GetType().Name}, Kind -> {args.Kind}, PreviousExecutionState -> {args.PreviousExecutionState}, IsPrelaunch -> {args.PrelaunchActivated}"); + + if (!args.PrelaunchActivated) + { + await ActivateWinoAsync(args); + } + } + + protected override async void OnFileActivated(FileActivatedEventArgs args) + { + base.OnFileActivated(args); + + Log.Information($"File activation for {args.Files.Count} item(s)."); + + await ActivateWinoAsync(args); + } + + protected override async void OnActivated(IActivatedEventArgs args) + { + base.OnActivated(args); + + Log.Information($"OnActivated -> {args.GetType().Name}, Kind -> {args.Kind}, Prev Execution State -> {args.PreviousExecutionState}"); + + await ActivateWinoAsync(args); + } + + protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args) + { + base.OnBackgroundActivated(args); + + LogActivation($"OnBackgroundActivated -> {args.GetType().Name}, TaskInstanceIdName -> {args.TaskInstance?.Task?.Name ?? "NA"}"); + + await ActivateWinoAsync(args); + } + + private void OnAppUnhandledException(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e) + { + var parameters = new Dictionary() + { + { "BaseMessage", e.Exception.GetBaseException().Message }, + { "BaseStackTrace", e.Exception.GetBaseException().StackTrace }, + { "StackTrace", e.Exception.StackTrace }, + { "Message", e.Exception.Message }, + }; + + Log.Error(e.Exception, "[Wino Crash]"); + + Crashes.TrackError(e.Exception, parameters); + Analytics.TrackEvent("Wino Crashed", parameters); + } + + private bool IsInteractiveLaunchArgs(object args) => args is IActivatedEventArgs; + + private async Task ActivateWinoAsync(object args) + { + await PreInitializationAsync(); + + if (IsInteractiveLaunchArgs(args)) + { + if (Window.Current.Content == null) + { + var mainFrame = new Frame(); + + Window.Current.Content = mainFrame; + + await _themeService.InitializeAsync(); + } + } + + await HandleActivationAsync(args); + + if (IsInteractiveLaunchArgs(args)) + { + Window.Current.Activate(); + + LogActivation("Window activated"); + } + } + + /// + /// Tasks that must run before the activation and launch. + /// Regardless of whether it's an interactive launch or not. + /// + private async Task PreInitializationAsync() + { + // Handle migrations. + // TODO: Automate migration process with more proper way. + + if (!ApplicationData.Current.LocalSettings.Values.ContainsKey("Migration_169")) + { + try + { + await _appInitializerService.MigrateAsync(); + } + catch (Exception ex) + { + Log.Error(ex, $"{WinoLaunchLogPrefix}Migration_169 failed."); + } + finally + { + ApplicationData.Current.LocalSettings.Values["Migration_169"] = true; + } + } + + foreach (var service in initializeServices) + { + await service.InitializeAsync(); + } + } + + private async Task HandleActivationAsync(object activationArgs) + { + var activationHandler = GetActivationHandlers().FirstOrDefault(h => h.CanHandle(activationArgs)); + + if (activationHandler != null) + { + await activationHandler.HandleAsync(activationArgs); + } + + if (IsInteractiveLaunchArgs(activationArgs)) + { + var defaultHandler = new DefaultActivationHandler(); + if (defaultHandler.CanHandle(activationArgs)) + { + await defaultHandler.HandleAsync(activationArgs); + } + } + } + + private IEnumerable GetActivationHandlers() + { + yield return Services.GetService(); + yield return Services.GetService(); + yield return Services.GetService(); + yield return Services.GetService(); + } + } +} diff --git a/Wino.Mail/AppShell.xaml b/Wino.Mail/AppShell.xaml new file mode 100644 index 00000000..2cc625e3 --- /dev/null +++ b/Wino.Mail/AppShell.xaml @@ -0,0 +1,613 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/AppShell.xaml.cs b/Wino.Mail/AppShell.xaml.cs new file mode 100644 index 00000000..4fb83614 --- /dev/null +++ b/Wino.Mail/AppShell.xaml.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Windows.ApplicationModel.Core; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Input; +using Wino.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Messages.Accounts; +using Wino.Core.Messages.Mails; +using Wino.Core.Messages.Shell; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; +using Wino.MenuFlyouts; +using Wino.MenuFlyouts.Context; +using Wino.Views.Abstract; + +namespace Wino.Views +{ + public sealed partial class AppShell : AppShellAbstract, + IRecipient, + IRecipient, + IRecipient, + IRecipient + { + public AppShell() : base() + { + InitializeComponent(); + + var coreTitleBar = CoreApplication.GetCurrentView().TitleBar; + coreTitleBar.LayoutMetricsChanged += TitleBarLayoutUpdated; + } + + private void TitleBarLayoutUpdated(CoreApplicationViewTitleBar sender, object args) => UpdateTitleBarLayout(sender); + + private void UpdateTitleBarLayout(CoreApplicationViewTitleBar coreTitleBar) => RealAppBar.SystemReserved = coreTitleBar.SystemOverlayRightInset; + + private async void ItemDroppedOnFolder(object sender, DragEventArgs e) + { + // Validate package content. + if (sender is WinoNavigationViewItem droppedContainer) + { + droppedContainer.IsDraggingItemOver = false; + + if (CanContinueDragDrop(droppedContainer, e)) + { + if (droppedContainer.DataContext is IBaseFolderMenuItem draggingFolder) + { + var mailCopies = new List(); + + var dragPackage = e.DataView.Properties[nameof(MailDragPackage)] as MailDragPackage; + e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move; + + // Extract mail copies from IMailItem. + // ThreadViewModels will be divided into pieces. + + foreach (var item in dragPackage.DraggingMails) + { + if (item is MailItemViewModel singleMailItemViewModel) + { + mailCopies.Add(singleMailItemViewModel.MailCopy); + } + else if (item is ThreadMailItemViewModel threadViewModel) + { + mailCopies.AddRange(threadViewModel.GetMailCopies()); + } + } + + await ViewModel.PerformMoveOperationAsync(mailCopies, draggingFolder); + } + } + } + } + + private void ItemDragLeaveFromFolder(object sender, DragEventArgs e) + { + if (sender is WinoNavigationViewItem leavingContainer) + { + leavingContainer.IsDraggingItemOver = false; + } + } + + private bool CanContinueDragDrop(WinoNavigationViewItem interactingContainer, DragEventArgs args) + { + // TODO: Maybe override caption with some information why the validation failed? + // Note: Caption has a max length. It may be trimmed in some languages. + + if (interactingContainer == null || !args.DataView.Properties.ContainsKey(nameof(MailDragPackage))) return false; + + var dragPackage = args.DataView.Properties[nameof(MailDragPackage)] as MailDragPackage; + + // Invalid package. + if (!dragPackage.DraggingMails.Any()) return false; + + // Check whether source and target folder are the same. + if (interactingContainer.IsSelected) return false; + + // Check if the interacting container is a folder. + if (!(interactingContainer.DataContext is IBaseFolderMenuItem folderMenuItem)) return false; + + // Check if the folder is a move target. + if (!folderMenuItem.IsMoveTarget) return false; + + // Check whether the moving item's account has at least one same as the target folder's account. + var draggedAccountIds = folderMenuItem.HandlingFolders.Select(a => a.MailAccountId); + + if (!dragPackage.DraggingMails.Any(a => draggedAccountIds.Contains(a.AssignedAccount.Id))) return false; + + return true; + } + + private void ItemDragEnterOnFolder(object sender, DragEventArgs e) + { + // Validate package content. + if (sender is WinoNavigationViewItem droppedContainer && CanContinueDragDrop(droppedContainer, e)) + { + droppedContainer.IsDraggingItemOver = true; + + var draggingFolder = droppedContainer.DataContext as IBaseFolderMenuItem; + + e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move; + e.DragUIOverride.Caption = string.Format(Translator.DragMoveToFolderCaption, draggingFolder.FolderName); + } + } + + public async void Receive(AccountMenuItemExtended message) + { + await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, async () => + { + if (message.FolderId == default) return; + + var menuItem = ViewModel.MenuItems.GetFolderItem(message.FolderId); + + if (menuItem == null) return; + + menuItem.Expand(); + + await ViewModel.NavigateFolderAsync(menuItem); + + navigationView.SelectedItem = menuItem; + + if (message.NavigateMailItem == null) return; + + // At this point folder is navigated and items are loaded. + WeakReferenceMessenger.Default.Send(new MailItemNavigationRequested(message.NavigateMailItem.UniqueId)); + }); + } + + private async void MenuSelectionChanged(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewSelectionChangedEventArgs args) + { + if (args.SelectedItem is IMenuItem invokedMenuItem) + { + await ViewModel.MenuItemInvokedOrSelectedAsync(invokedMenuItem); + } + } + + private async void NavigationViewItemInvoked(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs args) + { + // SelectsOnInvoked is handled in MenuSelectionChanged. + // This part is only for the items that are not selectable. + if (args.InvokedItemContainer is WinoNavigationViewItem winoNavigationViewItem) + { + if (winoNavigationViewItem.SelectsOnInvoked) return; + + await ViewModel.MenuItemInvokedOrSelectedAsync(winoNavigationViewItem.DataContext as IMenuItem); + } + } + + public void Receive(NavigateMailFolderEvent message) + { + if (message.BaseFolderMenuItem == null) return; + + if (navigationView.SelectedItem != message.BaseFolderMenuItem) + { + var navigateFolderArgs = new NavigateMailFolderEventArgs(message.BaseFolderMenuItem, message.FolderInitLoadAwaitTask); + + ViewModel.NavigationService.NavigateFolder(navigateFolderArgs); + + // Prevent double navigation. + navigationView.SelectionChanged -= MenuSelectionChanged; + navigationView.SelectedItem = message.BaseFolderMenuItem; + navigationView.SelectionChanged += MenuSelectionChanged; + } + else + { + // Complete the init task since we are already on the right page. + message.FolderInitLoadAwaitTask?.TrySetResult(true); + } + } + + private void ShellFrameContentNavigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) + => RealAppBar.ShellFrameContent = (e.Content as BasePage).ShellContent; + + private void BackButtonClicked(Controls.Advanced.WinoAppTitleBar sender, RoutedEventArgs args) + { + WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested()); + } + + private void OnShellLoaded(object sender, RoutedEventArgs e) + { + + } + + private async void MenuItemContextRequested(UIElement sender, ContextRequestedEventArgs args) + { + // Delegate this request to ViewModel. + // VM will prepare available actions for this folder and show Menu Flyout. + + if (sender is WinoNavigationViewItem menuItem && + menuItem.DataContext is IBaseFolderMenuItem baseFolderMenuItem && + baseFolderMenuItem.IsMoveTarget && + args.TryGetPosition(sender, out Point p)) + { + args.Handled = true; + + var source = new TaskCompletionSource(); + + var actions = ViewModel.GetFolderContextMenuActions(baseFolderMenuItem); + var flyout = new FolderOperationFlyout(actions, source); + + flyout.ShowAt(menuItem, new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Standard, + Position = new Point(p.X + 30, p.Y - 20) + }); + + var operation = await source.Task; + + flyout.Dispose(); + + // No action selected. + if (operation == null) return; + + await ViewModel.PerformFolderOperationAsync(operation.Operation, baseFolderMenuItem); + } + } + + public void Receive(CreateNewMailWithMultipleAccountsRequested message) + { + // Find the NewMail menu item container. + + var container = navigationView.ContainerFromMenuItem(ViewModel.CreateMailMenuItem); + + var flyout = new AccountSelectorFlyout(message.AllAccounts, ViewModel.CreateNewMailForAsync); + + flyout.ShowAt(container, new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Auto, + Placement = FlyoutPlacementMode.Right + }); + } + + private void NavigationPaneOpening(Microsoft.UI.Xaml.Controls.NavigationView sender, object args) + { + // It's annoying that NavigationView doesn't respect expansion state of the items in Minimal display mode. + // Expanded items are collaped, and users need to expand them again. + // Regardless of the reason, we will expand the selected item if it's a folder with parent account for visibility. + + if (sender.DisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Minimal && sender.SelectedItem is IFolderMenuItem selectedFolderMenuItem) + { + selectedFolderMenuItem.Expand(); + } + } + + /// + /// InfoBar message is requested. + /// + public async void Receive(InfoBarMessageRequested message) + { + await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => + { + if (string.IsNullOrEmpty(message.ActionButtonTitle) || message.Action == null) + { + ShellInfoBar.ActionButton = null; + } + else + { + ShellInfoBar.ActionButton = new Button() + { + Content = message.ActionButtonTitle, + Command = new RelayCommand(message.Action) + }; + } + + ShellInfoBar.Message = message.Message; + ShellInfoBar.Title = message.Title; + ShellInfoBar.Severity = message.Severity.AsMUXCInfoBarSeverity(); + ShellInfoBar.IsOpen = true; + }); + } + } +} diff --git a/Wino.Mail/AppThemes/Acrylic.xaml b/Wino.Mail/AppThemes/Acrylic.xaml new file mode 100644 index 00000000..5c833a97 --- /dev/null +++ b/Wino.Mail/AppThemes/Acrylic.xaml @@ -0,0 +1,43 @@ + + + Acrylic + False + + Transparent + 0,0,4,0 + 6,6,6,6 + + + + + + white + + + #ecf0f1 + + + + + + Transparent + #2C2C2C + + + + + diff --git a/Wino.Mail/AppThemes/Clouds.xaml b/Wino.Mail/AppThemes/Clouds.xaml new file mode 100644 index 00000000..93d3d314 --- /dev/null +++ b/Wino.Mail/AppThemes/Clouds.xaml @@ -0,0 +1,27 @@ + + + Clouds + ms-appx:///BackgroundImages/Clouds.jpg + False + + + Transparent + 4,0,4,0 + 6,6,6,6 + + + + + #A3FFFFFF + #FFFFFF + + + + #A3262626 + #5413191F + + + diff --git a/Wino.Mail/AppThemes/Custom.xaml b/Wino.Mail/AppThemes/Custom.xaml new file mode 100644 index 00000000..0714844b --- /dev/null +++ b/Wino.Mail/AppThemes/Custom.xaml @@ -0,0 +1,53 @@ + + + Custom + ms-appdata:///local/CustomWallpaper.jpg + False + + + + 0,0,0,0 + 0,6,6,0 + + + 0,0,0,0 + 0,1,0,0 + 0,0,0,0 + + + + + #ecf0f1 + + #D9FFFFFF + + + + + + + + + + + + #1f1f1f + + #E61F1F1F + + + + + + + + + + + diff --git a/Wino.Mail/AppThemes/Forest.xaml b/Wino.Mail/AppThemes/Forest.xaml new file mode 100644 index 00000000..88afd2fe --- /dev/null +++ b/Wino.Mail/AppThemes/Forest.xaml @@ -0,0 +1,27 @@ + + + Forest + ms-appx:///BackgroundImages/Forest.jpg + False + + + Transparent + 4,0,4,0 + 6,6,6,6 + + + + + #2900F00A + #A800D608 + + + + #A3262626 + #59001C01 + + + diff --git a/Wino.Mail/AppThemes/Garden.xaml b/Wino.Mail/AppThemes/Garden.xaml new file mode 100644 index 00000000..4f904bd1 --- /dev/null +++ b/Wino.Mail/AppThemes/Garden.xaml @@ -0,0 +1,27 @@ + + + Garden + ms-appx:///BackgroundImages/Garden.jpg + False + + + Transparent + 4,0,4,0 + 6,6,6,6 + + + + + #A3FFFFFF + #FFFFFF + + + + #A3262626 + #5413191F + + + diff --git a/Wino.Mail/AppThemes/Mica.xaml b/Wino.Mail/AppThemes/Mica.xaml new file mode 100644 index 00000000..baa97183 --- /dev/null +++ b/Wino.Mail/AppThemes/Mica.xaml @@ -0,0 +1,28 @@ + + + Mica + True + + Transparent + Transparent + 0,0,4,0 + 6,6,6,6 + + + + + + white + + + #ecf0f1 + + + Transparent + #1f1f1f + + + diff --git a/Wino.Mail/AppThemes/Nighty.xaml b/Wino.Mail/AppThemes/Nighty.xaml new file mode 100644 index 00000000..3644c954 --- /dev/null +++ b/Wino.Mail/AppThemes/Nighty.xaml @@ -0,0 +1,27 @@ + + + Nighty + ms-appx:///BackgroundImages/Nighty.jpg + False + + + Transparent + 4,0,4,0 + 6,6,6,6 + + + + + #A3FFFFFF + #fdcb6e + + + + #A3262626 + #5413191F + + + diff --git a/Wino.Mail/AppThemes/Snowflake.xaml b/Wino.Mail/AppThemes/Snowflake.xaml new file mode 100644 index 00000000..54a0b247 --- /dev/null +++ b/Wino.Mail/AppThemes/Snowflake.xaml @@ -0,0 +1,27 @@ + + + Snowflake + ms-appx:///BackgroundImages/Snowflake.jpg + False + + + Transparent + 4,0,4,0 + 6,6,6,6 + + + + + #A3FFFFFF + #FFFFFF + + + + #A3262626 + #5413191F + + + diff --git a/Wino.Mail/AppThemes/TestTheme.xaml b/Wino.Mail/AppThemes/TestTheme.xaml new file mode 100644 index 00000000..903b065b --- /dev/null +++ b/Wino.Mail/AppThemes/TestTheme.xaml @@ -0,0 +1,22 @@ + + + TestTheme.xaml + + + + + ms-appx:///BackgroundImages/bg6.jpg + #A3FFFFFF + #A3FFFFFF + #fdcb6e + + + + ms-appx:///BackgroundImages/bg6.jpg + + #A3000000 + #A3000000 + #A3262626 + + + diff --git a/Wino.Mail/Assets/BadgeLogo.scale-100.png b/Wino.Mail/Assets/BadgeLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8a28a3fdc4de42f858b79309e58975feabcc19 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F5he4R}c>anMpx`u5 z7srr_Id7+41_slYfssr`vB?p`NzqVhKx(`mz-ls9yd#SJUbryX5i}Z1>ko Y&sWVz3})<}0(2pRr>mdKI;Vst08e36y8r+H literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/BadgeLogo.scale-125.png b/Wino.Mail/Assets/BadgeLogo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..53fafc0d9043f6eaa91792e3adfd77a651664b08 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9F5he4R}c>anMpx|y# z7srr_Id89Cj_i*asGsJZCDG-pN2;~g*U z--Y%UcWirSZa!g?(!Ml@XwiA|U&TaRJn?->Qsn6^d54znz139y@Y*|__ZwA~AF?fR z4PPvzQO~*F+1W;H??wI|k0Td70s~l+)w_HgVzSUtP)pG1W80eRCt`tm*Eb=FbITQ()WL59g7%Jfwpw8yI)2Wz8o!M?FFXx zGyv&+>NrK8A%GZ$1OX(~q+L&oSQ-ip3$JC_1*i>HjJm_|;VttL-607h>#0E5FjftM zggHZI%PQQlV6JPg1uLQYv7@%E3Q9UNyk(hC-Y|9#bp{mYl70ssI207*qoM6N<$g2t_iqyPW_ literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/BadgeLogo.scale-200.png b/Wino.Mail/Assets/BadgeLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7b9e0816257bc8fd1d59da96b5c625b9339a1f GIT binary patch literal 437 zcmV;m0ZRUfP)pGXGugsRCt`#n!ysoAP7X;8UO#6+i=iv5F?=I`YvgvZL%vU(lmW8 z;P>!-klss{51%6Ik+d}i(8Sk}Hg2LZfDSitm4RA#ehqIR3#FrU4sU?SV);28p$%~1 z5(#P9)ClIJo#H(LM}$NmLTHcS9M~zw!)pqmi*M=xFBE5F=_r-B7F`zzWa>c{H*?4) zxIS?Xpqh|$byp!I6L0hKbs0r4G14%s11DD{%>b%5b33Dv@1@$zSuae-NF&yPa_xm8 zqG1{J8h1ai(!|WQrW%?RDK$F~(;XS_QMGtehBIxT7Oyq3GX2~JBmvrJtXu$02DCSp z=0;QvM(?xUxiVr|OQ~6r!XnTsW-G-<(T%_j;)$jwwtV@tc%m5a7NYf%Y`E$G zig?0o07*Py?gx;>6Css&C(zFaG~90hF|RG$AA!>XW+*?e-<(Dz0=JnEpVZ%C;`P50 f2s_LkQqS@S5zl0h6;Kx?00000NkvXXu0mjf$Lh3Y literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/BadgeLogo.scale-400.png b/Wino.Mail/Assets/BadgeLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..55f300a96f3c938a7bee537b0f28451397f85285 GIT binary patch literal 903 zcmV;219<$2P)pIIY~r8RCt{2oZE84APhvCnf(7Rwzy$f&`KEHWG^p&M^OL+gc+^*1PpM1M+XepWVXiV zz<>pIMd#PUfC{@Jj{*YJm$2i%eBZ0Klnbk|PN0zM`E&w$=4KGgy5oee!D8YF+G_;mE0qoFrFvx3@s zz}=!j>-VTG$lM_sG-^G^WJT<%(O^+-vn9!^nP633(>38MG)dY`PL9i>eAH<0D3@DS zL?jbDBhxi4B|?+rT@ga$1$l|!Eq)?|0SU`!uavlfGFbg`$RQC)PUU|s3AVTU&PKi%!}F<;*bfEqQU(+AYoZEqm7XM3@AP9w2&&i zSF;eMUpRV2EP@GBFKSB`)LVSQ+k|2SXcs1m_(Z4(&?cJr-k4^_r6YuY=gj~uaUgyj z^$39YZIGVsjOq&-=?L-Ls2Bk8$5DAl48o6twIx^9uqp_Xga-8~&9?9)p5?2dw9!a5_lw!_=krz4CQVy>#}`_a2^I^W&(Z(@002ovPDHLkV1kK2ixB_- literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/EML/eml.png b/Wino.Mail/Assets/EML/eml.png new file mode 100644 index 0000000000000000000000000000000000000000..7aeeb98f680a9cccc59adc61f2ae29496ba04415 GIT binary patch literal 8387 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/FileTypes/type_archive.png b/Wino.Mail/Assets/FileTypes/type_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..b42275231dbde34ce5f35612e713ff05b9aaeac5 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$qWpPf}Spp zAsLNtr*GssWFX+Mev$J^?}H6Zn_aCq)+z1i?*9K=|HYGckD^{YxNz|1LM4tzj{?+N zFNI7tdniQ*NSs7k=ZV`R{DYf46*)?a5x?}D8xCJ(RD$_dH!Bw*&h;uOu!xPml zTQ3wDoL-y!z+X{r;d>{uqz%FySJf0wJ^Z$&^xh7!Nk?aBhKRn_PT1QpP3)E1+(RN( z?&TFe@u&7LUCQ*gSAENJCS9g`DZ?4b~Ht2 z)tZIVOcC|wN9Wt!<11x}9!Og#o3C_Do&}@=Uv0w@W`|f)6-RPO1^zm)(OG8>GpWGl z>I{58thC>&U@H-#EY*QjU|RQLFBw5RtV2^}XsV3mu#Vki1iIguHDALye literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/FileTypes/type_executable.png b/Wino.Mail/Assets/FileTypes/type_executable.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fc6e6ee342ed58ffef62c23de159245dec5a06 GIT binary patch literal 678 zcmV;X0$KfuP)kdeq2yO5p$f^$gE0Kplgr+{D|(sMwt2l-C`p?%1J7ce{X^R3bX`1)3| zF4Aag{a4AF*;d z)Uh!{Umw+-ohGkUEMi?;IO^kglLQh8v}6(y3ISkdGKg>(R24ImY4%P}*SteR_WL*m zMAs2gg7Wf@&(8qJN(EUiH+wY=(ba`e6zo2990OL<>BbZT>i9VF_7>6Kj~a_%o}D$k z+uK;#tfM~fat?}~9+c5h%%daZ!vpH%M;a4~}V(h^ci%s(4KQ83TXYa=){RbQI` zdNPT$EX@6Vs=K?L1+)qU%;V!me0_~FI7s#20BIOhPfkEl5TOvVRBG~ia?DuS>|g8Y zbu5cTDw~^)+~uWhsMq@Ncd-xXRz9Fx`G9Wa1G-hqo21o)+SmW0-!6XRE9qK%XaE2J M07*qoM6N<$f*JQWRR910 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/FileTypes/type_html.png b/Wino.Mail/Assets/FileTypes/type_html.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf4e1405171e744d593257effcdb805d40898ed GIT binary patch literal 591 zcmV-V0PP(?A@@KaOQhEeE^ezk6LaON+pZJNFQF6%`U%1nL!==eO@FkLj!YfEo#{0#IH;y8x7vSP21GTw-MeU@?i65`amGdGptou%`*0ef*#-Yvn3X6eFM; zBcK~2pc^Bgn_N%gR_i@drucp%8*4WA0Py`r*1m}EH)yw-4CRpP^*WCpKF+@T()r9$ z_;Vs-d<|s+^YAyMMBDZO6A z&8=G`am-*aP_gv#?g87jiNXkgCD76_|C_^WZoxQFH`A*b5Ot(Cz+MIB!Iu z3V5EEeTw2Z4!=)N>G%62af}d7;f!e%s=)Z!9-a5R2;l;-zyB2}B|?Zo*Uw^U_dumm zVe{H1hlgEiwHnpxRVBGg{YB=uE+;3)2xs>3>2yA2?VX(mb2D=ZSk?wo$_r!GlzCIe zHZ0bLe+%t8E(hPg;fSq?`J;A{Bzd-!q4Dqad^C5T{&SC){$0oj=*9@>#t7)f2-2W)*ZxY{n(&n1F6&M#Spc*Zp8ZDrj znHP}$BP$%$F?@(EF9pVB3N`i*EuOAKiN}ItgOIucmz^%}cTd>dJ)w2g4UGMAXwh># z_KQuSoYDk*A5!Te*S3S*bx5X*c>eGMjn$PX3v(u`%Tb}c(q5rYU(1}9+x_daN}Ft< z!iy)5`eV(j+dWV;GEY3VB=qY1LCOl$n;kNr&j!XnJjiH|>UTu(+? zK!SkldL(v=cNXQk9?9+7d)o(9D%K6Pmd(yVT{LYUVS#k6M77ZwdcS5}^EPuz{@Ch| z<&T>bzPE=yGY&!mrAnJ@;XE+LFinmcgB@urf5Feo;7&CP6ARqf4ykmJfJOs`ffq1T7PVT{o5MptXuY~`zymH?a~d)DXo-Cr5^X<<&GrQk>z<(T)Z^yp2wt5D1P{x9SkUDVglTx}QAStD3 zP&z{ixx;O{ivvAPq0sMJF4%wcsE640DZKR80d@RX|Dz&XGwb zkv0q@9zIOZO-*HlWz9<|FIc8|u{jcnZ>nIprA5&d(Wxe}iDD=&S1#h&szrq;1{7iGRODk|l*CS(^_#+ZA zL^^%qa8J+Gbp>y?*dbULzV!Z%Xt{AQ6qGIOic?LC~i3+T7HXRZvtyz-ns1 zYHA9zlM?e&QyfAp2{v_g4GGR;W-OL>TvlBTwW9-SM@K=DMl1#aL>qc~ZZ8S~fE41( znX$2C-jO$n>CsU`Sk}4h@#5RrGK{b1CMQ46n5NU=%027i!^5lo&V^Jwj`^7x;iU9Z zwr%kVHb)|H5c2u>;GmgT^aZheQ4GtPoh>s3-bs0|x0)UxLe__UA5B|A-U*;>B zFAvAZMRIO#JZ0NoEpLBJFxcB`Tj}(%dxL{UD!$?RPQjS57#`fdZAvL$U0JVrV)xb@ z4&RZSpBU}$H!^14qrG8Li3COm225ew#~VVSk(K9H-Cj0ycYnui`<;Sw=~C4*p!8F3 zAi#E4RpngqGG=EnJvL^>XJ%{(oE`UgE*!sdg|F8yr(p}Xw76ZW`ZgFl%@`~31_FxP z@7IdlZa6dzRDHBDs3x7) literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/FileTypes/type_other.png b/Wino.Mail/Assets/FileTypes/type_other.png new file mode 100644 index 0000000000000000000000000000000000000000..c16c9edd9f07a2cd1a6884af37e9526125b623ef GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}~d$}h=``anLLQYH(XSKh1a&R(y5-?(T zqOgRaL-`3qhhi7QfeIHx28nhJE{6FX`+nZk@2h(Mt76$(t#|BgX$@A)S0oplV<=@? rVeBxM@fA-%I*QQU`^2hdtAd(RnVyLh1nNyp?QGJs}~)~gC~aE z$OVoC*yvV4_#x4IYS@ijP6b>iGd3D=L&7rwa7V&Z0T7q)TmZx*R)qi*F0pC^pfHJ| z3uu+WW#=sac-mZMON%@Rh@xCkOE#K z1-wQV`8XLnkDWFFPz(d3EkbEa8|h~wn8OcpL7I+MRZZE>R{Yy`05Eg+CfV_K`8-B@ z2S&8BpdN%)VBtdoYd%fs_7<#}8B(_g$j0Ae&CQZc#L;U*_-aFZd;6N{flHWA9s#hJ zOtP4q!r#=4zo{90eNDkV2(18s7OW<)uN!UcI#M^Tl1;?(bAf0VdTp3MS2t7V&SDPT z$7qiNp!iBC?>-<}Ui=K$>91toyv+SwMa5TF|67a}T!SyXiG|Ofz{=f;b|yn=Fh*)H zMm8~CaD8Ec?BoQg>sPSmW(giXhA&*VWSo^YQOgWaf4y8496kpAi0~FFY1l&5$urBw zq@ND6@NtsTme%~3;`b9gdR(-;xWICxZe7DNO{_1o=o>;*^z^x2LrB1gcA}M6{xI?R6!iTKW|wpSJ4#QcDF-r9U>1RA+2KFLPVrLpnssF zULp^Hr^pB*4;{LC=v&yZ0)Idt$u6yX5PyU_9=^Lga>ISI^K5ouKJb`f z-h5~0!+dAnu;6eQ;Z^IPW>Dwy%ZeA?1e2!2M8cShHnBK(JW;QiHXX{2z}@H2k_bh@ zjzDu43_S})!j1rhCSgwiLXog50LBvb1;9w6J_MjUCq5u%0;wTLk3zgpa{2dnX>UtQ`eauj zyCQ9gf#C5PnB7MEA4{nee0>Fn`O?Hnlg+I_ZcXaR46MHo7O#QX3M{>pH1Ryx+xFYb zoA%lW^gaR3poMXI04%@0oynM+c*J-qro`=nBcCGy>4JV00000NkvXX Hu0mjf3q>1Z literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/FileTypes/type_video.png b/Wino.Mail/Assets/FileTypes/type_video.png new file mode 100644 index 0000000000000000000000000000000000000000..829bd68609ad8d6c8199361459931649d44148e8 GIT binary patch literal 413 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/LargeTile.scale-125.png b/Wino.Mail/Assets/LargeTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..06dbbaebd7336c41b7f5c80667176a0ee56c48a9 GIT binary patch literal 22931 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º|_S%<*EA#!jSE6i}-{N1md$h+-C@CvR z0T1T|o0{)Xbg87V$s)Y44!*q$3((Tg^1>o(I?S0Lef*ikq|JPGpTRvYZZTB{Zr#ec z%5Cy$#ee0_;w^bjx4C-oQ$K6OM8;f1c|qr+lZl_tE6kUC?KCH|Vd1GgpW{ zee|V^3O~IRHVFb_@`D&>Xm4>O|HyxTFP&8tIdZs(CP&~24n|SGHAx-CB~9N0m^o=i$xl&GFRJkGjG0@Mp%J|bs)07 z!Rni13Ol>9`admo%Q=8m^2xs=42;cOMe$xOX2uQa7{k><@)3Z{K)|3tGJ7TeCdTZ|j+fnBzq_3Bld=_zKU?gq6$Y}Jy zf}8Bw8r2<#pd*qHUYD_OHX$30TC5GUZQr`$&=dWZw<2cj$a!|g)g{n!bd+6%$+UE0 zN`j&q&TTMncrvMRBJ>`4%=#U*P!fS1H*KZx-uVY2EWRCQJY%0D=v%dE|D`n|KZ4G3 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 Vlk1=6xV$}HN=#m~O8AHW{{rnOG`|1< literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/LargeTile.scale-400.png b/Wino.Mail/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbe0abba60e7a6f55c935c176db2808d7a21913 GIT binary patch literal 132614 zcmeFY=R=Zz)IV<1hNI=k+0=5Dds|uAa+EXo$SpW=p;);pQ!7(b#GR(7I6*<6B(-u6 zL`87rM8Ji((4XD+{eAfR4?YjB`RM&V=XGA^oY%Rox2DF1yeC9XaB*?*K74TZ85h^# zp?}A*qx)|h8+S64wbjJu(zPFbHHPJ*u6-- zrD%j-MM*l&bd0TCl6-J~d0hUkhJGQ3{@sl~mvZ`d^OEPF+P~*t7yf(v&l>-M;lEh; zj|%={!vC1?KPLQ-3IAil|CsPUCj9?r!k6k~ZZjUosxAEQ?uy-A!+_IWR?!Gpi?G8s zi#Qt^>o4LGR<*V1@MuD%6$Th}?2Ha)v1MUi()l(FA~9OAVpsbShb2K=?Y?s&#lbNO zlAi@xyI($|i{F|^ikO%!A>(sc8<6^n{@K2n)u&jxl_lB1M4Ryhqi?+zSl`i33-7L& z;q?g7u|j}V0(ZCr8{5|ofyEV@xJ$sN}IW2bYL*aRYv9gFImmM~^!etE9r*i|9m5FG`AV|#W^HMg9^%oa3; zDp~@xQ?Bbos>ZKo4ALvo?Zspp6YL(nCvCrxkjpPy;QUoc?^M5KG%{6&rKmnmw-Np)NM5$yJr_WYwUVW;^(FG zwu_b0m4kMbv&Ai2tKP$`I%{0rZcsgT_RdITnFL1&-nRRhdfE~y^G+#^=9U-&e0Q%g z%l;>;r0`4MR6~wMy5UVhI3TVqpA#+6S9sf|=fyRe*u_ee0KA*OZzd>Ht@EUxqr9-> zSCCn=_a0OiUy z)CcwD39&<7k)R=dE76p8BFj-c@cEh`#IWR5z|+=syHGWxUc)__V0!(Mbyo_A3LUYRuMAi!bD1Bm=;MNdP#Um}9Lio+$p5WG-zs<#!bM1gA z*Jxbsb;n~RaKojQ1(@Odq_Tq^go9-#Cw61x+Q(L$PBZNl2m$9^pDOe}Je{~oj9Gcu z$R}WFG6%=2FOMt?>!lmsdoDMaD@0qn@)IOt8E+(9cU*JOXW;E~0Z6%8&2My>e_=9K zt#m{y<3zP&Xc4i_NU-Li+OvAdwflVElJ(Tc-;~~%E9y%lqeBiBouEKjrfvP#CvG4ry3G+$_avru zt)^kOY26eW)jF}RcEFR|F;F@7T*~tHlshEVyd@&SrPuYvC+9E6Cab8Cw*Y z=YB2FN>>^nRgdgOWD3(l)P65SG)8O%rm_d=w$ZtNW^mNSJUj06Y4^AWzV$LLzuLtD z-!5Wt-1N+a3=katL7^p)D1aS`^`qSi02QXg5vyAgzA3wP-+({CZ5DrpXx2C7(uo%( z<;m^l^lH1@9v7H?Wl$^VQPVJU3Qj~Mwx8-!{NuLK>AyUQh~HaEay*`~EScc8)A^xG zPf%fOqkaj2-w-{()u6nu-89JSTj7+&61tBGA)?lYC)3zXwQrdAxQ|BD?_~y?F z8nOkii^rw9u;!x9!Qanns0lbh_x>1h)j<{&pknU5FKz)Eo+{QN#o8On>Hyn~yFG^k z$j=J2etHqoyloaM)JOe=V}n=Gah~)#<7?(diVIBzbKLihjy2TQ1H%U&d?0Q%jsO?x zP<*A&EdH3o7Nt_k^#=fR_miquXQk%9ktud>fW>J?XWc~406t+(wRPFfHkgTE@`z(t zP1wnLjt0ai%Sonk-7!Sr5s`sRuINk}?6rAfaho_}N1U)(@KtQ3SBLUD_nZzd>AVL$ z#mDdNYr_g1J}%%Yt>Y7N%8aG^j#AJ_?M^fXXQ}v$-moOw#-cSU6%uXRhFP6B95BWy zc%Q;vQ7_2*nmn8Rwa`-~Cg$Rccs$$Gf()l`(RUi`5nkTk^!?oJ6$~~vR+bms!Po~a zoJ*~SR`Zi2!c?In-yW6YXrnrA)!eeYcecx9_vr>>;}I7ZFzF>PSKv;VOfxpIJCUt0 zwu+px!mVr;>`boIZG3KTUwWpcsr?Wd2t6h7`DW8@RoPWpLP1oIgy0KR3wKJw9#9Zj zJ<6MgJgX&e2V0fD1@_n+fC+=4LjvGvqdKR^&S5~vrIO-DvKFO3j0aVQJbDjb$+z9K z@GHx-YBjR1%d|a*ZAKW)S#w{r=s_CEC8|w(-YGwql~rnOWuodlq9*zlCgmH`ZjF%4 z;;>$4N!_3v^`iWQd*2^sz`>8QUdmaD$AD*RgtqEY_q^dE+ZCRbQMHx=Z9x973^y&1 zBnUYy`Vv6FqQK-L5NphdOdqZ5jL<%Ab{=UT3*DTS`alI19)Ii#D$|;k1{^96QG|tq z^3YHtHR*E38QXQtIn*`}3|uFADWNI|`waSey&JSmOlGl4O=gg2e@qJSn3a8kyCh2& zZG+U%)HS+UY3RKZ3;JbMv_vLMPPR9DZF*nJKx7CB?S+O#ZYEBQHEw|6yt|SY?KsQ{ zQrE8YM*h6tb*`%1eOCY{J^ly@8d@Rum zICtzYKejSqKb70>Z7EB6S4n{mRfM#IUJ63HV^p)oWxEz-S%aQsJBv-tp8zN@XB`Kexrs&laDGa~yLOBe4HoXX)=&)GiK;XKna#ast zQaf~9AKg8lS~x{|EC`#%q*-`XRlp+B&fUL*q=d;PE1>Kn`s4guAfgf>_p%kFgX{dkgH+6F)fP(bG5SI@v?w$hc7pp~)?bSot z|7b~vit@C;PSn$H0|-dk;oMrSX}^HQ9e%RV!geVbFqM~8;oyGiAu_s+QDodDOp~c) zaBS3GEgN@;gc#pp>UpKs)d5!BV_XeUyw-4M-jXS5;|OA?aW9_jj+*X#tcuihJX;AG zd}!1(a`%VP_lyNb1+17vAL#(dEG_8OF0UEv4!txemvq^Ku2EMvM(`Vby+o2;bj?P#;qu=( z7W`CY`c1nELxU7U=#K?;ftzmMFnMw7aak5`OfCMFw@Ibsm&JQI2sh5FjT|*~^E3{<$C&XyePr696ZpkXd{e*&iLLLX1L8C22SNai5@Y|x30Y_axSNZ zLjwqr9b(LlxdAr;j>R{9M_l|5V{GR}qf7OpL=XGHdqfD{)pUxs?*m^)s4XmEYt&EX zR6FH%uh!UW894>=C1e5bj1~!;$^jvwhsXLZ99|TUE=i=#@Oj>;rY~wGA`XpFqt0q) zc&J}3Z*6}}-w3Ds<)LL1D;+y+*k6+piRW#ybIKw7QQlg5TLaVc1a?B=Br`U8AqjsP zxALPqzRe?Ad*{|fMG;q3!ak?0Z~hWxp3vuPk?>&-5OShn`*tpZ;310FhV=X4->DIor_ zDDRVqkU@;G0>YKouj8-Gc`z2biRl(h(f5a#Lpbxle`6#v?lpupF%C9d|jIUqBkj|E$utQ(GZJVof+R|4d*KiA%4h=*XlpPlFt;Iv4`^g!JjE9EBYQkFe zdaPS3bf`950K5&om@SqW&ugfC@%fEp!i{7JItdV z{c3u{R=O+$SZsW4WK-ciPNi;m@d13&$r!%?Z*-Uv^==a_hu_;qPe_XM33?^Z>lN|UIr=P92F~3Cc+j$W---s8& z$vPb2$}`+=8(nwX*8(4~_Zm|R*I?bb#fr9KW7-i**NFEd6MJ}MB(*=@8VjrGt*~ya zbTC#?^OO1cpjw@26ZfPairrmD{+>Eui%srQojWQ*IRo$6w8Pg2_0w;(_7>Oqh?z#! z_kXSeSCrY^Q6x7+E;gu7&wq9`OMY`?>;B=&I{wXZckvGga|F z0Sz!fNOwC!&~=EOEQ-;+E=_tuS>Ao74DiTbKuies;V_ZSzl2}Y+lsdozrw%}PbOQH z(kVcpbpLX2F~g>h+;j2UY~Uokgh6V(E?JkS%MRk1>2SAnI3PP$SBM$M{#w|^R7hb) zhi|MRI7I)wO}vDjT@&Q7AvagI%6?a;qW3A8fNf*y+vse?bW2KdsD-s)cBMjlm7V@) z1s7uNjRC)}@AHLJ#MZ-fB`_V>SN@R@&XTrfH0egw17(U9|4pl#>eODQjjf(tKfPYO zUnUrxr)E2fbfd^C13jJqgX*^C`RZFj)a~{@fb+CxNT5Mca-XrqfbqlW2Splz-Qsn7 zAN>IeOOKQ};jY?h&u6a{Q+xdLV9Qf?SZCrlQ5*-y)#lh<1IgpB$d`3*bTA!AGd5q* zmx5PG7OL8Mp-}(D@b*eYKA*>EE<=J*JP9 zR+fpD8q;EB^V#t|`D9EEhL{8n2~U_^{UFmcA?#4t9!w3?X1Vv0bwAKpy?~UUa+=?4 z%XxrGj+XPlz&mw+=vd>-dy_byLVc7h4}5TD{YFiN)Nj9dg(kZw2f60S&DHLQB`JIL zD?g^e&5mJoL&EQqdlnniu)VxP2VbHt?7L|vcvI7PbBnvHD`PBVcXSieY;ih0!|EcS z)#fql)_A~bGnVyzPTK%XS-QUEPBcKd;^rF<^c&s(LRREG+QXz*pGU#ZDyRs=SJwi| zW9o-Cn=sW%i_9?X-qwh;z#-+EV#r2kCMl}8OjH}J>yLF$dV8WYq(w??yM3>9DB;Hy^3Xvx}8fw|LTu163fMiO`kkEwyY#}Dll2DpZSQ&JO~@n$54Xd z8FoeMSqv&0JBcgcp@WUvBceS@JX!*FvQ{=GYnut`)U%KcBL2*7XT~ndAVq+S`e;8m zBgJfWwIFM~R^sv!k?h~t$y{As?Py5&^FhBpS+%M1G)ltYOb~}1(u61}{y-byOLWcQ zOMTToGqPxD-g!iY!@zG7S)GpgP=MeOxe7R(Uu!+C5gx*4?Bd0Gi zbU%{zwkITY_Eskhv0mq1rYP=r&3byA>ELsE%Rkh!vlE#3(1*a6CJW4b zQXaDZU3E1zMC~I|x+<#HPg;zQ`c83{ROgsOu_QPPegcJ>cAzi9_qTey~xqpiIs{f9`HCAQQ+UZg-v+Kj56 z>5mJ+PL#INLz#<~O~Kqxvuqh6w)zbn3ZQlWIf&FBC!mws7wD*OR-~6fwx_W`b_XD+ zNuDmMyq)<1)CIKjteefEwqn)llYHVzgG4cqW0=hT#-j=GR^;3L@!O;Ew=vr9V2bn& z&Io1C+&2E=sPzRB#XU#rL(=8AIM@0T?!$@BY#fyu1>3ILY^d#~?-c(5P>8{+^$pfW zj$#QL&C5djJR7a_IkEdh^!kJ&U-aUR)w&uF7xmyjI7e(kzR67ip(ZN0j9R6vUfgz!F7mefZxAtLRJc>n-HZ zWxnva1xZ9TKC=cM^JLJsvjggYNaBf)!7_bXMq7-?-zGjt#Dmw(_jD;p@*D4XHuG=x z+eq)ww2zXc?ZivPF3CgEz;aQ1J#>VHZzCY(HC4l56c?X^(IbuLP9KLS0xd zhV_h*oP41A!UM9fkGZn3H90D{yr7IS_&)R1UnrnR>H$rqctJ$He>1TBpsyUhA$~KU zw^+T24M?Z6bYJL`t7dzu{*E8~A?jJi?>EJO@~&mQI%+07=4@819#TYDsA4?kd-kO< z1T9pb`5LL7c3jG4Et&?gk_cKtU9 zZF_WT%;A?FUtaRQOySpG-qJRR*wHogn8z?-_@%DNG9I@l7Ss22`K-!ihel?%whky6 z#U3)617SzL(KP=$@2WM!s@IvK`rb-~e>{5@1G++Hn|32=VueNf~hOCk)VAGG=4 zhhnl**}Si%$_CbvV9YI)WtsBIFpgKOs$-P>O>@S0g92xqDC{TX%!jUkos0PcZCP3( zKSNt%d@%KVLb^@$oH1Tj{0O9<7M^J8pkSb*=Xg%>GgDF00Tw42!BVlqZ3Ima0>YP) zxyH|5aym3#!7QBi8)7_W42*e@Plf=5p1n(xVgFh*zWgWlll%9tPQGgK8Isud6x1@ z#gjB}lDjxvzlSm8=DZzb3({Eci*si8u%f{uVJGA1^qCK?j+k=4RU?B1hMSKv3b26; z>e9wXxXfC+9E%Zh3vQlXr{yfTL2qdxNkC4``#L#;0Q1{N}!pluJPx zbzplVI6*b`H@ZH@v^1JtHfACswC9~E$DpUH7z%eYH65paH4Vhxx!h!@owVLXa>^W_7inl9Y6026-oFv7&=L`#uWh3sS;*rjotdCw9Z=SFGpQ|x z?w2(XwS0%21M}T2OCrhU`?RH!n=&uFhh!#HJb~#aY`=w}2t`J2OWrn5v04}Hp?QY}dP%)Su`_5)V#Gu?l z!r$Eu;{ZMNu*Bit(R>eA*WF~hi=w8Umjc^AMz7}}wG{@Z6pW9&CY`_L=RWL^F@(W# zBQUI(bY`$F1!sK`KpnI@muQ+TiAOY{cP>wKkM4CYwdHQN_^2J=%CXtc^wbE55-g#m zFnV)Ch4Z7fb~Q9MQR!!==t|a2;z9!18p&T9u)0|c@V0==y4@FE8;mp>Mm4n69bKbp73yq^f?lNa!gU*0d|>7c43=b*4>27XkU?K zDsg~mE5x6hs*0z-r9YyxvN6Rd(F+n=t$h?rm8e??lmk1GZkNe;d`U~u`?-Td+~i-4 zbL>8Sv*Kyl2^0K!Ni#og15f=n!L{`He=N81gGD~6u)A3}wU*Fj+^zSu$vSjc_Kq&k z-UIu-e#@(7nP5vjIrqGq#Pf(O_KP}_ugcHHLZ?uf+Q;h0UDxIHdj*t8*4pgYkLtWx zg94VWBSVYhkAuTdOQnsWpB%>4r!&j{(xg@hZkG7Bh(D&;Fu8aB%Pgym_LMmNU7u)~ zoy@V76u-uOSN=Rc#1-ZfJ~nOjb8-dDfaOFPH@usW0Z@;KWLXW;b&z^r{czdv=JRTs zA1)6K4vrSxRJUKAzaiA{#PT!6Wn49y!A|fY@xCANb@%S56LoW5l{E*HJ6s5~?duZu z?Y!`|^9yKd8y$XxJoMC(=xxF5CYX#wWVg-Ge-_fe*lN=4Cr5xHTE>3<5zyM%Fx}|J zUBeVN4J~cWlZwTDIGffz<;ZKCuls7mQi$krE|c_qR!1dEMsLiw&97i`w4X=LqlLf9 zk@zDL0lht1zKNYZE3E#t{&Q8TZc3&70G||tcr$3b*}9v&S@#xw%_Glh%6wc&Qj3SL zve5)+`n-QV46V0F5?J8Q z3PS7KVx6f>R#B8=in-Nnnj4Rmkef#M?%H&r+s^mGY0-^TqIvS+g?P`8+vC`8jtG9Ok4)A7qwT*srPUYW) zrJ=*kM40NB+FIeQ_R)~r9sTZT*=6cs=fIWx{P|7_$hTIp4C@mbw(FicGt-&loLXsA zUl74f3o%$#{1f))5)xgCT^4N1YUn(V=-v7eUluA6>-KJ9!JD*1WaHIt)UwgV1K^)d|*@O-7G^&aRdM!Zbvo$DrVlLs@ABV z7kc(@g}zYG?dNG*L;-bLNml{Acu@QbZrI%{)2!cc`-*Vg`6>w=1_+wTE;bStS-yd>z54cOBaCfeqx zTBT>@b~C{E84(-s$7n>;Dph3+=8t|>F{)naAR?&_sFU|%r16l$iOkQGp?cpEP?uL( z^j=4LFujY08w=}Lk4!2Dr-D8ETL*Rx?)tTREpe=2C7sM-WC??@-|Fk~^6Q3V9D}Z+ zvx39xdG-hJlXYQ^;o&Ut2?NB=+og#N{SeNf125J0M-eYQ#!S+4aT<`FSF^^+kXfzA z4`~VHkJ9sA=SyqeR?q8^4<}o&u?5$V6Z4=p zS+eNT(oFbj*WN4EyIP-O=;&=PTn#`pjAHy9>38`1MAI&USXcXkEqQ&$wpJYBrz>F_ zz+5b9h*&b3zPF{lpP-`8>4}t>1#pEu`sX!d)D`iBr6vAs2_Zb)JzpY!q?qoFmD#d)@4>0<$;jPa9-}ihNkU@$D@sAtLW>IDm#;O z6$!2!vHj+{8#x7M3nZ>7#HTM6K9(V+2>-@JtS zW%Vl|AuB2pJ71*yc}f{&=PgN?p`-U%bp}C6jd@;5UoiDSprN;8R{N`XT5r#~Kij!J zoP7;9YU`qD?K0F70%0v1byWlt6z_ojo|rcz`+_xg#~DZ4MjDg96psZ*m>G#mpZvXE zuI`SG3%F$G15RhCxM;_dJJ@9veKhHG+V7U(-i*&FeW?9fCi;|~m?O+rgi9xGzthmc zK#)5>3!1jpQ>O~M`Ag5HeXWanL*=Qo)SoM+7g^Sh@>2Q2NoY`Ll0kDJ1Ykzp&BcvY z;QqjF&a0V01B$ZdGkNiy3XP$Knynv~3eRU%X7dfr+(CxLq@pnQv!UT9m2imtyw0fm zEva>SXRh@Q3ge23QeU`)HUv+%CeARvubqCMbfob(xc>lRb*|}SJ%w7s(=tE&blGmJ zcx5sTUq8|n9XS>Kl~OVL(2r4jA#X~-x$T7B;PU`Sxzo*Ei6?=V z<)EFee4j^N{GB;Hw~pflHJV1-CQSca9$`1LR1Z8V4^_tzhX0gFT@y3rCoGg=24X!h z764kmW4z1SXF&4ybsoB3%M1>B%#TeS;RwmB&6Fb>B@C3Q+IxSOmKMm(xnZ1W2czBX zVfvAm(s%beo!a@(9Z@`IP9v&)b8{Y3S-DkPmM{kVP`y2%&iWAQ!zZ(+HGZIJ*qF`4 zcz2mqZhwlInMJnSp|a=->y*vNRl0}WcPwvX*MlHs0SH)4X>*WxgQs1KBHz!lK~bnb z*G!}E{Yh|W4Y6&_?R~7~h^{Q*>(j!SAX2KWmH+ujbbs>$ZmwdY^9fx$l%p-H@GJ z4-!3kj^#f!eaXCbfxGF)D$_2Zayfy7_Aaw6{Zz)y03B%$v%)}7tt!u^KlS;4So*=` zO}ou8Y>rbotEJLnW)VjUvB{2hsAN;^^M|{TkKIG}I#=8%i@nH>!w0|yuWwriS%13$ zxmqTxqACW)AM|P%c%i5IbRqp&f3LsJ@KEwa6onH)bplssT2efWl8DBnAG=2Vkg|hw z%Zat(20qOluf|?nAp7CiH?87982_F+=)l=T-&-*siJ_2;_Ii;OY{ z(`UIKtJO<+q*w~e=8w{}B>O@>y00wRt;^_|Mced0RztF1d>uXi*l%cEs)w%-jW>~E zRBfpnHe#Mwq@VBewp`xX#7=r|%1^@)yD9Lud#nvA*ZBOu%6xb=r=1PUj*Xt!S^OJk zMC$1xP;bXMxW=h<{vmxl8m%tsC3yoeR_*_#_Wj$-{Bxbz2A2|Of|WnJ5>zyhl;j|c zB%&UXSyoiD*k(ss*wV~Qkr?bDuvO-AM&y;Vh97{hm7WN`-*z18)xko{j|OzB)~$vj zvMNQNxecB|!cFd}5bu!aQfP-J&&u$3FqLoH*v#X@(#0m&mfEwrDaI5w#^Xx5kKboX zz!k&6x!5;^4}l9{TiC}^#}ECfXj}9=5rN)Spyj?Z&6bD;h6gTp?k62i#nOaO^i(`_ zAKUxl>G#^{%kzy@VH?{iE*s4?I(%*=uV3^NJX!r+guhi9bLre&67VX`j#P=l>+YdR zNw5z9h{^EH_KJtjoF3fv{WcXLmloqV$6|ohpvsvO$*Os!MP-Nb%*ULogFJ}+$TU9~ z=0-B*6#=t0!!1bbx8##%^!rTZ1uG?CPu44isCcbWN>{U-7&j} zlbs|p><^AD$%nMnj%+irJ3(QuuAfvuO*q>{x%L0{dMc(L79B1C@mAd|$?-Qh@IS+2 z9osI63OETTm7Oin4g&TCXVTUyV+wDY3?@f8Hu!DFVo#DJLqw<@MqwuU4>#-m;Xr?qjHZ zO!;Zpp3B8ln#+>8o2n~Kt0QiShRmrYyif>haTM%XyWJ z&rnv*Wy}oSDc|~97ipN!F0kz+)Nghu9&Ygtb~U%$U6>=Kl=)7GTYt>UZ0hIi%q$@k zV$Gh|yh$m(pGgZT%pUub8sr%|PdgGz0XBD1?0j+B(4eY)IRLk@wi2*`Uc%yc^<$&i zXC3hOQxA;4J+t3a`fkWhWBmg+iTA2^0B$yxuAlwx+a+SvFBM1JMLNt`TAc$$OVmbp zY%hQORf5due-%8q^pX*nVieasKz;}fNClS4_(v!Q%wFXNvt&L2d(wwXF+$kmpUTWE z`HRLB^jVg}Kh`TX=g4-_eZtZQk>{G1>_3uQ7EG(6j^7GBSq(|Jovry5L#7D6H9GQY zs;PGnQ13oZxm5X<&i*=2{?<pX-kgFO5!noV&M4oZncyVwY|~Do`6Oef_nJZRIUF z2M&KSLK?2@s#pN5c?^(&m<(R`Zr`Alq+F0t1N7W0d1-jo%$?Wtp&*KB`T2NnnIZ3* z&+ZV_czcgc_t7G$1ux^Ln&mc+02R(zkFOG3T(&xEG8Sr#5W|+_V8OTCqq5kjwdAXV zC=+`FLDVbe#zoR>h1jqoR6`|dB#OAf>bd-O4Zl6OfhniWhox=N*+v$?L9f5 zpK*B%HmrE7M0R$riI%7?j}d!bQK6cBaxr0b5-I9N1cbe)cx!c>ALCg3(XDvx;L;D? zF?@81dIJL|4qZ1I4J8VY#}XQ%=6!>{#i*4>+u#>3Rzlu7R_yAbLw6X7a5y`Gxf6#! z4_Qk@%%J$V{P^}uLK8fTK#C4n1{=Sdq$CmvWF-OC)CBrYNjO&uG*5nC7UCp7Dut@lKg%cI`d3(|hKs|3T7cf#d-jI|}T za)CD9s>F$w)_#HK-Sl=#Y4R1UWTeL`B)gU%KGzT(<;`_TJPLOl)n_az8kX+LG5VFDK& zQ|4534y?G$32W#2qYwVJKSVVCY&0{L9Cvh2VE*? zbVCeZ-M9cF<%wA~)Vo?g7@`=5QU^Y^G#>1#MzTUPF2)b*eZBnL9h^}FY;jny_(}Pz z?#kX6S)Lg|6&HoHUAF|_Z1BA^*CKCU`=iMJk4T^WJ3+c(kcr;O73{L-{+Nt><^x^X zLA64rRalSF$rG{`@GblX@O2Gi%q(J+`}cS2JQWm{p;t09RwfDrmI1we3rkns|Ioun zC{Cbg;{+?`K!|&TC{(|%i{vbaj*7rtU$weOvX`8-{y26KD7`3tGlPSqSYUpHjf9+) zu-zS`w%T#~5Wx6y+0P_m9Q6m#dN!{34otFPgivhA&!p znr&xmpEPqOFU^+u%x{FtwL>ju1(a6@TVn?2^ZdGJ(3A_%GHB0nS<=L4Bns#X68u|J2!DylVZy&s>cFMk@?8-Iuj#77F<_T&y2T8nSjd0w;sTE5? z#ZcppA5vwP^9_AI6i+7R(uX{0+kriCk-|uRegsF$u74ohyY=RiHtBo~{Klu1G{ao{ z)-oQmE5S7m{D&|!OfPKvdB7URm?@rXrvp5gRn}(P4=O!zGOM}}4Z2Ku z-uf+*Zk{3-3hPv}Fsz+#zIec5buGJ?jH>-zmgUyKbav|PVB$>kNw9MDp)E#^t8lcZ z-%OWUKu9S~XE{`+B;>v;GZ>Za{TKzc#n2k$uV|Z}z2W9Ts2=K_!DN1EKbea^;_bDlqoSxb3_tnQRy{dRkIkqh|~BT7Jf&*<(;G6~L5tBTV8o}YB>4(lixdIV=7o494R z`Z}>7DBg7rcjg69`{Mic2>N+^pgR8$u;0CV`&kWE^h+k>*VcCWd}qp35^i5J*si2e zLWuPEVK3XPFKD)>F4f&8HaIv!Bv}EcV+UEh49~ zRY&|Cgq8T0))FfLn?msf4_nb$>NV|~IreGVykkgBhsF^>N3~KK@4?kh&EerOr_7I& zq`(sGz-Z`2*530xKolYg=9;};q9up;iqyqo0 zlf3*Kf)HO}rns_az7WZuoy@(k;4_wc+efVM0ei|Z`wec%`+q0WrEFN-8m6l&*`dh> zuUluEIdIY!tyJ~`{o{#9bc1AV__$oV>AB7rj}jMnMm}hpWUp+eJ#-+=2+*IU;K(|( zd*ktAR1o z8*F3D^nCB{)gYo}4A^u0-fg&XZ#CEm$`~;<{)_pNp}N5Q_61L=^zhRT&B!flv*Yf8 zE|p!UE<`bleg3#C?v0Wu9U71zP=10io*>;k*~?_D8|;}TTznz^0yS0*ylSh8zm`mu z=t|ZHv!=#0%2`}XFOKcUdjxiS*-zeeC%a6eJiGK$_-f0g`00fM>a8yBH53RJmzw+ZF*zyt7Lu18r!>*0dA1Q<`J{k3|-WJoA{i(I7?=2}Z z8LV-7ixbw_AO!v`P_&WBi#Y3J5na5Tz7|+QRkh!{(eKt!i`A_+=_mjCpan+gb*3b! z`*xf6n7jS%|1pw5g_FlG`(*dPa+bZJT(H$$4adULkR#$KC0m2O)f*7CRkZ`>7 z7na*K9G`BOji|E!MG4#7TgnXzWzBa(FD?NOO!^o6nRv@D00 zi$5EWip+(JD@B}ssQtZs!*lG-A&&c?*^YhOg?B2yFDFb;?GrH~&h4|I<+-Cr*fbL`3b*c#$b(=h$m;6!+{snMY36RioQr|>f@!^?n?atpT;-;#q7A0Y3z1FI_r zxbkyq>Z|T-yfQjr*CbghSDNh+N;qU^q~lx0tP8FUDG|!j@{uXOPqC0yWr>vawovZE zZVhFhz+_i;lh=OfR%tmS+>5{}rm=n9*GYL0ti^Lq!w%}!CadRy5Rqu%8np&C7J z5uK_l>As1725o5#8c0F%6@3AVs_k>8Jie6&ca4h8(8#i1K#OJL6~}LT5-tsPiE!%}1}=#`_MALXl^+tR~w31WySu-lV zR}J2!3E4qXLMgmHa|RexdAknj`$DpfGic60%bywRhiToyh^Pl~7UmsD6 zcNTWn)s&8RdjPVzS9t;v)!=v~WZ+$m50!ABGH{f@y<>mdXRb1=?)7VC?4vdultQx! zHdHG6${ko)JJKsyemn8gDXl|!6?2%w#?$FllCyC9bCbUL@Hl^oyOUz~g@0S-n zx=?jlpfU(ke8isEq3vA-Dnf@GDQmak{qR_J@nVRdDsy?MbB z&K^i_6fe!Ze|319i#@myYKsvWq7rL09aS{q9TH=53760RNi6#k4IDnpmraN z6T^jU_G*m2so4Z!TZ+4f>?^(%zQb28v+TbN70y1*ICPEc(}dHp{>|0R3bsi)(?R=J z`2YA8`~Q6VaQWtgrJLtIyT4I5da^5HX3O1N_HpbRJqMo7-?0S~79dnYqPaHgeEZ$x zLqIDg4pkLNJjf}CP(>p(txx2Nwp|og2E0BUBJWF0<=ATbeIAQZqYQ7i3TCX*j&Qq` zWFK^B9w3=C*1xD*zew`{6_2oiLSkR$3YB$(0mURqlb+q;xW&1*TotjO)-5^Ol8R@h?Lme7DeM-cntEAYleeSs` zuysZA(X&#?io~jqfJ6UFAX)#9K#ErE6rXw+ohtkF<3i+1ICRzpMmJgv^AH0!n$?fca<=xOH_t@cUx^<=Nj^t`je8C&4^+tV+lr-68 z`&H}bd*4KqEC^rWB@u&G&l9!JM@?fYE%;iVy<$G-uY~<_Y*hapjd3wZi4m)KnqUX% zmRNXiKXpRuKEc^GdElZ25~9|usYDO7s4V%6gSedR^3B%xRdxO!I31e*m-*7)97INB zE*|mv@rV09X6`}K71-aodkDVVM}|E(y-D)Z6Wr+_&04p*D7_a7Cyb%!pfWEE@Z zT$Dt4jKCleSIm6Xg*KAWr$i1{2&H^N^f0U1y&pvhpJh5Jqt=*5ai`vU4 z0GpD6yRX+5bA7YJZn12p!_dwNc_O~kkb5q(eiys$e9}3&C%mV*!nXKf2k81Ak#@a=m?G=H&9-0{(7 zZ5O$UpV{lsmCjpmN(7dt#fSNGn_SjQs-L>XJw&-p(jUs99})&5@0u$w=V8!(VX9Tm zPglvZ{R8quTpXJ%W}A1>=}L{oiEki)?A*xDJLJ>3=UTfz3KUx8zyB@;o`0yCsdJJb z8x#0r&Xd36U&i20_&<)m{VTXy9H4Q!{u(J9Qr67#N!EktFPvf??Onkh92Qsw64(~j zXFmddR0t)yCY*Pr^nMW=A7a^Soc>8JC<;*LqDER!7T+5z&tru+lm}2X za^1ph{XHa`_Il*RB~i5QR`KE9+Y63w#JoQn0WEo4oJMGADFbsq?sP`{UxXg5`rf*~ zo${-XiZYw;czXTV5cnlF0pcq^oY=bdI{)Ryf|Bj$rZ;sZ$TZsZcfDl!OMFQsQK5jR zo>um#eDOIcK9qc*R6hL`I5BMSH|;?cT^yjb*M_8zF>KpxVY85 z3ow!Us>lz!9&YL1&i`zFAkt^Zxn_fbha@fgH~WIo6*pebOa{2IADqJIAGWqnWz81K zAj;bOHXOz;6wDXoK8se9d4DtK5CtHHiJNz*>$>ZlBYK8MHaEb^^&>J|QLw3#<{flw z3o3EbEgINdHRhx3xK9M}jk*7480jPKrk`)xcDIh*fA{9eU67USsmEM=pIwpOOJvhR z*&Uo*k6)0fb3zYDxV_^5vh@7-l0li2HW&s0sW_jNGGcj;)O4Ley4=?u;e@+;=Qzs7gCXyhxzD{MXWGT@ zUqtivy1e~VY2Ewo>!#23@T4C$Q1S_H7}Ex+d-wb3^PWA2w>I2P;YkfwoA1E&8k!r! zZ7*2|!0%nah~BMub(Z^k4Y?^LycL)+75Fog_ zySux)L+}vXU4px8++8*t$Tq>K4f248HJ+&C^ zv#6A;sb_Dh%d|LE)D>8@DQ>hYj;(@f$A;sIJ)5&@_bhp>#M`>>uvxT}D!TfXd7pf` zHc-{7OetM@W|M0sre27v_Pa3;N zi;D)D`ZXV9qDV(U4(MQ4IA?Ov3|kuOFLKjIh+@U(Z&lqZir;e*ZLxu-4YuD0zRT0p z?*7ordCop4qJypwRqeSNyQJf^9FQ=ANEBqT3(rmM*5K0@TCFne*IEeb%h8VwBi!XB zh$|zn56K=0AKF)4ZeP?3u4fS@iLdvh)ug7v3>;Jc)U(6_i8i^jbp%gbguQ@7$4}r= zyTDTDec!0O6T^8S+tSEsZUh^biKmx0G{&hI7+%0tYQl%OT*>I#`&=tW^RznOSQ*v} zowLdPB0?QaVqweRO;SX{wE_Ak9c2CuP+qN<`(T;xzVasW-*6E`UBl=1Ijyo^Pl++- zDFxHiy9Ql0`~y83x2Af@x#qcYfOm`JLHMQ~3M=b%uLAeYRbEoEJD@K35Mi^tS>G7t zuG?|%rgnL6{7$~2OlH~FJxl%0QGI+#OOwEZ&fQbDE}5Rc0Um$h2#IO7*5O2otR3Y6 zS`&Py>Gjw9=_*aZrcWq~Z*TNxhsgfz5b|qLM6(0z)UAt?VT^s3r=zA~CmicAWN5(> zUpZ-g1-^j}Ye=IO!bgvVeK>Dc&x9^r1dv~KT!+8q8W~yTpjfH(iYhQwdWTY5v(`5B zYZUMEM?f2Z*B*6N=ZVrj8j7{8Cc3>q$tt$rpWc*$6SDmBd&^x)CQyZJY3u5&0k0Ym z+V`nt6Eod4^0sm5L~HgGiMZ`&V;&uIV>dVGYILVSUB1d$K%mtO2^=ktV20u0f@&9^ z+L+48sJ9H+Z1VF7CN(y9l6Hc*SB(`AAjOUN`(+DM&i^A08l1sWSN#WEk3$tHFcg=( zi_4}5TQU-{Gk`FQA2wNPbv-Snno-9@MnADvlM;fB90`7;kXY(CnSa;8N z#ibqRTWL?1Oms4vXj5&u!#RyDEz%D)d1ijS;tQi{HCQU2pLF8wtc9Crc+4z`k^-T)UC?~8u2*p zxa@4FreD`#w%R?z!dm96cs5npsR@+oK4vvI0IC|mnmE+NA5h=sV56|R*8RyEYXP%= zJx`uCO052@8uyT`*t4N&CxzXo6BB6EP`1W+AFw-o>QH0w$yfQ<`@2Eu`2;t3%~kWf z*thh~Qu*KK%EEO+^;+!8tz{ZN&{6o3nBnJJ)7-0TkhELG4;`#69*LyW|zx;yVJC2Qh@S`!kK5EG1h(j>8(8n()_4~JjI8eMGuqAt$e z2e(a^<9F>Q@ZnqT=IU>?QU$Cx@d$OB^jrbFqazyyngN15AC#j?cO+djW~0uiV@mtS zrmfLspbIPhhca_@c8=5_@ZPA|vfk>eC13SjT&AXqR%M2NsEH^7cY0`fiph^O=*3wc zkG0p;7Ja(Xicelsg-afO4Y+1E9(9Pi>;ki}#!q${DFmu~{zIj1J!2Wd+pa_n63);G zlAY~--i03f(Q02H|6^KK;MM<^7or_aPF&FQkoJuIw?oYlppu%!wh}1MzwlC4gd_Bi z>j*!{pxOZ>oggT|`UHJ6XO+~@#U<SVf$M`{+E0(JA@Z6)K68V0S6ioJm& z6^O>M#&yAIdvT2DkNYBEP9bRM?2>6UJE7Kx06YWL*>bg8L$Nk!z^1lI=jNvrPeqAO z&I=`2If*z$edIH=!#)k1t}x5*DoRF5wNBo=_ut^~VA7tws%I8h?IriHp+cqZD?|*i z=M_*|zo{v5j~A+k8~VWq{hIC5cQY6Q31no>gw0n9bwtmH0|lPfJtRF*=q9tATJ><4 zZyp}i9ZuBIelOJ|BCfivtPk^YqMEtG?L(Dkl7)_h#t?oYO~)Pj52}Ly4M_d+%S!UO znDju!kk5t=VZ>TJx2k3nZJ_>Jvl~qV28vEHD}Po-Vva)!v;4eoD4xyjQBQ-ZiRD|B!=`&=$TA4s0z zcv!Szr+cC)-KDdj)bkB+jdIC(o0e12BDQV&jF$7JtHczwXIq6xtpmxWHl`!6UrGE-iFX z@q33flY}=6#V@Qmo9xeXPae&ZnZ88T9-Hrq%Bk!Q%fj-kkiq8^0bETuYcJ8CNV)ZI zvU&;0KhB;wwCd4)NL#@+QKXR1YlI=}wci95|IVADCx6wFVlb z5R_B76!S50VQlXVZ=|h5xivd4{D~fV|CUM41e1>5E3Ba)9}>GTDO{AUx7c@9`2-xC zRT!3ZNDV8hAkFP@1Bl0g_d-_q2pC&YJACTi=)=Z3CgZ2uLa7sh33;>Sv`ktKtuRsn zFJgr+3IjRg6h6yCNt&k?TC4DXGhsX9q}?$M8{#CY0ScqRJk*Mmu?JdmX}!DvcxKLp zPW=EX6e2TW#8Ok6oQVb|GiPpaR0OKGtp^V`?wd-XYgX^QMxa3F@+U|CaQJG{5aKDW zZW^X6L;nZN45{EK47S*!Jde2`EIqN%*&JG6H)fKgcZ;YE7^MtTUYl-rbI0d;FVxd& zPEk!whF<67CgJktzz%{*9jULFHo7ug0JG`S=*)SbK6a+jXRYB+*64%)qad8hC)mZn zQ(8q$qSxBpsVaquafrUkbvZ8j|6&vKU-rRkg_gL530D3|7X_Q}fH+by5kM2>0(ln6 zi>Bo*y%Ws)0LVrGWXsKjm*Dz}y2aXr3PX}u#}MiVvi?Na^|PkNY)1+qOB5gzuiEQs7xI(MFcBqwp>Cr`F2kZ0{f2x3 zOuT4G;-#@~E_N7eM{ea72D=00B8JM$Zq@W|Wg|EwGcNbvLwGHw#$IGJy?Jx%tv-rc zE5ZQJxsw%)UiS0!a&9YqTuS{LuhL}I!be!m*y7ev2_15=P8q8Vt*d+b$x7hDd2k zfw}{zQng3d$T6IJ4j7^FK{x+V-MO0rU$*;?=BUN{yF9tvl& z^meVl*v@`?!gR2X;yXc>-hUJAFY*HYdN2$Eb1%d0-y+6**u?M1s#Ex_UrU)9k#!gE z6&`f6+PU(KcR%?*NEik3ucVU25xG6B6lhWpNDO2iRo}`^C^=5sr4c2#X;EKA$hprK zUahWYm%W!VS)cKhe;5+^4)R6IL(pF0__tNBDK2L;$~Al;Ci{08;bZ0AZ1rr|j<_A{ zij<-k^Fm-2NW+Vls}oXxINf(o3aaYRBgrUsU9mJ<&Gm2Yp<`V29%d>bzZ>^rIToi~ zd&=gqna7A+Pg^)mHD7Z@R?Sxn+Qw8p>2A%6%bVVbX2*GXTS^|LDTCQ~3)P#)0k(xi z+^8WUrwethI6$Qy${GU=ltDoz5Gwn?V~x0dE630nS%WY<%g9I+VUG-e*&0l z$2@Jav&z$GMkls#7vb0!DDB+X;Qex$Et?k)tK)!GxHuxqGuLU2&#hR~0%qG@(NeuBg1(HO=S zQw|c&&O07)iSDb&ZAS1#gdM1Puk{oQBQu8D!jTg=8;sGHvUf#SNaP1;^^jrl*j+vy zsN^q|oSh$yd|h>M(Eyc?okHnhDU&rRT@%ZF`q5B8Hh-3J1WoXoYYimprBZVh$s*=p z{REq#&N~8-Q&UU+lS;pI{g0ycLKvE0SDUk~7w)%&dpV3O0Lo`Dn@g2iXBRzi zJQ8yWkWv?B1t0G$VouG;8PzMHMN$R1A3{gywN;5}g@+|iwok6YSl=}k{Ok(%F~vqB zS8J5Qt~yp*)m1)*+qz%1v7A>KyTpW-rkO|bKRZ}WfRE&84K87<5YjE!rG7N0oX<5# z6a8AT$-|jn(L7XH+*HB3gUoqdP2*+YM<>)mE)$yODxb2Kv+YI3aN81;!lVrltR}L;JsEp-uCiPI|2ZP&7q>1Nd;d6KF>2WlXp@>&Vfrs--)=mdQcHi{TG+&wkb>BMeL>P;z*1C;?elwEKm^?F z;~Eo{X*1%K1N5uY71=GHp(j-W2G@9p@VU<-u%-CI=cOJx7#vbXvSLd|_kM#Z^K)1U zpl0g@Qt=bOepM71W$osDwbF~O6!6LaS$O8ws-?*+>wV19I$yVT)ic3z>OiZiqb(qd zRu6O|p<3Q`j{TKc6cZDAryD7Z8(AZ%xow^|+5>h3ZTrtjWyqrmDas*@QeaUXkK zyogj#F$o`X#HpeZI%a*DQW|0{KA!p0D3CL{Twi6T%reYNz{!E=#ajBgQWed*7aux- z(N<&Ksi*aICr2*u&w+&d7sWgt%}gcF2aX#?*~H^@*jN;{N>or7B&Uz zqb-G^@6An;7cLrh#B_;p9AwXqI&Ld@}xlSm>SqW>Sp6rQ2^hmYAZsD6m!}Is75bo8m;`+BeM3 z`Dt)mOPY;b}NV!q-O@H$d9&3PMD4E2F|7h@=tc@=PVhef}lOrSrLAQfg0ic1R2 z=O{1uJ?)W$dHf*VPGsnrQAv$27AkD}+OC|!C9pY86%t@NqR5YN4y8O>y_W}DEAAdE z%(C4m(wHIfJ@&$E!oMtIl$u4GW9OpPM-mCs#=tquSHAI%GW{+8JibUGFN@-8uD=xLlS0QB zHfyLCNnIe9g1LXq#&@Xd^cPg8{759FsdI0pruP;50{XBxBxLrH!IOW2{qLggiJ?tF zbRV}HYMZ4CZjzLW^Rl=7XX{=dJ2k=?%f3*k(xS%(z68S=w>iG2ZG6O`l1g<|PAewO z%Fns{Junx#69I7{64X&i7g?k4$Fumf`bjybq2 zv^;9k1X&T5p%+`fmOx?Xb4)Y?yeU{JB5lGd8!#d^gpdhT){^%C+2nXxw@V5Cu?({S zX}coSE>v;9RP-=$5FxUM+@c1GYzAC|n5Zd|Dq2bz)c{Jk@@x=y2GG@oRRXlHRJSjd z79np>?3)3+O29K)<8~Lkncs8@lZ2<6TWMrVd;>%6ZQk}us{d-omA{lNX_6kp>p9-y0vn4d%uCoQQ)*RaPbFQc+_dDgrk{-Zyk{vIpT6Xc-*3xBX- zan&k;vPyferah40oTbspwta|D_d?lhLakn~sAz@LpA`dMttnueA`Hhv)vK`Z)F7mxcI6=A#N7v;II+SUn_vJ!)o|!N_dvjh;8A3V=yN(cJ4*5KSAHiVUFBTnVM4fx z>b!O6j9BCYqx(42jf2{7VSn{i`xY3Mw@J^HrQc}1351%laCt;FzGGBqSn)j2yIfpz z4bEU#90#o-Du*D4ccmxQ@mQ_qFPoa~)xCIPB2@YdSp4<=xr@ai0b-~P#RD*1v%*_? zfsmK9igLL+arB`?oOX1oleg$^jaBDv5!g{=orU<%&%+2xP2*xBM(FifH;MsS37n3$ z!l5l{07p2Z>orwJo$!aeLoa&2{0LqD=6*kN_}Nn;$gzV!?95qtQbumQub*bx^g8%P zZfl4vcOL=I-8}0g-Jb}v6}RayPas0&rq&@hA1Hx!*q9TXFajhIyi!?EIxRHY{S?fu zQCUB{r(}DPbohEcMsR%U?n0r>TFGPt_5q%TgIm1-OdoM?r1~E}JzxwDS8pMxvR_i= zCu^UDLefz0Vqm?KeVH81O?9r(h%9Qgz^@`qk-GD%WJY)DodQ>jYPa>9COg$$%$Q?> zxPeuPku9FZE~jL{6r80a83InMOkxrxDBU(J*;f2=N`?|d#<9(iz_(Bd)1F)em*I8i zJDf2`{71}~__kt#moqPfj&}V2@uKn zz4XW>vlj-~z!jHoYIb3Hed;tQ=A+6i(K^lSB0m}O8H91z;wQjhIjqqju)fa=Q~w;j z{gLeo-t0UuNoLM1x?FXS(`Gid5JFhOt6Eq$fl~e~=k`5J^&2R;qIxUs%6EdLbaS$4 z4K`yU49)79Go`PC0-|;5?%Vx1KDt*S!VGkpqJmQCF%tJUK$AP=0CB@zS@nH=g#(iP zE6g~>Pv)<&At*z^i}7-4His)pkUIC`l{2N^cEMF16sFnX4WjMN8SHVQBsG4>Nhxu_ z?T<6MRxLX>?d@jJ>2;*0jT{Ec4(|Y@99gnb>a?xu(TEV?IMh`};cXNl494^fu2*Q9 z(5S+&l!a{^smL1%9ClNX)fV?xb(E;6KPj>^46_qEzBXCx8-p=-sN2{<|lB#STYs&$YwD;jD21gX}Z(@hQSo4-sKGt@rR)@bc+`ppu;Z zD!iS8!EZ3VGynpbV~QEsKd%kQ8j3O_yfT!+e7KFfemPEa@E}U4)lDseASp1ZD}{v8 ziKCQ2pP?|X@i>(%4<(t*jkgB|y~*f>KqyLdXYy0S0pbr|ed3}?Qe21HV9p;UF1w-9 z+pAJ+vEWP+2ZD}8<|ich+}}kziCDttq+X6Rp@hhwIPgJBpTq9Y=E?^}rc{NmXG^q? zvRfd z2B>zM@XwEp%|xQp?#}%LVW7;~7a3K*LX$-19}UKywv`@uuJ~A5>~5f-hc?< zCoCa`U?ld#jBoI^2gnn@xT|$IHk)B6CQ0m!qoDzxG#8iMmz#s z`B*PdXHglI`es#w*IV+FDoUQCn3h_si;tBVf_c|ZnJ>ReDfnh zARd!lcG_||C5|vJO-R(Pfy?lJTPz0mH<{)LYl_Ok&eC813Jae~t3!xTde!`mbfVsF zja!I<9W3b~P4+5J;p)UoKro_ceXN)lFO@>Mj;EjLeJ#xJxZVGYYn`3qmzmtH95Q1y zMLu2(%r4XJM6#(NP3~1KVhcBbDWp|{^`cVB3@ux&ueA8OTi`@9j3w)v16mIr)8G`# z2#*IC^xpkdm)DlELk$S_TvoC9+=Zb*PfdxNt4}PH(n7A|bm<&9X6DCT98Rnp1|%uL zO6ThPV^Zx_Ry)J;lN;Y)yrju5MVUTAci5yMnh#Q-Z2Wuf70`L2-BIw=rplDBY&4^; z+aR7kXM(EkD**FU4gAT8Rjr2hPgLXy{L4^_OGm|rOj8LdToCF8>Z9nG5x07r_A`MM$fX~t`9!aKzsv5|d6Q)``FL7h zv)&J_jhJN`rg#_6^U}=YOP9p-#C@>Z{VL|Ds}#^G&f%qUQ`XyiZi7I+o7U#Ra!JzM zR`Bok1-t07(XyHyPdgTu!xcM?4nsiw?{++j;BOH`JpCiN`xBj7#bW*iO9JI=yhpn{ z48q_nrjmqbu5hKf2KwbP(T>vO6beS)4?|m=DctVJWsE&6`*yyJH#WMPJMZ)Aw?wpD zwo3fq4;>YKvb&9b04s<1?+d;+0l6D==Y77{xZ>oIno(x|7(--*)F0{KR=Q%v841Mt zb?r7@Q@w&=Ha0xf7p^v;aNtuJ;^oOu1=YTJ6bqr&1%7$j)(wAjn*E@Ek6P@w^s$65 z>+Q5lew_{Y1jZ}$v<|uzMRWnSoU+wGu*Ht8RW3`ib&e*;Ae?K0$oFsG>Wp%cisCHZ z?D!zL-iNl^5HWJuj0_?_iX+iuB_{fHCF>XHb=;5)oU^wizD#7&shY=?TPm4QHw2zzVeTt!DhXK88j*-;k$01>B#~4=q-8Fz|3fTz{Ucb+p92R3b~(fi-irl?^c+?X)pl$s=A_GGJ_ei0b3yeNHxLCV;p@_-R1q(?PF*ra{Xb8{w33_nWljcOi z&m19uotHqC4CB2c%f#Bs8X3&87}e>4n7eOZWoc*i)G;jKN)`gi2s{xg@_Bsb&+Nm< z|C9Qi{L>JmnTR*>`IkkMUJ2p^2fCExNNqE}!LPO{VVOG$B*n9y#-(HUc~~7l05u;1 zZ(9{k1N<$o!8L`uvLsXxGcdH5$m_L>3b`N!Qk0k0S4s7=Z=o>gYd&oG0G6v}3>ZTK(LQ;MLGp8?EwcQ< z59G-tUBKg@2L-6ge9AjMfPxWvnR^j`RB3v?h1_VdxA_v1dinBQd()5ts()`%%2;h&t?j%=0;MuTW z>X32+y1}cYk^ho@(Ouf2$joGOdg16orwfYn$8#B<6Kl(da+2i;eJMPyt&jy861rMC z+Cc#tNcMZ_5dTSMI86VRw^7Tkd-QZ@FGEUZn^+x9aM#8#$(91c`7{Z>nW#W%5KQM1 zs&{cLVZ$9C!X#W@k}?5ht^usWySC#MhoXvo)QYJz=K%Q`p$%kZ2Z;BcL1e{H!^3(|(EnjvIm*9$WV9H1`v!E{7!x!zx7YTBGg^u3b) zx(IW@z8!v?+Yzq)Vz>6W!k{h>lKGEv0Q%oodoW_E*}_}`=ra6W*PD>C z&Q}7u4&mulhVGHGG02w7_!oVsV-+mpoVoz$3pcEgelfX<#NDnD%(X=G-`p7`B>@h!Y*@mUk>%Ro=pNQ}K2$eMA(q~GVS2h5_cy(H_^pD%dW608 zW5R}B3{eJZl~YM6%Ci!+Qwxx}bespy!}qX#{M7MTbfapYOc92{Jo{!zWg6ujDh3@| zuP15PevgCx20LVL`7s+*(y7(JGr&{hs3d@YP!S zh}*%Gcz4Y;VReF&8Lo~(?&cS*USjx z1s7Lb#1AiX7&{{z7kjXB<^T5-d&M(syis>a&7)@i+(GboF2&j)qto@f>E4b(Qj`}A zSL1b^PBfbC%BGZ-VNMa36l5e%S~m{=(XzF~ZwnvbrY2Jn&dxK##q7jM*=9BmcD|LZ zDNH&sQ^651Zbtdz(USMMKYCjnj)9szC-funL}dEb3EwUyq$E>(BkY3Oq&m9_t$>Y4 zTkY*~Ds_`{xn8;xKfKPp!VfB95vTv6f66Wj`P&KN@CMW4_*u{ATF$x$I%|A0F3k~J z4#IlRgr1l&-3H%0`D0B8j&lFRIB1=N+M&o55gSh4AbOsg3J*I&v>qSR-41wSd}BOo zQ)4P>ix^@8Z6Qj?J2i-j(gH!y>WzOra0>L@VzO`)%|R%h6^2;WD_ldM&V>bVl3ks9fgJ?@%aAgI)bB`g`tSQ zZM;$$v0sj0zTDaIA-&JPKVqJ&HGv%-!kfq^`H24{9jJAlNGI-IAl|x>tNYyo$d+|2 zRXS_)7dGLQbt=x&HAL@j*$I$>WvP_*v1pVWdN{{wyxM$!=(ByxYO^=ATaaqFvW&F* zKo7)U>$fy7H%}iAIv&gj^67Mc`7;k|ZyO&QG8NzGw|vaK4fqbCq$82%ZmEzYuNRHB zZJMjEv;#P2p|5kv$%N|uDl{cq0dV$M5c|VFq{#=5#yj)Zk(mLdoh@;pqB54)s*+^ zR8dyv#Eemz|8c9eFq4T0jes)+xT+HTEamA~@pO@=9-(`6`IC%q(TU81#>8n_No&rt zX0LMvgVsSc&ZITmZ#U>Mo(9nI_crKFm*$I6DWxVaGbnZ`e#|LVs0mh%lnaDE+8xNh zdo1=V6^5ElsA!d<+pJNH6#L~0>x&P;*r%66zV{*o!f$yNia};6i^2zIt`wn`d-%9} z7O1j|_tHXOhY;*0Tw#j(I5olmCxzhiJTqitD~vQhqFJW?l;wGL%Twe`J*3ED_NJ^uxdQ9nl|&H zg;}*r1#EhchXd|dy4b@Qa#p~WF~QoK6I7N?8b9ykY4WrK?I%{qIWMbU{Bx5EzW*ii zGxUG{9(re-Gi)#}498~Xn7o$U-4_&4nArldo}U14I`3&i2T*KRLGtMGG^ zvJ5ke7h0{BL(K9fJB=MeQBCPylN}32 zQpwI-3A1WeZb$l4T2epzQfldsM|ZCpGUyZxjV=qo$MK7qDR7YGYh_7$y&1LIx{bEA zv9(63bwVd}L}X3KB!ssdHB@F{npND!;?tuz#O=y{Z|EEgbRU`-H9WZ~!MCn4JpDFa z`I_79tfs2a1Ag;qK0Pjq+W{t2wjK*|q>ro06Kb>3>xMiJ8EIp57}CSt2&^{N=gXZn zn>n@MPji$|ih;pD#{%IWn_{JwWT0KKO}{z-!n81Ic5#;Axt-^BcZ@99LARmzvP(w4 zEHc1K0Fr=^ZBLn2&aeZoj*SwVV39zcm$k`G*G%9T^`IV$)@uOEQ zDAVfZJ!O4-_Mp&i4X@+%@-%XggdlTCT)-IZio~}!e?p6lc2?SvQJr}l=KY(W!z~5H zYrE!0U*yS&;?C&EXBNQ_mpLEDQI5(=`|CQ_cSF$HSNw&w%&vQ{eF|*t6+brKjGq3a zetP@_rh3T;^}?GZQgJ1G15>W_dF7%*gZA7@D-qsr-YonmN z^AZ-WL0Iz>E;Ejg1@YD6FoqsBhc)j#FyB(fdX?apS;rh=MbPOxclR4V1Ojz>=!X=D_ zl6pk7$_2afiNtTwcJG*mwkH?mg*2G!#HUi4JGl0^_Z|5mKkRo0?JO5EIJIHC#zLk@0fhvm>RRMP2#6RjY&jT|5ZTv zgcCwiucXUiXJD9CA*?dqda}nA4s^}0a?H;>KS@H6WdnT70)6}ZDWfcEV$SB8Gwn*r zTr*0_8#H%MgaewiFOoG)I(wl5Hkzjvas6pkjPNJ9KO0|WS8$RTJ+2vHeUqx}E)X|D zeg>~AH?ZMK4^9@@G=L1(`jZ9>jUGh-Fr($>7}9vmqP)~D2k$woGMseq!7r@Ej4iX+Q2=Ha8bIYwVN z_&oM`C=bfPRZrU|4of9dwpKX#WrslGJg}ZFmi@gLQ{>`GUGIM3wg6rW$Fo-W+G1_7 z*>LAgjgr^h@~n*MDedp3ezIL9tv9n`kEV*}1 zftmewT|#=?u;cFss3`l2Zm+dCt==XC1?Zp-w9+~RcSX=yVs(%hMCim6XHda8Tx<$NPr4_39dVb5>6$`0x$o ziEKRn`A|TiqB8xp8^$C=Knrk}1CleBibQQCnW&S2hvWA|_Fz)yTRdv&B{2e5^Q8%> zQr=|xeo+0bqNSK}{UAIO$!7N|9|Xh)L_%0V*{}A{$z{vG)YX)&A;|R$2g|~O_%4dN z@rUiy(X{Tr-*w$yKFr=%k`d?unbJQA-sQ<~%=>v3c+1@o&{Tbk$pfnq9@f~EF3K=k zirhOYMBTK4ViS8r%5~SQ$;I=e+nnZ$v}n9wnWaw^I~6`|K%ZN+x>NtsG~ih4Mfok_ z-ZeXU-IvaDpPT#sHP~PY{9%_&>EYn&%Lv&n$Bt)bu67H#^}JbK6w52Ts71w`L%$5t zhr1}rYNpSF&P!e{TrgCS45#&g zo8d1LCO@GC41(@vQ4)6=Fo)|kz;RmAw4FE>NHlfuX8hvebc=KrQ4nWFm+o_#iDzD4 zt)CES;AJ#%t*82yPCT~$v@>=i=XEK;nKH%}iLj{@_a68Hu-9e@|w=djv7VPVtT?errkSWLb(jPoBZ@!tj1b$5dre_XqF4|BGmO zp&50P!_7n5?B4?AxQ5^Z1P_4LJP$XrpnywW?rVL5%-1d0Cb!G*3$^#Hd6P~T#9nOy zR_+`g^a3;##r8ruXvlN%I50~{V6gybzDTpM0woAi)x|W_ufSzFG)u^wx;8BBPKwb> zYhaOXf&W0RN5+AZ`Zk-u!TpoHVppHJ_ni0n(Amyb^X9_}y;MGmXT@+Iz4vqVHTd37 zj5_m*!*( z7I|sHI8he-;SSAOx;=4nx(@DR6yzN9=#5xt5R{V%Ae*3=hA;sbxjutyi0sa)o$wv6 zQ|%kgczmyeo@TVvL6gjxL5)nq!mf2Ots{PV1UJ8B7wEaq38JZdtr2|1k@P z{}l4#otO)knn_6W*7o~W@8nd8ySqO*PY?T?pdRxXBKjdeKsMCNMRYq@p-#02lliENVy-$m|7buqKTTdcBCf zcYSl5=9t8gJy&T##dfqSbY={G;dZP>)^p#)OZT(~ z;d^}Czj&NY18F;DY+td*zdC6+;EYJko@~YMZFJv@^-`hG!^kg(lZ*tr5X>ILNMI$b zhwMv$MJv}Do70UOOHqKS`&vtDc%}%9u|0dYZ|v_;w#IPM zzz%xU^1W=g1W)Q7TuyQ^Vf}T&i3P3&$9y@K9O!P`QlQV8OOwGjliic{brpe4H4{eGK2ac#-h)W zH!p)5HjuqKkUKnfNn0=HWRhh>WAc`Fc@@RodC1|kdIoyqYA(jA!!)`f9S_1v9_48< zNEpxI;}zJZX-b?I1BBrLg_b5aqiq&g+$sq$f-NTTY*ajB1qgiewT70ma)!6+=JRE(9TT&=qF z6#z7mRhVY8RPz)3^L|VefZy1p04w{q92vJwF}cnZv!IJbd>^*;`K=|084`vu7IHKc zNzKiP{GGT2^(LpE#78Qhvr~6e$xCFi{@~w#Efjo;MtfH>$9|b2BGZ0p-9$F1cH1f9 zITOC~)WMIluqP+un}=dS7m?@MK8|Kk7guz&3BIc=D6es%MM5d+(7{q%EWSnj^Ah8` zj*3rlQlB9CswR*GfQ?1cF#$1#B`hqG@4{M_1EIDRnXyR888(4$!~_{Q3YPd(OM?be zZNHS)*0O9@7TN$`y!EYa9#VV{BqohMu;0t*?<2FKinGx^@4KnOK`nw)Yvfwy>56(1 zv_xs&p)15=-8fP0<9nrPhM876$h-poBIc)L`cbubn|2~?a6fS>z>-DxsE)V{a(bs; zISYOdEXP*&6f>+Z z_QQ0^SRv991QyF5@km{V_~{6G(2;FBw?Cj079GMS7T+Vr+S3IlhGRfpNB%43?i&fj zkMLdwg71BhK_>_1A?>_rMc7O6jp0og@{*|eHu=oHc{08<+Qg71obQJ;^?l-ChLXe% z8P7v;5R*ytnbK^0j~;~)inBY_OhP9T1Mw)oL|B6!(*oxv3IkJHU4Pg;g*WmNXagJ8 z*T39Epi@ukfhFVo9+PC0h>R&%)qXNdl_0J#S(+@+I~Ij5NHYgZ_A4IWI~FDiy^!6* z;(bOF7mTY|OPR7|JoJKg+NDge(%MkGjomY06H9Q^;K1)PuYoU=9ou+3=Y^H?dIme$ z1F>so3YM!F)3?jJpQx2JVJerr-xXEvWt5fqCO|LP^f)(D!#pf1_MY=!ojL;gFI!7f z<0z&YHhvD((=o@P3`PiJJfKoGFsytuBVHgNyO;?C^>}y93{dI-LUp*mem;>ki@9kS z^0CuTM>7^;VoajCp^3NhL*d}dWrfYT1p9=@R-D-Y>mTATLeu()F}VR(?Zqa7mJ`Z0 zdPfQ)y8pR4w(2lXlY~_K%MIgzW2~2h4Rb5g&^-a)#{)$;1!;;Q@huUIBTq&(UBg+= zwT4$%mEOFbxATq9*{3sBe(@8CJCTvrdF87LPNd@hfeyMhl~{D$vz7 zs74NkwTPLQ{~<=Bzlc#LcGi+FmL^=0{B+z>`_mDG#P*G%2}lE*Sn{Y@6%$U+=_*)e zD}4Z+_cmygI+QnEhZCaL>m*HQD{@T-A`wd>^0gQ_qk2sE=qm%ohqjar(oYth1RAe- zF}~(_FIP&~;X;Gor5heP6?w^AuHKwsN?6ce7=J zjLQ7^p(qqieqd@4)Kru12OgX$GkQ-hbDbGmfPmUXs;^?DQRdh`c71{9y1aSAx;=-c)eA)7m#!LBAN5+q<}fZlV7y(W!B? z;$Z%pq3+r+SEW^n0jD8pUQPCz?;?Ly%gpCigV(+>At44RTyw4Z)G^04TL7Vg^BruaQ(;6&`h(Pkd@C`DU$N56HEa=#4iUtE>W>$}<^ z9NsN5@~=|+i_ro zXeKCfIJRzPqh0&x+8x`xZ|~fQ6VMnfm`I&93+>@rQw;0OO{e&VZIn*6<3z2QWDwDg z-C1ne=QsF)j}qfD1$tqbLN_nORz!()OyBa|mN=~sIGLwcB+Tp14dGV`-JfVu_+ZbiS((%QB{Q2CMxWU4}qFG8ic? zeIJfC{-{BEw1Hj020U{9#b}2s=ob%Tbgvh+q>btE3PFZds1(HE0cI+HHQdH#;4*J- z94(I|>?akZFk>b?RvGs1W3RzPA@+Vpjm>omU#0bR%;&Y5GbzZ(0_E~+%=V6&1!iu# z>aM7Wcgvt1^WD#NSN%)5YTL}dV2{b(#nJo+-;aI0jBBs<+0|;XygixTYtH<~4!j3a-}c)Jv5!_R*m zc{oyLty7=fy=)3C$>A$Q;^Ju`(kQ&3EaQ2So6KJ!TIDR*$=3b~!~J**4H8Vz>MGK; zoE5n_Cd(lwgN`Edqc2%~9WO}J0jP`XtXP$i7AS`r*@0=luHX}qNH_}6rNUeHmka-o zB}Mu>lI$tAsR2|}OVS$LXAXk!2#Ax8<7MI`l`)a;|69Gk3-s4X7kPsOfHk4 zdpp{;>-^nHuE&Z_CrC{f2v(b+BhEJNH^NFdzs9&4JB}qA*TrRqhcjohclJLP7jOMYlcGZSD#rb3%MS>HgtQKpS}h7VDG6KL5Z27DacD9ox2T+qS>-Ip=xD`2OyHyY3ou)x4@!Eov_t`Hs7Z2smH4%(bHw zQt=s%qIF#z7%nqmwM3)+w_g%129-&C)Z!6Sh118UZjn>Rc|EEYr+RKgn%q)`vt<01 zwLJwPdIi-m^G5Wf**z1IFZGE-Nb7w-_Q~T;KZgsiruu~O*2?hzn0}Z;rDErSB+RqfZjiyw!OfrXHAYCi^iO-r{bN8` z{_AieWDt*+?)!e9$sLGs>N&$Ls!BHCI1 z8iCE14?!01ZP2&3N-m$$BrdS#d!V~UDZcHSl6bUEn#i~Oup0%Nyk^5atyx(^S?~g~ zNz1rzRUm1izY-X{aEDefrdgKjxQyL!mOPK4{dC4 zT(;X9Dm!DWw^yxS+K-U*u6f_(o%Gc|e^~({@8^|-y@81`YC$q)xkD;`a!aViApvQa zlDZ7u`eGuvJe!107m_pRI?wx81;PP6a-V)L#wyavY=A7Xy0v zPsz(LEFyd%(f8{lJSP+xQO$^h+h`Olv?FT9DbH=0BWvuh?U#RX-2aVT@fR+D2t@`* zP7PBK<&-DVU==0EvHfO?k!&{lHcJQD#+cE&H-O^wSa`J;Xxa1>X!)d!=LN6zHvHRV zHv*exBa1iHGV#+4egrqcH!t1@uMj?3+;v7TRkS&GPUcULzb?feNLdT)-w9Z#lvs5% z_X!er>X7oMlEWZK`>DT0T9Grd0sfM|_)et!_U&dtc~ioI%vwN_E|L!q&NZRFxqLN8l_+V-w!7 zP|JP|-poUqXNO8y6!)vX-n6TXO;?Z!E(a{Fm*vXsg+pdwhmoVL_;u<+p*cF=O!0Hj zNBKp=(jT)UZYb^GSweqosw;*Bzqkn-WEzOt1-tAvM^)8EEIUNr;TKdYaiZqbEf+ zCZF(l&8m>R7;Vx*-k-4AifR2xKsf;=y2-Kl0;`FLrh@6WTrRQD08PLU)qx=OYb&H9 zVf$zq&FN9IK%)JyM~A!=YwOhdFKe5#A^5LDwc1E6)5nkr zslx|Sa>j)-{IjXMfWoun_oUxE-x_aA;|?tN=a0f5DbBz({Qgo=Gv;-v> z9R|;|7%&N5b6xRkd13)mEIXP%8Gxyg6{-7p0?DM zV9i_2{p~0NGzH$$oLfvEOdV#t%>k@OKll$6t)i}$0$eu9lOSNX!39?$n5SK1 zInl@MQj9c@@4;dF)-IztmgqZ`U78v|lS<`>ND}dk6-M)y@=G7|E^@D9YH~DI-)=qV z~ET@RAs!0p&ao&D@bU}%^*;WfhtFdb0=Ofpgf_<{om*H!RFba zRJ~i*h`{1QpeXctr;5~6_s1Q-)$^8xgG{jq*1c1#-`E9?q2|w;8rrHV#}_T((y7ck-qH|9`}nvqIIE46pS$c<~{O z+k0Q^vKBk8EURE@b|(dLvOUK`E21OutMy1pJ4uJ(TW-8T{%H^*{>dP0W5u}mBT&E- zQI3ySW)!`QbtRuYKkm^}KXC;exv<{kS)4Y=!|ki3TnEPe)Lz+DyU7a2Yz)NhX^61V z&fvRj(aT~Y>+Go10iBONF4H_f`7koI@y?oU|FDAM&JMqcnbHt)@cV@BB#`A!wQ@}$ z{;QNw{ompb$f^v7(zZocA6Kq%G5Y)J?E+%b!T_Dij8 z2+Ga}S4)AgKVD~8n`FS#tlK=mwA|0x#vY5Jtukp>F?hv62f?Dn^I_@EM{gW4b)=2K zBo3hGcvytNQyCPk&;Lx087qXGEE$5NESmxc+EIP4^<@1hd;3i-G4h38zuB*IIu@?m z^A)8V?z{CL1TPMf3FB}(86{gk#A;zK8Ku*W&;$pcl&}AoB8xN1j|IHNl z^&1h0A*%V9L5CO_7E?aes3qFzR{Yr`H&Z5)uu+Q#-n+1XkMn?kt;MlACwV988#0jeTg2eK4fDxg^96o5*BXE{=Il>F*RaODQsj*J;x1mZm1EAoylFQ|%So zBAJmWYboZ6%gM(~j@IhOp^}Jkfj>WrzKnCXXnK>Ar8m?2Y*NLLwwI0ZlDPcQBhqYf zmqA2n&xwc{?5yeLfFqei9LT%8Gb9x=ZAp$OKweZ-<6Eu964dmZrnm+f>AWg3p;U84 z-=1FBy8cQtxE~fd8prA) zp@fan5EFZJ2xAVI1Qk{$0@R#FM}HRV zx7Z`^8Q(m7ob{c?WrXmhbK1ETpEln&jgs`1MWQX*^$iCv3inHIHYK*-9&1@oO-hIr zS417Xz^-DMU3Ak)F|POVEXpFA$nn+AEoh0;nVwRK>84u`ydNAOQkESn$Ze+@sS&3; z#*(fBb&sP9IfUZq9tlv(2alIL?wQfo|Ex~u4E5|<#$|ckLwoDyc7xA+8322-fY>&s zzUXmJvP+hJ!M8hKKrK8-T}D?cO0m4jEuv?iTrN?>QpRSDMmO4Fk?sJFh1`8k2lPSJ zd8V5u9Q@<4RsJJE(ia3qb~B0g4S{zAYG|GOL`^{y^4Y0^ZqsdR+Zz(6iqM5g#x};< z-ErtlTh5=`$X5r{m0hKk8iCgrpfsGOnifK&@(qX}O?M?XhO%RlCq@&H$e^ve zkg*RWF0l8@WTF)q6U4M)>Us~7$Hgnfxtg>o$jf!S6Y&Q2yEMO7GzzXGyrkK;z%Mm6 z$c5tc-i}hX9hRhnV!xP>1n~+`VOEK)R=D@g0NnjdE3;ePH3$7TgdDlsvVi1jACI_> z5X(1RTyxVMxu)r+g&M8rzElD$9Sv(W4{?E~SYGyxJ9jmWTR1qRBsQ`#klgTvFnS81ZC48|HM>n!DBQRj+sZ_ph~Ay!X4 z^33;fwSrDUpD9e_BO84zJ5fsB;tJG*ABIqVWVX7PFq-6O<78``$Bysz93ahut^HF+ zn$v$#H}rXOUwXCE%FL|rtaD#O;ih!F%*aGd?sv@ghmX7R=es|_R+$94aOH{(~JT3nXBAZP_*p{ZXy)uJw&>}C=|t|BFzWP3u+%KU~v-X8Nq z*tfpK!QiCwXR%$U8|ChwSpw{pNBiAmdwBF;L!=}Dj{6}BJXCJO6ZuOnx3d|`{k6UA z!jrHyS_Hu)0ekVXLDk6zZP3P-n(JvDHyh(;>*DO#YNV?}7Hs)Wv10PO)7xwiMJ*et zh#eW(i7Rz7vs*mai}~haJ7%>h(1tI|QkLzElvOeIa0Lm=j&O8h=z=w6P!5c^(-@0q zbK9Uy=ehLAGbnQgYVc;z(w?WlPuraziY{Bjk}j8YJ=&d|zN5@vO*c#;l$WU6vgQg} zq~lf~c8mgr-vu0KQ^kn>*#a*4C>|?3&*uu3u|K;bHzctLnKBc<J&t&1ZSSHd?I# zEpsb^cfHg3Ojw>XDu1enX%37OLhq6wQ$aRrf(IfnmCFh|0ryLxQrEa5r%STWj@7#q zWmvNPo|`k6H8mZXOPFQM%0GQkjvu6khN6#CHUl(uyHvPYYi|T%v+urFa=4k*t&20s z{0UgM7_+8(aUC7Wk`Juy{J4*J&icH$jktEnd~hc{3IcyoB>*1I4}ea3DA&xLS&*ZL zgLbg2AL~dYWx0m)D3Y1wR1i7+I;TR+Ynafs@jL*JBmtEwMl*bp?Sr7@K!t-!dqx&~ z@srOVlq{~gkee^>mEDUSpO9k^KwoD4N1MH9_xbu*(?Yh0g(u@-XnDM3oa{K`=7_^~ z=<}wH?trEtc%foOG9=UQq=o(CKYyz@=KowsJPYEDPR<-4R>QM$;%OUAkc(7t(D zD$DI!xH20edo8!VaBQq51zrow;_9dg6Rrm z&0xvoRMQ#I&XxIG4|#|?V`EpyS3cFcch15@bD==Gi zaat>fTyx@;+)paYbT*fkU0F@KSUgPK535Io5L~<4!@#K+lx=*%kivzrW(fT zxD+6>W_IV$l_VwW+4qBScm2VD!EKuWT&Do~^m57)!SZ;Km>oCK zjRGeWABo-cIH>FsB~2=%VWd|Nx#|-=Q9>D>*yr_2cDy&~&&A5^vDMWpPilYe4)&ll z=fY@o69`I#baJJcmY|a{yyU?swG1c1j%=)&C?&;GTZfcX@&MIU^}_+q{^Ps}b$!#T zRGi0iC{Pezo+}4@&@>+W?~qC;j;J-kfw%XeU7f+h#}nd#IUkZOkV?5QUdm}*J9eKqGo)SZybC`HUyq;9FOKf%&0UG<%mteyK)N@92!4RxSUUyBId`_0 zcXVbo-0&SsAzfq0MlfpCC~?^m70sd2pi5Lm_IWbw>_APchaIU~SJulS2TTh6zF6 zFk2;F?@JEBjv4b$z{h_67jW!~ipySP3F*Xf#hHqedxqiqfw!;)QWdd^Yd&k}`;)K( zPz2p~115?B0gkgc(*#R(3`t^|41#VZ-|N0E7%}jh>lAH_ zsWKnfV_SnCqXpIowt;oPkd>trL4Wl=-7@_u)Z8FugY*)S$Z)3L9cP6ek7uYIgT<4E zK5d;?i5`Tz)#2LQPK(%A?N>H5dP}CZxpsWaFgm+9QTEvIRjjwcSLcUAXBv}Gzonx& zy)8es??j#C7MG7{N93v^9OoDFP6QF$12O^0MQppx5b^0F$6}X zJ$_?^?L@KF4L_WW4;90KDx6|GV6zkM7-3@@R#lr^5j&TDYqhxs8Bf);0cwQjtbdi7Vd`2*soT6>R= zobfhEsWyL<8G`klmKR?y(X;kxa3kv%JB2aE=?hd~?j!U04l#Q@Jh8%0vMdYu4%bIh z06Pcf=#l9Fj#MI~HdP)gjOLJV!*uDS`N6g4V~=?9A`em%0QDn%Gh zAfcQ6!4khKGei0y-OG|;<#GMa%Q3F;FwhJqQYTjSH=}=TQC6mtSKvtyectzCAFQh9 zNfC$SEiwFP!>`H}Tv$|;zr)#Ok2S(D@EKv;g{nPSw~6+>-ovs)NGA$qT&#l^)8LXR z-mg|{4w|Le3iLRpqJ$hMoj@aIrl4GUOaKBla%2#{t zE3PgN-~A;2<}!I`XuTVWrJvbYrNYy0@^BWjKUKx;0U(9m`VbpdUdBpIaZe2rY6~ni zmW?(78LFmdKYCyODC%q5w%XM}2=WxQanB|^IL$ChTU|T6X4z)q{*;^qv5>8Rao{qrb>TrWxw2IP6-QoU3Rw|Ei z*YHmxuHa)c;dewkqJ`+DQ+qT`6k`uPN%~pQ98;R8+{t`(zX$Nt;3s8y91Tn<{43Y^ zD!`E4L|>uyOBkTb9Ahli;=a?0@_yS_3^;h%IZfY=QmLgR*I)$>vYS!wGGO!TCJAI- zfHPP}Gnj=v+XkITLVkinO+vPW89?0%g{_-cfPf?AQOL-73FrTg7HvjvyrvQrib?od zR&K@`xZ(&kaR%%!2?NhJ1yDNJ#!R-GDW9%UliIQ$JPzD|P7^?s03N$UKf5$RN~PZDCuk~z`478idf`MFkIZO| zyg3(eW=}40oC?)`5yOmLE?4xwVY#<-$z&4LP*9XW*r*1R zNpbRj(HJ*o+q=P4z@xrBkMciV8G%1S7{2Z{ojJ5}gf!_DvkWg$DnPfUkaW&7I?1i{&)0!e_E86$}%GIv?sM6-FoweIn)|NviFJu)FE`9 z4s`R`+O95XxvrWnNw{MZ&CB=F9p^htS7~R;aSiFD8`6xyHl0%~iNg1aLZh=GrdyCM z{h2mO_2=KmAXA0Sf>0fjDe!Yl7qQ(r?E;gOtWqf{Oc^Patm}-_&4lIfjY9pT$EUVS z9m7%#CPj%{<)s7S-s>Pj0z=aCY+&J|PM;`zemPu3s9kHm>ya89Xi0AlGgP=j_R|GZ z^|FpH_M>+83n-1>=MfNOmRvWfiZ3FVdGNO}G%<8u?4Z+~WwC zeEbiNGLA;BXA3duT$^CLEHUV0o@sSo1N3RK&h4Z*H*U9ps)*K_&(0m2Mw|Ker1r!1 z>}BxOr22l&>KhPxvBs{sG`hs;C@&_Vu+e0L~6?-jUW-*mX8LjxNEr7KW#t%V#032S}v z!-@wsTy90?Lrp}8SP7|AhdqO%(I^Skm}#6`-sd9JPC-(Os%x^qXF~%hZq$huu}NCfP;w$ z?hdEqj?Zze*MpCyi0vQM-UfarahaI=^8VMgM&iVQ7#Ln$%@u0DNENWBVseEkSQ<)x z==Ig3hh&$UMKFdiW)+r52*w7le2BEj)A-RbOrh?F%4YV^OyaAb@|~`U9{q;qdgk)y z_L}#%cB03ST-k3Zzd=PjRxWUI1KSv*{&irH+~mpF({d68W~1PJbEMZ#XxQX4`tTSw zewIDbm&abC`VIr8d^Ix>YxQq2jq<+)M`K9I-FfLk6CFn@DC~hHcJy^CJ*~pk_HZ{< zWM0I-K6s^tSXYr9oA-ucoLJHrI9EGy0L3hsB>1YkM1#@bYY^M2b+?k(ack@zE?~EN z+_0s}8%Kt{WiPaObotrAN(~rrN`yhlQ23Pu*`q7Y(EC_3NQ5@%UY)z4>%p^{Inc=cuN(&6azL=Cb%JDC#^Bv=*QFQ+_hF zu#fb6b#q*d3Sc0j@&&yk8d8H!9dxOcB}YEv0M|@@q%=DUV3uTwoTP#&)>iQHTlOo< zN*`ych;3@+V4EUku2R*;wR%C|-xQsOVv~Uea?+{e->(}!48MK){d(KUDOt@B6v0!Z z2ZjXXXp}OsvArl6q-rnXbYuVq%nP30NHxH{4H3^uS$L?NE1~}pnz{coHKD``fmvW? zn&S}UpW8UDw_B;42pbpM1gI_*SVWPEMum%k5$#9cPM#`A{p|jBH4fdWg=_(E-bY8K^7BXs3fJh^eG{knv7@Cms7;kzs9lNQBoI^? z68Y+cQ7KB5U;znGJ3z+7k0zT1FUAWI^oLOcL6>`z3CSGA!-pXaP*>!IpA#Qb6%ZA{ z?aE4mxFXie;%wt=18KU-^V%;jW8u6t>yGyEJo|dJpMfIu^&wo!*O=(=3@PShVE^j&+cXCY|q56I2zY*M-5?eHn6N?W8M^#IL)_ z=l%5csz(TJrTdDCFjKrNiJ#jVgK+(cnA<5wakl%+*F%wOq9`GBx6}wFCJW$I_zpg(Am7`KgV*X6K?TfKs%x ze2D<_PHN)Fla#q#A2Hz|c8HV;Ja#|HdD3rrJv|==kT$vB*6p#YD&g8b&w)PP#xbZi z$#qi8dCL|@Yze^A*oh8Z4!;_v$g14YaOan6Mg5(2E-H5CN32{X+KzXF5E0lfKN}GL zsh~-DAesJZco|XKYcPx@JHaB~`!9hE*JleOr5rroVWGP?fGHCwqNWHeTV~Vkvk71j zoD0KOPADTVByu#QI#y&m*oWcg|Rm9&jzczZt1yb6_g>joA{4xrjXL<^W~ zql+jr2_2J9x4|e=+B!?>r#L>!r&X5{WT2OMR=$|vDI>}VV3D5(Xc*^I`;v2Dl zhD@-$E`PU8KXkeYOOldsYOyVS`v{M=@G}P9E55>OPq9B1PI?UUe%aG{)X~XPg2fW0 zt8>qV!{wX*+AjP}TN~~?O9ci|l#yUHzA|Fy6jhbipKgQc<@&Y0Y$KB-ofcg9ibchT6h!{kW$;GqBTRF*vFMr>k98j;qCdpMKRZ zmqvvr2BmIs|4T91~7wdmACdBZyTy!Fk3mF~)?s*MM(Ue_#-2nrJwC)^LmnXW~a##<;Iz{2H!R8z3K6oXJeUj#w#OR;n1k#y^ardXn zz4n%QUaxH2?aQC`+OK9bp{7MzYDoKTiTZ1#PVBe#TD(msc-~JpzGigyrPeoGKS)}C zn-3B(-+$ySz(g`xi8Dnp`F?G$gR)w;41I!XuBOZ+w|l<2odhx#119c_zoYs7XChj3 z>zN4*4a%Y}BnkWM!JX!qaLV%-h>K71TsE^q@o z;`8#cviIVn30pA63cJD-<2c!@aGLYfj4%8oKZU0XxMWTbnumwI{+?<2Mz#A@gB+gW zY8(HlLa|(ce;+I|R=gWmsNBH5 z589TlC`H+ap#a1&S+~$AltJR+hx=!Q6%oerxS#S&NxuO1!oNOKrXbHJg?VoQnsCl% zo=qcc-7bQR;=u|vUXy4)ocwj)?$ENx!ccKVVDl1T5j^hri{zyRQ>PzQU>2yw(vi6! z;ny^^J=?)NGdI30d%qqTy*}t-5t}^1)-PObEOv7pLs1dN#ykT9xkl!Hz3?hJdKeyJ=W)?&t4VHj9Iv^{npGa$Fh<~(-)Yay4S(R; zoM-tQqdBhRlgAeQA$(|g(kG`@)cxiI|8L3ni}ydJrtrIgF*>=PL#`+q9#=q?K%K+o zC@MWHckB!etpc#CK6)=GVHw35{JQ-K)WR)0S?+&N4*DLP0#$$<++J%;3Lq z@m*{EqU+eHhjG>p=3GS?DS<}T`Rn30uir@Nicx?MoFGi;ZG7VxYwDa_R{%Ez;aC+F zGLnDs*96#3AJ?P9FC_blsWtfDKN5?!IdcLT-5R+yH#ytZU(ZX6gex%vtkI(nLR@Mpv85p0-=I=}`axUQgM1Z-v9X9i7-Fh`e`*E6WBM&T+ z7&9T-=Wqe$nCUes$%bl81y>jVwFS$pGGRF*x`loa4(a(#Idf(gFBe$jtnWiJWfPsl z)nJrtePVYvp|9+hXzV{vg+2b7sy&EEzH0+ln^b(5GXph4<7A(y9k?%3KRkSq?Ti{Q z{y}}+vg}p>GY@2T>&fUflMJG8CN~dbDtwOWH-;|tqgwf|HUIwh^dAQ)4aru3gmNMG z&C4u42(Y(hM!(-otHq+9OnEUG3rMiuC&ZHfHVS2*_)P)=Ec^^(V?$&sVgd{Halob{ zp?j2F^GIl4``8t@Y-(GTTv|m{bk_qb=K&aI^m`vCM~M<|@VAj@0!Zk}(4Wxbajx+! zq0l(zBbF%3{Ep51S|mzODrHcL-&vCg5%*Xvyqr9#YZnSCGgbo{l*)1PsnWKB{d;*b z+Ly&=KOcLsUq&z8&!xzTsxg7$dM45cLLluK-J?!vBpGt2zDbhiApZ7aQ;Qrm;oe6z z6#;<7!Y50F0TecQAi=T>>?=kz$w7f?jChfl002aA!f$W-tOIiFExL3 z6|9oN5<#IPo|aAb?!!i*Zp$7b>oS%-2C$(P1Bhgq%*~XiaHfIKB8+bHvgE6(D)eg; z4!ocf!(+O8I&?MxV2qFUx4ZOWiD-W-5uG3Z(bD~DtXbkr{7Ld@G*$jIe6Zx(I9U@Z zJ4Jnc=G%$;2$a&Lq4>nEy0^L{^yny{mt#=)1-LhlQaDpxT^ny8YHMd*Vy5U-kk}g^ zm2BKLP6^Wr>Ur2u{P{83jw+s^KsJe-Q8Kyw9e&`@ng)X9A*oQ$g|EvSO}F{SR@n}w z?t;sjG zY$-?7V`ge)xc2Rju?NdU1NKZE^BJ34evx8%*FAQ-Fj0p?Wj5uAaC>vj_0ECkF{?!_ z8-agMNvi)&$rIpx38*sY+JkD9KE1w6(`1y{%#BYk1;newzX_T?+*i)wwz zC0`_)4`P=s6X6<#8!HBTg7obN%sOCi^N!j;DoSqCOb6+Jg!uG zbg2FH{V^u=Jjhy9jD{ons21LNqU{87aFmts{)ol+t@no|j@Ge`+?_2+s0)(X9MzHQ zwEK=zdYGsjkRlbBhoSAZiSHM2t0%qI4>UPSjmW*BbZbMaJTZwogwo0-vogma^^3Vn zHWHFjIf^Nnur=lF0NQgv<((hg9jiAW`b%Le?e6sjrbtKH*3#IAskib!#?%`8jd zGHTOo$eFJ`5}?|=9U&JVp+$%-ZAh)K^;03|)k}qPwn|}VXhwI1by@(2sB^Hx1DE>^ zEp9`2E*VjB!L{O=DrdzSSnsjAIiZ$TlY#x5^K&FDeph!whyo;SfThM!%`w|?@wj~v zLiKi|05f2y9~{i@Qa$TuzYe-U`!197&`&pwM)V@$!dvC;#-EaTT3^Ev{FumG7CZ<~ zN%fG=$ts+d%Q;7?J-Ghdp{AzIqOCv7v_c?MQbrswW$yF_EU-Wu>#?r4uMb>mCgGR z5iM1WDM=QRHR#K1^1MlJTX?FfK_dGN@-yXOiWxsC?BV!{Qut43&Q&_VXHhO9gTH62 zgSZ>PbS%|gO)&psvo8=v4%sb}h%u60u_U&^ka}776HF=ymibUw!i2LSBqueB0-+fS z$okKAuEiEtsSK(jy=l%hSAWY$?= zSkFyEqUk#-Vii?ZM^i!4@`m7j_OSK&l6(DJqDWAJj6r*pJlaIVeM&JP{rZuuLPQTtv`4kegF5M4s73bc zXSCyNrEezS*esO@rQ06r6}cfah)Z!gshG`eL%Nq&Km($#Z;O+?x=6i)i!(Qj0hQL0 zx-^l+8>ys71dBb^m`BM8{ql;S@-hHlZLB{pp#f>Za`dBVdpgL2TuxHBpY#;s*p_kz z!j87WYN}VxKA&hhOohCEn=F3+S5((zhs2kg$Bpyj(YMQqFSu%s{(9_JwAg&>xESiQ zi3zD|<{()F2`TjKwx6dE+Tb{h23acp5h+X=U1ygHS?-<(G7v|K6Nz(I3;%Z3$F^q$ z+WyYfHf7oU907Nvm!}FH)A0RQb74~=VuPweewy+z2~j_vw?7GS0A2ujNqZneG}6|o zobF2rAeR^ScR1a!k3%ZutJe47poaPM$Q;t}oT>#J*rJTE#S3X~CtY&R)@9yBEs8{0 z;GXY;r#1efT5Y%c6|cL-jjgj9$Aky@t3Zcl$E5@yi&Gsjot?{Qp^qB8rxCPVV?L)f zrr#9TnZzI>>WB~8P87^5A@6tNy{Xb0>Di2qe2y)MY7;_ovLd&1=s@b%gC@T2MbOb+ z9g6cmogH9UZII*R_U-r1QawtxA&qmtE^vR&LxJy_@|Pbt2tqQ=YvoLK53uq}C^9)P zuX>p*E;_;ND%vyKNak8OX*ke_jjgqS|2%5rQ&xq{q1aC6lVts%I^9!L0t&WF8B4RN3)(kHKI3|)MF3a+9eB8TTB|-3-+i6;90u3*2QCqHMOj&-3oqphV z>pnGn4U=IIbX#AhifJ?s{f+LRk!BEO*G`p0bs|U)+2;*HX|DE$N-OJdV(ZM+u|_pn z2y^og!#itq6Gy7_G_5wLWG|azD+f#GDPDCu_G^W(8;Yu(Dd39cLJzj$+^#5+(626q zLjt(k?_h#%p)5sz4H(hfLV`Iz;yQxsjL);p3}wLdEnt{6c z)iEawo)@!^cq``GxnOie><#Fzxzrhcq<9nHgoL+b+3A+N0B`)o18=BofV6nL6+&NB z5nk!bExtErv0IY`z@wjl>~EH%`uy9pb)n(~jR6#Cdyy)@mlC_44IK6>m8G!m{Hkwt za0i?!NbN-gxik4+x6|GUW43wbext6q>}v9cY`^~5R#OXZytrCrMKI+GKY^yODf;|P zrxRK^KF+lQxgZt7k+(!XD^R{76T`o8+%?l5S-3qH;ykyBcbOaA!u{)kEW?zw(Vv81 zH%xhR1DkgUyB{>TpC<`%{&D7_t0W13zTyevLM=G4ENe6yMZMYhc{5!8wckCAo${M# zKERzO-&L-h(eUKOBvU8smqPCI6o_?DIk@RY2`8teFRA5%M&|cuTOWWe-A!TKh^(oGK(UfEi+Rs;e}(|%|e(Qfl^4O z6l{ADc2aSfAxBLtC0*rPIZwYNObzT-sVVqtNnoRt!}fdxrHv6tUhhwwaN(?l7EqSKAU4pX?C7jl;x1}uqU}T@e=*@bB z638_1u|$y2Nhs*NkPwBNDShh~g>`Q?J#44GY)YE2c=*DhO3VuY{iLNJut{`2v7^V= z-EQyKQ8>qaDR0VJotE-s5w*6gKS1&l;j-DjP6FAoawI5aT47UYBLY|-76cvFG8sl9 zj3w`fE#TM<;-9Vs*u*|7BblbyfzwZ!iw1dh@yTHTIYlmWeT;-h`_nt{E+L4HGvKz* zcgT*GxZaB#KZn@($v{$V2@_;Z;cxwI!<-ldlO@jjd9H{UrCsj5F0U5!pS~r9MXn zyr$0QBZKxVvhXTwmeNJn5<5GYr^OkFy4-o&p%F$1U13l37i*DcdA$t^VJnJDZ1AW$+wLI8?JB6g#g(YutIQycUIhrsf?scUm(4@H{s=#2_LaeE*03 zwOz;o`PKIwwMmrb(M>N?`?UzkBA;LBzFVxo>-DtIbWFATcHaqR?-y-4sfUK zMZhm9aL|;z(gS{TvwEHd%hkdaSQ-rf@{Uo+@1+&8{cC4T z5y3ewx^X;AE=3^W(;(#toCx9C74kACMlI*z31M{Bd+ecK@4ss|uLXXp!t<$z8OoZ&o@ z6K{|LOhzOJg5_BximpcO)2>zqu$oAMJQ#w!R)X!k0Dpnt4ES8kD~nKr^1 zu-0|7dtyY@9Pf?8tOgS=#=@%!T|e>FadPAPm9|v}%d@w*SZ=o8?pql*GDk?2Idi!7 z30{=Ur99+-YV{kny(3?CtI$>lfnt};(op`=ODiHEFDAYT*JadTX;9+2LcVmh=Dr_J zi)`j>$bNNJ@^FhSf1}AXq8XyMVL#25w(3Fm^ogpJ-nvagZeq5f5!<~X8ua!vce9=P zW3|?IZ{Oe|06AJsUs&BH+P`=S$X)vJ@sm~U@>(<}g>j{>lS&7xlncyG@`u|$oFDCf zxO4|%EaOLNQrhMb)UDMx>kj|2KsP#*axL-(0A7uxLdzQNd%PZ~B%xB_h^WhR3vDKk zn>pm`E?QeNX7{Lh8VzM3&5!Uc4ZSS^@}PP`KakU!WgA#Y*en<&mh=jDJ&^1a;bM;w zle`X`LTUotMDzr#Aro;Wwp98rdY1p^S3OQFs$@?WuWy6gVFFtd|MJlIyQp)cxAR>X zOj_RJWLc{~>DRPDCc;y^jJtDk#K-6>^V;I#Bm2H5isNdCvKZZ}-l#jUXzftd4D4sP z1O7OLYUVYnc|(w%C8I(`V7!Lq6EHL(t}0KA1`%pn1qkw+rItH#yI!OS7a7r?Rjd}z zB0=!i-k%b?7%S8n0lY7pY>&n;oHF#L>A)e&kE zCoAo#ie;YPpS`IvUy=V#A$3dtp9_gjs$BBsGBP?&B*E|tG24dj+|&yUa-)c~Oj*(2 zm}gjwXqix}?@+2xSRmOqPZ&QlcSX`9y{j`WHA})I*K?r`3(4>yRL6EA#=LVDo=PLM z@n-j398J;;!^cC=jfUHPbAwpO`*TvTeIX*1{d+=H`;`=jr*?+;`;U?A@;K!&l^K*u zc`$GC{2w)mr^==sB8Uy9C;@N$ggek4rXHx#ar1L8$h8KvlC^EG%k}RIA0)VKj#l<| zxoKsl1-XY=5-wi4Qxs>}P1W2JpT~LZ*UF3Th7Vb>s32I_HmG=8J z&Tsd=P04ZBvhoAJu8SnYtrOW<3}V+z%PW z&Zm&lM#z@>=eg;XmUbPCdx~^5sNczrZZBR6yDu|dF^g}eBWHiRD)=rW|Fhl5JoYEd z*7s&qX~HU2p3yv8%SI~}p$k3vC|Jnn07hIEDnBs(bNG?vcV~W>cY;9nUZ^um!K<)x zN0B0Zj7K?^I24=QG#+(q5zFlm82QtAoFZ@VerZP_$M`!~U)Xyh34?$YnNTxB(ie!3 z*$yIXED_7*48zkbDg>qM8@SI=`=L-jNR-p~W{12+FMI2?&qwP_EX}102fczFiGy`+ zQkg5BXRlxiuU!CqHt{Hlh`&F~6PIBDVPRM>!!WyAC3X)5xfX;{6`e13<+? z@w2IHJ0iUW#oF~tqH3)cnG2^phk;wU%#l=4l4Om@ z;{jPzYCj*WOidPU$Gk%p;B3T+IQV;-_cu))e2p!9d!3K&^NA#GTm5t(y)1|-m!GaR zND(`fgF51#NX<_~a24Tkg~1*#mdksE4I^POHa!@L^30#}(RnoARu)T_V5^|v!NQUk zOgwPODvp)nK=YOOkh4o%fjJape{^Q_8O5TlUV62sy&vo&ACns|)T)%Cy*vnvH@sXW zPMtY@y??!!o5M!0)SFiD9qV`wal(=;9BBABn_@#47Wwm z@c}T6A@bObn{EV|HJCP#oz}n+Y;-9;YTRa|m@AU@*?21`JjmX&N_IOEEV=1IJd7}X zUTH#mx6uV)yR%9ZL2;Vv`~oBlh{;zV2+Noif?}5Pn*-AGc=*DH&RnJm`v8XXA2O71 zrX7kTeTXVp%0?&+!a=hKvLIggCG+u@KUmYXzHS&>M)p)fdHoCWX#WTDa^)i4?owi1 ze~%C}HCv)ja2|4vL&*a0K?5u;lv$+`a`s(imbvrNy8c>o~IxA@2SgI|&2U$sh(#1smfqTlR;$%|lvq6HnUfe&*q6j13Gwd8f$xlq0Fj z8ohI8t$A3xqnY`6Yo^`cQD?0`e{yM2{MK;FM1569oF9@`(|Eje4n-j(2gAWfG^dHO zgvj%pvE@Bp`+^&yKzTN?#8?Dd@R9W5`){al;$JKnce-jDQP;<~Q$-6~H+|iokAesv zZmT^Rz&tUHqwgHeM(>{1=6W0)7?Or5j@v~<+l-}wmXUbE0UB_|zcuO6gJitlz$X1} zF2;V1t$(Af9R5o+zGC~|ur#t(!A<^gefEM27J!NI@dpRmyXPeC;9+qbR-d zd>~*|F;k+HvM_;c5SZ9SFM@us_LR4I*g&DnmvYO?C?~0L>%82NWp+e&29L)(w&(bQ z%|RA!k74FUPS|P zR7BHd6L$ziz|zQW?*Aj}9RKssnsD9NNn<;Wt;V)(+qRv?ww*k&Z8dn3#U=qffe$;H>*2=S__4pbZ-|fm#FpIfo_QQSl4Z7&+hIT1i zk303Z=spgTv~xbW$kqBVGN#RrF)!(mLGK#FgLxAu2ofDq^Z^6~pjr>*Q{R&Ats%t6 zV!?ZPF79StVEkggAI^p10?~$$z!ySp8d`WLu-_%djJWvAT%CyTZcuz}oT2=>*!}A6 z%vf@(1`#TQ_%Z6WffVyNZWn!gG;(wI$US~JtuAUvO%#nm>2@Dp?CfyO6dMVOX7#@& zo67SSuKjgmv64gedHrGDs7X+>0|=2_Rdr9xR(WS zkMvgt*3b4=jyudyzs2tQBcx6N!~!3Ffeaghw_i%tz!xWhh9$u_=m`3sY{#5q>1l2S z%xr&sfg<&=bjEK%EkrnR?!(a-M-8Z>pBEhk3TqP2(r3c%VDB^0Pe}~fE*WtLQ!?Td(<=mPgvU#X#kKG8{w?!eB zzj?~^yZ7<_p#6m?p|5vsFyx*bO(8d!FkBG&C#7z(x#VF@fl{Rr9JfjJEjgm$M^%0p zs&Il!RGXZ38@~ho68zo!^*i7+cY#02jd`6ROf@ffhZw#Q#wM2&;&75{oi?r8o0Cr8 zxUDB|&?CqM=VMNbW$i55AMshUJi;YlmD0-7@?K`CdFg~Hf20exr6M|qlfvT%GSkop zAM@Q{)5o4rz3u}gYI&&XKY-r&f6Y7ETy@mhE?t*|^U9X;3eu&1)qS1i-kJ>z=x*$! zj6KWF8Z<5eaEztoS%vLIz9ymxHXr?c#>p=)5PdsgVd|^e@fZ*?h+Yopr4XetwXUFO*Y+Q zy$%@SQ@TWz=J0X6g?SDJdwT~r>oe>02k?|)lzW4ND$X?5(_nXt@&}Rg)FI+cuV3r; z_shI>8N_hUDw2{2@*W+|Y+}t53&o4JUY6zM0)ta1l+9L zQh(fzjn;K-t_l+>^Gf0Vuf*Z}x5PmgnYz`VK)p2mDA_v<9hH4gy>O3CyIOvTHMU(( zTouo!e$`swOMn-5^&YKIu>jabStUxAN>%0qcn?(#Ttwt0Ae88T24}ZcQi&@OrK5fN zp|!D!l{xURIhN(NQ<}l2zTu2?gJj!dbM)3j;^WWMqZ1IeZTsvW0oy`sJ@It%v(R_4 zZ%euJ>?QQ;ck?2CST3)#T5rd<S|h(yRUen9Itg4lsGW8l;SS5ZIx0R)#%Ej{g z8*FG+oImi4l{(d@)%7^he6QvnAD&3i)G7zMZ@c5VdEi3cc^ls0;)#7X$ zZ5PdlUbzVi3o+o`#`Tk=5{@(sqxSS?eq&U;*x1_HCSFA)TQ#kxOh2!;|8MkO^&WoUB&7e8R7LqHg>w4a`o<~BkP<8uX&;wN=@Z_Aa z%(2g6l-oK92G`2CuC&}y$@f5_k;1P|9&lV_M2=%bnL@i9z9yN@f6Y*&D1Zd*cPCyx ze9PqGOi7W_3781DrHX7(!u8w*H+4P;;T9I^*J^?DqA|#|{HZD@YrrUk2zfyum)IFj z>dUyC`?gzhKBHxXQl>(dIzthc?xB;W|5?C)1tn6K!@0DWdv1cMRe@}xna}x{dHB!!CI0H`D_d6U7d$&&4sakN;OJ# zJ8mYj-xjczKE3Gj;hKm^gH(8j5bIl({o1Fe@oQ8v7Z2N^%~&m+$U~0cEtHh;eHyd^ z_I;G+3lc2_Ro5MC4WDu!Vadoj@N>?Ucdu(|UHR~Cx(lCTRUA|V#&Id;`c<@8mHHL9 z9~Lq0#s)}mx!bU_@BU7Jq|e>S>+yWYRT|wwW_mXkU{`cwCIR=8euJy2_w`Ba^uZ5@ zLh)>DDSy`n(4b*if>%kOfEER>E%Xe*0s^Txlxm<<>xm*uLvAa9e?nI%C~6ro-=Noh zOjlsxw0Q6?a{q2*RrVcES*qMh+~IIxF8;D=P~6@5>9z#M#|>9C2ezS0`5_PtA=@}K z8#YqG|HEX^4jlIis&)kS)KE>h<%f&6oZqlOeq)~hA;AeYeDUvF7q-6w=&I{Kz=XAp z&ts0-WxYi{mCiH!;gm}{s*=L-q_pxdF3_TJioK;`!D91#CH)7KDk5!81R=MfJ>F6t z*{L-s@)ydf8Admp8YC7hG-HnJp{t1;`si_g(c&aDIdsnKjo(60wysH3WaR>d&eY?7 z&>>JPHh9R^1aYf^TfH5>f*{jF!obOJxqguMotkj`4)}>Ce8ToiXA9Q0L}ZWH9l4$a zhOTJbDThLp`%>kL1DlBkqW=eyYuElz5T`$A(lt;A1=%R<7 zV^#s+9H0uu#}J_`-|8cew{8 zAt%~cl3FR%CT{0q)4H18gX7Jq# z7fBCQuO9nFS^cT@EM9ii*Kb->0cb`569pMcC?rEi+LBAu--321&J+7jH#hD-Zmr?z z_!d7#vKqGKm)N&btKI4opgAAwQe_5bY4ECpCIeVv02MUM=MP1Mt&%+DBg3wKg0cZTd7x)8F)}IYvXE3MrH7*kQs=dN{ zk#rS7L?6BcdENtN>qdyxF{x4=)qyT8@lGxI25dD_OMCA7TFN0xgU(dtZ;dxB3lS`( zXL+-ETO1Y}%YU7W z|1?rZzeZ|xifQMr5FB8WY!;ngx-MRGbhmKM_S9Il^Hd(k->76Cpy!qgu)A};W(Tyt zq|X6F`WSn2y!Pi%{+3(YlK%x80-Fno#HKIQ(BcGjHm2J_hBljD7Mr^GR^jU_ZZj48 zIMO+1-}GdeFMcBHnzADV7B9G^+yb@5Z)F6Lzd29<4H$C-?6vx)TTwimt)Xh-!Wnxy zp=!@;gv4>{YQDs{siVAb7|AyA6Fu~NQA<@l;Ut@Ub8L@Qof}wHxx1d0s7jCLig0bI zx(^{Jm1qz`)D$F{VlBgLphS6v^m=rd&Cpo|h9?=_jXcL#ax>#6FIS(vHw6hKPI8zd zk$b+p%G(1zeZifGTH?tlu(?lwp{$Oc>EExn`#28eAdqTxRx!cwP3ppGQtbAGY{ahf zWl@Vws=>1`Qi{VJoE?|H35=cSrs0+^ABofU%D7s8i zt!@M2B2BU`sY7t+Mth4{1RzX%FqiB+SM3e)4MUO4Mo+BNXTUZKeG1wP$c{Q z`mfZZr(6Xk9LgZsL=h6h#)V#c zGyfA(Z-;?=^*7zhWaNq8!GUS)t@Q71?&*G4_uc!mz;`z^Y?6U4+8I>cDrWFnvwbcv znPkyol{tf7I943rQmgX#B2p#3D^o;L*LuxuihTkl;?GtL3Ceiefm;+02$xwq4)ET= z1R_~5*x2;O z`iM1C=9u&U=A(iCR>i#KKZ9C^3oDjy0kmA3688@2>b*P?-x`1B9ONU) zay0OL#eT{=Fm1OIzHn;es$-N<=2(v0!KCPn$3_Sa2I*?s3`4EP;`q^rJfm7B(GVGf zX3q81#KsjpekMm0T<|UI7I`2Hw?> zOp|xIUC--q&e_)c+1=BmS*LAsB$=rTlSH#xkGxY>&*T0384~8D3%Mq8(!k_eOv)nq zhIBEOl6AR7@iu6_L9oPgrj^7vwj5-Mi$XO|!l6$*NTN;H=C!wY13fqy(FuP>2#g_Y zGVX~azE0{YDC8hhbOU@M%Ua#@Dk7c;&gLt9=$60pm#zEpS9X0U^``uv<2k?7bvzQ` zGdM>9onOe707R%u#dDeIsy><3}<|H;BKbn8vq%E3pNz zsR_8(xlDm}&x5ew3?cLJ0cLPENJ_TGi9vx-lbNeq zU+Tj?l{PGu=z_L*h6MVp6fH9E;~a^M9-k}i9l!|$)*KN+d?<<%l??^eT{A)sKH!?f{) z-LONzV$mh5yElv{4RZF;@c8ofD=0H^h~dU<^GNbqQ&u~Q_+YkVbY5qMXy5WuuByQr z%J?Yst|PH|MaruD9bNx7Pp$KE;B5c7j+E=cD@)7l&&!hu0xl0aF>for1Z9^05i!q_ z%Sq%E`JR&VnBoUnk<({T24Qc1*~g08|M^AU(US49<#4+#+Pd5?A`Asct_sA0XpfHtP#SRvD@0_P4s%+M#+uK?1D@X6 zgt>8!jOl3Co%$Qc>->1~A3NsejRo3fF%38NvCRkHE zQ)87D>63M6M9tYO869@T%r6uiPiYHNbha2AYprJmctmC*p}5U(-cFSB{dN30)J%{9C@v!5yWaLB5IDdidAn{dP2V z9~|!KFVWPJI+0ur(+Ty!OlHQ_hWofocqy)$GPRJJXKC4Y=FFi$7dwqpAS#0k#5JPP zA4{NnGA`+{ar`>XYgVTLnM-lz+<|S{P?M>Xse63#DMhd6`ToqEF_a`Kk(^8(~Za1UHbH?N8#G{~2-u|jlKL2k+fo9r*Jdb${* z0@TevpxMQ@@S$*?7=uq%kfap<Cyc_ z=M55VP2#r84jwj6aK1hAWZqLf z9?&3Q9n5_nHr0}9ruAV&VFeT%HFj^6ruz7rkRY3~)JE0ZM3|dSQ7P_{^5BW*6q$pD z#*-0$X!j1*$Au2&=IUyokq7kgI~c6Mveqeza+qs-WEW8(P!j=?uE=cafxTAchNu~d z$+F5!C@~ro<(IyNXNIB;1-QT5rtJ7W5+J1%0-3kHBy=8f5qxld2KTk-lXS`Hax?RN z%TkwLQ7h&S^@i17fbA~}!T63y9=xUBWm~(BXCniL>56*35YxAWF3jZP%Uykf${3)ryl1PLmpQE}9BTY}; zGJSo+*yq;u@Zai(S_*Txe!#kjLD10tQ09meI5=P$Pn&9w)hE&w47~!iSmqlJ(SFO1{E)8f<~8%awWXgsWLv6u86`|WbWVpxeV64;{3rS={ulkh zxu0VVG_kMEVMoEI74i6^RGjmILKW%OYL&+Dm+X=vw3>8@pl~|S8gdrE3vM(+Wg4D^ z?qk1^us5CRI=CFhQgJGwAzv3ro+WX)*fnpzKpS{DfBx$TVei7;hYj&8h%|Kok-e!E zE^$na{545B0*@w}!KKzJH0N`S8Hu`I7Yg{*eS;xNvVuob-c^#KA{S;o;@I8d)Xf&4 zQWN#$(R?3^u80gM7;pFXS8Dq6vQa=)HRgAF@=%6j>58+;mr=HmtE0^KGsvdE zf^MOshO<=X{Y~)2{E&8Z^TiYE%t}i`in>y8aTE=5^J7j%ODG zFEdNuMuk#U+SLlbaIV~b3(9&l){&ndLT&m8olu;t9`{^EO36#OQvVw#FEtKiAqjug zoo&aRN7GHmpWs4_Jgd#hER}r?p89j0%^{fs(#i47Ubvf3U#R_RMTv0fKlPbB>c8=e zZHGc;m1##X3hxgxxt1FKM&Nfxzgd3n7&z2UQ%5ivEc|MJv>zqINkRv&k66lLn8gZk z57o38QC{tMZlwwudyRmI@)h!SH*9jpMQ^s2Ta#d21Ao;Xe^qabdNNULg$@#uvKEv! zmPx~GGY9{{KK|S-$hnKY`yIaGXOQeo3*j}gua?5j2LsQHpl<|p{uCOlg!Yg!kftfg zH*DLq_|w$tzWtCe4L4k9nZaoBXTqvE4+J9yw`7H*+mGg7s0Ryrx6riZZyS887*e%S z{T&+#;~I?KCNNvQ%Gi@y)Tll6P8+Tpw{5iA#)d0jpYwX#=GuK3BffVa-%5C-C1Wmn zyjE8xn`Yld7(&d;J!4oSGW__#DjZ%?h`Fdc*g5SXimNLndtE3}N9B*iao#8)Oxz^U zvFp3@rjpk0Out~^q=7nw14iu0g&QvqJqqlE&ykZb~%cns@uJz22@A z?<=9Qn8vy-P`a;qSn!UTQv`B1GyZ;mUe9J@f}3xohBfTzirW%NzUBc1{GLadn30`L zBu0}lzq4yt1LKY89$?wuK1fKG(?#aORISVTitXE|{AO2`soy9T+`!005L8<9Wsjj5 zbL9;DIRd(J`bH)g`sz>z_3cWoYSqOZ4thc@dm!oM`x2TGwT@;Wu+{nDe+#^U->ijh z$A}KO78Rj`@V@%6TCy*Agp+FXTf!_B>f_?M??blh$D~9(mgU)0qajRN=TBHE)m>w> zsNSbbn|KC8!(&`C*5G01m~r%v4K)6}t-x(dp?@uCl(BgZPQ>1jOJ?KJ!pj{%Eu(zmcr{)$Cckiyho{aMp~Mi}N{PUeNL9!w#nB@V0+Z zKiSj(&`CTQ>d{8V%n~$<+(x-*-kz(6Y3D0So=FovmN|$+Jt_MxCf!K zTRn9tEzyzVAL&PeKn&V~RxisJ{Xb3{K91d65i#ubip{XI&XgFcemxJ^dUi^QOx)s+ zu&Y9nIi+1vvMd#04I(vxM`QA<^bdcar|@!Y1H#PBnE#jb@sKCQitsBs6- z8MsC_xsIDJ3#`RS(nq5H$+?Ey~v_|y0OU5R?!e}L@MU1@12o~OqxvGr=z z>V5lBzQDYBaolThE?Miak)j`lA-e|#D=}8e+4iNE;hZj?nk*hK{5#1ZXMAyhb02{8cZP56uN)LzQ1ODb>277>$4Foe__rzsjaYYVNIt` znbWv4vIBNp`u5fOLUpSffS&Xv4g=-Ptm2V$dPH96;whi6qbQ3tOl5&G3ZrMRqi2I8 zs9r6XeThyDF{l;_>Z;th?SJ{|Un0gpwBQ6LgMnmIMUi!^Mxc&Pt%1�Ar<8C%$@8 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

bc9eXGm&t!ZeX)nL#?X@xh`mw{k}%#1a;)( zN*-ptQad}w)tXadv)52tHg2n71Y7p1{)*C#o8@FOVk$qlVGz5rE2m50i@3nZh2YYb zKAFGH%iE&}dWH*U*vv%}l)p{RF}Kf`BLAdDxWJv8O1HlHwWc`KnP}!&01b`f?W6!M z^0-y%7!AMuEQ;`l&9&AZysUFb@1&+Z=hHsBKTR1o#2ZyNQh6>3SC+IwyD%q!9#)=u z3L+94%gcKlv^XKbx>Hz;axZyc*6|FUC^ZGAAk~~D@x{kaB0t5C2o;dSkQ2|fKf*`a+1>$mUyTh;1Y zQKBquwGQ+hW%3v9X-tNaIXM@p#Mzdse_(d?Stl3=H-7VyL}*>@BrG=bxFpWt+bSn7!X%JzHHXPb-T4eyz9qZ5O>R z8b&7@&lT#fo~vo;yO>M}`-n~yapmkJU3m7$(r&6dDA{WH{)5q2)ll1hxY(I8^xIjI zIY0FwW({LEV|Xt8WTa_i&C0aU`BHq!*`|!Ddr9oK&!jngr{Wr?2ka0DBm`GeDl};Y2|@Vuq}G$8^E>songu|jKkFMQM<&xx4i|xJKvlIPs6J! zN&^RDZ81M%4SF$HUy;n6`i+hks={yV{_!8g#>-+0;iHUszKVF4l#(Q7@Ele^7VM=x z1rm-R14Z=Y&VmEdyIon&n8cxpDk2D-%flcMW)H;1;VB@q%3WjA~y`O)!3VGvvd=`#*;r4%|cx z%8~1C&beW6Ue__B&2PU$WKn*RXq{$t61)#^8pavwQlIcM8C z;m)3gUpB6=zjFv1F*$kV%Ye}tD){j%RoND?p~za9E^hS?Y0`7t^`J`k% zjSV!(4rM(!MH-NVfY?i$9+?J1z89u;g}Y~1_-2dM4k`43JX$e_H9NMb%A2{EMgi=!hdn5KGOqx?4VE*Y6nW=2mA&mWB6ZsQD82ObUA6Y&8Izj) zby&zBXrR0jXW_O|R)My8dl&4eDdmg|{%QGntnOMveRAo@y?(V@Xm5BhdM&BS=<~-b z-6qlwzTs|)0aMv_>%^RU-COUg5@8?6qaQlXqzw5v;ZE?XT3C-8ZZSQnM%c%jSZ~6T znqJzOUWHOba(rmlmmOg@bKd#Hspo869HIqym3^ozYYM3*2KPh%sBTf}oN=v!gCN&3 zYtW)$j-&md0ge3>M?@jQoEEE6y`i!otU&-AMWvA@oUAzVhqHb|W$sflM zEHvQBm}&(s8kLRNpf zYyu=WR<8VY^v?p87aS>?{`i7ZsG$&LQmJRcXC8MN8|z$NK!XlKD=23$_2(SYm#3bv z8DnM3W}r@4*eIYNn~!$rlT`0i4WUxLEHl`yUd$#Do84ROV)>6CJn~(Ah2-E;Re)Du zaLNQ&gSDbu{Q_0Bg%{}vf3kZiLnu^Llv+yQ+Q4-H|GMV{Dzc+idA$#?iu5w~pXmcc zUR@rTUK6#m+ffnK^C4p|e;yJ<7bC?{Y1TWL^_$D5Oi@{J+slePQ(io$`!Ww4JS@m$ zhzReY^WfyU(>1P$U;t;2LtKO=-WyP)_r(3MRGpbbRWs~3TBfqKq_r~9Hzb<=P{_9OWy1h#>d0_Kthvf40_mN+Z nZXfusyM1=A$*eFo@~{lyB~+kgKLh)Ek@ literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/NotificationIcons/delete.png b/Wino.Mail/Assets/NotificationIcons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..bc46276ee6e412fb6d80cce84a840f1173f4a070 GIT binary patch literal 26317 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

XuWpGcE}D*?KGu2dLqj zmH8mD7I=PVU?Xtx54blJ+ZWrYJKTzYd(2gP`geHbI2cR?t^9pnVEQ8v#?+{Z6zg@t zuh)oT2Hpe?ycL#)X(vC!f}eCNuJ{x2*jMx!^r$o8U4jCHLms%p!@4WJZ^e(g>be9O zQ6LhJk}Zb;uJa1|3~;m3cIL=T!(XDFu&G4Oo>5f#pm7iql=kMVh>KO4>p&TTRlSfQ zyG`{6vFb3qk$-rR2S9#e{3SILB<*&@#*l;^nJ>Hh(s`k&$1 z$qCsDLKjOyBdrBcywCCgfjn{IEg88mYYmv9C~V45E^-qF|2G^@fa7eZW^k^y@Qhjh zFt%1FK#^)go5u8Rfy3ysWiCHcto&WaH+2I_4h=mi{0kkICo_`tE-!_cD%3PSEd!wO z#lcCWY70Phl}^nJ0OVIgdoUs(H9xIhcYO_PBX@sxnPIxJ;{fcV082rK$R7}cH{l17 zJeX#GZ%i-j7Z?C&cTsR&y3_!?ZU5u+LkDu`z(v=A7d!eT>Ih0jEL^{V#r;n+-L_;9 z)|ezc_f7OawH;2p3{(oYJ8%iwe+L7Agxp=>XTG)sHXlkdh~GdbYb6ahbi-vL@bj%B z*CJ30fDm{vStl$@EOI-{0ncBxqk04w>O4PGx0e&X2k)Kn)6-7t(n&}M93^^nEGjTg>Prp zC;PIm*#usOwnX&Oj={=@j0G18NuaQo{IKOqmvjNisLXHZ2)^m{mr+@CLQ5`d=vL1W&q3k0>!x3bgU%=*yjbUg0 E51TlVod5s; literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/NotificationIcons/dismiss.png b/Wino.Mail/Assets/NotificationIcons/dismiss.png new file mode 100644 index 0000000000000000000000000000000000000000..63086036e4a09415db32ac0cd072acf8f41ef15e GIT binary patch literal 16527 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 Nc-r(-(Mg9J{|lQ#z;^%u literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/NotificationIcons/profile-dark.png b/Wino.Mail/Assets/NotificationIcons/profile-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..114b3af6f97b37ecd4a451195614899e394920b7 GIT binary patch literal 2445 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 ir^S<|UKhL|?y4QQH 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 aepirFucnmD-d(Jv8bUUCxKywLll}uEb%O8! literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Providers/IMAP4.png b/Wino.Mail/Assets/Providers/IMAP4.png new file mode 100644 index 0000000000000000000000000000000000000000..145023d0cb47464e0408a9b2b9bd2d18191a1407 GIT binary patch literal 26087 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

p#<9`i#tzY)zdouxHz+n(&+ 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 P0o&@d!?DEP@7I3;#{fM= literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Providers/Office 365.png b/Wino.Mail/Assets/Providers/Office 365.png new file mode 100644 index 0000000000000000000000000000000000000000..8cecb7cb4b0fc4efa5b1d8a85df59210a7b1b353 GIT binary patch literal 92451 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 IH0&P#FK%LG)Bpeg literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Providers/Outlook.png b/Wino.Mail/Assets/Providers/Outlook.png new file mode 100644 index 0000000000000000000000000000000000000000..d1956be184cd618e8bf6aeb9ab0f6e8e6e33844d GIT binary patch literal 66213 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ψYi--msj@l41RgNOm115cWaqwSM|HLbcYWi-u$PxftNRn(uXXX3-EXuMO zJ}XYLF9G^(y4eGNE7`}(vy^@d$Wu4eYi9=_n8efcWj0~F( zat{Uebkiq&j_)4c!t=>379MIbc;E*Mew!}=R(S!q{zQkf8jQ0R=lT8=-(~F7%QGQ` zs=J$wLr)W7PVK~ohfV@qXC|H-u>nIk?*`7wGRJl^%|9Bm)M)ncvS=5JZG)FK2vTb;slx7%J>D#WrhSj|y7( z!Yl!sdI2?dJM7H5A5T>om&FKEDG>dR`x+JRtdEhQH{5o6&Bpoyi8_at)@PNZwV&#*K7{79MBp1zs<}Uu^T1pbY|Ymz)YtS z7Uta1Ofl|REcuyU>E(4xTH_II(Z2HE*o?(A^KEj;9y_O2ZnjGAXdn6#TxHLnsF zN~7nDCz#NsI&=;mo5wl~>OUnvyrutEEsh9bQNtF!d){cAZ>FU2+WVEDZ;f*xQbY$# z;V*OB4;jH?%J&x22oKqiu>HN;*URe8^E=bWjZcl6i9jS{%9Yz@cIe%_P9`ZPF+JbI z9@G_Lb)62%B->Z7BaAS3tb94XjW2!aNR~>y(q?P`?2A#vhDi4!*9L?2HN9lS!uKZ_03bwi;q#6}Dyxb@w98Vo)3QZ;|Pk+0&XS04b zMy!<(wiT)TyqdfkkO-#WGIY+dl$vk{dqW7&yLu|3qSd`m?J>ocS07W16Xb9*EboT_ zqm&CJtV`3c|L0)Or>D0psP4<~N;vky5xcaHBaY|4ML>f(@N5iuwf%Bs;E$KVjWNSg zvL=JVlXfD8mO9*#=*!LFeiUzDxo0>$igj;5}FE(YB2uxh>SCJXcqZV{e$G&MQ3Nm67x*yq7?(G zvkclY&0}`5C1w@wq*deuM3Et6R6HZEwj6(sJlnpO_BU#`Kh;aOlzDt+V&@4s$2 z=O>m~bzw>Qt@rhxCa7da$hd%tl_POq?AWKS(`r0Jk9OXGOmG_3WeDrc<6r8--oWm$ zKCR+%Lhtc5<+_yiS!%RbQg+kg^VTanUT1BQx~H3%HIur&f_fZ85^E(*8zb7Vp5}zR zb%%DBW>N@w)>~e$$3#EzLB|qw+WMpWpbtmT-ykwW*SmAon}(IlDr1hqhU~f%a|`E8 z$fO!&t&G6>p)z*(K-<7g~oj*dynhN=*{!U4Klhdo*e^bI=rnF)GEx{X|hiG1n_Juh^v)Tm$vU}so z_lNRg7KF0NZ#6S3sGlEjn{otkN?BP}R4F9vHma1G(*x&Jm z@2TzG%^R#-?7tOo0{o5-l16!x&dH7V6Q&WdwPs%)oXxeSbhsX17&Dg3T_$l`b5ww?VDBqpG2L10KE=>llVdlgHL`!@1ZNy)iBWpY?`K*@)r!INakA;!Mjq{duDi$!U1G6pVkuXB{s5H+Q|W?`>+L{m+v;mxK(}e4}=!MwIjZJ-(z# zRfU!2`ne_|W-ztweH7nDk~$^CYf3Tm@!&O1;mSv+%U7-Z;NkG!vqN)_L0aSH+-iLp zxxuw*mW#BKe8PgXn^&1Kmu#=W?03(^#XgU^E_PUg&BPn^I^oCi$!KX6E#lV%)W!&HjWzQOdO27Yr;(o$okUS%Am_Y$H&WN2d$Qmx4dN>Ib=f8(JO0%eCWWZ`A zI`$Ii2Ky|m`LsNRODja%j&m+7y1t5)&~S~MG@-#h!rAC?JZ6o0U#ZUhmgXpTp|orG2-JW`I=Wxbr>u!XCA34q^6rj~4cENYjAoX$q9F{SA|_c6XDnYkl?X;6M=?9V3kajcY@Cs&yDl)%lN0uuE~tv*$b zFRHen*Jx6{M-4L?S6Mv4#O3Rob@L+yPxPWQ4*tqmc1lvjO|aZO!W))z;gWDH!AYgI z(jyzTpz)CPa_m3ttBIo0suKfnn%s(-$Eo7QZ$9%Fhs|mu-1!?;mCi2~%#~V$PfL|y zNb1*@U+=N-67b7%i~iq}&V2W^X{xJ-&~q?G$5kod_xf5){tk zFWgy$>fdKFnd2}1;}qsrF9V9owR$?wZU5FAO_UQQ=9=TgMz7Zy@LY`5UQ!OD&KvWPaL zfWpKhq8N~2GNcdL!N2k8ON=QGFA*cP5>wO9t~ z3>1+6lH`wG*VNNS5Ed*I*}`l~g6j*=l)Wl*m4k+%R&@crl~+KKviZm1eG9c-phNRj zpNVJ7Gc7cxTAoX_{&-39L;y=PlpDRR-Tk3vW){G*n3FEP6Ej-Uwi-!IUIF)nDi!+}M?cHFw-4%G?xRm|N13*CbmF@UfS{I5OtDQ5@|G`r`vgs_BG{j5?=~UxN+94(*+ZY`85cwOurG zwLQ&h47K6`(L@vmrZa;`Izi7RWLJbtv7-%lz2o#pH*rGyS|JMxgPNH;zB7FISR#e8 ze?7FLnKd}=4z)TD_iNPJl_ZUJ%obq}^A)PAG76k)A*PtF(DN(fC-#{AF#V>9vvERl z^Y^g$nq}xU7{cH3r60vgQJ^YmOmT;qJW&;%_A3?FVB)wSf1m2Vf;K8deua#L7Eeyz zt6GyWJanj06BmBW;T26_E~AueS#JhVS<~2O^;E-1o|UhX>b@Q5%*_>wB}8`5h_OzU zG^ji)iCc1V32;?j`Y=lH+bgF|Ia*Qpm_=?*2xZ{a&>7icU!owWZY3<54%Xy}HH@h3@tc9~Y`u~z@QVmmqiC1vfPM|l$Cb_vjSf(oH)b12C z;h4EAC}=gz7OiBu!>|aWF3_{bqwvIa!c*m{M|HNMf{mmwyMjJ}we0C(3H7^UWa?v) z1hWvuG0m5|KYXSv(|M)axLbewPvg6ctlkU6Gy>GKAA7&}p8ytC$a7H0g1>h(&ow=0 zzY>>AC1CL2l+S(Ml|4Q{Nz*>X-;%Hed!uB2eCz|5!&o_990s4iX1p&K2@q$`jeW+U z@4Hv44*=M2n*4f-#ig=Dg$L|QR)@dh5KnAK)oB*byR#U_xCXEXQ%E)eU;2N$uRZ#7 z;s3iY+&e%B&k1Uyxa21{!H%+v?$>_UC(@|2{f;PB)E^oZM^w~5CiqEGIj#S?Xf|APG0$e>GR6WYO1yt zTixiKD4M|A4%{@3^IW-QcG^@|4TAk?QbQ))l2B*EV9Q9;RSs7UUlfGAaCp{M=nVKNa$i{gSUA?)!%|`e$VN^CN@n$9(n*f>Wx4W0fjEZUo@EC!CfGp3 z`ML<2>dOq^u;QoQVK&v7u5yduX3>?f0J=Av|(q}YX1*EtwL>v!Lsi-L?2>dhbrXDqSI zC3wA=;AastuB2Hgni0(BdN&2&I0a_u)g=e44J$~R`x>ggWFOan0*-X!N?5}NVMX&z z?TG!I50OblJtMH`LIud%9)+*2HBk43;g$S2)Bx;ICqTaf2Kh-?t3>U+g_i;-MxEDw z%H$4}X{Ij`v$%XsfpjmyU$H*`!UWL1JgZPbNul?4G9!hlyt(Meg@MbV5tC(784F9SF3|=G zM(6Bg<4aO{%3^<;AaDx&IkMv@uwxg|UjBTQW5#EDYHukwmp=Ot4nhyjyoxYL9k`VQYU|P5I$CLVM#v8|%Gq2VhXiUH3oJxy-xt4GrSabQPCb@@;R}60=f~d3Ipb zOpN$5N)^9+WHuGJc%v>DDAl36PyEm^isO_&uw6GysZb{GR+y((RA_bly#R%eZ0v8p z1>-Vu^<*S(7$pO@EWG`iwABWtGin!iyAc?F5q+iJb#km<*sY(i-&;(k%>DgY6JfC` zXFE#}{Y*ISPT7oC*N^R-T@qW*D*_T!!sq~P!`(jg{P?7tKf{O%XyXq z??({Bovw~MYknmxQrCRB4>-rAWGzOzw^UPcm?ijKe4R)Z&>cF5Uxux7h2jEk(B>mX*^d}si-WBW6ZMhSz~wGmBgu00hQLr8y`4_ z!Q9mgvkDh8#OJ?9iW!boS;cfwpeT(OV|j_0z#kx$ulZyCZbblAFi_LGmBN9y5WJy} zIXJueNvL|A0FZ-@+Pzh80x2y5teMcJMxT3iYb=K4RzK(~E3q2GR#y~0bYEw1VEN&3 zzF5TEIqm}*`!a>e-)k;FHpFdBZO@^z7+1`=uj0d2AL|{fxWwTy9tU%ml)KI63THYL zoVO}Eu7ee8Bu`$SziXT`+26EW1GHDeq^F6qmWXHTf5Y53u?Zg5qb2{RPeDPE($x38 zrl6?Xl7U6_v10p4R?reT4PZR05+VP^gu+rk-<)QjREpF@E!32O)RRvvw5>8WnS$p?HB@ zc%=Y}1NFwSCL?+Hc%8iVY1^y&CAcdE2%$@^Vs^Li z!dYX!o=93+QM|O0P^YfcD`H7Y^fNO_$+|e%5H#E;Q-NMHkU7V~dc_zN!dT;319@;h zR2vY&vcip~s9@)}!dO)_`Cb%N)DCwbLv9p=LHSNw=}M&mY3(s zB)ae0oo&{wp;Ji5L?5V@QEGY~y_Is9*0CHim)-i_Yt`6y=GK)}Z|8gwSDh-Di(pbU zYH?~b=Eebu^wGhVGhiUsaCt0Kb#AUYl?1~@p~Rz-n51V;XIv`qi1IWi_h;b9SPq~# ztGPb)+^Bz5w|%6dRb1qI>wZxxMf$$)2-8SGZ(L@`X)&x}jNfeqKf#~XdB1`%=4*Rj zf4~4J0cGkiXyTqq|GvIA^41q^n`(y|pvyi8oQK}8w+gR|T(qTza@p3D`Ps*%|sdQc1_T1Hq7RGG)3Rb|BzPc0McT`#_W zRudipj4&*TH?Ne~j}<7Rs>^$-BwZ3%gfrfb#0_TKk8r`tX-Ex^OST-$4@Ionf_1^R zcE?q)^F?b-03bS%KV;%!;iJ`WeUl$M>wJj)S5zQA5pE`7UCBEFYqC8pQwMGApQ6%% z-0z`>b3y%4%wpge1HYTRI<@<%g6GU}0J_W_Z(j#gjG#!R@@Y?*$te>`9*LVut`N*r z1c|cWHfQ1f;fQcM?DllAJjFbstZ1fRR*Zy;=x8l$;rxqX~a^2Qc-pg z;pU5iv$K!`mjTfz>wg3qT6D3;I*k+>GbnJkD)Ki)5WL*=&9tk{J08n>{VlV(#VPk* zMqY!hrey|jmjdXvY}J2W9r=BC^^r1QTx8mxpIr}nc_#h{R0TVGKpp>1aZKf5Nx$cZ zV(qEWu+$SFVR~eRozImgOCuw>Rbi>TW(wKQ2fgId&$TJ%mk9F{Wpb^~Y^`Ppm1Ee%JMu(L%QmHbM{ zx0Plb@^nb?%GM@XiB&Nx1(6oXj5KVoheYz`tS7JWB6$0l$@W4AdJF{;wz3VoC6A?4 zejh#HP-I-XR1BrZ%|#INfRBN)c36w7$e(>=(ZxA@>^3T43H{uQd5+2u_uKEH6Wd?2 zOhr+$yqU6YzSk6>p~!D+83wKHE>n-^aQ7IN^a!6-iaT3TyNikI)+AZ>^7d4@Em4$o z<6+5BdReHRf7045p5Lr@W>QNULOCkrB+wZLMH@ma{GM-WHjb5k2S#XTp8b_+?ZTh8 zEV9eLeAad}^V4=jC2u4E;ZoFyhPdNNIop}hcotacOx}-3^4kh64^Jp5msrl@Lnk`s zotKP-P*Vom8oirJ9q%;UOWaE7_S!Ej#-jRr z&f_FAPR|ugd-J4R)Eknt?~@O$t@xT+YN{55MRJ=c)A<#)w}O8)b-q8zo<4(l`{IzV zobaJMKKM)xaZH3*a<~Ob;nNi`xK2n3Ntl7YPs~U`nCVvN2U3~$QtB_ef~zFr*|G1y5~n1iP=(RT+cWg__Dzg6Mrlu;|(1PRflJjM-T|YnO^6a0J-il*x@rL z?}cbD59%sL2jyrhh41%90Ev(F0oLgvv3%2>$Nn{7mpPNkx(^_jCO7_!>cBHKNY)d; z?FMTJwsH1c8x%mp6RUG3gqWeoD=NIVQtef*;-Ei`WWFkM*gMabcC|aR$OkBs z91Qj+k0A%I@(o>?5l{18v_>x$@5X$^J}SWZK%*4Z>0R2EvEkhonvtchMtiJhj<^K` zJ8J*@3>BbOPC2;_CJkSFp48Vn2Zd5O#J zW@;r0=b>cmLd%r;k@HQ%-Z&d}22Trq4rHw9yh5SnGyPQf05kFarIdo*jmlaR3&hbhh@+HHPzn zM4WU(ns);<6Ag0g2U)Zj03;KMh&+m-_p1_GafHA z?}}mK^Yn|0UTx4lEWpgmM4Fn+rleXZlN4Tw-2&XolLN&iabNa^#D%L{TM2z@4aFMA zPpnBlG76yw&oDz9cu(u6!6N!ssQOp-LL#5({7J>dl55**p@|Vn|vSA`%FP8fbYfi2m7BWl`Su9O0QeOU2OsOT@}7aAsdLInx0C%%}Oq^el}uRhlz@H zf8xP=OOs0eCct)2CBTg%K&O&*Hq}Sc(p~l2SxuT=e;t8aLW~NF@>;ZUr$(vft|trs z75NCA$AI7$zR#)5>X)q-J7IJ2J+waa!fjOH_}RG#6F|b@br*QXqdC|L2X+lu3FJ;W@C~=wG@_(xU>%T5nd&-%_9RvI3?aKOAxrHt^+ZhYCh2s&mz?zpW^=n7 zn^g0?_Dyd_Xru88p!Tp8>cFS9vz0;vW+M_2ie1%Z3L~PF#8sldp$m}!<36=0g{jTo zDf%=-=zPrwtSFq%7W)Qz{IZ*_G!_BRv?6PkEC7w$AJLnd@6UlG0{HSrAZe~lGL!Af z4EOE{auuj$w*X&(dlLq~`%DfdtZ&t1@nBlfHs>qCR%=L`j4Us&+1ur$S0XV3@n>#_ zM33`9hK{MdS^gOk7X0{guU%|``Y%1Jz@`z7V7BS%6B-!ehr<3#mRs52DiH77=W88K zjdtfNCC&%Aa_pE83j0C<-B{L%{>(#ouE5bY@XRm@Z)F(7M|p$~oZ^jjMePr`@!HQ# z3z*v^fAkk}7T%mEec(bQAd(4sy8#7{olPL;AeQJdszCFu2#fKwot1b6L%l_K{>ur# zIS>fP0xv)%a2Xe#+9rjlz}j<@LcS7FS9d%>oQn^>P0 zk_Ab@!^_Qkb%m040CL;={BuznD3{IL!5w);UImQw{nJkytP7MFI$F0GVdIB&#cAH>b@hRH4d)L= z9L@waN5?mhRUK)-3|-{r=?@_g4I&Bn=+>5x6Jkd4l=M0XC=*LQ-XiJfTZRUw!`1u*al~wm|i!129{K(NCIe5y{cUsHmCRy z7u8_JIwthWi>e>e@>|C$74@Fey1x3+GpMistpT>h@gn{MRbL0mMhTy znDcI?jHvSkDg@*2z-r%?ACEA1N{LXh^2OP1y4$AMLGV>s=V^p(-Emh9dZEz*XCB-V zA%5q7pERZ7+%Fc_`KLX@MISyyp+*p4z-M-@Er&z8VlOaXiorr}5H8Gbjf#1NEO9#9 zIbl4#q0ZrPg983aU%?Id`tViEjI0|#BiP$H8j&0XuUsw-FTK`720s1p_;p>+RL$C$ z`cNf2U)mlogpSwT3Q9w0BG5ai95e$IYY&FEzm~6$SzwG@&GOx!crRB{PW@-qQfE4S zT98kr(FMrm-12=?c^jJFFf`~yg|BS=0L3>$L|mR;O1(_?+K6O4p&@S`MR2Sqpv8f@ z``d>1!Qtztf_;L?%N`E7Q#)}ibr%CTl129j%Q)#c2Pihz2d6!}3fhX(FF*DzFxH4U z?NS4>hd-ZsrOATSoG#kajiK@2$_FWAZt*gO#JsTo*qW1TVq9_!c5v9789}4NiCM9% zgSd@CJ9aAi$=vH;+OaYHH-Ee$IFj$nUlx})kMR+-7k0oGe?2(XZ{Brx?&u1vQF|q8 zre6K7Bf>mQNic+NDBPf1b_kf=3|@7WmQA@~mGj}}o{PUKXUA{%_BZ#I?YYV0l%7+b z9TpIybgVY}T@Xr3cfpKD}hTH(2 zSGA5#gR|Vl`5aBPt|x~xCGULW=JmRhFIJNc?zMl|-uw%!U|C4^LUe!~>nG!Xx*f0H z{`-T?#ses*3VOl(?dn{d=1;vfJ=9b;*TIypGD}kR#DWMXr0^ao3 z)U|p)Ap4$!&?&Fe9U;$6XHSM`ySAH+$p0L?xf7BsnG7r3{Q`|g!T@}qY)@wR#Sh6G z)Bj{1p{NI3tZIt(bQ(>JfH%3kow4iHcX##vA@NFP2+`HG+)Q2 z&`SX4eAx&#-D;M%Xpclm0x9-KgeNj(C*X3>6uoY4!D)xEqHwZ1_RBtuXA=pAEQZ04 zRkWz&@l~|G&2$cTUKR0xDlp>pP#&SV%L*(TzQGSFFc#izPOJ7Rh&uTkjMLOt0H%UC zX|wV?aQ4LfA`5U_$`RWXDeSSX2wL5OSHce0!Df#LNJCJ(^{-_z!d!gQB*da!B(vKk z+590qw6+rLg5GitS}VSo%Gd+s#w}KjG{wk0 zYnYs8!!#el>tYmsW-w?It^f6Z#e?FDXnZV{x{-+g+rR#1U`uz^L7GL_o{t)p|N7Qj zc4b+O7b`CpSP$<W-2VvdcG`EHFn zmY6*tKnxZjHl^_=sbqs!pEmF&B?|FtHr~~P;)5CyRrsl9JiRx(*-UJM*k-@E*Y&W%M+5iYG2r)pHbe*D+U7~IRt zpBHjE_YutgRbDlK+@1o&0f9BC!6~ijfzCQ>lzd8s#?-rp5=Uw0GR8Wmc& zp!wF7QxPEBKq%M@n<(;>cDA4%G-bTEpRl*Q2C%Ee5~_z}zsZ6?p#Lc3WM1%atwX8L zdh~xqi<3lfQn&uU+j)&I%}F^c0-PcL5@*mR2^WskQv*whxad#UU_Z#m{%lZJ8IM$I zAEw8vPpW0|B(TX^^Xez?-y5Y4866i^=o{JG9La>+%K>g88CnBMjo#am*I*^5q98c^ z+{Ilbd8h=w55rP?-iIdQQ_h`)=aO;Z1D@XE_mHh zi&NcNEelo6Py6B*Wq3}qD_&Mx$cnA|O7*I%-Jk-7GL9sG3c6Tdt|U*7|SJ1}@M&H-3Vp+R_zBZ>t+syK~EU?QdbB z)V}#}$Iu?(yhz_VNukB{0(``JVp_WiQkjP4g&1akSpLjyElYjSeLpm844tDW-~f4~ z30H9S+|*LDE@734SMI|O{kc!$5KQH}@NY9qrbZTp}? z9Cv+y^|*)!lGOp<%Bc~2s}$x|&~~s+j21vY^I+uPsVIOBB^@tKV{V=7{y+lGPveki zMc|Mm(yJVq77wl=0tfh?S2d-CrR#s9FY)dC;U&z_(ZN8AS_74T{!o=%o4)ZiaODZK z3iU7Ex21^2qIkxe-8tM`wuH_mNe)*7mEXJdf3tM!_-3iz*HrIL0cETjk{c*S=R@eyrNHqoi@GS-iv<9bh#B<{-3|+BAM*$g+Y83oPMqNJFgD z7YN+#3E#V{FYv1AfL8is!Ev`lJU}xk@~r!5#48HVe^MfuCC~A?{)e{ zQCaXN98{G8X05tK|KG}b&cYs7JMn&Iy@C55cS52g_i`=&i@1S9S%D_?nCnwK}`^&ShxYe(2&pna6L;uq@>muzjCui^%_HWPL z1XaF!eabd~Pb<$!X)N~WGuyjxdHp%+0Tas9ws*{TpJK5D8xZ(Wlm+qui#O&6@A)>+Ma6xd{*H;y}K~xo?tacOR1p3%@f(RiP z?C4WCp$z9rZ8+hWOOJ0fdXc0Wvx}#7wx2j2VLx!TM&k)jO`)F1LOIte_YX_TV|&dz zu&}yi!}re+_2|i9_>P9&lc zjRgNlZ*9?GHm5{%yaong4-e60be^7z^0K|-&8uGV&naH=;X7&3k1TpWLts5RoUlon z8O0+YcCM@YMn;axS-0pid%rm-A``^=>21{v8T?TVf|i`~TdqBo)%O_qp1f?saaQKV z66u9i)xFhCyI0`vR@Z3ub&I7T#q!Me-|?V|RPO)i^gVr6^(A_BwO>wF`0yjmEAN{U4l#-dtx zydF9X62?>9hPl>Me6Qr+pLvGJxEIj<#~B|>j3;fzM0PgpFm3i%*Dc%+NvI_%-`ut0 zM+>1>IcCgARl^Cj`|(06V@&$it7FDy$IhfT;2C~?9eneJ*}WQ;7j-7lK&uLQIp$>3Sb9gMeO6ujTPzU2nAi_ZBA z!7{Ij&Pk%H_~)@DG_iku(;R>up#`f_1%dsjTjiA2F*A--&HTDit$8KDu95Ln#7PU- zPqc*Q`=cwNm2Ub>>(!m(nvZQAQH}Hzab`^19Mg}nzH3G@fMaf)(tp3a-$AO1R_V&I zwC;*wWFOPSE;-Rkn7X=3Hu*q8bMa#Krx5r&cfaLkXx}r$Kt{C73;PSYspUFz z9K7B;oAq?*uUW2iq;94c*TWi0#+l z2#b=y$MJd`(QNk$9BmvUc#4~DCr&0g-Zw_9lD2(!fkeF4T8B4Ce#P;eu0#QOs+Vg^SAgHx4P z>_df6%z1aDEQ!0Q^NIAz$sr9l&qb2|dRq0m6yQ|k<*$zE$Y}ELQo_L=ZB4u&zCEmN zFSEe(YA&D4t-8x_?e8v%Kc>rgPT|LD82-Yo*Md~}n)GnW!7(|M-40W-br*j*Fjo`Y z4(m2DVaddG;G@DQ{7y)zmvhli%g<{o>tkut134)r!fB<=ycc4wb@qt6bWT{#s^-s@ zm3_W4>3}K0-yNMs!6M14&YuX(ji6K+wam#^^610J7bw|ROf%MO;cteCxn#WcoP4U0 zSv08i#N9v#=TPe-N}WG5opXqskNUK$paU_YA`i?}B@K%nqY2E7Z^LZy(Vd}4;^yv4 zf2e-G5(%q_ZPmcjxxlX62DSr|E7mXJCetz1HZCmUdrY?H;~ z>xl~WRY~K%KALm$adqFE(*;I-kH3D7gMbM7%+mkk?C>L6W-U$Nd8AeJ?MW^8E)3 z2w=zHTSYXFi3*-a;@Rga{*|J8?#X%x6o`k_@*`;&dl1|D*n^~827ZAKdNPohc$e8S zx2HTuHS0)(qhj4hoOWy3NiOM9I?6$C@fMP*LZ#YZPg2lVp<|mXh-F{ytK&p)4I(lT%{W`xjPKJ`Yw2j@C zg>NJgx{{O54y3B}d=i7(;95#UkBRs_wpO)a!P!^UPJ#GqBuut@IN!a@uD3H5oCy(sgXXv|texjls~?Rg&c3Wv+=gcrA2&dn z*3n}{sfafj`UQvTQUIV<;|+&#U%J1>G2j#9v{I(73*;i>7&h>?SB0}R_4Tw|tqk<= zjih9@&;Iblu`N<7CgqZQiU;Oae4^V%hLzrCJ$D{Ka7@Y#1ZX@xNQU>-=+}G8hqD>ut*%Q}( z0jiFZckmAgC`&dwuHs4E3V6`zLZPh`=XEO?DUcc5y3%-e)Y6jfwIL$!l^+qBw~>|WHG+CvlE02? z@QJKh-AD6WMk8;iy+61=U0lg%w$&IEWMEKm*PonXL?J=SrvZ1EX5g+e?3d(_mDi&@ ztaGl|ttnh)!QD^F6=dR3eWN>Z6QtU`>MrKoD>BzrYij=dKQhFRO>uzn%8koEnt2A|yMba=iRpGYxz%*^st0;xPQ;rt2D-%SW} zVBsH1ze>Z>5vff(UZC^<1cPS--Y2S2dY~0Wv1k36$v@}Wkox;FKGFGWutxq%O@4Hq zxaAKnSL}p}$(wPxeT~vdAZcibX9$u}A7tdEdbzeSx2L44)w$Rzp4^)(!YVLC-C8+( zJxRe2mz4foB?tG8%gaiWmacRJ#>Q4QO~&tJIR5n5y`;srM`VlG^LURSJe&2ZMl5Fc{;`up>XvA*kIap$c9col=qQ-HRU4x}cdDY>|%fbjbr24<$Dh(-c&;dsz_o;v0 z!4*vVcI&1{(Jr3EIlf)AMMPzIt>d{Gb8Mc<^*xin`It-q1!~WJ|Bj_7Jnp0RJ{`X( z4;_mgrU_q%%hjY*0*BFXca%%DT0sftdAZMuGnc=UnOsB~%5f=7cvVt~Urn}?v+|F* za*gH?CD@j2a`_)n+10!*jU$k<*sV3{a?rIMu^=KF11(QAiUQQHhp*yEI7Onu_oxyx zo?%^eJ1a$+V+1@@aUj64sgejA@qZJbZ$IRa<94|BGXM`_`a&93n@GkAwB|=Z z0IJ%)xJ&xVATdh1_1Nf!HSbxUXQ)zHW>n zoAdL*39iPWRF=n7e{Qua50kp(zg_EFxuQvp|#M)F(hsQx<!^lY{3uPPd|#HXR{CJpe~}UtfYz5q17H3h{9M6&coW`A7eYLT;+|zO3N0n zKymcAVh2)~Q~Ldk0-g^fico{@S4W{gDnopSHYP*;`^_^(8XQOiI#4(GZOH5@a|r7n zir#;mqo`>MYFut>#DROh`%i&^;6TmxkW5}8^Tdg7N<2?qoB|*8Q@`o#z?be0Nkn>z zB_)&GtzK3@Dq`$9F+*AMNW&YTbjBUhg+Bc+^7MIv;5U2^aXp@L$E=tV^@&C=zmDpb zJv+oJk`&~JTR&pRk83+SQ4jV<)%`_IQA3V!xOL6Wu?3`R`~Yd2qbo>Z7M#jy-!Tl( zu}j{Ou4lQ?TYc;dKEjzs&FE-#BL`RQZhjo0VVR;X9 zRUl9u%5x+@+ZNk>p5O{~0BDlQ1PHxmu>Z%No)@#ecT5>Lm0x&C*sR}%yA5M{qRsnq zfxx-QKs9lg(Y;kAu0KbMX)sJ44|ELQcF@514aFhgKRQDo$9{tpxY#2mEQv5X)h{Yk zy&yR4xu}~U8;W9jcSm+FpMpkwH>%5@M$a=W(^koP9iRGB5<%n}IXc>|i?||t%?C-` zFeWiHq=s0{{=4+RMQ4*`B5iZ>K`~WaDd*7GYL5%*Lv(Kq?M%-xZekRgHAr_<(|W70 zu7;qie-UY1Pj^VT=D$;3aC50p+MOZW{@^L;41M^|Pf4&{=k*i4{tMdx1bH44NLM6` zK?l1+>ttAY{zMBmX#GEranh|$>isYy|6(s+?Ea05nK659Zh>>^`JNkz@=5#h1#TYg zNZz5y2GT@=9ST{UIWiL1y|AsPFp)Oh_#)-qPC;oiDVe~n_NbbNeLbu{-y&_f=tAvl z`#|UYI~w-2*$vX8mO%~;@}{Y{Mhm9Lr6rlY&ciDOQaYQH-w2kUI_b$lHnw`8UIY&Q z5G0+uhu%ScuSi}NTj1jEn*u05e;;u$0!reeZ$?MYnRciLo$>zI!|n4o$pGlTd>w(D zq&7CtaR94xvY|b$oA;x(3ZDzbBCU+2chsJ&T-wXG^^rG+1dQz_l5OQizUE`Ttkn@g z4F{Qv2!@*YAly78J?{G*{uTl$P#_BDq9VTBA=b4aVnVVez9O(oCX6s+#f5VjU~av! zZT4e#ICwp|&M&jz=2~Hgc6Qc)A6eHc$H0?wuwTgMLXfhG)BPMt-ahg_>w0Z~bPl=J zR3;tD9KS0;tRA_Rn*XjI*tQEvupuJ)B_J|Kos*UMjU@=^`BQ=1fVRFQYyHBea~`o3 zgnG7Z<|(W9?uwOBrWEZ1O{t47FBLg|8w$yp4DDMI9xnoxa8R>mB-ps`J=J+24&ZM##i1*bzDv)+29Ve_%prt;@eS}V<{ z?7><=(s!O{`XXZk^{HA5^Bz)wBQ@aNIm{U7JRkKzQ9I-$_l+QD#Qp{Xm^K^7D)@Pe z6+KIXuVVV1WtSGDwL9<4hK^G>(>Q_VCFHC$KY8cJ4;+#7-0#WZTBzdY9gZZLDb>a* zYk{vm_V`muLwuM#kefiNdKyTJl#ZT@lyXVjp@}pZ8_Cjv`?`y=pPzDmb-$`eB}HG< z6vnkNtnpY;dE&|&~*VXvf5tRE{XzT`tEznr? zePu|U?68iG!E2$s7LqvR&c`)(&_VYO>CQ82j)5}O^R%$`D{-6mfIK8;^d$oDfA*du zUNZg^r}XIc{zlXJy?pVXzq8-Q{SM~Yu*TB02d;ej~`NMgO=j~JTCB8)F7@G zd0EaV@FR4m__wkh@U3do$}Z*^_l4Yz-J0BhegMicbH~#^SrsVwvG2x~{}t;C1Sv&Q zD-fhk@K2-=+*tzpN#ac&#I|fA>B2K3V#I6oM^hr!I5OS4SY|Gm!!|P>+m02FNcYKG>P# z0bsxKCmxfiK{)e9lm6!HaaR7@(;tE_t?zhAd>04HD@wOIU=Q%md;~R0@b}3P z6NArND_(Ip2gBX{2sQ&R6pc?7jidUs=O^IhIFMjhP7yyJ)C|-S0efxTs5l!R)R*^U zsg|y1yYW`>0lo1?xs;As;CFt}AK|rG((Wa5z+tf}(JDQ_VRe7_9ptZZ0Gpn zo*G{aWF!#f`ej$v^9T#^%j3RG65KDh?q#~DAd}y2moH@5TNv_t&D~lZt&}yAnCxQa zmO@4m7{xU|4{UrO(^?t`QlON)mdp1USb~is)8};s`)B?nRyBdtm>xI_;_Z;s`R)CH zKVte7j69LLxlfkJlMr)T4s)JUecj)rR;PV7diHg1ncIbF*PN)f{hzgx|Ai9P=v=)f zcJX?{+Z7-afNFux;=ik%cs!VXWu&J@MFo}~J+hIrGqf|XGd{dnB-L9Isr{y)0a%0P zLIMw@OVUji0(q2ofoPD;8AKb@4!oc~fwYBPC=6zQ52&N-Q->FRVWn|y-k{LM{~<;Y zfO>D(q^z>rtxe~Mt8KL#loh);@h57bM<#DwvJ)}tP^`fP!*Oz`GB<6G2iyfby?UkL#;NIEsI7_ zj8iz#0NOQoOuNiev0;bOJe>>BPLsO!=o$bP{*s9wwE=(}vXS40?f4Ta?!esBO*fcZ zazl5rqZ&|0z*OKkcCl+`Tz2TqACPr!m*mjcwUG>{O{6- z7;&o-L^}xwu6UBAu7YQ~wZpmlWXzNOQu~gea2<`;n=FkY{KFO>;XJbzN3wa8_hucm zxpLM=e4d*nXlTM>3Yx3QG$68kY{~(Ue{kkct3FRmcauZB?@(FaH>v-%$ z!EMkF0IjY)c3JkS6q6kI5KOS_C=mGXXSj%9ph>9$nM%nWAQ14t+(NjO5byqH$}Fb? z{Cd@x0~&iA6@2SgnN$=o#{4Yc`a44^8xUz5+QMRcA<{OccJmu$8tAly2*Gh*z}Sc( z1*YMDesFM5wC6%-PwdZqT_8q?S`B5SvX!N;J^tM}ef-T0g$KtjS8rGW*(ddX$iCr? z{rraT(2qTB>?bEf#}nRu(|Ese|4@Hi)1I$>XY%wOoJ8jZ?6t$z=FBzvZ_G@JhXO(F zx7~8sp++rFF6?RUn!H)ctBd)hjK=oXW=ZKd)|Qj{&TLRKh=*+(s@}SITl>}m*MOS= zEuHQkBsDK%yhwr}zxo^yACw{XwG17=Z_Z@;7lN|j8s{SR^0xz?<~3SOsnxE?YV3S| zv#-m?NMM}jdd%27HZfn&HD|yzyy8MJ^E@JG#Y5=`%K*LHikrRUm=+q$B06ly>IRrFqdNTg8I zqa3LyD`qZn7cNCjsU0LnAxFYRwk&_%v*QMA@%z|$U?`T=_yD0BJi^1C832Y+fDUTl zc96>Aw5>7>kpB!MEEjkubMAh>vv$9WB3bpS)$QG18x@z5^n|BFdnDD$Y?XDM%87pe zL``fg>1hk&yU)QOq&>t}>{}PIQs_KvS17hz6bM?w?`<`s;G+4Dzx}V#+hNXDz^xp4 z4-)xvmP`=k)r+iai3{#RlJra)O}7USAD(OKaE!AF1ACM~GU7IWMS}5oNv}3&F?60S zFc|- zc5IuSb%Qgb4fGtK4a8RMFnNlR?YfCimx>b~w9XUD}>)s^)q&d0NMaED-f+hCnFJXBM3N zKs_rFmL3Q>u5y?XK;b@IAw9+|23th3=vfu0K3&BVCKRmVg2Alozhi{TfVihJ3vGD{ zvy<>hiD2yuWq zPq}A3!S@l#_tynICr!8cyCB6Al+wSIXjN?7(ZO{AQt(TOW$K|AXrzWCcK}h85CJOO z1+og~ph;UXg!Xn-ZHvH?+kJb@$FWX+sX{6$b})DXfUm-vKJ%Uzd^bI zAqZ^S|L9KfWnU?<6)bsjAl#$>Ma2FgN@&2Q_cuSRuE)J>?vMIRpZG8ku=I{@F4x3;OeLW_@J!0b5O673mrC zmz+kUr*aeK zeQ-5;Di@9$tpy{OY%CkFss6vI12Ht4{ovOi-I^n&@G3DAd-(-gU=Eq>_!e80_4Zr% zOp!U0vp1I!5K0Lh1k1C)!i7n)!UZ>qZKeeMGFSI)F^Yf7Epu}g(mLz|~UynNd;6|skF$?V*Hy%wX8MYRC`(z$jss{TT z+L>-oB<&Ul(Mg#%McJuaV=2r;Z!ZmXV8}fdFFef8PKZ{Lc49$}CV$ZAS*Am)%}8wr zXyNg7r(^xCX#I049gN4BH!HB6k*s?^ExS<4NBeA|^EreE%;_%6@O zuminyD>9vPf|X1m_m=k8fpD7EOb>r01u8w^$lxH2nq1LiuxqK#U2%K-_S;gbYn-=L z#c<07DVHHz78*SQmI}s5#5CM`+@&%)t-(Bt8l4^w@b_aE$AtI<{|wzWW85V~J1!R6 zIA~;~y;nml4M}9@yEM8Nw1g*)k>E=?@ZJ%pU=DoYX?|W)baV=pxU}VuNh$q~LVm$? zAbvy#ayg%okNFKSZxf~f^IrBm*buRE%nmKGlL>2KRdwZJOns}-(?#c{w&pxPvn90| zemgYDPJ_*HUQtGS;c2U3xoiH(xu}+thMX_Q>vZjJx{`V0_Y$tkZ_kK%w(QmAQfhC3 z+RC@208`j2AR&S65P8`iSXJ9Cxl}47U`Rp>`7rD5lfK7Su^l~6m}yx$#;lt)r%reP zl25t&ew1r3zp=$%r8t3CTk7CmS8-2kwV{CWgFtNL0vy(sJDJ+V8NFAXfFB0kiSwN} zCu9W^2mHiR*5niE5jmXZ;z!;{a!h)LvUkbb`zXxJ=e+^ak54Y}GU)vE0YY)F zhxJvFZ1(Ct`?@dz3rPhN&eI2qGE-=dY>{^XW>7^ff!O@_SQt2ofRujhiIr?qGEJ&d z`Z98L+sv>SJo+E>ZNt20z{SQP>eaRxX(vaRjNTPkn}2B8m8wmvg?agHF*ElU34voh z@loW7BGw=-TOhgQ4ONFgF&FfTRXq;FM>Uq$9!FWoH}j{mKc=3ZvTbt^4^P?|Zq6xgVHBZ1OmP{Qx9g_o%F@A) z_#OVXSy}e2RXMx~1+9SVDL!X094KZWfVZ@OX7v+!{Ml>X@BNJB)%>wM>75z>J)5PQ zaa2oP;m`I9tBor+q&|b^`Q+t;KaRdRp`J!)j~e{+O+(;a$%z3#Nue~4q#^NcGLko8 ze6Dzq8MxX6In)hjT0B1&VB=unV|d5^z~AMuxLI|<)j0Kbi$dA&)$ zGP@U1jhm>xkH%7|M#K{gY&iA5y_Qi|nYR(<;(qRfL`EWO{7GOP6>b&>AnPLb*6i}0 z{=y*zHpXQDhJ*h@DIGID^T`+dVPxpWJwVJvmK?4lGK~3LvP0k4;z!tJzUM8i*T&nc zW4A4adbXK&>T`xGKb_u+S)NwzsouN?Uzi_bcU>bOuDk2$JZ>aC4h!{|&SR@HS!7nc z&CulV?LHMEDgv}DDui&4?lKtKw)g|gXfdWgj}QgBXYybveWwQaI^jy;( z{_LIcE$O@Vt7}|KO)@8oyD`mutj%TdWr}Nd@~S5cD7Je-Qr&>~0!nTF2^~w+EGo{a6PT zX}n}U=V+a-{~P)UF{5)_G5#N$GD)IS9^8B7?4+fimAhe%=(qJE!2LATi=BsbDjbaC z8fK!?HKGW3?}EFq7}Iu9F}q>{Vd|xC9h)R61Pj z;7|5WJ$GA*yV@Uwi>sL!YzDiaDKUcsb7qeQ9tZR!SIB>vg=@ z-QzW9ZZ8Qj`WbI#J52?n%dSp2Pq_T2SCCQ781fO=O~AfsC(_<0_`ezg3=z!xE?;+o z>QrZ|!oT_maU(C}l)7oYniDH{CcEcHH^h66kju^G^{ddn^;X8FQ?1=#d%@4}yAeO1 z`ojbas?iCBn&@ji5vgcISBccx2sD4?Gg5g8=sZxhtbcJfg|`CxN$~-|GKKuFXFQXd zL~T~SOb{~m8Oz23JZGB>d)2%5g%a;doa>#@->R%OutINcWEYi=G{gicI`&9zeDM8N z^5E5HF|yS2;(1@~(Abawv*WPpgt!{FgSHc*ll&>0-jWf0!wT0qx&bRXp)!61(+u;C3LvAZq; zE?IRyhQ;=h+em|=bl8Po`99R{>DX%?W4fK{TeltFN7<`alIv%@FU06EXCU~8%>^>9 zr&#${{i zrJ<1)UFJpf+^7H+*x35U?3?|XT4T?}?|0Vul~HFE4qY;C(CE(Jhrruj8g#y52-cd0 z?+GILM1W6c=AVk@h-RwX7i5c9vu{uRH7H8O&pY)?YG=oBCTaVMO!`CILvB9ataVQt z?ovlZr?8WA^<$;j#pe1hv52!fsrPC3@?n>q+qJTWcl?vK-L?YuF{}|gK2uU@sxGY3 z_z`-dREFGAFeL^C$K%~!z!q(dZ|%rqE1da`*wad4Rvc!UbRsE z&#h(Jx3R1aY6wTp zZa(#&)j8qKu&eLr^lR9tvSYX9AX^uH;GHJafw(339xMW^-GBjT_}2o}?@o#F{Cd%A zFr6%j60I_S1}$>x8fgRJV}`C8mZR!}B%Z9pRnf##WL`kaZtcY-1Lw$M{Ywl?%B!2{ z<1YwrX5i0|5hvMB~MmpCmof$FI}laP*<*Un0W`(nHw+q^}r*j`iU>g>cp{x-k9nV6F9DeW@H zd(wr;JX}iimzqfN8s9t2LmlkZ!|v0TzH8BshW8;T))H2j)KwK`EgU&m+Retg|*37r5lwjf80vSDMAhd$xy01y6T}@1kB&0OEKeo~e;J8K=3hl*ZR)wv z{b{c*of5zRQ(9kl4?7XX(zE}G{~)nuRZ5|3)BQOoowym;r1^WC0hV$889IQiO%$^e zj=4iiWH*WC3{xWiG4-b^MPxc2bG#T~uWuhiWJzZJjP06wd=TxW9WcDv?(Zd;gV9D> za_MGqbJIFDtocMEpZwVr$fMf&px&i>Cm3Q_vBunV$|mw%b=6x|=(e^!#BH-{n}t#* zzzXS+6%5)mn2{6bv=g^M%mP2&ND9pDr2Ht0Ha1=OHlh09rq0-COJzRpeOdbGwiuNd z(`oD%)($72(hqbiC&<{7#NZ2WcdyS)U~IBdJ3P@cQO@?uiHG`4tTG zu(8(k^Sa?$2P?+=6UV0xP+k4|mY|9R8>Ro=wFB)HnmPa48It+{>Kb%5r)1_1YUaIN z|8PV&HUCgN63s}L<>D^uZy*+7Fdb3jR=?WP?Rt=Wdw4s9M*uGnnW7d%PN-9({WH$U zaD)bV@K6t@yH>c`PI_3`Cf0ljHQ|z6?7KFsyvW%r08;U%+U@P#z^`TiQ@io9j-HQZ zU`O+anzh-CPM1#f1Se?qsXS|E{8%%ytsf{!c9)a&yYn@9MUzi%c{=rSTSj7E5z-^T`bAZTrnqk6Hd0STWf$272|b!7`|Qw_E3TL| zYUW)ue|$ywgO-Fq$rH2+cU71_r>ebL6XFHqE-qK61fB>-1A_jJM%u%Ul_ul{9wdW6yJ&Yzr0Sc(%MdZihj|^n3`X9ZK_nLYd!= zRo-;LAZX)27QZ^#buHF>#VL?cx3E6D;%oQv9;3ESR3*1^q4`^EG5bu3MOk%Ui=Uug zR|Km>%Z-d1Fl38O!}Y9#&AdJJiNOv9{Wt<40xaLWWM$?LP1Rb&+?jMZ+Hl==2T-dl zLJPjBla={-zX*@I$7(QqXBZzBaGj1rzf2U@RG`Yt&&6S+N558^Le{G!UnWt^B-!=$ z`?`&-GzS8^SuQ33WLyj=OxsRlDn#e;85Y@t&WZi<=D`ioFKDoW#c(3J#1JqbH=$FY z(Rn~EuE$jjjD3NRF2@r+?=UXE%ypq6b94xeMzwHH)qh7s7<8YMQKf&};Zut28tr`% z=e)r2(yaPqbb7&j7`Bo>{oVne5m-NLx^yG#*hor;(oe~ny3m7x1;NaNH)$n%st@96 z1C%AAc5goJm=TK8IOjU;fQcr*Q6h#LvaP|pmB0P;bwkf+p|q@9*6s7#y;QOcY--jT zH@NkRE`<GPBk85*_~q7Z^hx_Jb(lb2yT&THb&2+g9R+xZ14l&xe^y9+Gu9~s}iFge*twMI#~M;}i< zra*)D%`89Z_c*dS1$z!Q=#$J`L+{!IkUJ0U{~@>&ZN6=0pVRh{ z{O%W^2@>*&qD6oaB{DlZ*BjomWQ*ciF!Bp z;)&=Fw?5qfn{=i_`XLk}dlV9H=90%n?8bS*tU2^<3>adH$6xS|bR0YBnXkAt$V z-UXrb#Mh7Qw59WR1O25=V_hHWWvtH&IyyO{VgpeA{^8(zCoQHD$RAWLb8w#!XnMru zLu&E?yK8fx8g+Ic{uFGpTVG7A$i?Adc^(p}u^aduaUOh%5W|^nw@tY{I$0(!JPE$b z4$Z@lu;~Q%x|?(}IZWqB$t z#^*j)71kFAL`SvsjC8U))n=Bc94RT5ds3Ied8S%lfYop~IZd^~LYuj~D!lGz!Ckl& zY%^4h5xN7WGKHSbyAF5jw$GOf+J3-aY_i1WJ#n?tRBtHUSASGsWT5Acj$B+)2JYqe zP8^RQn;@(jZEOc#7y@f-B@L@nFtew0@n6pB)2V7Fp}I1Wq9D`yjUIdm=P3#9Zn=Ph zc5?8_U4q8Hz}F@C1b9JgjjpKwT0) z{!@KwB#mi0sOM)1!>_gMh!@L+*sobu<3keKHpq=UhMUSj?xGUzQ7SGd2{SaGWR!A8 zAB*8;0dEh6;bO?|`o9_vT&sk`Q8Hkd6!_q1cx2p-JVJVCPjJxB3O~E)Y%lJEmr+ho|Z3XsCIIUN0M^&@FzQ`b2Uyq(|5I z%jhpdne-H6Kf#E#0m8seDw9T4OBWcG{_qC9_tC-zWhS_e5zCk1h*o>ko3TIr^Hb7$ z0_RrCkk~({J_`ElD=Uh9v&4SaIOq1E9!!O92NbMVC8aw*u^(i%0zFJXkQfQ1k9z+I z;p33VWQuRfxIv+M9NnLSVdnLuzmgre_<5gf%|Y~IrJ8Cn-a3ZEYOcjimT6x1M*n*$ z1#@+sQzj=DSwK8(`(<`zTXI_}(s?-|X*v{^6=tjAf@NebWP4d@D}H+uluH8w!Zzb9 z8;F(es}8p4&%z2!Y3iK1JX~!>JPo>uI^E8?;y~6Xz8cD%U7unHI>+i_0&lR7+UqI4 zd1E=GhtTEN6e{JxIEI3_q~Bax7)90pEU5c4@XY1t%^3kuROBES{>8uk43}3ieV6_I zgNVb#6Acumxs^0Jh@70Od&Y7>Qq#g25#?G`$PPt!d^81#pVxE6zPePA8Hm(kz#Nd= zQF&cM0$#GYu|3F{B}^S@86gU6Fk~t2t!`p%#5kLdeqg-e_GPuXMn_DXaxs&H#z8|E z;%8wRKRv}*5DorrL*Bmeqk=Sc(jOehlqtnvqIXEhL8Oqu%W|fkPki@qTtRVtkDS>5 zBqtvdT5lAkV`%UNgy->R%NfuP&bmvWp_3{`$s6NzF~PxJh7~-Rvu+v}@*~dItfG@_ zq4I673u=9p= zE-*yXXk0yGa+jEv9=_yPNyp=SHDtOr=`6r!sTst7Vw=ko3!Sa1qyIQw5cT0hw}gn= zOs5&DK3U4IRYPw>PI!`&qc81qVf01wd;OOg*N&fYRX^^%bj=5VhHaaSzxt@(t-E_%%W~TbC1O$gFZutKA5#e}FZ|T?u88p+ zdr5?EfnlqO%aPoXG}PQwu7xAA@&)#W?LQlg)HuFeBb#_5Xqq)Jt&EALT^s#jb~Ypg zYzDA;_6xY`=}c-)CB*Vf$xFK+b()=-YkG*+_A7+^8oo5`ty)~oJbUJ4J_1cET%iZ= zN>jSGl)iyo=on4cRj--1gGJzfHj~z7nKy{G zklIUMrfWA8zW8 z`Io?IEH59#mwp$BGpc0-h2}}pWut$dK2nOcZFfo|DXkkOjR(~WL!O?Xj{NHBzr@*{ zqhD2$-nbp-+g$iPM2~BRiPLI9aq4q*aP(P#MmJ5b9xpvdOy1HsvR3eo^@tc4KyS^~ z4QDMqy>%Pe4gvMvfe1$m)>iRyCpLNtbH9+tbR`sQ!o7Wj8p7aZRm_$0Jb@pabcbkX zz@?Qt^r|Dgsvxyey`ZVQ7DOBj+ydlp!_3MT9H9FB^_gZt|1|emw{Ip~qxSN_2J{g1 z5Lm|^#GwkFSruKgnl!cPgzDZa6{vQMXaH=D-*bkV;{&jFNMG6>&LcqRZ#m$SXlU)G3O;!hMiGNdyuXOOCBu5W5b!)ub7#e($HDS3xXMR`{ zh0+VR5IY&r^7xj{#Al+*Nk;TSyz#OSw3;x{t*QSQl``M}Ev;;Y*V#DRl%A_H%;VxX9w7;%q2cM3#vx z@LgvJ_D2oK6;Nay9r?#xQvcEfw<&-|dh9dm@^Nutg`NyhP*%Y-T=TQL?%tdGZZSPO zPq-0!=|$!}y`4KjY37$LB9C~=`||L&16Mzg!ibt30` zDK6bz3uxd*v=*;QC!%FWCkpUEWZxC`6l9SUD0ZkGTW;H0!3wlNj=b2ZsJ`%HJ!2!j}q5 zXPTRBfk0HjEw!NTb78s(=oHCFYQ>2`Q@DvRu_wj|N@s8Xk{XMzBlvBRf7&4T;8B{M$oIW0oBBu9S_xCU)mFIf@+TrCI_2CMwp@ge+HF>yJzZ& zc^WO`@^&%eY=45LTFxsc!>|exqiPrUy&fB|{4?|cz82^Fv(Q|?&A_yJ&Uh*T5FOjk z7#_15#|8g7jQUlqaN5Y`0)Ik8up+!w$cY6uvByUftUp+qyB~awQNknZ`H1>fLM*l~ z>a3f6Ll81~wy&YkI`Sjj3@_mIR9?v2;|ehq*nOu*Wdn2HYNdD3*vf-wHVjADV5`_6IAk{$+EHtw3REh>Xth&hf^(TKYSGd~Sjk+rV>}3jf7nyF6VUPkNTCOTJWi=3TUFofAp{d2k4I{$so`>6 zb`pK?ccu$TE1?7>L&eN{957~5O5+$T>g3@Z0L0jpAv$^azchF%FP{i^KgC4u#sQ50zE z7~mRQBfoB;++NC&C!=I8J(V>z*b{^@xl}Gg+TDBGV_6BdXP?Pm#%&aPW(5JD8TgzB$9nlFyy1R zzX~%MpmhHl?R=BIF6oeb=%tx2klZE<@FgaT{9Xt*(5$Bq8CVguus z8ogMjy!G5Oen1^&vqdI9#h*sy#Oq-GG=Sb}$wmnGjo91e>d`D;NwBK#|g9U;sMpimRB&MdBdDs@1eJ(ksp zx)JMh`ez_`^>$5DK!yFQTa+ZCv^3;UV`}(xR)%$$Fi#X^zv~k4kEqo>%XZ4Kz5W*v zD2`m5pw7eEF?nB9%hE0`Doo#=>*=JI@qGC2f;@}z!&!>}YlVtPi)#csM?ZBM6vEn0 zOh9x~-_>1qJe{?2X)dLZ?H>UK^2h3PGWOgBL1L$tlo-TV1<~T{u6pb3?mvLIWl>RK zcB#fX=xeLsk*V#c2S77J(1{DEtoDu{yhcPoFI#o&=C(n_FUA-idb6 zOMs4Aaa%2fy2))d7DS``fl$LyFC0Jz=;IKSSIG+c8F@|cLXnn{b1+yn{B*aV?KgU0;p$4uLHcV?xM(NBG3y3s^ri+=pba(GHvA=vv`Q_;U3WR(l|B(F&EexsaE?Q@%$6|*W zSqn}Y9`Gfi07%Iv72F*;f7tJrQ$Bpidi(@Kb*wEASP~fb4K0I8PCAzl@kDy8XJxEF z1+=^{1M8#*1HHg8qLh84rEA4i^`Siw_UjqV1Vq*_J7Rzivknh^dktCNsZ4r9m7N{t z^*+{62t*d%g%U5(y>1|7)T+YnT+B=Z*oK8F|J7NU^l$)wX?e4gc&&48hPkdMS)Ax&hR{yPXtWGZzOklPaL zVo9!DY6req!TZ)A*Hs9rpSUafTlSPM^$T3AeD~gY>_-SIG(3H<0Dh^Ye>Wd^|K$)} zT6)l^mGjsr3H$My*pK7kv?apbXuGsjN+vF4akmwK(Zd+l;lzlH?U=rEH3YLbS^*ee8b}+pZ|b0M2UMN+28tsgbKCl}rW#J(6d-)-ivnpb zx`zE%XG@y}|A5*Rc!)eXZF8W^_o08pu@U=?h(pmy_vW_S>ixa?d(|gnp!nF^spF8* z@u~^-*4-l#%3~=hXpr&_M7r>rT{`RW(uVRmXjXyo(TMt~^!SeLRRI9h0|66YXS0(y@34w}a$G?Nv?J@6g%aeoY{e{qJd zeL@!{4F3m$pg%C6^|$Xyl-hqQ38z73?%VUB4GXlJfkd0@0zT{QTMdL7juU(HaRvG1 zrdvEr%JS5V<>1vU#&U#q|vg3IW=M`2milW)p zaRbT!SHTV)(_jQ3V2$<;dPwba%faUXCF-T2cchsXa@<(&cH6xl^@!MX^H>$# z0DnW<_6AjW5=G|vcqV5jk z$^0xC&^bJeYfYCZz(dD_#G(SPR2{`+Xae`hupF%l*eCj@B5>w>unr>@Q-+5#uIR9& zZ}7vb5QrkR_)k{VVp2q(+qZ1n6b>opt6(@g_QQ*)y@0K%nXL1rtNjD$htz)p!3DfS zvDEv$Z)YG1rlk|J%E|pv>*$(aCOD{oPJ3k7jsc$f4_rAd`kg#7pZw|Q@o5p`elz;+psB+#PI z0pV^K_w3=BgNL0+0Bh~*Y7YSf9(`O1svy0I8W8xKqVu6b<~Pi&j{le)a%+1kPmor z6(Zm;STp0lNsD~qQTp``Z4|EZ9a_$hkf)E%aFf&M_h7LpSr)c-oenAuA2 z!!v9yht9A!3RDg}r5QA;x0$n#Z6arvp4qY~x)r3!qIr-PAiWOwnzbz?KgV~(a*PbZ z91?k-@E(rNy`qLtpp}B5bsH+4{`U{_n%Aop_q>5@k-L@i!>}*+0W;_oU3|aVo^~^A zP0VY3zizW?W;K4Gy&j!_3<{AC{zm_lQ-MFyUG+iR$k(vZ0V5&0#Zuk4}1m7JR z=sh|%1kx%DO&qpQr+0{X?e+32RDm@3rdbK4t{+@S3Fz{^%n@8~Ct;5fL-!_p#o7bF zi0c)rg`KSj)z%^dug1+5_>rFw@rUQJ_$Z8?IN-1|yQiK#_I=Yj<|P5{F8i+(WMSmn z`2GuG%s^pif;f8ED1vx;)+d^q7C_dC4_$l?W_}ehRMK# zQPi`7Fa)w-3VwKJpE(R7tb?w~G;RBxHt$oLY_)gWw`z!T(UC%er&5qp*?cb~5C(b;vd%Y1&zj@&m77-CgW~mhGYMli=aL zsh9T-TPZbtWt_g%+z-byV zgpfp_CAS)tqE;WUMyxh1(;lV~jD^_FdkK5)IanUW<#$p#Y>>4!x1;9i3<9wd zN7vvT${(4k_8UL4!3F<5w!wUJ$g-OJxer*Oht3+j6dwS)NdfH@X$XWc|o!L zdZq<6k&nY*F2@fK@6c@7KP&LB*~kqA^R2HtR)-@1plDvEfU_%iE-J+*zdt-X;tJ%o z0|FdO^-RD}UaGh42-j;wX)Lt?x!2iS&p}T1cMX8P6>`+K3INps6^p$Ho@9>OUsnogSwf@w2PW$6p9hixmd6$qkjv)ESzIGG^m_66ql2MB{?$a}A%hjUSz4<$-cP`Ml7EK5 z4HVkNXmDO1H7cBlixSNccB79YE29p1S8g8a3i>2gXdnzQ@Am|*lX-?9a|qNh`;YPs{-iY1 zj{i{(+lIhy=hhj6qpER9C}=DN)}|Npc%Ca91@jICo~SE$=Vr4?-;WH#3blGAG>%$W z)oiFguS=D;twG}pYGzuFE- z@gbpnX8t4iZ5wzf8Pu&?o}Qkd3~&N;{eN+%mriC-@gf}(kD$als1?Qg^l3Jbrk8^b zPwyGlsI{K)|J8Bj;ZUw^d^)X%N?(Nvsg5FB6MeQ~P?Y6Zq8JonC}J9%LX%OFQc5%i zSyC!X){>-5QMM7;BWq+!mMnA3`aRG4j*iZCeXg#nf8KZAXYTiY?)!KDe!pi-(6-NV zd2RVlkfc{MA+pc2v>6=E)~cIz)tSMofcKrBy36KCrRcuTBsWC2kr5Y_8H{a|by|+* ztB&Htug&z|(KD|j3Q~%et~1Z1O9jN>0aCQssR@!vRMGpxh90dS|YS;(9``k}e-*3qk-M^83e68)3< zC0xxLvfMu!iX3Plh;qR467Uw=^9OQqV%m_^1Hezg3?WqG+s)552b2tgl>=ghu}oVq zBmaOWWJM1EkExHhvYV2iBFFC669~mnIsp~ggwXlN0t{bMLH??M)Xg`XaK?5eZ?Cif z=FL(KP)iUFrBghLP!eH=i1gzOAtUH80DoYzQR?otoGJfn7o!0T+Gn4s8_)WyYe4V% zsg!d@FaIORD&465OS%OTtsn=r0Tkh_`UrT(hd+xkIQi9cY~6Xm#XX|VC?L-&4i7ir zqcb?L2MVNhMsk;;{sc8%XQ`4V?ir{1V9Myakp7)tJ=le~%y$3-%@bOU9rF9>UWV zB&NSYADa8#TEvE;UzE0`h%-){&%76Fer>3N=;59|JeLDz3OyS&$^H`DJZ?C%6BRA& zIyx+D75_m{;1^n`JHQ#GD@Chr3+nrewWt&G2>rFZIE&_!n~H<9x^^RRdN08*-ke*iwiKM<^t^o>n zF#U!L2UCE9=egj1~2N1$9wuBHxy6do;MVy-y%Xbk!GeFg^rGx zA~71nuD!z=kYT0zZ-3$`joa$1KV6Ur3R9MBzlDzfx{%#-9t2CxSuCZzorWidT`v4h2tr#e<&cOcfHftgr+0Ww4q)Ql$t$A zRaxNSKp--}1V5Z9Px2kbKLS{vy5-JwA=%lA`RzQRzs3Ogh8h}bQLrh9BxRtXI8LJb zo`S?`or2Fd1o<^#?4ay<$`cv0Zil^h7ho#mm;lWZQ0#gS@~^JdM`F?=EsJiAk$s&< z2HTQqp1R(ecSR(aKLFzp@TQ2G2&Q`sPpI^lAyp}Q#tzz`8um(8s1MEWVxI7?J@paP zTw65#`y{w-h?osuhC1K}V#deQU>Tm+rF5c77w>7_vX^E3$28thMDWIJ5`=%T;K@v# z1aB?KCT8XF*@}45{IYy^qGbcYKmbF|`w32|d~OXN7IIQdP&I>;P%z#i?I@T(?a}$O z8xw{?cDWBjcQ@?Zx&$lcnghd9BL=+&K)d@c3w{f$WblZ{P9uOh5KcDnZiGUgD|j+C zNy5c&HO%ujqraC5=BUFdb~CF|@c>{O;bdr^=A zY>h&FpFobIp^41j)BTO1yB~D3@>0|Nwdi7PevY2*kNU?PJPT2;d4Z3;$|<3>@LJ!H zD#czTRudOd;swm@q7th_#Ls};369$8sfP`A7l7Wo;d)Ke0D7g7tsLmoN=n|HN30bC zUqr&b4q)-l59XE;zJYo`db724yQPWjV6t^u%QHWs{mkb~ALk(uFhuUR2slX`)&CAQ zE(n6@qg^BfcKH_%kj$uG30WQV$G~kUBh7Z1p-O$PT9%kz{vTuh0KqZW|Rcc zW9N#H-mzrLny0x-uxfaZg9!+lo+@9OGLorY;72+5-msItD87o7Xo>H=x3^{gQp;%v zs2^;&tJt{97x}_9nQ4H!ACpq@_Lfr=({`AiH^!IcNp8D($&m^#mo?!@PrrpP6gw_d zfHV`3^0j5k3IHV)=e^t|!^oa~+P8(1vt7D-a>bT|=XMLL@dh3^=WQV6AOOG!9|g=_ z*Iq7P9(9Y-J^owKVT0^5bLuL~Ef_I!y86G%TlZIrq*wgeRSUBclWNL90J5 z^?3-y{vY)?`8)S>v{|Y|I(HIR4q8fd(Qx}jj?Ch-&hT+>0xpNz0ylgE>JX(YhHNt+ zUO*Ev^3j`!PUg74nz5V6ojxB%HOzY(2OkwYrK&nJ%WMYH5q@NF*~J%jd;M87O6wO{ zz9xX-reOCm!3%Bj^>aj-_2};pJ}~=tuR`OR2ar}IEr~^z)|d`J7pjB3xDPrr2>9n;jDVs z-X}^Qg^@Cl9ZraAFRp89>!cFYd?&-cHt?QO2E$^^*i87XNVTDS{hYgJw!wAwWVGP* z?zKmJ1C**I$=SKQzV6aGa&Y`hw zuNSoA0y(sxR*_d@b-9a$-&h|Y{iyS6H>yShmT9w~)z)|==t+urMRIPd^E8!r2A}%7 z_Li5V9D`Twq>EH$O!-?))UZU%eD$e@Aay*?j>}Bqyc16*c9A`{oL9{2oP041k4?Ari0e0RX5JJo#40Y+GR zd+5%-dOy8z05LGPnz)YX0TTc+#X!87k-H~VPw9M<2q2QnQd*a(%L!i<+!+1^@bqrmSO zcI0tHl9+>_E>(&=?U^-y&HUi;z+Zhukv5XUt~A#;;3@Uc4&27bF45niOfBI~f0yp4 zr}xxywE~}OVk$)jRfO-Kvp*Ozh&MDr`bq3)l;S@#?(yO0kJGF>BJu~5iw^xT2Jj_V z(vBU+j5)o5T-b8eL%Bx{skDvQlZAgxgOe@iY3E5~TY1U#54vWTQ-+y1`jC6B%92Qv zbClWo&eUY`!xp)iLnn~+J&S$G4g;%8J?+o?V5OHbQA$-9-^VTtVwW)vyv+Qw; zP|;eP*so9!=zJ{+`nfPzZG3zNw?AF0jw!R(oVOpq35E0W{wqb&9rZ z326>FZ*7o{^5p~({J- zD`lta0^f>|r_7J@vq(~auM3VV;8}IEGlfEM_Ss^Wf_Y=eVl3l;hA>LJ@Xfq~BVKVq z5qw#<_HxQxe|avI!z4+PDJha9BuGxbT?rWtc@oX3EaXvVh^Ak33VpjUm_?~Z2lTA{ z0rK&8=029@HRewf#WO<<*ONS9DGMfT*l~&yJItR*#53r90Er# zfRwmR%B{>fo|{Fa7qDb!{_xhw(g3MG(QZ%au8s2SYj28hn+^2}EL?4nW>4-oSxDtBrmf;n7Y3c? zwoa{w(v9z67QesPF&E2WmQ`|ZZV{>`Nmi58VIRS|*QD;L(mEBx^*K4#J(neI&vl&I zq+p_k@%5S_Qhc|bx8%`2w9$tWx_*CfZ~gm=k{gxax{|66TgAIc5oVkBJmnjEPc(MV zuAu*Iq{Ob2Az zhWLt%D{<+GaY@zrIeUHSk*;NQW*48Awd=#k20lO1WW9ab*Xq^ahV6a^wtlY8egrKS z9|HIfqk`S7sf5*3Qu(j-ZZ)kv;Gc#97OREDM!(9P_~iyKqU$NQfd7BPm);eo;0BD5 Mf!Tp+Wy2uO)^OM`%8bc{{u5~Ncm-5sL_(hVY=W3(VJM#C7- z{Jz)q{sqtT!@16N&ZqAB+#UH&ONE5+3E`bPcSzJ!mEPaEb5|bs@IJ!B{V7IIJ*+^HO6{Db>=;P6`W^_@F4aYPuahq!M7H&tVgJ9kLC|2=p60mZg=?g$2{DZSS7 zwb)Zw25=MeY2DSkU`5lt`tW; zK$MQIXoe~kMar1K)8Biw!v`w?MOn9!KH;j5o>qGdOCE#HySb&=)x8hk$C=wBk{+b% zS;6EAL47D}D!IbF(5^UgN>yrb$hTLyDE5#Cl%XuF9N%~_k66DbAypm`a1hEXs6N%X zpisCM`M)z&-HaO038)PM$RXMc^xiC;p6!H3SE+spj+zh#XkX(Z6_kzLCgu5Hu3!E@-mW@>nHTrtS|Z^L4It?M9Zpw21qYnj{;&2vxTlev3< zI0%k4I#cLz(|YCwHsd#xy|R2+UMdY$`cNFZB7(BpZN(6ca``@qhCNKtO~q1kh}hWu ze`|hWI>dvG<8QtfV&mZFHB&GA?id^hpm;7H~<-SJwFoMdw+mcKnN_xqhVA!VoKaA>J-aOKY;Hny^J%y!V{eb)jyoCFXyT{opKxoLa{oJP)hd~TEI%eL6sR}=hqR`rE0ot1dG zmrD33W0EHfIP?AfB&1vW2a27eU)E#L<-q6)k(sJ!7RH#~{(4k8@8ADvEI;Wash?>E zW#?>8X7DgK*{JG&TuxSB9qsgHM(b%1Wri#_kNYZM9Ziu=ach_WGaq|t|F4VxRT z{bCDMGrRTo$A5Vk^WPva^nUj=sO$aQjvU8vzbaBiHP-*)uW_55vwdHi9nE^NOm)xV z03!}w_o*mJfe|H*dcspzw8@BqQ^$k$+jm#?fO)2WqrU*3vilikOibeT5;sB$?vwJI zG`@)bcSb#m3jb4H@m14Gks}zNXcjKU$6LUUBaY00d25BNL0i&NjsFp#+<1ZbVAuStdE|At1)f&3->Vsa51iZ# zvW}a>BdRQ|hdoheJA=d?dU3-R|Bo_?DdV3sEBed45)DDgp7;WpX5Xhnig46aX}di3 zZ?|tR@It9A)lXc1u7)Mc;`Gl(M6Yf}yrXCXsr>vzyy2Gh&omi;_SrieWbEyfnik#D zZM#%R!v*OOT|nu`m8RxD{C{rn(xM7a!)Agr%#ZA7O^RiN#0{YTV8)*sbqum`vN(;D zS2m{yqc(nI?F`{0nqzq7V*Y)*Rs0vBNuNgh`R=_C${k@LpV)XD)%Z*$?1;(@Bz>a$ zY_925z|Y=E3S2WWE#mHDf*r4%_S2qIi@e~+#0ATF5;y(xOp7pf92B)X^TXTdtx<}3 zlHL7@I2Uw_A5f1e%M_@HV=V2cZ|m#5)y2wUUHVkH9G}^IWH4H<=~$rsuyWxBeX%tpmFipBE*Mmms(2=C=&ex8_dQ9W}=Y*X!8Ze#G+R z_&x@ZkEIDlF13DaJR~kR)IBT%1?J0kthipoXSG2MfvN0=RhSguQ8wucHm+f@B7AJM ztT42bDbSgunWKO~Ypooby1v11eRZ}_p!=r#FfMND2yx>gvXmmk_ldn{WC~x~`zE|6 zl?XppwT~zIC#5A?JQ30F_u}*@32v))=fsj+vc^V2 z6VF*VBrP*AE9CMHQG%wR!CS!PxyvktJe?NFP|~f|$TtYAB2(`9S-&~&=`9VVd@A*| zV&7~>9mdZum(kb$!7TiRLZrA1lLg#W;P&P|zq=7+_vOm8bHUIx?{A7rCVm;%!3V_3 zIPW!hEYq+aPTTVK1<`jrj-!h;;1Hv2A8*HETvp#6)`@Lx>p%o@-9-uTZ<2_mYh*?Pc=% zaaDIX^Wxo{;wHjqL8g%AVvda5i+$HKYR|yFhzWF}7 zlCsk7+i`a$CF1Yy@mX<2y#syGP5w}7u-|@)GN>E4K!svY^hj&s*P{e4r^%CAO*y=Y^=K! zEVDPAJcBSh1e{N7wqfgN=eed@b`x1pa@~Y(T`xb%3^no^cZi-o(Mx;6o&WGCGUAAb z7F_N_hNvBfeQ5|w!g1usmMu^0*v-wJZy9u+u#7dM1;3nE@@;Ux$wc0peFLo-8;9S{ z!A7rPA#&$frI)sxpXomR@>xZ+*l}efdOw%ZqvN$MmdyRR__5;>>hh&*-1Vc(D&-Z?8f8y!fcXK6KL<3Cy{V*7l_CLcM*6(iO`D2?VqCO=H zXtmBm6EDQY1y_&0x?AJJ53irBp<2$4s~luZ-Ptf3xOsT0W@hFn?I{eLpX?5lOp}*w$*Qv4 z*tI-OXWR@tO^bi#Ab^15Z?h(G7o|_F);=R;wNs?etA1VF@E@7U` z?5n*n8NQox*G8-98+24C=-6FnuvD&58*>$l{IN}bD`z8U2Kxpuws|^9b>AVuCB7yt z7@T+FG_$RDG0n)VSf0nFY1!#TKf^z5v(#PsFt@gbZAiZ1Y2KokON?AexobGtR^ZfA z3%Zny1q}zJ_3F^}iE$-sk=!5^mq9hU{Y@#aIZ-a9>3CQYlo;LN8@pd|MTAeID>es;z+$B*_Sg_p^RAbMXHd7&ClzIh;hkll*L z7Ai;1PHyq>iVDQyAq`%%D^1Rkwev^QZ3b?`dhO^$-oD-_s-_LK+l)`V+wS|}uz`MU z^%e;U>@LyUa-Ct1IHc)n96fZojTdtS z==$v-nA!bZNp)}Dlw(*mcbEJo>}X@7)%&te(J22_mgAEU%jZIjih9}~!gp(tyWq4MadV*+JE5_Cz`t9a=~;O z{35O7t!en;Ut$C2N5c-rD~(UGn|`G9i}x$J6$=avw=|7!5GYZm|z3UpST15a==H&pZsU-0-ZAkt(4Frl^{K(c{KftS^tWu3=+h z0U%&8fb!@-Xgo#CjfWKU}1#7dE-gqB+_Ssz1vu$ zGOB3MK|>C!C+|@POJ1~xR8v$ATk%?60jYf&-H!6G8oGk~nUCKP`x^$jyC%lUCQ4lT zLukE*lqC_xjNq*J46rJZKzCRHsRcYxXG}cMaIBHSMkgeFA=#2r?22gzL2|7!b{*3y zHk(W32(xW);Sk37dKua;GDxz3ae+mKWPB6tG!#Vmxj(Nsb75_NP&4lP?L&YoF)u{K z(n6H|p}5Yd7@Oz{GVV zsb8#D<*LL1q1WvCvguF=qL@nhV_j1-YiY+QFEIw&xx{b`drO@!HS%sPDzWL1=QbrD zv^r&SAi9Usj=7;Pw~}I4Na4?@zz!=Gy>I=Es?+!Pb%x z7eMTNtV}v;1|EHRWkwf4s+G*!He)Z8U&^jx}O7j84&t7?E z64YHA;j2ai(dn&XiCWmPShqZFS!Gc(%ItN{y9_C)QDC^=etd9DpY0LzViGAxy! z`FBM9!c%-1I&(H!{b$Cn>ME1{%MUYG)kIyR)_NJX?KeMULq#(I=9%H3;=m3S(vPI6 zoWdJMw+E&(;~GDs_LxAmd3lOZ4uQ<_!@vBkd4HuB1N4{~6>lsojW3mbA3!nw(J=11 zEy!F@M1{Xfc+;l{E`ag4kk)Oayv@`~3oI6ZdGQSE1Q+Qfj`VO!g9LZ#=ek^&AO9v# zLFkCiitb!$wum*l#;ysD+hZf+_{+LiqoAv3k)JjMK+0<$L0e=$kV8zl-XdMIG0U10 z2jCGvsOfDI*dZV;>K?0Xsl2fj=UR67ycz3a> zzI;y7ykoJ62)UmKk${Squd!X>0^X70U@-eJT(&dsq&46-$$g_DtQ7@#SKIgLEW~yG zNv8)@$ABs|95~Ci(j@i3@MaHBp_lYc_9`NQ>NU>HOXQc6kr_rhd#?F|yUGGa?{6IZHVJKlKhQ7NOW6`8GQ zvAe^ti3*d$$0g@sw1?@>_sOhE$gXhwx>#8yU9Dhl zxm=m3u$N-kw6NGXuVEA9bBm`%g`!mY2;tO}hJ93LkoFU#)K$1b`P|QG!3%MEGdmOb z;(aplpG1@;yjerG`ZEhV9}W;1ZL-)jOt;BOQ&5?_X`O^uv@~q3eDNmJ%lCBY-N*8R zF=Aln&XmdxcP=JZ|HAxi#4QE!`X*cIF_=P{j5p9?!Dm_le=$RnvGVK(stKoaB|1AI z#c#KJ9xo-Q{{ZJ%o%h&v4XRu3)O2Q4durF09k&`Zf2dtoJnFLW28p^>A7S$S+OrZ4 zWou%pDx%rDy55p)emnQvtS;mQOAf(&n!q0^tqgCTVa`?CK0VA8k~lx;jDkMKP6%Ma zAY~7DzKst&Upd(%ZhIDW<%HF9I>t@}^?9N94X*2;xSR$3w&mv4QbU88oI$bIG&e`g zgD}Rj+kSj~J-ZTddL?<4eR^hMvM zjJ{^62C22+p|eew5@aUB_a;^uw7>Rk#^Y>I0rAr8gkjS)5i*H3??54Q_zXDuJ&GY} zutYqAsYbzpJ$te4uPR9p7v4da7^#{(*fdxdVM5j|tUIo^_ts!I#R)kU*Y|!JM&&B# zcb|-?Q5lRSZ7f)mf}qIYsLI z#7+`PliNRYiZ|TQ-(P^!v%E{eMC!M_#=1I-L$*-~nzH>G);)tdOD8k!WLkkISti)| zOtlckhB5~AHarzG#%{aYJp>2dZNR+s!LCpal9?V)5sI{8gy_qcV!U&`E|yO#NSP86BThImqX#ii{!HRDV)?)nby1k6%zW-jND39E4+x}C_%ptRh~iKTT(I(fSm z6kb-m%id0;bYYH}!avA&X2uxGWcTjWnx6n=9HA-PGU+Nej8$YM%v%JUfO z&E)f@7q7IVZ=Z2*>9yu{QygkLS>hug1JHTXNAt%3rR=~1fBX?3it0x1%ri6|BOHaw2WZqO*euC%j(CNqLj4H}MAOPG_v&!$oB@vPCG@vg4`j zEwyZuhoinZM|%&F#)$&=uG67j7rlG5=quyVxpz<{koqI< z-_%tF7Zqn{YOA&N9(qL!6^0s0eE3Jg31>Ir?Im5c*J;7`9)r&rZy!R>+Y?PjRP5YW z&vp)lmQYuB|BfB$UM7%rKLUCko(~2D#%mG8bhJI#UfM^r1qPteadgL_w;#I}t|Uyv z8CC})nmC4>EYEMdc(^CsHfdBD??!XJTNzipB~QZLKM*Q<#cm|9wPOeng4DiXSljh8$bX~fl_P9}rp*DW>aW_=C!o3Tcsk!=D3 z83tiVa%C|d$}HNcgUb*ydY-T=oOsL9k>Yb@MDZugIF zsu#N6N6>2O`*V$tWpLH%hKEW<1uW1574Cvj4=M^WNj^e__uYCTrz5YVlq5ElP{EC=g_3JpBG27Z$Y>$rc45BmgJXVeeuML9J}~C4kas>)%gH?@WGu0#bllars&(P!mvpPEQd{Y`RXY zf@*(?6F)HPk;i)7r~JBRUHH*60%0nb3Aa+C$0^S6dqQ7%Fd@89hOsE=aO8`ta=Qdx z0WqeQ%bA7V{*HO#)@Ry-QHLE8#FHx#>(fwyLNdFIcNcyw`pT;z32R;I&<2ffovES; z5+`lA0@pQWeyuxdc44~7o8vQ!kG8Q z%cUj}PSpAdg)DZnKU3=*89z$ByV(EmD_*!-Mv^ET7MxFjKMd%d7OaQ(4$D&6qcknk z7esw-8N%WGWa4qyn93o!Jk(-mXdJP9s5!q-DfYKY&v#de9g!ty+)6IQq+~0nQejP9 zORm;BHX0#cA0d|}my23d+nkG#kes$a^3OK2VMt{vmKGNvK3}1IiTt%TPYttYHOVBm z^BM2RZu&65WqZh|!P4m$dpa6Pl(`By(JoR(Yh@mxUlS{xZ--pGCe4(7oVhFoD2_?; z+y|e6;EHmSJQ(ksSs?}jjz24wPX=m|*4uTrT=zTrJLGls0t%!L4pT)i~V?)raJu#v=;l`7{m)^XY@sM(`V=Tr(uMeI(d}Cuwk2?I%oGo5zH~N(jg)7CyfKx+6}2^Rt(el$^HQg{gePT z;=3-`$h~Tr1KVhr=0a!}fUMFV%n?nCnhMFZy&Z^TQwaNF@sikKX#$aISZmeLLR1G! zP2MolQ7@`s+0n<~CEFN(#G|Z*Y!J_T^L)YD+!$x=R0Pnu_iwrR3L&VXqtE1)Baa@2 zBE)f(f8tLPuVp)~2gwD^oD5gd4jAK1F$3Ge=fG(EV=G8vdPywVZ!k3&@u8~+Tdpf_ zI3*}r*N6Q^V{%A=9hv72lq`B^5X3%o0;#nz+_-ldtISU!kCVbs9jdp;4AI5m_5>Ia zTd!DYAB|tY0$_AaB8^k7@ooip<1N4-p=%r`90AAxGE&=38Z?$hA9Afw8TsC#(`|S3 z2Gi;i@hi`s1=V>wGgX?lHb zdKUJ$M)*U_?fv*@=}dR8!=Eby(Yn{QfvV)BVn16U&NCoEqoIE{!hT$z(Z^f-vH9# zu^M&KZ}wF157eTHzKwK*;a91JGmehn=r7?z#;ln0tMA9npr$;UyPzgZTQFE6NPtG~ z=JHDyfW`d8h?Dmq`SWP;)nfYJ2uEbaz#bv!T<%s{D!=Z4zK6|^3vE2INX2I`px`iZ z!o9D8gt6c;84w1i=w1lca@RhkRT%&B$2BG8j9lN6ybRDsF(`ss4hVYyTRvnb?6?v7 z;F;~XAXy@8xZ!M;l{KLyfX8BvYw(Dxq(Q#Y66Kvuj@;5cxWoygyhc-_;GQg3f=N(3 z=xe&b(DfU)C7M4>pBDq%UO(kMOndxhlwt+XNgTJU=m$^g32W(TYF1Zm=BEgSQRJVF z$B;f(bUPHZ9DKSk9O+f%cXa3Z4G2eR=vceQQ{Fw6+-9tdhS`It;m2dG{m_!KcD3^_ zmBnqrB6G%a#(GPU0`=frlyi7HJNiSPS<5;1y@+t86XulWxXIT=J|T8SUk2KzFrjNk z{aL%WKaQT-WEBoLrk3H4teU2VTH#$tSu=>CTRDXMrki5yC-iTM(0w#IX_YJDcbK|g z>r_3+wh$A0>h;O~-R7*;%^T&;T!SBF@|ngvCVyOQf9cTqJnHdPHwBR}Y1>?5-XLeS z6l0$$fw_+~KS;|-5GPuV45F0>%0)gg4M?5ROgw$AZ9ZtjOV#h&yAiK$fNzbnKWnl|XmswosS3U}m9Ss4_hJGMy7tI+O=e~L4F{jhq zW9KHog$9;ouzT19eF+}t2^Y{^HeTahV2!mA-2c1J`sY04Jk(4Lt(FBYmzD9Q0hC#p}QUe=B|Rf%=c} z;-w6;)m^&q+NkbjJ>TLXVSYWvp=TE_K6j0)uxs%sykPu1|E9;uDS~UOm`X&xZ8H<| z_t3^@wo@$Y+oM;>Yl@i4Pd#sXk;Fb=iHsn@`^EEnb$j8MM1YCWqpgo1b1TMBI1D*x z7ryaV&Hp&<4`{iK+;@q(IbqS5O@*L3Ef|Y`A9m|S{m?S(-R5>(Ja6gdK*ETe|w77&R>{sBsUj7X31S07AnR3UQG~~Y-)H`YIn+A zR4N{wc%k3@;y*^inE{tcR=92#uu+@O8)9{jBXc5QpGmKUSe9vfV4$6Q#dG6)t`rS}d=~QCP zTx$KFmARpI*x-FX;I~tTpg$w7MsfiRVpBk)3NGSL5%OG3tv5?^ldRDl>o*Rmz@vUO z*<&-agWUdVq38Y7t0U4*Kivg#QR;aNVK>oL*>n?Z7?;VeIS-qrtAdg8iFkg&<)*Z% zGC*g>Ljo7`S%U^{6E-*3!)h1{d_*Rg-5^b4Ke~s$MNj$NjC2qhe3{!-{^RE`kQ(fC z0uOS^>dh;8t6*1qX)q-c>0rP}JwSCuM#jI+U|8SPcTH(lyb%Z#M} zw5QzmczMOHE`~FuE{0fYrHB78_6OB>$6zU$-?p79xi41T!{`9vrM8Izh&R&`k}l!o zf$uH~IyZP7fV^W$#ueb44Iu`*`}AXNU+t;5{Buz1!RZi3C5>P$(#Xfe_ur)YnuhEI zca1yXib|gW=BeQZmDni*T)Meh<({F8p{72|1ZgOA94qCQ=)(Kl^0I)|#v0c;u2S2;X)c5qfNB=1l)V=d;v{ZLD3 z%EXQW?MC_M(-!4oC0Z+CZ|cD}+H zDC~u*ETVSmuE(_b5Ksju5}Si~e$x18f+Z9I&N#PXWSDJrYr=Crei8foprUD&t{az8 z`SKdKa7MsMnc6CCP2Gv@V2$rfJG+xF5dkgEK%z!^qb~~m9|!D;`$>Al8+HLFGx6U~ ztKhnK0rGs8<#!J{=;{qj6)H!(IX0OIm#|M(P_JsqaO10R#iF;dmi`(|kLpsxY?Gv(CN)i)gZWX3;R{V7D>f*TF50xAWGN) zM@^TLvzaAMkMu~(ZRNWIg1@ciqOS4CvM(QNp8_3GO5weHNhA^Ltz^Hl0z=+i1O|sf z>pxO}5*Vk+i?Q zR{2PdL`upY;Yf)ut9s`K58+zT@2P)pIfdT)%ItP&4zS zY-p~4|BNGA;|1$~VO~9K&CzvDNYpn=)7z8!{6XdADS7GDqxpw~9ZW73cC5QYtgIim zAJTO?gs$zFZ0=-*LO)>5ie_z?6z8GF;9 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/ReleaseNotes/170.md b/Wino.Mail/Assets/ReleaseNotes/170.md new file mode 100644 index 00000000..67fff691 --- /dev/null +++ b/Wino.Mail/Assets/ReleaseNotes/170.md @@ -0,0 +1,11 @@ +# 🚀 Good job on building Wino Mail from the source 🙂 + +## Once we finish pre-release testing, I will add the 1.7.0 patch notes here. + +### Right now, it's pretty lonely here. 🤷‍♂️ + +- Make sure you read the contributuion guidelines before you start diving into the code. ⚠️ +- You may find some redundant methods, interfaces, classes, etc. that are not used in the project. Please ignore them for now 🥺. I will clean them up in the future. +- If you want to disable the unlimited account check, go to AccountManagementViewModel.cs and update the Free Account Count property at the top 😁 +- If you have any questions, feel free to ask me on [Twitter 🐦](https://twitter.com/TrayhopeR) or project's Discord channels. +- Good luck! 🍀 diff --git a/Wino.Mail/Assets/SmallTile.scale-100.png b/Wino.Mail/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4fce7c209147914e6e1ca399e4feeb76676891 GIT binary patch literal 2829 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/SmallTile.scale-200.png b/Wino.Mail/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..852517b502374c05b5ce27131319fb463e03ece3 GIT binary patch literal 8445 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/SmallTile.scale-400.png b/Wino.Mail/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..f30475028e81a2bc25420c162cdb7493a3912a72 GIT binary patch literal 25168 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�C;83Z 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/SplashScreen.scale-125.png b/Wino.Mail/Assets/SplashScreen.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..d84f59a5b9903fd57ad2f0cd3c9bf849ef750b4b GIT binary patch literal 23043 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/SplashScreen.scale-200.png b/Wino.Mail/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..9782abaa547224ee9e17d0af031178c619c3521b GIT binary patch literal 47925 zcmeFX_g9na6FutDV*?Qt=>i8-l+dIFsqxUHBP9tT6zL@dr1xN%%B2uPQ10wEVY-*xZzU$|?1vKHZ8`Dvbc=h=JDo(X%Q{hW@5jpo9I3v_C#N_rPA z{5^T$!bQVtSI&R=Gy%^%|9AbBD$MP|g_~c0|NYhJTx50O!s`oaO8**or*F>rlsXZ7 z7LIMpnikg5Wp?8dRKxQgXjED2SKaLnf7rmbX;d}x(aDJ21%30`Yqo1clgc9#$|HBn zO$yb_nctXKYrVcpx_`~$QaExdP7q#crG~$vo+n{Arlg+pR44g3({J$SO~0~jiLIt1 z)Pmc#hLfIn`%Y-%aieXE-~35T1XreQ*?HK1KC(!nTfoKtoA>^jd-`7v zE?oFu4*r*e--z(PI{04>{#OV8f9J+uy&HsP=_G_HEWG|j*Bi(lPyX`9GkxJ$UCO9b zX<()&*Lq75)ZO;Pr)hq>T-D{{#L-rB{5!I36UEAgQq{WEV!DFL;wpDu5?J@>a0#IL zHO)J&Xy?@|ZvNVkE+zCI#~zIe$o!=C4ru?vRpF&1ZR3y|New%0{FuOs3O_G1D{6|H z;URwaq^zbvk1ER;Xx8CzdL}wr>o0uL7`f56vEVfTlXC49eow_zNVpQY`900o8ASIq zDqx&$kn{WxYW(eZ;lj7NW3-L$%4t4ykjCeoP%qacd}@DOeT(HGA#5(|z2@^A2O}E4 zf-_5H#vTU@^E&p<+b4b>s{x6(kNphu+8;lRAQSY$aHzUnsSi;k0>(ECe7IeDGEnwW zyTM&;s%P`DzVNtwCw5Uj;$-tU*YaE5y5%OICc3iWFw3_RKFkGJar22LHhY2;U)elV z_I3)8Dbe|y5n2{g$M4F!X?Dsw;pfsR=hl;vCNpYNxJ@Ac!iTR~E*-LBcVY?)>!p(Q z+P5^N(beo;q+O*7mt(;)9(?mX_5nco<{&uq-Po$3T0n1^j02HSrZdmtW<@CjHXQ04 zt1=~~Am+4;$6JJnk}HSZ82<0Z0Cw$qQ(;+7FXfV7Q-bjEP@^&1#Uzd{T@M}e4lii$ z9*QJG-q2Y>Ub=9>yW{q!zb?F9?W?2Tq70Q9o>}D!w`dhF0>$Q2Q(d@&!)_{o!_1v3AnI!TBhT?9z?Mr++G)n$R&i*|KPvz-A`^XGDy_HDpT!!x58>mb zT_p%d=CxMyfI^i=5EOPdW5KBgd5}IhaS3%$Wl4;!5N}gO~ z3=2>}osHc;7p*_<{qyqtR0}qca%wy+NP=xG3lrIBDIo(g1@n{yt4dU~$oE|2${GlI z&pRHODp0Ma_u5+KI*gO2jt!@^rp3;S>(pRhwT90{OkedVSq~S;d#^mcsrKx%* zOyX0oJ`<_ih1w4+9}5y zk4AM8w;oj&mrpm~-w!GvhGlY-Cu%mGp_YdWT`kh&kH)5y`qNp=0`qxaQwi+pC7r<4pc?v%(r2!9h1r_ID@#5Cif$Y<2hX~TeC?;e5h zO?DSGJ{O0>i5u;x_LauGExM@HR4V5cj|lD;h0_B56Iw@B0Uwjz=4&_D>?b3m&Gm03 z36*0PyoIzP93~5+-lWNJ&6V8JIF{NHtA1DPeQE$so^uZjgHg-59%y&|tb(efw5MWP zg=QO2qe%P-?+<+~L^(1OF3W$v-!Er<{}Z_ODCZt?75`3>>%sQA8RuE_W~y0ION(FV zIaIEIPcRy?YA}b@P(;9R zHQOxAbctVrX(N7O-zTzwhTrC0Wk%&xawY7+gAq;7SFL9aUl zCPi3Xq?w(qz80LcczWPGIlTV7pV~l0xE{}g5~&*1uQJLq?evhy`M zBQ0+ZAm;LtoLW^ga<~!;Bgd`p5XlPTL3k^ z;=?M+VU=ciAlIJDfHbp3L+D0kXq+~;spFxeq-MT*XK==btrL1;sxF~lAvsQj@44Q3FvyOooM3Qp>HhO(W$2vRSp=8n@2c6h^3`-jC$C8Kj8ceZcE4EIO z%N9PDjXiG`cr~#zba*OUTmtNll>XiSm%DA#3VF-rq}Nqu288m0OxXC;>j38lO+VXu z2tTExly;;XiRXteEd+-NmZG0p!m_reGPv;V>zDQdcc_<0JD$|`4u*3p!8`3w>4=qk zQ}bISX9NTDS)yqDx`V=V4Fkri4^7I#HHo_F?4}-tpEt{9b^;Qf?&pnD1k-+YrD^Hv z-~$*YF#}Q_t)Fd3yZsp=`}S}1*C)Y*mZ!~W!qjH1O>&}{xw+V5_>O!k9l!HqG@`tQ z4nOTNx*ET2E%`tWvc9i%ob5C3L+jAcHCq_x4Hq9MKq|Tm#pic4h zTW9opoH*Itp!4kGl|G*bo~cVdt~mWVl{y6yQjU-+J{2W2GmGAu>-Pd)5rl0lPFHQm z4XhxxqR=W1a8R@!^tyi)wvIe$UM$I{z}_|`ZZ$PdkF&3VJEmlqr<+vM6+3!0IT}Ar zoU0KB6*-}LJN0{Kbg`fN3&QBqi{(qV%aggJXw^=@NJQs*Xnf3)jX!vr>}g*xA#1y( zoM0XonoCCOMKq(1ZTn+5O!(tNQ7UJ2OI7D({r$fb+nioKq0TJN4hYv;@L@kSgGa`- zNHqAdn+`hRjRvcdVH>NYp$=q}gF=z#Ym|LX4$u+dwf42S@RnD`-HEArBNODe1Y756 z9I$-L$}O@6S)1(qQ7^5~;8C7B*t|ceBx9*sa%RwSXs1Ps%aIx$gPHCfXiD|Z;d{0b zj3PmJAz2udW)d<>R7uU;M878qH;`sHY=Z_u8j6)TnDmTgDDZLmEIunIDgrQdjwdhv zR5`2e*%xBgjFjBTQi#c=!=<=LpS~S?pC8Xkdcpi=; zu?Cbn<^734(;~ON>t0obC~d;^k5%F2rlyHd%Y2u%R?SqSa@WEM&mw7LjgyZI%4k#} zjVnNLXzFip#zxoMffYki#>Tcaa_?<{(u<>2Hf&_b4j5>8uK z?8AoWwYok4G#^%T1Rg-HMfP>G%NAxjuouN7q&=_?h^&j+O27n;*laj9@*&pDX7Ij= z9u1w~N2PT>KJ0@Y{0t^6cG9B~?lzbA0WN^9mQV2jXx+zV~d%itlUw1Ui}~$ zvhU$>0d;fz`8ml>M*im58~Y7cYcvbVgx+pD$0KE$4A+|+@PiP}e{Q;GMOAq0{cv(#jb7YL?QnN)7h$wO118dNRf?F>>Hay^TrIq5bIYfW4vL4gLc?l&P0bPizzB=o zoXd_oP*5QfwuECxU&KEZGAd;BLIyS7WUp|y95EH$01Izl z-8%jfgPWSPFVilvnei=;9~9C2`%~rH-Vl)=(($xyz+V5CRN0p@e3MvA;1OW3pdrSx zwT3qz+k|vXFXhfs7C*&rz4vzt7&ZM?xr)bw(47$z(82ur=i@#=KxXsphM^p<0uTb_ zvg5VPJmBx&tN-^oz5W-bsJsMur*KuJ!e}d0;p2-k$gfm3{R@dUK7IESfh@ZHkr`Sz zbX(Me>QK+BTP+qv|Mae&^`WoqyAa61@U?r=*(vnp_1vRsj1KlQI1k@{!M6M*X|Kw- zZ1S0UUukXiW!Y!(B|7l%^Y_cq9zSxflsl6@j_4l~aWQL-qBbxaAahO+^G`5UU$$FG zsh(G1{PqqaxGm4MNMA|O-tDw~jUA188b+$vT2rsz8_7H$68}gwmoSv4foPC1K@Fu~ zTD%JzS0#F*m~Wh0;D7zLj=k4Wh@Ej_?XQNa4Fp8?g*fLPSwSV7#wndsPwGIfo= z;DKs*tbm>ym3b$r7C3!wdDi1C&;<^W1s%?Kc zd^FHsh?o`@J7b$5bHs3UmtL=aFjMG&-!RCY@;9z2-5cO^i+^Ci7lIfVEIw&)IO3>r zxU!1Kf`zlljN6myY&ZDrsnzh+f4{Bt)EIO6llRf^VO!4y)27{(thnQ@7CDs0c|{BT zk)#Pxo}HjVotS|#p@xOU7bh^8ZxH0`p7LNIUjOZc*}RiyI&O0##iNFUsSI@gMgY{Hw6AGSRPCi1I$J+80)`m-k1X@70kYp$5CWEuQczB-&c8-4GYni!@{ zZT5KX`U79f)r?xAJ`U+--+)J-eygQv2L_F1$GKQ5>CozqF4}Iz1RgGQbD@qG?b9Ee zC-^U(-^iiU??-P|Ktn>?@b$ks!dw)zW(M@am8>h@@2oj0#%cQ%%8FI?>1XJFKB`$8 zyqgAg<7nAf8Z;(K@+>IcU;wx1336yohvPl5XG&L)4tPvcm068#gPF}j$-qcqlI0&m}P=>m@_@ zmggLBpg;j5i8o@C>8A`!2g!6S-!^NA@mw%UQ|&ln$ni%zIp!`_5)|^II^VBOOC`!i zVqK`nA7k5(;c?UIqeWIzXK9u56C?SipYglok=FkBdqI^$Krjh&x-{+P9Ad_>CaXiu zupeyjp$DeJQ(o~n_ah0k$IV_@lr@ivT-J4=X4;9;ytHVgg3!Q*v&7%@;28Ypd&g`N zmc2?1#$l3r-s=j5NZW*TFSBm2$kqiIlx`{Mca{;Z*ZRgYEr(VXG(^qa+Vr@eZn$c* zSc9OHx>Q#*G6EmE_`G0I;ems)&*}ay}xtLhw0pqu9F0md3oR;7e1cG&-MeZd+v>@qH8NrKw|Q ziy!**xlqaHV-ggHvB|lTk@1{K^w3DC-$)q-sY^6b6*K>r0gpQ|AbDHESZw!uq)TRA z+kGu9Kw2c?($zQHaC3zt+S935L+47ml2=1zgkEBs?w0E7*3JvoAI%kr9Hyll)K+g{Rm?>LRx+EhVtjL&Vv)1t3QV3+?5`M{WMH0aGZc=He zhyPeOSgNX=XYrI;x;SIwN@FkdR8#(wN#x4l*U6RfHK#<}<>LXqU<3sM#YEmE{!qq` zEr5l2e?#A+KL9f`+{+%7h;Z*i8Q)u)CIdYKI}+|2=u9PqXMEa^3NzYqgT#6md(0Tc z*!2Z!PkLNSns}}UpUL53D{xyscs9-3g>V>K#GQC{pD9lrxt&Gzl=PNv^{1tAEChRX z5_OudRyBQ$SExBNMD9jPmeze|bsCT+(ARrXr#~agdc_f!fjH0iw(p)2=Aqile(FynCFY zmOt37_HNya=MFm5ZthT~uHT3VX|dKNnw29LO5+Cj`Ez^uC#A9Qdc<6cBW6f?{jD%k zCeaf(@G32N#KWP(kvcuIKj2z>s;cE%lt-5`eY0;Vz5?}dYNh)^nhL>NoqgIH={E!9 zDm+oHQ7Ml*jYNaBs7j(uJzq}~q9dFs0g_uOjxM8){!ho7u1NyZqb|GT)61B7^p&3n z&-Uj^^54%NSg(v*@1iiRqxDdEjxBKlA^bj!u(SL;BIT%6KtQITzq+L#SQZPNdCp$t zKEr|pxvU$E5LXGQ+5gNkqfHvaxhJOUoH_FZ982;sgpG`H{Fd&_1Z)PgSk*Zj#Tyxs zz39UD8i07LmE7{(088^}Wi!p=WGf|O+~WP@-@#j9$2Y68eJi}m`>j|hma4@Kqr1}k zD>mcvR22WK;M9K;XM3C3Q6$i!Z z=4l519`Zi@VL&&%Qi1z0ZkB8Y-s(yncA~ubO_ui}{!k|WX#+QXaN1yJwej?%)nqp| zy27US-3J@P>cZ@)L8i{RTH{owT0H3=G-$Olj&{s<2_vyFIdIK(#JNoTPGzb~#o}v-I?`mQj9t zmhM~jk=-oZy{}YZXL5hT+51KdeHP=oUik2@NyhWS2>KJBT0>^n7_Ys>tFb-<%!ER+ z?2`@usgfVkz+Z7dW*GWHwpY6U>YS$S*UzUTseb?XTTU>f@Sd)33NM5@XpeOK>;|U? z`^B3mqQWvRmfuaw2hPlE<^V3gvVU@Rbh15F@TJvvsWZ&JxN&;Dl2;p%sXA}$r$@|M z2WNSJRuaSK_8p<~Rz@V9B1Sa2DxcSNXacOqKuRbb%vdG`DIsZ6WD zvh%cl_|s~Yv4{l6@(^z#{Y*@Q67!17N)kQ>zbu)XuQ}j*IJYtsuX1riMSH7_#>YEx zqK^k%lGu@Y%PGTq*)+m&QfM~D@WLalzaTVSRlv5R&BfTNCsm_I_Id2UGKsgvE9mX( z>z?tB9a@Yf!+UA9mN^>TI}0xNPge=U^cv&m;mOYwh?WH&0UJPPH#E5>crN}&@9NcD2Xj_n0}KrYu362LL(~NNyfH!t zxM7#z%ne}kx#E(|yfh$W=B^P2HFT$DoUdy=Nn8SFiSifEuX+Lqi2}xiPd_OF!QS-@ zj0eVF)iWFzku|NU&VUo zTV4n;?}Q$WBeo5LNAxDg|I8TD|GN#HA>5xP_zCr8L78h&Uva=o*6*#S0Tqp8hyBPz zpAh^}S&x2(xBR2zNsptMXyJ)5DP*%y3ySShsR{IOnrl4d3Bbxw z6btX@DoQ>5IER?D6)v3>&n-GASCuGCF!GIQvF*h59z6osWj4?^SH0lp;u>)Be)wRH zdAw=A>1xGDR1cRv>e~tnp2FHP+V8cNHsY7tUX(JHztq|D^$AlZ8;2X|yqq}y;Cpnq zPmtD9hT2Sas(i=L*O-LFx3?Kv#VqyxY~D*nYE7xtcno#0UQ4_6fGAH&NI{v)FeRT1 zwz+gDcw;&5+B1HwOwp@@Xn95V6kNYD{raJas_jdED!BMIt(YfS{So7Omm@{$Z<~U- ze=F6AUoa=?`M75KUvU0Ja- zVz8g~QX)u$Bl8`tj{b9}!V#fz1hQ0=)=Qy%6|>YGir0e5CT(XUw`2Q{Q=32lNKu%G ziyUK?iOg*!8UX_CyE!_yqo&}xjUvuyze{g&1MfnBr*5eW{`LRrH|@OIMz)3u# zFc(v=mgxsTf`4Yt$svTh?ftMSRv;?hdbFp%+{5$6xWRkY@hd*&jn)25rjvKxu`yRo z-4$137p?oGsmC}fGH$ljtVe_-S+svS2>3Pnw?F2#*kvGQPJ~lm@7W}heH_y?>}<1c zz4jDsWInUet0U82i!tC7AmV&nxF8Z>bKVAmmIr!^6R6eo5`DMYe)0wgIsMPywm?V~ z?pjAFEZNT5J$+xR&IK$6p)_ zef!7nRQkh_G7~`-_jNOF05028WJ{1=^^r1GNq+@@Q&9Lhen4AndO59MFIM2aKJwYP z63kw!lzlsro(}J0(s(riSdW+&D8(*9>gq;5t`{L5X zmGpj6M^DA3Y(nJ}(4OcXLl(>yIW^dFQ#C6xFtO9T(K;QFw^TkCFr$x#oAUV zjQAZKAf#OUH|?8Ptv8v@e^rY_YGl8hg_Jm1B++kI(Ar-@pOVX{@yc&@-_d1T#xK^< z*V7d__KaA(UcGuIiG0EOu2}ZWp)*(Gq1A|~Vj~|ZGHvd<^gd#1e)W|+pX%t=PCwCB zMsI3VbuRTxQGGHk_$+gm5Hp5&HMmV=~mAoFixSzklH00w8nV>c}uPI(*G9>85$- z3Rscw(ZI}9(CQQ?JQ94!#8G>8SGb4tEU#u*qjnvt5;#uB4j1H<#HP3xFim`UU0oB!f2#42lfy`vsvZR zqX)NPIBcI7Tk(}Hi&am{69#sLylV&&m+NxxQ`hUY+kds!D#)Su)h1wu*Kb=2;!<~A zv5s_MaQaksBs%W|IJt5rX^y1XJ!P@uy&JdYebah6nXbl2p|&vX^9yN(q3ICsJN$fK zkrMq%4BxBB?4dnCB$L7KAsWM<+548E-^3~$Oe1Ka9GCQTbTQ;rtNzGQNWsVZlpA7B zc$j9)3Y{+r674_ zlzf2E!|?q5LM!dg)q$Gg>#wJehCg%?#U2I?>A=)*ww1lQHM$vGo0=#84(hd=jw)d4 z{WQKC8bYkVP<99Eh-NOJCBLaw6kO{O6yE&8ef3fwIjL|D?__$n`Iap`VU(qrKVj;W<4n3iTIe-~4j|Y&1i8EFZcQDS}Cir0909IhPWav3j zi?`ay9Z{yVf&8fsuE$>w>CjQt{Ne}WuIg#mZyVeo)?f&b>Em~A2#;v z5sfk#@3g(~+Y1o=!?YZh&ru(LJ-uX8bcfbFg;ty_=C#uAy)}sd(oVKPA5F3R`gNhR ztm>A}ntSuadn&fKBP6Lvn7R&%_~y@2qJbX#g@KST>0-#J`G?{5C`#N*75gFD$p%?*N0nEUXy%b=;9OoDMLeBrQ{GM-Sc>O&c0kf zmoK^1Hs1{n#=Q;%FdW=O+) z&^mE?G^37W<(e1e`_!T1-)R{2pPQwRshwOCD_W9*6{m$QE_T9TVjEbzppnqAJ2M?x zj&3VmyLhCBaJ(m2P7*b^=KxLpVWh9cGUc3FAbUQ&_&?oEG|T~{NdUBQ^h5P3yo zPo~n1T_1Pgm9XuY)xrs;nHxMYqpaMIwtfiO4{-e%KuEB?8T@LK^kd4~#yl0e^t3toP6w+yHyWtkQ6D!- zNFR=o-A_Ibr1{++VY(%7vl?%UepXft7*>w}j9hTI)7j;pwGNa-9+T}eLS(Z`yudP^OK}Fi3 zzJ{F`qBM;AyCEb(v2Ody{hH=eU*+FeqOI@;QA9Jtj09J5il4sA$8%dT*aHZT_hjc& z#NW3>OFd8fA~KF`R|Z5jCGlQt!Y8a-7aFMHL*h%Y`!L_yNNLP8AZ^X8cUYtjRBe%Ixy|=ndswzJi9L4vL?C^iL-aQ$zs$Y-u(-2l^a&!*iM2 zc~`vOsEQ?!?e)+K-A`K(04+p_c0}37{)Ia;|LRZ9Xj*Q#T2kFATOJ9wfP0t8mHz8G zoK|t?{>LkxKUX7h4U_8Iud%X+k;%F%ZBZTk`n zQ(D^0LG@fp{=mZTq%h)ZzdLL4Fq3|kc5gY`WX{hV{7aV-S(0`mF#*_&u%9rZdO6U0 z{8h0&2z{yW%vRGIv_Szsf9~q*s@zPyYQ}5k`?-tQ6!*J}O8=uF9f`fif(H%F)aqGk zV(9W4elgub?J$ooA!Tj#R;AarvefNC$N#dV2~J#_5~sJyIdzPZA9}&-4}oxILEBB3 zOTH#&2w`4+Rq6411mAz;#U-#4=r5%=S{X?HP}}|6nb@H^U;x18FtI35Q?4VMJnWtAqw@4+$O-m&BGG z#@jz$5M8HY`A{0pb~mQdpB|+d9FFiaFMBvkJ=_aN5RZhnHKe%IU@fhQrW^d{>HP6$ ziv9a1>!>6h6X@M=<(KmC5yDv)|5c2wW&OM!7#kt^8N$@SgSn{Wtxc^_}M z0vV^)efwGy8iG;X2!@nrIY`N|M`b-tfyQiBtPrx;1P65@Fkp54{-f5V>8Q?$wC5E9 z(3az{lafxMdz!YZ<-=GP%7}4!TTn6}GIwSEDU#w>v?QC;uXIKJ6}A#SMb^~nq>+Rf ziR{byd_{X%ALE(33%AoEri87RuiUCu0dSlBb`9_U_73497XF{X-J09AUfdN8#DvEE zjGC@T@<*R!U0t9DYoku{L%wCVR1DEtn<=QED*V$WJNAHIL??1bPgjwAt2So2&)vXS zT2yAi`?P0oQQOCRL!x0R7Lv=zJwqFUxGq>~5^&V4Q4$mIJ$CWuONoY~F~hNe=*QUA z1?J)G0Bma1gcpFFD-&ZNg;D6*h!{5xhNq8DXpLku@s#9h>~+*+#m^DalXd)2W)Q#o zyTWOH-)Z@SMKxW|J09&ndlvY`(Cn)0I;@^0>GTqRo&TKb{8>4Cd3#V!AdAwIYvJj9 zOHSyt?J7!sXy`JaGE~POk(u>3chum@nL&2qm^F*gJrQ6e4lF$F0ah2~FsXGlFs^mo z{psiQ6gi;P(;b&IyyHDe=6G7#w-?|w+j2T0nU&6@jM3SNvewFs=}HSK_j1g{gklHq->f=-FL8MdwYZV z#g7*_Cb8(rg5J8?5W>+ptQcM}(c z`XC#oPqu7td&uPic%7vW{yF(X(5ct0sF9vbW?ra|BQ!7B_`HJkn0T4qmP%Lq4j^m- z2ExAK1=dYQc+N-r+A4o&iQ#-uQYi+>k@K`#zGNmFM`$^SJpI++MU0-|O7?5WS+1^g3YrJb|(jnp~ukoyZb(t(VCy>?P#TSFJ)wr*E@?WCrGwz@zxQ^oy!b? zXF&!fZaKURxVWZZch$oe}V(pWjFB$26b^PGeBBYd>Fs&2x4X~)KmGHyD z0JRZTH$Br*-MID8c4bsg=h{>z)mY<4qO}BdXqB_d3q{(U8nDW-Wk~kmV~sH(POEy_ zSf*;Lv+B5e7doHqPT$4WXEe{Uz3Ia}wg;yTLY6CpIUiRLe~S+4y1nTirCw|7;+ z`H56}Pu}+YcRstj4Z`=Dwv)u36Sg8dN_-zBecbZtWXz0OPyY73H=^AS3%8(8PD25GfHt4Ko=O>o}GONN5X zhmxUtauuoFNaw)(*#KDYD#+&_(X8;3)mJPGPYhb~ne-3_=`P}9opR9QbH`a0^q*d1 zu{8Pnc8Ixt_Dw-{^4uVeQRH%^;zKUdboT5~ToUUV=X%JgItBTgnQXnKXR!L0$h>@kYO2#F z#5Ml5K}QSc1T+itRNwBq{>x*VvK2qq^-bgXz4GL)U-^XY&TZ2!%VVfsiV4@ck=gY^ z?1zCtk#%@BrP<%*A@=>n3$Nq}=-YnEhzT+Li zWvz-PZKqlnGx^=vP~vWrevVECBb+JwVtMiD%LCNNrJ4w$dL%oPKRPgdc86U#!p^!q>=#UBH+iOwXgN_nPn`-)^721y%^SNf z$5D6HL=E;hb)4R}O25k;LS6+Gx9}S`e1hnW4F)dvK87A5bS1E%^zo4 zgWe2DD}20dYnRaYvFsK+Vei|S`WeOSUKg@PbNTrh7TRT!Rj z&MzHHUi}JP*$18WDXwqOn`CZ9YH+319b*J=nvaAGM@3l?E*T$3cU4uKI5;|XGy>ad zTp^V!0+DO0H(##qlLP7=IG-R0J-zd%CVSn^hNPakeeyV4*pCsY8X4wf@{glC<$U)M zXV}5CWWn`=3~Fxst(?67C?~{L5kinrQD8>X|66hg;G16LS?0&^bNlj0b zaLZ$_)2ZCO<@x9?j2n+pjZ6(b_2)l-vytMDv9A4G-zrA)@6?cD`XA(yO) zd*6+3GJ%@}@VlhlO8@TIw%7$LQMO>%1E`88Z~npn6&fgST-436P;Wfvi;|}{vunp_ zlxf(o25d*21~GXa4hw^9q?^^20^jvjxlT^$*DGWz*jL<1nBnSidvOFd$Xs4|8_Dzob@iN#;E!-6Ufp7= z6PdPvJFw{pD*HQCBDmenqnuSa5>e^G$whW1Tp0PE-~A=dHk+6uG(u(ep$o56VyZ2Y zhMnKV2Hx~M>~=Ob4*2O76M6F{w0*n!U@N&i-^~C38kin%-@JsoRXz@iXdUEPzXHmXA+M>?+>gc1oZAv zOwvAxy#Ks!wb{kx{3=g}B5-=})FkzS!yT+Wce!dmxGJirH59QFOT)m{7OpILJ!H2c zEiSRdxTM;+-v5EEsX@2S*;mQl(~#sY=RmTmkleaDv+eE;1?4o+;#5`xi9zX(M!v(S zvaX(FSjdzE1?toY%$PUhy?x$S{-3_g;km+w0NCY5$-H|;c57+!OU$J2s?kyF1;d_$l09-ZLaWI>YSLOj&W}W80^PplJH}YP9(nMcjg! z`^9ju%xY^W->5|aee?=eXO7agc;Y1Q_o|naQMqwH&-x&B$w=Y6-E@}o5f9ucUogsMNWIk8dm z-H0JC|5P(FC`Bl12ckf*l@~%IXVSg`rNuu0vK7yZ-k9;v)Gm!~&Lfkn8?aN^CvQ_C z(L$_Cr`Ikmu^2TEQ6;WW$1K9bWaSBa*`Z8(KhM-T>+uOSo8gVF1h5MYsELd#m$x}F`e*`)q7%)%}plxAXV$V&Ki`h(O78;~q_*sQG->|ms7Rc3E z$ZO80wM=TEq=rJWnpeZROCKNPjmc{Y&Uzybubv}2dorqHXt(IYuwldY;1jsr_l^Pm z=EX`M9fOqDpXK7;DL;gEBpTOxLQy+#4N~qPN6+bADXNHptGNF9t-RFQ&q$7Wdg~dh zzEEc%;;?$^7vj#m9#wn#C%)cmE@p1UtI`+m%zX}Xng6*Fy|g~nlS?Nn6EcboS(Z|< z;rS|%si($h#O}S`SUw^)nQ3q6yLz*`O81O5bdT&7JX;H=j#^t=aVjZaps@~l_h;>Zn^>EUfDxH-+Uw!5X`LlrWNQ0nvch^7y8>sHUhtvA--6F9^S>TKoiUcNx zCY>ku5%XTurTbo7FrQ8wr1{vLyKvn(LOqOMYBZn55~)`7Y_Buy5%g|wRvWya!j zFr9kZy`(Zvwe{Ou4z{OoZodb*Y>KOyr$+Awgro>n7|W>nnmy=uMKj{^U1lxV#Vr4? zA<&OPuF}JH65XO>uKg2|KTYth+S+f9_64qlFM6CX!R0UDhal6$y$)=?@kWOw*4$sR zL^H*DtWbQ5wf^W!)wMSnV>9)8;$UBpqNX4A~Lg|o%%S=6AqmCFPNtc``Mwcb+)aUzi@!X04_ zV~Y@sq7ssMB~^zj=>3)qYPS6~$>C~B=i_PcpH8IE=H-tu@x!`GtYgZXu{KT3nJ48& zG)e}VlCy@$n2PGt@4@$ds`d7|TD#~o8GY8Y`5I9E5=*Ykl|r(k)6i$ZmSN8Hf(GAh z@0QJ$<~zk44%X59m09G{6s56IjXLNV-qdL!cb#4}Bju1h8kTM^Re99SNLNl6%N9d+ zNNqKJ(Cr2G9nE!iXkd0g5xCo3G;Zo?b+GpHat`<9N5ZeL@9II;rKYs|cYYOeW%@Na znu2D&TJSNKqr0+90n1HZ+r3LVn(M+kVO&r_aLE*&aS{ta8v=u@o6KeqUBwfcvdP9x#3n_^JA-02v5PCl89SXjMManJDoOetl{+YtyWiy^(-ipj@w*{!Su7nT?Lzl z(M;pZOJ+XahwI7d=$7?%+m6G^i0}{n(88!P2{Zp6dwX6W%Ex&bLoFRG4X)C<#|{Py zW|BT{*xw;VRmt(qFlmYZRlb#@|uz2$9&>Y6b{e7*FTqfIv__&8Wp}5 zes62+YNp!yWiXzjMA+TAzINm}X=PJ@9!rdOWcu)a%gj{Q%=XT1U`I%DgRMP#2^*h}P% z$=1Pb_9FBe&{3wuaaB-@URw?816(n>=GAcGZuupZ!ARqLx=sEg+K)6H`ZYvU*foo^ z$5W+&$)8{!vw=YfZ5qPq>*K>KV58^3a&U>b-d+WH_Zvjofcx+dBw*M z(;}0G#Wj8~ghsSq-S&RwMD4L$TC*xO*(hA%l}<^T4z*tjD|t!#Js6{D3$Fguz!8d#5#eBiEX=DC_^-ssrtn9Fb6PDn}~P!SbP zH0y8YHDYe=)NOZZNT3l5ucrYrz}W-X9Vj^Vpq5vpScKI0eIM6ADe{kGPS~7huS95t z|L&R^#-PskuLnYv539+oihdCbl;r@TrQh>heHo#rZt)BW%@5u679J7qtQ-A1H|dc5 zu=*z!8zMqbU*KeOLi!g^N3|AO2ZFnYw^f@DV1Oauj4Fvtu*XlSCK-~F6w@hbhwEBK^l*AQKHm`3d_4|7DI#a za!@T*GWDpN$y#w{-bF{Jg4gLw?y|cUsjTT|>nbGI1@S>OB4aF8@)%|;`j+!w`^F|l zt>MK9_6Bv0udK|vTrBDkk;7`-;ey`Wd(gCs=n;8eY^UqXjV- zGCdMAp}G1AvFhbTJH?97N+Wsha8BiKSidr?QYgBUF~_^E_M7D|r+x9hS*cNr+T@z@ zfPP}Sq^~VkMSSxC(I&bfIHw>}oYm-njo|s)J>uotoz3~DA1_RnY|N#Tax@F*8ec=U z0@204!3KuC0zgV{j%Q1ox6#-6)`xBRi4$FELKJSr!!BQe67km8!5)Rbe zpD%xM*ZYgj1uWtO?A=)G1xqLax=$YcF=j)}l&5))Pu54kq7O05tw|867C7fB-U`0-aB#JqPw4^Re0-i@J7` z;3LpzEKtMP#m!U%rh}ZDd}jL8G6loyB=7z1Ur5BP2vra|145JwOvV~nFE@|FlWW_( z?hmdmWz&-QF3&1EzZAONtbQNZ5fpqoTi4#w#{76pg20D(~!`Iipf1~Mbgzo{?Ayj^@An7-xKwn%>CL|N!IvZp6RVtoEk6Knp%nB z13rQ-t~jR!D;UtQWVVr%Cit+1D&#C5#%i%3RWT*fbO;#FyL5-7|2u##@AkkB@;@t9 zuUJZM`kM1sUx?xNjL;i}7ipnfYmZ_%R`DZf%%izG?zeTUj6w`c}D>Llzq=_+3^? z`%>fGmL{)*qp%bPtiU_ibrm64w%@-3@05jrO)d@HV!VN`3-VB@A{+>QgSx>P2J+a|IcpG+t|dY%mzb zc|`)-mq8#tC8ihy2B#e0Di^LLw3+LEk=cYif>5VeBe&>ACvsp%NU)TZ-8sMd^!bWO zyWPXtQ*KU`V7jw+uCy2QhRE?yC!}%KBd`Do$u)6BVlVF`#Y3}rO{YW7zHvfU^dvDpe^r7yBZksACusX- zXvUba=cZ@FdNp+eiUA-=nYn99U0b+*J)7!lIjfryE4y5-h6Q(wL`aF8Qn8UG-i$Q! zrSp!>^4(p{uvnfgLt2>E-B9gKVt@E3-({qtW$DbBj!^8R>gVaFC*S7i-^XBA+saN* z76#w;<2%j8+JW;d2vYkUwJYhD!$%FM*6EE@K-OC_2Yhd1Xth@Jxr6_+G4kVt?NfIv z{;&Sar3Ocn`C6`x@c|-L^tr4b`SY3fq@@gbYEg1TbVKZ6t?_Z!y3#JdC)`YOv%Tua z?G+;p$MilVF99WFfdRg^8Cmt#^fW2|RRY292o}Hd!RJFsXzgVg3;LikYMBPQ7@i+C zk-PaOsFyfXPJYKEi$T8ESa(YC#kv#>%xS4*?YtgDjvq%oJI?FOXQPu*27oOOx1$$7 z@2OCS=e9WPvcwC3GFh?vC~H7-W1ddG3QyEa%_)s+7^-K6<4=lcoNx2nuaEBcgC;Z5 zsB?ei`iF)$IfiL4KNjm~vh%-e*UHzkwKgg{yXUr^DHqS;(Bq=O%WEn^(*fO?eHlx# zDx@rdQCt$5^tVYE3r;r_69m}YXsKPl9W9-!Elm*%ouba~J~hNRQv-6yEyL5?odNy$ zpS8GS9$P)-d2&DEIn2;AS5%%U6v>j?zoJ#RA76m9t3qf6z20ZDOY=Z2~jaFd)3uHMnsh0 ztw)+|r7_n${&nf?CjWCk+B7#iswlYobwa5EzpLnHZ`B~AvF39S#(|#Y$cOfh5P3!#|q#jmcjv~3X z4^NyotqqEN-K+6Df~N8L6#s_>0iXVFL8EV3wC6%HX-a?f``W0`38(z0-aUELI@*lf zuP^wY8`0v(zTR3&)umT$aVY-&(vXdJP6$S;iVP31~G zycj6R8;7!MF%oM;rW&FEP-l%tIR)P7`BWBPl2$vAj<pZ1pWe zi#L$ldK2&auD92ztrDJwzhPga0x9)sBMDV61Dp-$UJMF?p6VS#El%7`2`-}?5834t zlS2CwP&E=F()!Xh8Sk>^P%G@Mi4ss+8}hPXA^~_V;L@$^f@$brt^ z?`4#ReZ<@K{vqRM9TyY+J#_{>*)+ttNp9i<-oKkm3Gw(P78kZoz@d~BliX(26M>H5 zaJHF0RWOxsy>%4hu6qvcEV`a=ZlR11y72JgOU1OJ@;0p7_VW1;DP%Z%_F%< z1Cy*Z>}4y)-!pKoM2?ug6$cb==hDvF%HDR)r49B)7!SjYN_iDit$_kZ(yX(_g_dtP z0kcIXFYk>enp*ep3%LBEl^5@x46(z|SX--DwI7FZfa7g9BaOZhX)A;;^{99=l|MRT zj|aD!`5Q}snozt(^NiTyz#`vIqnt~#&8*EsnPoqGhpX8fHj*%w;RQ6aD>M&1A@mZ- zeKkwzt$70WFSsvyI-6)|OTDE_P~T|j0<{(A`qdW}Q>Z^G%M)#g>mns|JGrmw4UD~e zy{4^(T1a(35cpgatSrMw`Cpq5fbo9*e|RFGijr^N!!QbGR_?`0dzhn>I=z_FJ%ZK? z*G8LLp!A)TD~1-1Twz|1K#14()fQ9Wg44G->v0=*k_JaBKWj_kwZd9>u>c{Kwx%2! z<2AqsCEF$dpWIJGaM|*A90D4hI7J#55NOiY$kxyx(0AYBOa-U~(s4PEx@?R{W6;v^ z{e=w@O|?5KL#n3*x<h9VozN{xiz2r8ROrvD8Nqn~ZNasY%?Xy~% zf2YdayI&jW-8Cpu`?%31EPIut4ws}T{rdpNrf;0%4DKVdf@BqUjfLq2~CJl=c;L$CMU*fRj6nUx=eZR_>} z8!W^8WW&Sj?;9&+lTZBu^|edB!6i4H=@IOtzmZ458Px}4ketr$dUFV{YO6?)J+={t=x7-pG1Y;rLcW}=)xw=J8&`Ev@=pSneI@zZ>NnPx?wSMD$G0aH* zw%h6vUP9A;M%7m^*Q1Tiz&*dz;^!{N9pIPI3myB_p4f8~v=r==p){Sw z{ti@45bentksBb|>N(mG;yf3z#%(Qg9(~)KT%G-jvm+EGmRp*Sel!F__`az97n#+2 zt8~=j9Ql<&5e64Ss_k_}w%xE{N&E?ZJGTHutVzL~FbIn(KF6Q<5&270hJGCO3!qji z4Nt|=3a5o@o5ZY@h}@Y2x2feJC2l*Y%@akGm7`2HR9C+S+% zeIfQ?Wd|z!^JVo;6q~DVH=6c#o@cT}Ob11NVTkFXq<>jotlIaBPAgZYnoDg=wGH6F256(Je8Y zEp3~DQgnxCe-a?PMk&YFa8mUw>)rQ-k(NM<5C2z_ZbkmGo~;T67$Scv>%mF3a$Gn) z`e3{L)3&+LL2$5Ne%f_lEu9|^+w9MG!ZA~yCd&hTg3e3)8ywuNkAdDV zok!qtK9-k(!Rt<6|4=Rg3&YaJCg#MKds$%N+-f^FF3MZCjPBqR)16?f1|RrODjglo zv)=@?TsuccON%sJOcTMAcs?hs(JZzHb703%O6O8EByCt zx5$zYp!M7nYMYK?rjD8^%9ulWia(qp>M(t0KdVtfw>r*deh-xnY!b^K%C866^?Wb z|FU)s)8dwU=uj23h}wKv&(QY)6Cv#W8krN_GOFb%jTZTBUdS*;GTm_JtaCdS6yGcB z*?m2P-y18{j19B!+vuB2Zm)X2QM(Gbo~}O%!TR3}G{;pWW2Px$Yg(!ks4>eOkihg& z5$CaX<)h_J&!<~9Ak9Ro!3JPR-G0?75hK>=?~@3m0mX0vH37I5)JMsV9;dA^nw+_3 zrI+A4T5=at-OBxCQ>eG{%%mXJ@8`vSVHE|c$44O3`8OTZF=C2z^gK+=UDpDl3k$V9 zoSU1fSkpYN6Qei#Bg$Rb2}CHG%#>}H4l3kFbDQ5*x4T~hv|S!=Ofv#z`b^jQ9kL>U z#tb%HNqrgaHo~jm-^d6EXSIB||>u z*A1dF7DplAj`>o5Q$VmO>%emu)`qVYdEea1uu0fetm^wQkhvvbzcrJB?%~uN6=~bs z^o1t}GZ%GW_P_J;sX+c)(<484?_sVCVj)Cv*KOYJ zM=|^7{9igHRSGNyV0Z0mIpv40Ra6`k(#<9v4ofwOYfjSj`nJ77jKpYoJ4TNO_kd~b z%Y2XXl?(al9IQ*4#hPJb-<6Bf)Vb5xM70|2CtfyMxet0n>Wh4BnU`@L#A7v%?SgMI)8S39$`#pLLjZr>y}HA={8HDEX;nkM;K!yT z^~>jT=PYFEu?@>3-w@0H_&CDXcmLOZ$C7rE2Abw}D8F!)phaKQKwc6kg^E%DC-e&J zRn=6%RMfl6fQ5#4*WAR^izM|alO4l!-R4=C1pTtnpFvB z-&<&CNubXJx|__UDmzhoI{Ea;L(eia0{J&r2|=&*qKd^CFT!-jWvXoa0@{S5S0ck@ z)eZ$~M#5@km(5l3r=iq28T%eOlbeQ(o7Sxt#h0N_&vP|hdk|OZA~`@gch$8(ot-;^ zLRvF&yQ-Hnf}TC*=!{U!MYRx#TlZg)ig%qaue@KL=a?@VyCH|T3{19ninO0>6aNcpY4mw%m~q!>0FMU>~-R&yiQl0`;U~kyc5>_PwUfT zMILT4-seV?VLVMr#c3>ovpb=|mNd1*ENMBI@?__o?9Hj8a)>FbI8$sg0ddv^AB!uk zb8ccI(y1Y2>CRD7@6X#3%w}T3RXhC(tzxBLPTH8A-{|@T<8kTNOOcFC@pgq~TgxRj zeB`JRLTz>M>yIqIFMV4wjWALYCF2^_CH=W48w!=JYZfBdw%YJ;< zDbWxZpxA{4l5;U;tJt|gp25w#j!x)#Q=_{gBRF4lxw<_6rqj&CGK%5Gtx*}XzkX5jFsE_+=g{33#<@HtRu&N9 z_Gm+7xL)>DNkdD4o^1qdY|IQzL-#v-m&Q}ef_Lh{5TRu#>s_%ks?B{$SN(YS860$w&ORHm*M{qz-1Um&|vKVc@CnmW*Yd82bWTn}SACD7QjBb%gwAVqHg=uk`1Tm-vm{aSB zFsBMQ^vAkRXWjKW1*hw-^xOErs~H}0!^fxfMmhTtf;F$yr_s>V^WIIqbSgf_Sm8dDQ1)N@y}*aDJgDX#%wujRWdbJdvrF*qOj+1?@T2NN&&3(b6rTt3!Ya5kDQEf_HNWC`V}NMakY_eH7z2d zWNhXnme@khq6!Zb1q1@X$-b8NH+>9>Sqt9ivo z9{W$&2;OFb)SN4VVIgN`!rFg^1$_UaMOX|ip+XsR$55iy#h+&Ad+(`yT-iJkf$uNf zH;K||tW86CSbp!*V@DKjo@wiHR%l(zu2L@P5Lhd#3K%WEBXou79aajsdw1s0E-r3uCp+O^~DCYhT2l%EDI!WsL8l3r@z7o&j96bOqoAAa*>;rNr-`K58->9c+)Sf!c5grJQE+`W=0Cr*l_ zK^<(!cb_6!hA0`%5hLGvBu0t(PM9fA0Gk55x2-psEbuOLtYJ%On8?tKEnV$^OPee# zJR){?)_Hnc(}$;6HxsM5U0CP;a~Qz|n4)6%N<;Ea;#M>S_Q91%>oDTI=nw0eC29ax zrII}XZ|y5H-Q7HeJ$?yH8pheU;R>?l1xT!fV@tY+R@`==y?#oe?yY|VL-qVh`uYuC z2+;ayGw2g5TQOjCT36{%b%xnb(|BFd{hUq-RN7jx<5e&JR9VQ|*k3X}imkE%wawg| zxYuSMKNO4Du(npYJJ-NCI-b^sEy>C-(r=&`=M}SO)SjkkoT)Qefo*%((G^}|09(m#A2V*j*cmJz8x^ginBOo0*m<{oKXIg z{%r1_C8jGpGkZG?Ua>aID13D)iOo`Zk$eNdSyn<KV=J(m6U=KlxoTdNE0$zeQqvT_$iv9u_?P&J-l5 zFTB)@0Zfp=WEwkn&@!|9 zN}Yu`=XE&nDgi;AjiQ;cfCbV$A%1~8Vf6D0?XBktTMf)1pSLA5Sy5Hf!2sY^!J3G* z!ivrc3a`l^oyp~$gSZizs?^o1p9{Thlr6EE!5_>1i~{)o4@}oPD+DsmzeA|~uU%CL zJ})1H;Bf(1#Sc=#Hs(@_gE(Uv){Ll57v2OHw@%0|VFVx;NDc~DCa4r;6?&l7aUgYf zz4H|qE~Vyt*eFu4g*z_Jbs8s_>wmTB1jFCp@l6B6ca>viW3U#Fn6qmAwkoxgdjcP- zudH@N^xDb)aQ^gR9!y7G7GWhbX0~%xgQB%*x}=|NCVv`UX=Pp@fJLOa$i3D#3d`L; zcV5IBe)^*CkH%+1ntLeEW3KkY%7L_RLLpoHgCPVSaE^RLC@wd`dHA#Q=SwvH0ym5m zQ;2q>5^R^~E)mij)Nuvxp$Yk1&wy?1Mz{?MUv9K1K(vqy)(Q934)A~a=l@?*k75k9 zJ7G1VG{MG52h`GVjU^;)ys$C4s!r&;m9fkQAWeO3JW+e&e&tU^BXChM>MCF*zolz# z^icH`Gijr0@b|NiT34URp>Lt}TgFIP1_(rsO>?g-i_b2usZLI0&t|HbrIvn+#-1ny zzGc{2#M-AnkUx``sdEB3f~ip`EI(S zh%%!zfzsM1m@-+fhsz?$aeqz6J%T0+av~T7r*dk`bLKYJC zrV{W;Iv=vXc(mJ)KyULmG5543&Pr`{Am|;EKamjCX z=~r^eHm~p^bh#+$!x<;(EKil=sJ8zGt|ooCJbv$Wcfq%q+LR2Qxt?^>V|JM|RopCM zaZcOTvU`(%a41C0I z)069X-7OIP&}=GmpH>;y2(^2hNQMmp{J$q_`0Ae#yWImZIa`!ks>o94gK_y{+oWGZ z5VYn~+*Wp8o_V*<6bV3eS>{xp$DA|4Yl8F#JqPKT(t8m<2Nr5jdk%vE&i+XLu1Q%g zJA!Q4%W;1A1hj6;V!J|YmJWuEUu2jU#Fi}9*MVsr$-mW-0Dk_CUK;4=d6RPz2`lr6r2?&^G5D=oE_9XhTO-l-r|(qNpL!H_VkIh?YuI3UKMRg1+CbKARI8%Htzz**nR@1I(wfDc9jXehotj^n;oE4%o#{VSc`Wl zOV%g!Uo%r2(pzDUQWKn+j4NrU{RadKHC(A()?r04FwlbA{`6-5Pg_bU>`zHvNLXgF zn-d!-h&`xqn4&YfyDEv&8AD5U-J3_IhR_T108_zk~Sy z{O))PRotmS{co`LPV!%(P+Ja8#B4Jq+d0q;S!1jJK%(B&sAhD=yB45pY!D%J@1(+- zMoZsIXNe>8XAnatP+?p*kr#mc2%)B#GdBNB@cu;5_MxyohI3r z;w6y%D6IR=*ATYq(ziyi>IUHVF!9;dPVHh76Z9j;!TZG3wElEc6^n;Xq;-h9qQ?Dt z1etNE>}=WIz++?Kb=wPf^4&tj$=X9L%HF4B`HCx=leBC;A3C}Fk1&fW)F@88Z8k*{ zg$q1cOAL)u*kIMKWOEhvn#%`J=E?$yB+d4?Vf|Lsi>2)R=4XNjIC=%4VS#}6(mRBJ(e5^(;`N$B$w7W#24@gqL@+qppLk6-a4yl)6!HbXF4F2DP* z5fo?=#J5X9l5)(bEC>?PQ8{Ilu~3Q&5U4=T{SKJcZCrh`pWxG<`_u^U@9A2ehpCDT z^0U5)W;UHH%r?VV)t-5vc zVvjAmCsPtCpC22^2KM|3ZM}bursBsaBdmiR}O_h?70dWN;-d90AhuT~>bZkaz^@M1Q!(|9S zXt{-@Gs5}yymmabyK-In=_yxZLQKYS*Z5iOj=t4X_OS(=*&S!tCucMrAPH|9h7*B+ zA1m$NKZFwFZec0{VYm4GYNi%Pf0i8dMfC}~-g+ynF)A2yA68LMs-o+Xs6_SizXsw1 zq0e7(fnd)dlG}~+i4U>m21Fgty91jd_cr>v6F^8?MH@Mw#I;DTIGc#gOl&Z`4_rZ z#$K7eEkNGp9rohrHc-qSFo<3n+Hvh$HszwSnRLwCC|Rxv4cQ~oZ_!#88xK3L)!`2- zCxQ0c^S6cNalLM3+j}rwv)?mAZ=e;V=D-TG>)glwN|sZ7=}j;c(!W#tiWTQ+fqNBn zvY`2h2?=yk4Kz(jsaOyFVzIoG~ueZlM4g>-|J5NPD9!8P6Mh`|&nEvEU#?i2)j-5`?m< zj|ZR#q%TI0Bo`rAsXW6sC4U1Pr~PjR?$hy)7JR73!)qv^TmFK1kwCEE0qrM-*Xx_7 zoru9l`pVT;PP%oWkTY{dqEYaTHd-VhBn*}_Zk%@4NeJDDb{Lp{QKjH5vo|?}MVFAt z)et7j$JR;F_Q3G6qvh+o%04mmeLUItdR+kpNy_sBc0JntL04Mx2T0wa%W)}8D9PKl zyCswJ5R%o7*%kPMQ52o04$;@l+sfJcC|n%xE*Fd^X^r%%U6*aV`B<(5=K69K>WVf{ zy?-4sy+3}JoLa?srL;i%kmxc2h`E*h&m*>O^AD4d6*%;qUgl$R_&*2SGTf?->_Rwg z%~$sOw4~dbj1Q<*DkWfsC%ubzE+nlu2zqN7{6Frd1b-y9KsNiVlO};mk)%>72)9#zFQ1Yuu&%yihaJP&Ll69s1?%m z@b-aTDtg=`o1FKp>hxZ7W6xA(Ghjh7;UmK?nkLh1V3Nk$Ma_Q~do%a+;m@^3yT()= z951uEyk)9OS&g+i-> zU(v9A9C-DDyaWdJZb&*0%Ut0eM}%#^hN(`LiNA~GK!r3v?wGu4(+QYz`807JGsY>8K?6T+X>E7;|8h4(2_T+ zBGAOCw$LAies|#WXnj^GnUAF`%fryVpw6=yhZHD5VpT|I$d>yEJp_!g{`fM&|JK}K zl@EerE{7rT4NuxOul?C}5iU`r#}-6>OLOREKFcw%m~JD&a|r+tXRQLSfIlpbapK3) zuf=eJlH>I~JxwvACA$s)Ee3vU&PLPo$x5-4GPkCP>wQ*_^WlCy625?T4>KQMy7b7> zW^2y}hEu|?leNP{TEWjymDuU!SpEBZMEbTy*PAr-KmELPaex_(K>v; znX#p&+bR9kd6*nxZIMs%Xp@ZuR>NW6Y`5Fl(8=0(cZ%;l)`ue0R*JM zO#TPGPNl3y6w{1I_t`)Aydq@TLhST(zkVd{==(^@;68Jqp3RI*b_Ulu#Myo2Kmr~G zJ@u)KubrGn-|ZJG{{CE!L)doPK(5L0GZ`hZuUg3)aU&wh^ZmBg$(N?wBpcQgh$7T~ zeidH3lG)>_x?dip{%l2qyC6L6o4jR(ZKNVHHdQG0@T?w*c;H5OZB~5SQi)5sMI}2m zO*}M;SQDOR`CBVkZA2RQXYSFZ@GludB|tRUIXghHV{=q=Iq`0Qv;$RwDqvWc^aCFD zKBtbVZYKxQvDR#e2GvyrtwT%esLx~vXzbXb!q_AWX9v918dAIKZ@0MYI%G~O zcS5hkuuwcC7?rnfr$+uVn-1N5UZLV{C+lpaiXUvy#sXxhb1n4>XC+?(l(+KsP06Nr zRa5l4Jen+-7Jn*Wrv@hA^@z}GjRl;YaAJs&xKFL zoXBsuHMmAD&fib%L^8Rx1F-(voX6h33R+2)BC<{mU_W8@gTS|NL=tDwDqn^4--%?$ zpb*ntm_dRwdF&I7?)&sl7?Zp2et%*PC^Zei%=`FyXe$dL?%}9;HU{nZ3J_UIdaFDn zX3Tihmw3F|?dJG9CrbltzLInnTeDVdMmj6*?;R z6I-k#gg0{wj=~Z29OD9jMoH61eQJC-Rl7B;rO)o7g?KJ&vm4GLG!mA%{SOAz=L%4= z5{Jk09O#o?QNw3M8{_?KIrnh3SI}$H#vhYvI)SlpH);21zd*}&i&u!?YLnFq73sx_ z0*6iOCa18~Czg~v-;=WnCb8Dx3>-0@uEu zTQ$sdiBEA0lyOM>-=z2-n|qs`|2kK$ryz0}D5OeSA@3@;>lPdtXb-@}$dvU$gFxUEIYEeG~0|YjZG7&-a)dv9SStz4A*Jenv@v zXPOa~sp;;DwE2q<2_=boruYuZKxYnihKGY~kiU0 z(Hu~k(X*jXtlbV@MY|DFs)6lRgQ_Hx%>-4V*7@eM>=Yc+ZukA@cH=yxsB8pcYI!dc zIS{8(?;v6UsB36Z8aUoX2@Sf4TBE{3{ZnY){~hmQ9g0*?8mi3;s!WQ0u2#Ss%a_|) zRcMS1lKhc%CXw8YWMD`xUIhrJ8Wql^je@hJns25gn|@rT4N@iNE{zG!^yb|px+eI{ zd8%i>n8=80ZN2_`S}I59p*fi#fP zWiqL&%Azt|dHb6N5`cS#(QuZW;`giLU*P%cl<8ML!%_D*JCO)kXr=1bq4C@#{?^Vt zapr(0Uo0)|yg8{)T@+W|#R=Kle}_r83zw~vn~xLMf?U2cDr)Mc?v6{PZM9Mp?11!g zY&@=+fC~!XTI10_Qvc@!eEyrmSbCWW@@Y)+$P(Yf>r5Me2(Ep2AH+gD922{z?elpb zhI8Xbkc9{%oX|z2=zy$omSRX_R0nJahbaCkKaP-G>~|{ysru8keF_bp`$M$NZD%a2 z<(i4SU?w$W5UW5O^HxI^<6x;V)hfa5>NVp%bAgJ{9i4RIGb)ynqdNa~^>8rWs!oV9 zgclWEA0hE7oY!19oC~?qy}7e@5LcGZ^G)|88=s2-j++B!(X2oPlNu~s^4mLGqL1Np z)S;8saczr~p)Zp66GzL$^rnnJx8RCD#0}=JgQj>ADfUym?0{n*Z04hGHHelV{y~&t zh2CF5;kOTIkOd&JWs4LJw6l&x8pM=gKVTn??h=(4xg=6~5rn>)a-Tb2Fkwx5S>C*x zEJm?fwR2=IUh7h1u^RBkMm81T)4=@LBwi+Q($sxJQ)=^irB*DQhg|Y!TP~{pK3w~5 zXRJ|SQPB|ROqA%s4hW3_YH72+flG3~hse{|7ILfI6oB2IX+BqmvP%rdH56=uY>(}; zJ#?6U+Et&M95Ni;}>h*%)(*l@3vum#2K494n@+?ghg;<@u)eC*4v zv!aKAdHISXC)&OF{2H4<<2*hjZ5(~6rFzcgV_9M0v%EcmF#c-w;_n2pTVjmfC@*4= zGcVAJQcXM+_A9In7N3@XuBQv9(H`hUpD$D0@|15So_TlN*2#_2=W-P!?Q!%KM$^L# zNxJ$qNQKH7`mr!H;Nj<;ho|vL=F!7&wc=5|Af6lOR+{P6E3PF8VF9IO_aq3#W#Cjx zNC3~ss5|3`vYL|?dgUKwo8%w1X1NZ4B9ZMNj~e+Cf_BfQ(&5x_Q^m`8U0>{@%DSYn z`zh`Hww`e;y`D zn!czk@XlTT76=Jpxp2oUQdPnJ?S+)H1jO}S^b^(;`_HphX34M zzon{B$@OXbV(1OQFU@(-sl8tEM}F)toK;G03`ktU0E!wlQ%NG>$lhJ?%cS?5>lU|Y zSts@_A)kDc@1EGl*7Fv7Xn-=`_Tgj7x)d={@q2Rw0}e*DXqwdhb5^X6&A1aObE9y; z_x85kadnb3^<;+h;C;WMHVyjVXzgnJjhkymW4g2H`0;gL9P7;$BAD7n2}is&yXtKj z$BVhnoeFurY9&yd@E4sgo%EpxHJstqbD2iXJw4LasfR&eNI~D@D31OYbGvr6pm+a~ zfc1aF%OTi7arf6WoW3mW?%uRte}I%;)$;P@k}xNx<+m50kxzW{u9vbQmG2cD4A8Xs zlFKr3f-OVb8lv;~VBq3h+^1nJ+jP#J;femsE{cT^Cj<~#o}ewemo!}MFL)#YN9bnN zW~6UaCQ)R!YD+S(84n?g-TC%;jMGT`o&9*dt!6CJ$2(D>6Z-yr+0_Mu{z>A=jt6x=#805Pl5(92r^Gujw+W5HHeYWEVMO0VN%X0U*Dky;4M} zY@bYE!PnDf?H`gk4E?3qAsmK8&4q(>RdDLQq2~z zjWDYQ`rH-C`6*EUTu%Fcg44e!Yh}$3M^cUi7Kvi(F6TiKOXj1&Xv&wY49Q*f9#M9A zZ1Jos;lT%Y)OtA$(qL<9f7p)=aSD`~VS|TMTR_x<#aYV`r(1ZwhnTL!alY{Q73TT2 zgB^Z-`bM@9)yT6Rrub{PL^zGUQ75FVPl}{IWJ8gn)8prLer-Zh3vHn|MvT!R!XwhY zyY64R6DthZPVj+%b$)0XDg(5-!3ELfp>Puy+1Yl#i)}hG8(NHhu{v3H>AX=fp=TZ+ ztiD|SysW*&`qO=IE^ejujtNi5KFfB&`I<(e?+*$Fj$VzSgXFd$CWYlm7qpq zdEMLns9l6RsMFMT=l(P@w%ozTEm^L(EnQd z1?U&O;;XO!1l{-iS)N5HG^ykD%fapUbz@+QsO^Yg$!F4dB-t>WY^M9D4>>c3 z4PZmID5vjjtr*OeJp9Xu;!*CH$m8KKpOM=Q8Q8++yFl>!H3^C7C|`O+!Ag#ABJzp$ z^ly{5tE3A1ag&8G6cH$}f^2R}=$DoC(3My-%1^GKx*=FaUVg>D%2e+PGaC=5(+{;RvNKPF~?go@m=bjyq|85e3jeRhKU}F z%`)~oSyttxl_d&PsZ__dV^jr+aR;l@Cu#e0p8sh|0(<{19!7TU>t}fn#bd7*9^h;x zqe(a7Q3kWy+h*<4APV%UJYDHDBE*U^SL&cQq}bDOGzrcZoeN6NJkOn28F<$C%6eWB zS}mcpJU<{iF%9@=qCYjr_3hS(cL}0z|Ll@8mcP_b9o>j9BF*E2q?V81r|*M z1Kh}mhIpkqRijY`1ls-GkG6F94G*Z*WI2ps6yn}$9g=!^vvD7zMeN4uhCt4^U&nI_ znigqpvcnSi*L1eU!`f4W}tf8&aIT%O%!J;s*F0IUOCeba=m zMM{Hmfp}zmc#3`$4<@D5evuR5ywZAMfuymEJ3g=wbZp_2BCuL5e06EE%iSa*-+d{? z*~MF|vUY>a#o8ZjDAbL!EN%vmjr8x;^!+_Z%uOGBsT{C_&MooVx8_* z3Z47M9q&f{kib@G7AH~n(}{$`xUPzpigX92iedipxcj{HR>XY-8q5|LR@600!z?8; z<8q{!Z+jf?T+zPTN3TLnWIs4y?_Kfsj7xX!IQU&v%5Hu75@_(SiP8o79l7kE+#u<|Q?(=^b zfFuoN@9RS8M5utj9iu(C4H*-i7XJIkG%g!cV3#8r*|mFi{N>hzss*a}Lf8dI+7sZPJ-}fzo}<4Shm|5@t=+tGbdtfjSsIga8OHy&Wd~UV4x{iDJa?8@Zm}^?jkcK&j9_e26e`xkrQu2*cr~X%`bgHVC~No#x*6TFnV=0@=w=1# z>X99^Jy$1=f}{nrjD8fS%YyBIjFKAW_#A@I+^5Zx&H*q%D3ktp)&U}LN+ z0dfUKX&}eBk0xf37JalcHVTV(X#tEmXrZS{*;dPyz6cp5_aIsFtzHP>H%K(YZ9a9_ zg3@{_n2y-<3Udtg*5>kAOLvnpWeg7|ncZ-`t&$norDX8Zu=g+}pPO@JzU4nc+A*+; zEhMyy{Edx2|0nLZW12tUh`{@gqo^xPDPiVH_R9_d;kQ!sBpMFp@Bw)>9%|JwV`uBNuGZBP*f6_MUW zL3)!8At*&UNC~})^xi@Tr3wg$^cv~ChTahfHS`VvArM+1AiX~v&wb7_#xvd@@P4@0 zmwd_|d#<(iHRmeu;wN^QkGVIllXhqx9SO7^UPS*&p;OA>H2{LI1w)gqs;@3ymn*-CgQiqF5#nMgkgXG6!zsf*Q&aQX#iTmdK&_gm^eqe_2Xw4^JZYVFQ%8F}nW_@k$EZ z49mkZH&g`dkC|(?RK)BWXD|Mo_PbGS_U7(NE$4p& zz5l%r_2MaV#yaedDGygseDwODvs{i&flmC3xv|l>zM;mf*=HtJXP-i=A^w1m9O~Wt zb04~KL~H%6Xj+c6H7(zacJ%b8EAzRKs5>C+jg<-ZPxDol$5P#SlE3~4&8}YBZH_}> z*8>8LFpR9V#%C#$KfS>nbC{3xzsqXddxwU^|k{SScWF;aXW zL({YA=3=>E0R~r!{)V+1n-*RhWBwHHrWtL~_C$Y-Q*)DGduqAzXE1y=f2G=vu-1xD zUs)iY(SZ9#Qg!5ZK$LRjb8W$Hzg3IHw+4;vNkrwhzL?6~gUBYd1~KX~FX!9P*$Pf> zh3rq0V~@3lp!FIMPg}A)CqEFQG4Z@%&$-|>M(5z<9ci+zi5%hxoE^oB2D(sAFE&PA zwUBz5z6^JirP`3R4vhS|=Ch579*Wpns%q&paBMp~uhdB;l?_-PWAOMJS84xomC&T7 z8v}8~>->+TNHVg~ejb%fA{ltNgbi~a%6ECU%vu{<%92ZIsKte0`K|lRi_JEUXCLOp zns>eTy6<>=_il}AWv%BvfB$)1i%k-MY*tGTUU2+86=+!85R>4Nw3?sQF6GM(jP6F5 zGbOD+65!CM*azr~`N@O0T#O+lv~XbJjl0VtVvDny(gFy6;ts42M2KFzx7ps*kE>c_ zEXe8w`#ag01Ud&?$J*bn-cU-#v?%VKdl^PrFkWb^ zln)M^S^MnLIFGn&C2>NP6ddrf%o$kl&IIg^pRYmzxR{S#i7e(Q^Z%u9*7^J^cZ-$P zXL*TA0b7bW)LFrX`R{GD++Rqxlw(nJIc{|n=%6q+^a=cBZI`(A>GHYn1zv7~dH?+% zP`-|ASl*PcO>W zu<&QL$qT&Mv`6?d)c`^5r(4W2iA2*W-l9Sm+L8IKj(FwGf}QCDh>t}_X@W|s(rO?S zSg&3ng~|pg-QM~-*1&Miv9jdQzK}RYyRkn3-zk*sQ|_DEF0URushrKRM@hd)stfd4 z`0cG!0RdhWENRnOuT$W>3laHufIq^yx?hy*&2bowbiA3S9B(1jvbgYAtyC|-b$2@W z4V-|*?9tK(Sy|7?6y4#eBRHHN(+pz6|0#b!5&BpbQ?(ST-9id@G$lH-n}7JnkF`ht zF9+_F*7w?B2CF^D>*T?DeHfYlF)%BW!+EHOC>N=!_cAwsRM4>bqf# zJ7izyZTg$G6;w5_6P)urD+fn(?NXk|nd#KyYl?H87J5txgeMKy8UZE*`g9SzAW(KX zrGA6!ryg2hxQiEoU>O>_^KpTQV%OEW^Wtbh3Tku9p4%yoMl)@{x%jm&^e{$RfFv-s z6mHNUfvYL^A4dGYOg~UQIHdqsz^t(Gjd*EJKmaXTC#zE#9Lu3~&uo`PJ=|K3ej8R~ zi!*4RgtlFN387p$9q-xy9n1oAzi$w`o3RCR&~p%|Ql5J4Ik(!Z0No6IP5Oa&*i=(@ z4)s%r?A4S^p}onhdx;~B^cPG2-8Jsqw451u)k&3sj%6l5kpHA4z3Ew~Axjn%t%5^8 zTs^{BRR{9886zhUYYypoN5W|U*g(}{=jve?H2RO13MvG1;(0Di&Z3T#f6#G8{9p@ zBkNU=6 zM4A_6hJs$JsBsF!UxwN4ZuXKogqUBLliB91jsDn7k73RFBP{j5QTGrlC<0e!CIx@s z?(FAF$$hn_1I@hfAjdXpHCYl4Xau{*ZO@1KdpnER_p^C2E-zUY#0s2_ewH)=gRGH& z6=G7&ppWzcathho441^7O`9!92D7bzsV;ir|L6Jw4rz;yG6lOyP z=FV_UlyURHLB@tl4dW!#=FU`?xn7sOBsvZYNV22<@&9Ok0U9fih?k~G*CkGoabL$F zP%!yX8E!rntd=a}{K8CY0*k}k`(g$l(v5_OMHIX1E;NX2(^9~GX7`JJlQquVie^z8 zIaE~4i~I1*mn2N2Vt~fFdd$p#-Ore0e;wPTujBk}LAcfeUtz;i{=@_fuej{fC-I1} zf+H2e=?^Dz**O^NxAV_kE61GzN+_2XH6vzu^+kc8AY_feK#UX|;+ z-E5EX?~%PBA0F;D4!|aNcaW#TzZRH=mahgLgY7$Yk^=CD#PaJ!;T~_{ui0kxE3wV$ zFS`(O4O^C6Wv)OnvYD1{iRADbMqCOqn*>WwPfjO-TMsbavLiIPbA{o3J+7*^!kEtD^7%e`P?&ie4RI< z=%s8k_zF+U{?>ajNSIbc;JChpt97EPeL8|ZgEJB&YM6-M@uF`~Gf@qyNJ(erX7`oHrb?q=⋘Zx0IHJOdq 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/SplashScreen.scale-400.png b/Wino.Mail/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..58e5483e7a9c5ffd36198b27ee49a2c555a3f460 GIT binary patch literal 134337 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

+>_NQ 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 UTmFYB>z2xuOP($S=g_ho`G<9k| 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square150x150Logo.scale-125.png b/Wino.Mail/Assets/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..74dc251533f36fd9a36e925135fcf06192a67ee9 GIT binary patch literal 7321 zcmd^ERa+E*62$-sX(>sOlm=;7RJyyn7Lb&sQ@RAC1f-<9ms*xuV(IRsOJM0(8m{*r z-1qx%W?trH&NmO|%!yJ{k;TP+i;aechAS^8rSY#r{|iive-$R*Q~s}Exyb2*(9rO@ z|BGjE=MpP4G%7`Tsn1$onTN)96~=Sgk0?Ml_3GB%!sz+WT1FC9l9v;|6iS|JkJF+* zzIo}WU7Ad)js8;O<(CwKFLIHzkwx0mc{(L87^o+)+&N1^CdWTWQZw5T!5Ol%AE-J` zH z&2vmlmQ5A;kFf`c326j)@l5|N_HFAHCQ^TUMOP!vaKFu`x0#vSh)XSn1Q;e|AOGnC z8}yfI;GpT14UN<_?f0xzqbKD717|UT3a3L91c!i^1lrqDRBtw{)|QM5D{qSSH4_e{ zeMMhCp3_V?J+!~e+b}OO zE%3%E5=LGh2-&||e*U!4h`;%1aoflAVUQ9LdUz=?e7HHMZlx{&5${ZzP>V@w} zbTO6*R5FY&yNBb!Jsv$FhMW%px0=@J9LtzIL&K=agshCKosvnKsr#`d6%7iPcL%oP zG1Hh92D*E#;Wp6Lg|zNnO0}FP486bF2M_t4gA)7DCs)55UHZrqyqmwAR1RYo?Z4d; zUz|bd1wGmHx`ScuO}sscI!TI2+8FMZrnrL3jzQk_>|r)mo5R0)fKe23uq=2R3{T`b z@F#F>;h7Fa9^b(5&EcPkV)eVK@`t*D*c;T{Jhf(j)3%fk!TO6yhn;SDF5&O|%xq9} zkKfWs3PN>AX_>D=L&xhJ&=;qlC98Wq2-xMb`a#zYbe9=w@ zoEKeqB7p$kSDkwD_X>Nt9%m*?fE!w9{^i>FU8S)<9gJ=Kt3#WY5|dM>gaAST~b0-t^g zc}wdb5)r8aK)Ny{$&sI*(U;Kz)^M-t+xtPqYkm_FI@s!^T3^e({Tm%h``~ZXEQAf( zBrDU{T&31ivhG$M3|HY)DnKD)PTW0xI;e0J_>`(Bs^d^)9dlJIreg{XcW8y&$f?ui zQWLhqk#@xC6l!#ep%grws-1!#6z+UK5s2EGCyQA@||@mO}I zGT|>FdX%}0!ldOB+T^ln+2|z*(xSJuab9TP_edaiT=oa|h!*7$zWb(9dLaQ5ZUSU) z%D(=FmEhn}KYWqQQ6OtXH^vm^L33e)ua^ z4j1%Z{r0L4bV>FnKHe$CjdYrs-Ve-zP8KX06GNbS6<3&`NPbQ64(X zGcDV}A7+t6n zIS&LWklS+v*axy!A(3mbb*VnTHEY?%$dSd-CZmgIpE!wWlHY~zaWr{qg}~DtXr)Tt zOa3lxAjJ24)yPjW^Vy;MSX^JH z`ffK;Ti${wEq%nfhOe6bv*LqFE1BZsG>&(#E_ojF{Ua)p1ON8K`vu^Gg{`*S62z=| zB;qWOn(OgCc)jJ7fvz#CQnB>lOu6Pr*X>PyEi{!R-?&?Vf`HO-$sDso~mo2LbnKmQfWaQj+GgwKVjej$^ zTRx+Ibp=lJ?cJ{*Yu0pC69XG*{)wizi+ zj&M4D{9~@vl^|8N69!{<+Qt2b8sMnFGx(H|;e8u7+qTRu3=t!>&(Cc(SCwr{HqI7CN)A>Q}ew*5h#Am?lw`*Ij81Hzuo3X9fyMn?leh9W*>vJeEe74DSVm^x=OoV%M5AA^8@Qx zhFJ4il&8&f-daUXcA!+@i=yjPo(p)R*0PVT#e_P{~Pb2OM>2=EP z_2RPHln86ORjY7s#NnJ;P3$8&ILr5ma#a5PztV?OHbASQZ0+tBRI3Zlr!QjshesO6 z$M`N%k{eCM8jk)o?euiEOFr` zaZU$|;r2b2bLMDw4C?y%VMlA<{&qtlIKTUOAZYVVHDVy4P*`LT!a2fM!4eC)*uoIN zkaj@`qzQDl4R!@wC6HzdRXv7^B+-4N$b@-{x=63|4cDtl(lo%a>HV@Ub~QtAr;K%c zSdPY}5iq5FUHa}0@qyFj%jZqhoTvNfjBIb#fyq7k3c%Vr0lALTU4_fU!j}E;WpN$e zzVfG6rwyUP5}7)ltG>_Uvliv9INfT&`S}b=stMwJz^4#4Dq1xwuG#uqF7mPhJ;@CI zT@K4)2s)vO(JLP%Rtj@(-S&;z3S4CCWmA%mru0(n#_^-9pMw}cXdxtHo`@0sVyR9Uh3vUTnuy%Yx~YF4^LKmk>kFQ<3na9+O$ z^#<$SZqu=^?x7Yb;}9hSxV9GiG`#PTEdG8@R&KSex%fvV@%As#DxreLgvpOzf2(LL zJz~PIIJK_JyDgWd72hTIq$8W$Fq3iufHBn-Ii)728_P3CCTtWEul6$3)5Zdw_3y6| z>iw#wHUtll<^ff)Ejn?~k<&sfIQ3u|S5E)ouFD?0o#w;zDx{19S+O|4v?I!x<`&ib zwDs)?m636bI;0BikBjfJ41@pOyy}2uapR;kqdDnck_nr|G;Jx`lGZ-o zQLF1M%jjK7gL0fXX1Hj+J6=a+kww+ufUazo?;FHn!RL&wFy9`mPJgKacHdv^!t5YT3ohv}V=ZXr|EiU5@ z%?k}gzv|yc39qlle)|aKc{8Iz#n!udp7Q>cA?{U`lbSQK$L)1e8t+9gtxmXcg7G{= z&-8Ae4Sc}$f{(nJi}iMgi71D&R5W5CdjZYfA9P<|jw;`w#g z=Wo~ZgqU5%#oTF}&%@Us@5w7F9WA_ZDS*Hhi|G2h39I*&Y$lR9@i|9p)4~(wN9yEP4&=9xPKO;y25D!LhvH z-h&w+c6-!4I_YbJu;ZQbXBXN`#KfnEMwu~GK};blZjIgveEC(@*{N6!&TLta_-)vk zKWg~El=c*lr+~Ouc(|vi5aI*7!d({o95zQlDl@r?0!w=a{pm;R=##IAve+x?y|vQf zW(o&(l14fzcY7xx8?9!fIj+2Ab$Z63UbD<9n!@Z01`8=wFB5NL6aDg1%s$FCt7h8^ zP$>S>4IlxRd3Kq#!qWDxe<*lUG2ZR8=jPet^&(GzIS*XD?=-ZZM<&jgIw%8V?s_EA zve+9z^VJ+uI$F&vNvwXASt^dBxFmx)b4QGT2;K+;2$;4!M}`RJ1~#xFTynK`YB zBCNO^wWra7`3~REN{i4~b&PafopzUu3R)53ZdKmeTT(amc!eBpQb=Z)y@LZK&p+KS zllI4rHqE|D%k%V7r7T4#`+;}Z77}vZ8WtdGJ-wr3D^T#c%2`2C@hlTw^H{YWXF z*>Pr>uItQz%=ap;OI5YD=;&pCVZ%j~#AgeUKV7TFZ-syM<&uzHraJV$6~Y4AXZ@oP zS5{-Ewe97=h7EfbfA#OsuVNcALl ztq+*-8V?&rn(Z}7+btcif1vPbIO@puh z&LPtDv)4slD$w0Q|6>)8YvcjWGip)_Lh(~xk?<4Rv^cM(BY zP%E&EXoOpUSVwL?sPl*QmFgllU;Pwzt4)NQr^o4q0z7$nPgono&J~mCj-uZ3#}2uq zte9C{8XVu_8)kdxXxI2ukS-i&=Rx{GTd$e(d;{Z?@zJ}4{+%@j6UsH1vrHtCBB$NjTisMPC#j!b7~@jn$QnTu!o!4 zh0zYO%Z0}+WcY{OplCVVZv8N60ZnjXtGLLBBBnK8kMaG|OZ|f>6)7)DtckZKif@mY zlG0MRc1ry}BZdf^z*1$y%8^8r0{crNj#v3GPg;(8L#%4jNl|8r$+Y@d+oXEgV$u6WN6IT&>*f!^d!ML|3q6M z5XKaJLpn97OrLI(jh)J}*>6hnTwDNlPvjCH7I6y9yEme!0FP+>^XPyI3Rl-)6kgua zg8Lp&`oWzQ?hdO_Z{%)Obj<(w;FTC;4M?v%s(j1TZ}lMMygn7o=;sqSO$S3zv86f` zE@&+Ds?>2m&8H1Ygv+D}Ebe|=tW;fJsyeLit$R+cq-8-@7( znzu*Ki!1A65Kg$e^zGy8abqrSt%B6_K&4s)*)Z-$B$w?%_x99L`n{RWS-C3og8>FBr~Y8}^GnBwJgB zWMJZWl2V3S9mUmaTkoQTeY#o0H{bBezb&XT1 zAY06tNn-7YVlL2=P=|Mw8_Gy-@)PP119LbBBF6kzTyTh7YEX z)V*nIXKc$}-WUmek@{o_C6WM=*KZpVhG3eea5ntmNwECrX3f#mI4&KgFO8~0^!DBS zn&?}Z1II_ddH0gyOgFnb(U(4ayMpk&X95+UnpA#|8blPWygPQsPl+s{+}$p2<={_DKu>eS{b3hu^3R zmP5NQ+Ur*UrYmFN;WM}~M~N>Q?ff(FI`@D2ld}L)zKgS=>lxl!l)W!Em@7vvvnPL1 z^ap-BK@XM4v8#|wWO5>3$jh27OEB(NN@gG-b|YiJn4*bJ@VMT`Djp}#|NLps;_~zF z>!9x#tA+8i%~@I2R|EF!VxURm99jy_%lSJr57gY~y^dx$NA{m7?K+^Ac^UDt5UBMg zA>S=P`%lGWrQ&_8$;3a03r&nCk7bui%X%|N;dst^w(zq1Gv$mF^Y@$A@~i#bqPZp1 zipMTK-Y;osE`F`d3}VC__aiZIoOc@U(zOJG7%AbGRn^LtjkwROS$VYPrbmPqHKV?n zpSvFLjkwKyboVSP1I_oVKnYfnDgT6ff}iw{UWr|gNeH>rSVdz!R-H+77tkrPr%h@c zj~%CR83vyzROCE=Fk6$iU%83a64Yma8GqufzFW3unF=Xazx?}o{3$m*@`6~OS1#Wi z%l+XshkM+B7NNL%ii#bMMct*bp9h!zb(%V0x-EW{*NePuWyDqJ3l~?XK@02r_aT#u z@HwHPVWI_+sl;>20?{lIBz)+F^sTEQL*Lc* zrHE+Hh_X+t9l8;REv^N&q#TA z?$DAm8u{q3AVGM{YyNtIe8`yUFbej`L*l_}J;zIN&giL7E5Qe09)K(lY5q)ged#^- z=!!3M`}N{H?NSr2)b(GO#AQdt<5Qg%{3g93g=@g|H`1FjX`G&%tvvYMkVA0H=OC$? zlNC=47Hs{4DUBTVb+?f z@1m-1YSqQDz0a-_t)?Q2hC+<;;ll?sc{!;c@8{0{781hyF4nx@|9&95%ISH0_<%n2 zzx8p{rNZ*V2f8+SsqdP;x#xL)4YVskEB!~F4@TQ!vDQ4?3uF4Ejuv{9RZ({se}0sp zXy77z!mShtcN?J#bC1!aWlS&miIRr78ybT|I~tA5^dkZsP31U>!k6w;1JMySC&JNyjo)4kr8 z0iIyl0gBJ}78lfMPZp{t#yQQIMyVsvh8j1F zH-dI1I)|%Z#{hYTyCm{dlR@ZndH*l*V=au>EBEX1<&jd+k$#F;5Jt7}ytWLY-(-u2 zmV;cFtiLmsvqi5mWIwZnOnE)kkL{RMx`1-?DQJkZ^{t;bP(^Vq;~sTo$K+@X(rG)g z2%H@~ZJ}p7e`@mby1WhE-Tm+AT9u%nn^b(W6+QNfYwmUF`Js)#pJFKR6=Xlnv!vB; zl&M`aExz;WVSo)iU^TGa&&I`pmj2K6xUn z>P^~;)_&C7$&R1be%+Wb?iNleD<)jewuyZr-6|j6z^E{xfHC*9-|S369gG7SkWA=D zY}&UsFIt1S9jruyLTZRGM~*ygh`U;xR$tT=l0NXBS8hP(h3t-K>8vNoN0El2BgEu| z9k5Ez6U&B}v5no&OwC#w)=S=g;$-?cP35{N9j8v9&Kn1Fv>r||8P0;w_&G;e_Iq?4 z-;!S;`znD4B;sKK7cBjs#UHegW3RmCpi_q?tk37Fa=#Dkhj_H~`su^2K*}rHv-*U` zYrM!K5dkx^i>(J97*t{>rpkG$^6sei@!mY&=bu^#k`VNMsVoN}uU!&8*-z?<{d*Jvg z%T&De4=fzo^A@EfR({+C(HI!)4#G=y>m5p~iN|7s#>{5sk|M1>ZF^$TZokm@Gac6AEO;3e`7dNnJk$IZ+#Xp|J}f0|H3 zAB;p|S*Y1yxzxp2=3Ycy4Ji_brvI~w!0gluyw{XfYdie}<=4S!Q5U5&istIz)jxNog}ESgfw?n-|qvK<8XacK>kQSi!6YRv(bAwCadBxcmLf}=O#W$jtkQ(!( z(xqWCsW6S$07;F3JC$R*rjo41dC52pB}KlmGzVmG4tq4dgxIDn5^5~oCv8Mu|0&Dl z)b&7`7)E(U&tA&khR5GgYCy7)lDLpv=lQEn)-A2WEq@eHxWovM<}ARUzl<%yQXhV8 z_4q7Z(X(=4U5ib#d*zn7ouNqTQ;c0wZQoqrR3VkX#e55Dkh!yxRudgCLJug+Bp5H zaW`G)esLVrx91>8zOxH+2!A(NQ4LqE`^qn+VHpY*s@+q}U_Z@d&&pc0sAcn8d~-qR zT{JHlye$lAKn(k4;jgq}BTX`Dgi}ZY(T4V;zPW&dtJMhYAYx}$U%T=N8$FSBxc(m+ z36Cqkjph6yYTfm7m%!Qqs@ya?TCcS3HuhrPialYMMmD?I=<1W)fy{cWs4SUUA5R;c zLZF<)TuB$9q|A!?GAD6qjHmlYN@$jG49yU2at@+*6rX4DP5O$9{Ao%{BFZR;Q$B^+ zXy1>X!ti1n#`Nxb=0oTD+G5^XG>N!>V|cd+5`S9KDdm$M(~W<81g~o%4!*X%6I} z)!76&*Jm>6l7ZQ5Utwq1E4RsyoVWMrZ<_xA0*;T^^So$!hBxh2vV2Ah;jG@ze3x1v ze;u_&1xV!!KI}Nt<-Is*(`l`v9amOt{KR}(#-9UvYB63V9N0b0NY`@ZoM#N4y96XE z6lavSF}SapWb%hj9{qULf@Dbys)t6vf$FRnNPN5L0>v-Mx~e9rU%R9>YFcCb(swjZ zYt^;Ex&{>}}xoy_PV7wZt1s)Y$fR~%S=UO|6<@-P;yQ#6}9eMUEWgP8I6zSfwKG9KW+ zC`@U(n~+yN#AokylAXkU%9g2zfXi-_mu^Jalabi8RQS6wvo5kRiD_5T$c>|Fw&?J$6Hf00zM7VGJEC|W2t$}>WHad#E zU3{D&&WDDo2BR%TH*i4@_G;#r`N&PM@WqHwzr$h0vrd2TBR1$m3f1; zkiYw%G^yj$o{$fn4F<1qQuq@JV07r<5d+wB2ScX=8kc$Rofz_n+{jf9Wu}w4CX&hO8Yat)nV)Z(65e(@};DkkG_~WgkZ&A*U)h%Lb%QKUn3>LDNfvS z%&M&ZWaL4ecc@4s-%S7Wg7sZ_-Dx@^fpDkYTD*;_@FDa|S=#gdQ2BE4Z2bWgf4#$5 zm1GiC<|nXeJ^9d5;5+~N@O-~J+&UC}2OK@+!{iFvFF6(4J7lb5=9_W|lkQLq#9&uW z;kRp1axmPUXv|_apA}x$ohN7%%lwl;QqADRC2881w-YgfuHrIrHm}pRv}VfHd)M{E zk|M$PTNLf$XtH|fUkVT=(kwKAabah+?M|S0V|2R)KQ%%`u-E}Y{UrN(s4SpPHV9Je z+pD?srVfg{n$RIhBMF|J`V{MG-6U}8mAT0sr^FsN$FxXjLgsn(Er0@Wzse})>KjMx z0nhZib4`C6>H5#p>bjo}xe3|C^1#Tyd+OM(H!^S4TBzQ;7YYehmdeS+Xu}p(;{yVK zurt#-9YWO19Fkb&KHHbV?A`o3T9Iy$+f9Pd#{~v-<;7Ukf3i*)y)}jw76R{?yE2r3 zzR+h+7f#{Uz{zrDlBgJXJV+?+cZ0OuUhi~d8j?5Cwa(PwNbKv(vcKAD_IhwMqjM?H zqifs`h9z{AgJ8J~MljG&`K{!vaVm4K1UUyAWLJU&20+XkjGC)(v^RtV=!BRA^@PWB zJBc?|8RdsYNJn$@_a|_B&5gy)q`^Mv5WTZ7%yLd8gz@h4E7WF9Ak%)ErkT{kus6YF zuzM&5IqP-bDepZYj^_BFuEgGn7tKGb5RV)x=n3l4@;W+OYP)g!*EHn8I=TBLLzh{R zTw@BYx6?u#0XJu1@rI?5zS1@~@%YCzRu3a=SkEBpq0l9OZ|IjQ$+a>n_|~QcI=)|N zmYHS*mLYVw?9rT=oPvAz50lSL##$okk~7L6hfCb{5Ks!l1eT|(u_IMke;hedc-aBs ziUW%OK1^lJj(r*AdGu2k*lANTe4IKC>1p6)bm@1Keuz11>MGCb98Px=?*{~G!Db}c zCo3oR18 z7g>$DN1(PFb`ig_9vDQyZ>*ynrw8z`)K#ESS_LH+tfdJ2SCe~*`|nDDU=oOO@6T$J z)(!kuOEe8Tk&oU66u~>F9sTUy4#lzp3T6%aAz`XzQ8&blU zeBB^w*MhaW${JDtXd2c*XLL;* zsdkU&N1Pp1-l;zsVDz#ikUV%?N+1Rtt%DtQ`&HV1ZREDw3_paeJ`Jhv`<{fSLldYl z7B4@W2@PAKRX&pnJ&|P^y)&6CrWw2{4IHmyQdYCC!n96*BzI+sm^@xC+`>os6apc( z;g=>;@vT!zq;@stW-N1o6ne&l51x{JU7ReJJ%07Z5ZqPYhzRng0+S#&t*+L9eebB`?Xe*Z>YWyqt@BN@?f~6R4Q7>~ZT1TtQRB-Uf;)Z_XyZ^=G*LTQ=((?I;L%wuJc$ zt^sK;h?pP48LuW)+ufcI1`*quXud~7R2(3-@OzF<#BLvnw{=(pSE`I_QnQfpci51| z2~8U6aJZaL98$bef`>cH*fa~flT**X0hSgdGE zlObU5u}j1S?*3@IOJ}w{)-ko^A@murc6Q|QHZWa2xlvr1S4z1sV z5-h@@U)e>ZKT=M|qh%X0#?>>Vd|t=H7nw;AbxxM}}jX8FIO8C%cIT zz!D|{+t#uB`JMOj%k?{a`Fs@Ixcf&&zQdNF1AoKAlE0*j&6FyrJ3l6<1W&MX;{4j= ze>NTG|N71gv9x@tUcf^7P2Z3GWBjr3!7aNQcQ!)`%Ew_nyUBzT-U#j7*kayQu^6=( zk2^W^zO!Nn2y1Jdj%zY;%r~Ea9pgIMvj4_$atKwK=@U+Mo*^wlnWt@YmkPHApFZR0 zyslLn1@2zsH{^YfIJ1dTZB_lNYkA8sgrlx1eRAaPxk3Occjfk6bdz|=1ehGQzLyLv zn@y(maIXEmp%_^nPG`rkP=CE_kW(IwA1|BA;;xh#C2+YqL>yJaXz zoOJV0p+2xR_q1gLv+~KCWUq;f;u=Q<&o4s7OgIKrgi+`b!p$lYG?iJgfTR||rEo}h zA{}RUn#u0P+}o~96`O(u9ahRE;MIGbMp=qZvKY*I?-)>6;r3XOr|YbZl(Zhomw2QD zYbr+^EgngWK6qt%3G3#VDp$-@lneGP6L^^HiPoIIEHw3 zaCSB`6P~*T>|*<5w_kJ>Xv*76NfGu12N`;U#6*w8R6e|B^O%1tb-XWah)c)171_bD z^re2R9-uWum5Zk}4+)vG?X?O4xjhFEExgEU&wqzT>atkkZ<1TuTjcvKG)h>6*wAEBkF>*(bj;%nWGB%^26HhpHmW1)hNaBxbqE7$<%>PK;usz=)#4Wl9zXn&|NqEFprkJ=v`|d)4ero)sRIFYa4PuGE4e328 zq0K*C6Zs;45PfW$z}j+KMei;_cd04~{7`kg+9X*GUqhnPYB=T!Df_5G zkz-oHZ7}YWZjcr0dQEBN16z)Wv+JdD2?{Fe`z{r$;sOlbQa;cN_IdA`2_C%(SiWtJ z3*LXd_KvP0OQu2Ny|PpyXARcGzy%q{d8=m$_J*%J=k1nckLp=0yAyF`{du+wV);If z7i)B37of3g*&TbDfbM$jYh^x)?x}*K5#CbUoy#Im3{RjzZ=y-F&3<-VzZxEoq%Eoo z93HVU#(B4QWkp6biZx3|K@}f--2jt2-YHFdLV8#mqmhliB-LnF8*npsh%RBP#?7%M z?CvJZLtMjLT-iqiuQ^S@&kAfg?VGu0xjNK0L?xx3u^-?Wh4^@);uzxd4L#OPp! zBsBtJvh=z#7CTSraj$BI4@!oM?p2Mtj;05|PwXzYoLhXOWA^-uJ_IRZlqF6+jU1O@ z;%)q)tw|fagm!0=^!{0C$fJeeqhDTCUb1D+hmp87+m``57(~^TsZl&=+|W zS;|Sm4C4|3f;;k8qS}nw-Miy11B#n$Gprefw5Moirx0i|8jYv_pSd~<6n1C87sGQNYg0k-gjd)(3%B*{hoQxjC4*bkvp-GoMl6nxJ&&b0@S znY%_$Q=C(qI83kgdTO&vM7L?DlLoS;x~mHtSJ7Y0ClSt_0(10sJ-(gh;{VHPONB*_ASklDI7mK zys9=;n<_?gq=W64#&nC^Idk&zuAw71E}q*Wwdi1Ts{>-wQ2RY;+^3|brv2H=i5pl3 zd`XNX#hH2U>9iT*JVwqHG-L^|m?Ba=uX~N8cx8V185X1+fY5W02wSfG zuNU35+0p1ir|PfaOT6)-)?@c0>ZHf;4#Y5H15Kz+Q(hnUrh(XHHYHaWjKV)9Ir+!QrxI zv4+#$UxS~h_EZXglmACASYLK|*&lYUteLGn60~CdKe1kDu}I;^n@~qmRYIx6?C<}YRG4c#fe^B@ z-N)5@l5|ViPG&rWN6>hp=Y1O(REfJ|G}m=!vdbc&F-QX}kV7D$zu6t*7*_bj)y_n2 z(O`8{VrKy`3#+|jY{~Oir^)*;NU)-w;Ki@$V|1tmvid&?rZyAtQuP8Lt?eoK11_zl zM7fj2N1bOJOK6vXUmKc{UAt*Ts{$8Ub5h&^D#{{Haa~+GUA*YAo@={Z{J03z@1RcIoHV>)7S%*H_PjihOZ;!x=KQ-H zH4}qXm_U`=-b zqq%qJEXj-g&l&-%+CPGahz_#c8t%!Dh5`vo*VHQMYmjl>Yg}EJh{r4^tYa!>-btsA zdu4==xJJOLAAk9D9wU4I|0;jg+Qn^#eB6ZY_%U=)UXp+IaZjSe7J`xIHw)uhHk96Q zC-jASDW$P6DQ11+TJoE6$>`8Bz1uA_Dqu+(TQ znue^_ITMz`cn6_clrh804#daRv7qr#I^sD(cO?PTcY0hH(Cfy$j9!g5fdkrftik%}!m%jHnh>aTj#|gGXb_S= zCJ8)?NOz1C<+nrnA#@JVSBU%k4f5Pt2MtFsAS!olIpW&-=WSK4&STC~cVl{XfvGYz zKcSB`F-U$I*7b&&$dLQ-9fxb`10@fBr4(%nhq;r&mzASznumeRL#FT0Z>744|2Pz+ z-QPWv-9>8t^fD8>7e~`mR+zDMSCQGNKSWO4SwPr~Mk_>ET^T1`pZ(6zRB%K;-ZfM+@Kou^v}ZQ4@(G{zf26|+-_ZT5 zB5Nwb1dFfW#o*NqQs}>3dJF39zidT#r+S*=D*%4jWsg zEoi;Q`s+?QOvD*#7R|dUOf^qx^%z+4Ttycg<73erKDNEWPOs?9_``=4^b6PLpS_o4x~VyN@f)k+4D@3Ph6&!dFi!KZ-XTfd1|$wX#`95* zd4d(+7&xaH;GLh{*(^LSmg*tf0-oDePj2;`x?$Z1 z)Uqn*0QUD*VguEmrz$ZYo#$fcn)_%-EJ zVV6Y_9L~Qtrb{Az(*?1`&+nSERgBQ5c=)a?KP}xoX~N9jkcERQ8v*CiU)XZ{-`M*O zo+)6vr?2Yu%DQ3okp%|6nBsl+&dYcYG0r~qglmp=@~avD^{cl#oSYYpDRlbeW>(qG zFXZzG(WrYfFr3%Pc#R5BXA=|@0Yu!;p41ZML?)hTqFf$dRLqUMv>w8xgFZ)b+HCQU z&KB~|27kc_dZh@yUU_5dF6<7Ie)NAzR4f=loZTuVzy}zQow-DNQ}FRf5zv6 z1^wd1E6Pt=;sdOgMo_WP%ba}9j{~^6XqmlAn8;y(IHv!80}?ezPuUAKf_I1japsV} z@ktq_kIpt|TxgGD6+q{muaT?$S;xPLU4m6opM(Fi5dZfRNZ*+VvHB_PEBI7eTA$T# z;-UQT%LWQ2-iIiLj2C^gnQYnjGgU}DFZ9c;78l;!>Kr@A7sZ#sSPc0#4^2Pd=gsC` z=ij6}m!yH>Qxl!_#oh*rI&N?r>B`+3)fcRtpK5nGe47nSys5?!xvKlP@{ygLWsrGf rbH(jV{*ZUz|BfyF|1+TV68w|HmEs&%DDZu(?Ss6uid3D1Y3Tn0EuerM literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square150x150Logo.scale-200.png b/Wino.Mail/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c7a181617ced6028cad045917e1aeba0324411 GIT binary patch literal 15466 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 IZ0P_006fr|9RL6T literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square150x150Logo.scale-400.png b/Wino.Mail/Assets/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..14530295fd3433e9c913ad3946cc5f64582d1b1c GIT binary patch literal 45566 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png b/Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..cad729ceb661f99fd65f46eeae5863660d707528 GIT binary patch literal 764 zcmVpHu1Q2eRCt_qQ$1@`K@>f6-|X9uWDS}`{Dd@urJeo(YZ0`uut;ed zgVl?rkeqU znXzs+wu1;x<}pr<@zNLwol;~?0Cdn4UX27#7~ZY)4ZijurtijV)0Nm;v$%TN;r5vZ z{fYMfC8`?lz1_miFC!Q^!Mn^scrx>zn|-r}b>aQN}7ht-`@ z%;YEvl4lb^jWOWiRvSl`R4$H}C`%s?c3YB4Pb)cpU)zlfKYQ}gACRZT1WC-`w@cW> zDjS3KeZlp4#k*rUZk*VclSLViOmrn9C+`>6{MUQ?rp~P?EyY*8hQNtI6f~o$U;O#(vWg-3L8t7n%Xz4TSm!XX+?0W zm*doUCf>EN(i3cKvO7&iDeKN46PPl>f04Fxk;4r#auX|nR9cXnXNOQGtuP?5lzWRJiV^^O0eR-( zLJrT2D(563>bsINvkOYlNHrx8`k2H4m`2JVqs&~)5r;|to|-q65UQE*TF(hB#Ed)= z(IxJ@T2q*3(!>>yb~QAKMEIL926#3Th&_dK{}6 uAVgr(D3%1K)oe2}+wv&;FXMy5cmDuq`Hm8GlWSlA0000pK7fD1xRCt`7R!fK-RS-S5`u6+g%}ZvIOfq87Nfd&(a^qUJqI)+% z1QFbd2m!@tT)1#6BAP`I6hFwoY+^PV6$}^+jz(iX{w85aCNuNiyia%Eu4~o3{br(W z#D?zI?|x2IovJ#wEvl=vxN(o&)q29^v>ye?gAKe)FyQ5voxJ-OZF&9 zcFB{>GH>ET9HF0dmDNZ0RPhjY(8tuKE+sP1P*4hZzA{jj6|lS$$8mWJ?<8v>^Ll$D z|Lc5|-_D-Gll7AppYpUg@xD!{%PSGghldgWBo1*-!MM6ZM6AxsxUA8oMo~53QazEo zmNY=g3A{NzYg@o0=+bVt8ogp40X=R5_LavW6ag%$azvvrA*$$z7h^IsbTDn3_+D|u zvg27U5_sV_a~>|QxDNa)pjx2dIZ6}9wyf$p+Fq-USuvtRBN=lzX!E{|))R2ja-EPaY^p@nS~zSxZsiQNzrLLWAk>yw3|Tj#}FI0h*n3;l%(9LCsg?V2HcQ9 zdYQx0m7Dna;*cn}Xzl4@JZQpZY~jQJ=4!C%2-EcjU0N%+KXyFVt&_tfng70w0PEJv zH;4TB_bWJjN1JBvtP8&#^hqX1iLqMtijvgpI3sQG^!XAm-kZ{RnBn3|pXc}PAS+1j zA4aT+P4vYtt9;?tH5@!JMIUW+usEtqq76)@t60})_L9&rg;dL1mkqwURpPb#YB-$a zwDkK1&(F5eZKRa@ZAu13iG_2^JQ`#)eP9O1F73c)m(ozRCe*44(85pEtx|d<&0-RR zA66|M{gUzgA&bXnnSK-_b2Cl8d#0@ghO0LReEQpK*wwaleR>~WKikC04dEgU^%W~m zn_EiQ%EKp0wA46rEIp;I%n}^`j_~!I$8(1~UAr+vzn}9!sQc#X8usk%&?mhayn9YK z7dptsCY`UUTcRDFc${1Q`dG$n%lu*(ktbP3XPx;EV)e)Ma)Zh+PP}P3vesRQSTDght1H*MnKj$MRQ6Nx|g9C zTQOvVLkg}8ga|YsjR3ip4?;L5hx>b%z6P?9Gk$|@ZJeMBLH?1;U=|8Zg(NYzG4rk;bk`=~EkdjEq|-h9tg}p~B20d7;t#wsdP@$bxW82t`&TfioWi)KoYY)2|I6w)@M=URC9mGwT}Nm4^Gif$T3;J7g~ zPjGp1G)5y{J->}QQyn@|^+*f_qDogTSiI6%qND3CXcYaYz9{>`giuer^9~%&I>4jvh7^j00000NkvXXu0mjf9e0^F literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png b/Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..02b23248062643ced530b6b060a3e9c57011ea4c GIT binary patch literal 57423 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 Hu0mjfqC*Wa literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png b/Wino.Mail/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed92a7e3da709044d1e708ff93a1e92f3510705 GIT binary patch literal 4106 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 Hu0mjfqC*Wa literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/Wino.Mail/Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed92a7e3da709044d1e708ff93a1e92f3510705 GIT binary patch literal 4106 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.scale-125.png b/Wino.Mail/Assets/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bff2df888634b62e562369e940ce627cc131e9 GIT binary patch literal 3359 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.scale-150.png b/Wino.Mail/Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..0151282b3e509257df3c6fede790705aec6d2ceb GIT binary patch literal 4639 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 VgL@qig(^n-9Bs_kHf)i}zyhz1IE* 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 T0_*<~KPWjVWk9`zY3Tm}kagG~ literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.scale-400.png b/Wino.Mail/Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..59055316e28b0f73724a01041aa1914fa7b1a7c2 GIT binary patch literal 21457 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.targetsize-256.png b/Wino.Mail/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f762e0b85246263ab7f4550ad1de6c234b89d5 GIT binary patch literal 38319 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Square44x44Logo.targetsize-48.png b/Wino.Mail/Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1aaf03b8746567654d68c5267924383aee266a GIT binary patch literal 2751 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 FV1ll2KHdNT literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/StoreLogo.backup.png b/Wino.Mail/Assets/StoreLogo.backup.png new file mode 100644 index 0000000000000000000000000000000000000000..7385b56c0e4d3c6b0efe3324aa1194157d837826 GIT binary patch literal 1451 zcmaJ>eN5D57_Z|bH;{0+1#mbl)eTU3{h)Wf7EZV?;HD@XL@{B`Ui%(2aMxQ~xdXSv z5nzWi(LW)U2=Vc-cY@s7nPt{i0hc6!7xN4NNHI#EQl>YNBy8l4%x9gr_W-j zEZMQmmTIy(>;lblRfh`dIyTgc9W5d!VP$L4(kKrN1c5G~(O_#xG zAJCNTstD^5SeXFB+&$h=ToJP2H>xr$iqPs-#O*;4(!Fjw25-!gEb*)mU}=)J;Iu>w zxK(5XoD0wrPSKQ~rbL^Cw6O_03*l*}i=ydbu7adJ6y;%@tjFeXIXT+ms30pmbOP%Q zX}S;+LBh8Tea~TSkHzvX6$rYb)+n&{kSbIqh|c7hmlxmwSiq5iVhU#iEQ<>a18|O^Sln-8t&+t`*{qBWo5M?wFM(JuimAOb5!K#D}XbslM@#1ZVz_;!9U zpfEpLAOz=0g@bd6Xj_ILi-x^!M}73h^o@}hM$1jflTs|Yuj9AL@A3<-?MV4!^4q`e z)fO@A;{9K^?W?DbnesnPr6kK>$zaKo&;FhFd(GYFCIU^T+OIMb%Tqo+P%oq(IdX7S zf6+HLO?7o0m+p>~Tp5UrXWh!UH!wZ5kv!E`_w)PTpI(#Iw{AS`gH4^b(bm^ZCq^FZ zY9DD7bH}rq9mg88+KgA$Zp!iWncuU2n1AuIa@=sWvUR-s`Qb{R*kk(SPU^`$6BXz8 zn#7yaFOIK%qGxyi`dYtm#&qqox0$h=pNi#u=M8zUG@bpiZ=3sT=1}Trr}39cC)H|v zbL?W)=&s4zrh)7>L(|cc%$1#!zfL?HjpeP%T+x_a+jZ16b^iKOHxFEX$7d|8${H-* zIrOJ5w&i$>*D>AKaIoYg`;{L@jM((Kt?$N$5OnuPqVvq**Nm}(f0wwOF%iX_Pba;V z;m@wxX&NcV3?<1+u?A{y_DIj7#m3Af1rCE)o`D&Y3}0%7E;iX1yMDiS)sh0wKi!36 zL!Wmq?P^Ku&rK~HJd97KkLTRl>ScGFYZNlYytWnhmuu|)L&ND8_PmkayQb{HOY640 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/StoreLogo.scale-100.png b/Wino.Mail/Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..303a7ff2126e58a5b95bd136677dd1f2fb1750bc GIT binary patch literal 4376 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 S)U;#(0000j{00009a7bBm000id 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 FV1jS{SwjE- literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/StoreLogo.scale-200.png b/Wino.Mail/Assets/StoreLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..393052ea487e9c4b0d696e351ec4351fad5e2652 GIT binary patch literal 13061 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 TZD1yg00000NkvXXu0mjf>8xID literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/StoreLogo.scale-400.png b/Wino.Mail/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f0139701164577fa9153f72c6b046cab9f0ab0 GIT binary patch literal 39329 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 Dhm3>z literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Thumbnails/apple.com.png b/Wino.Mail/Assets/Thumbnails/apple.com.png new file mode 100644 index 0000000000000000000000000000000000000000..18621ea727e2a235a2e3ad877aa62b2ef2e2c73c GIT binary patch literal 2113 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Thumbnails/steampowered.com.png b/Wino.Mail/Assets/Thumbnails/steampowered.com.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d6087fb1db94ea15a318b2254493ead0908347 GIT binary patch literal 3396 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Thumbnails/uber.com.png b/Wino.Mail/Assets/Thumbnails/uber.com.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbb4ea82e52d06d1f5641c3ee9ccd4107c3f986 GIT binary patch literal 1392 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Wide310x150Logo.scale-100.png b/Wino.Mail/Assets/Wide310x150Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf08614fa7d6c6536ec0c812b95d83a96d8d57d GIT binary patch literal 5574 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Wide310x150Logo.scale-125.png b/Wino.Mail/Assets/Wide310x150Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..23246be69b4b34351909963aad5417651d3ccb6f GIT binary patch literal 7905 zcmeHs?!G%865iPm z)I9X=^~m?7WdI%?`M|&D9>NFagonqL_DVz5G$eO#$z#kF5kY@|8I#=vfxN?4PWHq0 zWW4=i)d^G^pFM`F&>m|>N#9d7HY4UxHMlZ4)^XdKM+cFOFU7gQ>*Jg9Yt!>*4f5v`gjU^I z7EP;?>plERKibLPi*h`_(h~xtv$q^}C8s~EYv2?{$%}AZOBY^XOnMZ~WiL}MdfxFw z7HELz?mQcB9<@xIna6=rPZ|PF%RH`vI@Kksd#So91{5GhXW$y2F)zt5nr`g{)(%>J z+ZpRLtKDJwcr82c&xNAch&78CL$wQf^ACIv4Ea{lidySN3Und@6$@D!{Q+ zg{`n6&N}@`@MpP7DqHgLYwHtI zwShfm*WazZEq>_;+ijiFxj~2W0ff2Ydj`ToeMlDI-P0ebMhx8An9p&^PhpFjlGy9x zz(*ZlHW^U#OOwjM%pkCa4-^U;X}@a%Axlq!U(|!2~kB$$~rO2aoRy( z#WP4;9=q9XD5hos)O@(UaK7_2Oq}82G=JX7B}jwf=<@37RzkwD63+CNndG5ck`j{I z3C0s)VtZ1-Pih?P{rmdx4ZK~iba>GT>G7nC1 zQuR-)ewp%C<8@#M-yXG)vg-3_V)vgeKL>vdvu@3s=%(*X)#+T;vAt z75lB`S08(Ek*?vJ?uwSI`G@$J7--bH#TlDT$k06HC)YIViVw8^M#mhjo8Ng*V6cP? zKd50XP)gcq*=%`ryzwuhvB%lAag54gDoIi+J*Rhqat5{T2jML;y!Po((=`Bl~mvK2Tv~ae-6{hp=s9gZ*C*nz&*f=fG zIqCUQ4?~^o=75leqOdXEeZ9|R^gjqS18H@_15owqEzM z8u@!>7`44gJ=p@CTdwIeXV{O68#L zc!`7bfjg~uUeH*lFSs;nWkh1=Ll0VLla9UHK7-jEThew4Ng8M1H?qrKp}j5(#aIP1cVIU(^EyAKu)ySC8ALm!4{CI$5sZH`ybq1@!~##K;QqAR{5QOH^~Xvr#(CK`1N@*zfI*p zpxP)?CP*Km(2$r@<4$^P48|N2@g)8Wy{*YT;J&A4s)xVn&sI%Wa;h2!mK6 z(mXxhnD#Un-sq-|SQrm%?i_%mwl#MK}t-8KXlxLQE4Z*MMeD{7dhaid1aDt3D zV|7u>q9@R!te~~i;^uFHYTGa2`g2xd0%Z*eVeok#qGle^(^NWHz=ZCYtXV}LnK+0= z=Z*PYEZ-j>GWa{vN6ei=XIbV%KfP|_mr2z`c*n4sv5+iId^(a?`b;hs`IWv{u&qtI z%&^m>!HP}5*`^HW=|Iy`=;>fa^x<;x()#&HzR=1l$5VTS<;9$gf=g6IYotf6ZL3F& z2|{ZNC@<7G{4>pV@!ApLfRX(~?|tk56(Vi?f*K8(rNAT8)*xS!LW|T4vEH^$UF6O4wc_?2~fB zCA`SbuFzrSO)A&o{P0JQlLei+_0hSHoiyn9xZ+|9Rxz2!0`O}3WCZPn;dM8CMTw7c zwSGGTRF4w3g}f$ra&8n0eNB`VaEJ6=ivD>vfv%Af0fWQJDm`CE1l2^RC_=IE(wn&R zOER|Cdk(AljejtIJ3B6x7qgvGx_LVJ}4Q zNL9B$^hs9?>`&Khk*FKj+%#8VL!UsOfiU1vkeu- zyg73)Qt}PfqqW*;k&F3n;Uxd^;y5GkP@27~GLxhjqb#1vQDoHfDWiI)kA{w-s|34X z(D7ozMw+9+&tiJO`pw{;K`FgyQHTe7(w5htN@3mg`$ zj<9m5Sq(+l#d3#vUHhM*+TTMk=)soSD!ouJ_DW~JCVi!x^OJln6Se(|*rKRFYSYDu zj!lAxJ*j18%cewOn_srs~O_@3=wa=ULX~I6)%pKH61N6y-JC9M5{4!8W4SHdp ztb*|4`fn3D5ttveEGxc%pO`mIX{%p6Zk4fWQ8fyiY?f%Wj|q&nP;QJTHwSM%^~daE z-E#O*_PKQGpO{;D`)ST7 z0=_B?{DJL2Vd#pQy&Y!x*%9{ZKGZrEAe|E#Z}@hC^PjW$)R1U}CzcpknPe7MQd?K}PtHe%`AJkoL;IPFyfi@KV!5uQ;HmE-{k*Bdd zQsdz(O-47pKQac?U+$O2A2fX2Sa)R)o$vN_R#t8k?fnr%|3E;ovi*sSZ&$K`jlhBR zioa^@jt7Aj(|P-An}StJeMb{)dShVwH~2*0sjFZ#$#0nEKjQbFu1#>|uef-k?Tos2 z@}5P-{YvaPur0q0ryTcXtGh23sn4VZOPJD-}GgI%Rc%|Ffdv|Qt zK5W)Ve9YO$on2_-hk*P>0O;K-R^8F7T`W~{WxEIi-D`|<$S@5~crp;XE5P~+HiqeU z?{6F1-dzvux5f>q^s7PDLv%?+tj)z!z7kGz|7-53ZzqDuJr%f=^5hEAr3WBxOGyQ4 z3<-oXxisCy{1PQY^6qefF@G`tul-_2Z@9TX?)PYNv0 z=sIq;I=87uUUhS0K@X=n?>3YL@0<3geNI0kl|0!|;a9P?%SuhSs?G+3f2{CqnvqQs zYJ(~Tm&T`f3u8ZDy5KqxRi4SSm_T1NY#}C7tz1LEbh2+5yzpEM*%#vmyUcmBJao6T=D| zqfGWAbq$EV!@wE0U7QZU+-yK3Xm5V_LcLSW0Qjx8KNQ%}3wo!EO6Wk~w$2�|Sn2 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Wide310x150Logo.scale-150.png b/Wino.Mail/Assets/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..33238ff7437edeeff9f6413aea61ad099d489755 GIT binary patch literal 10601 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�C;83Z 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/Wide310x150Logo.scale-400.png b/Wino.Mail/Assets/Wide310x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..9782abaa547224ee9e17d0af031178c619c3521b GIT binary patch literal 47925 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⋘Zx0IHJOdq zD6*?}Q^wo_*eG%&w4VUNQ zo!m?1&H0}hNSf)zl2l1=>y}(sN_Y7>)Au42mM9eyY-9eG`d{rYX;tc#z$tBC=oFD7`pZV@L* zLQny1Rc)hq5aD|=Z$S^@Aey|aw_UC_gsdwuT4*;=0=*2$dVV~1kNjDhs-7kU?3(Sd zUTA2I-jtFguomaJOL|SAUVgTih?fDr&VNDpzN5_xDi`t2z-TJ)Z}I-+`(3+p%w}9(uDT&OCal z7p_x%_SRo4C_eAQ9oq=E;ap8yB?qpA)B65G&KYrccw{HeyUu&!BuAilDYj$w@-g`p zGl$~1CFj_w?Gp{H`X+?2uR0R_GPU02jP}VBT@4#a@=33Kfk&yJptxs+J7=*K~J7p7)l&}@@-7?lz)rAxa2+jC8K^8$OoYqTG z%g&X|uV5c1S;;f;A*S5%rf{MzoW7Kly$#6NfV7cw$)W>!e0gEZFL%`JUbbJM5TTEZ&=hF$2jm=4jqA{+uTr_+O7k%9f{hg{W%aQH(V_pxM|pvw%KaAM?DQ zMj+_*6ar%IPbM>r&6FV$v8}}pt7B&cb!ZNDtkJzU(_Tq?UfX=W#_CAJ0vf+Jvydq6 z+D6z?L7J``8fGXE9`v?ZZ8S2$ADVC$dyh$q0KzC}L_fgsILi0^@59HDbrbhAd|*7;al*ENwKolo7Lb35h!*URnnuzZ=~s#UjK+&(o~>y5r&_4Cr1 zU%D>z;Kf2Swb8)m+01kz8=N4-Ns%45XniQJioNmGa(2C|Q#jcBQ;`}FpvJ=!{(boZ zvs*lEuc1=G)36gTc!b z$+w9|%N7ZTCDeHj5-cK_cDaCL2I>jHCBKFDx#b~mY?sA6lCH*>}j&?$AoiO%U_8eYk+I%8`nG@Sdh;elsh7i z$$O%s9j_~~?GZDdc}S|ukUqC9+dufy9_NvhmuBW)SRUu!)K@3}9|0{EE=L4TAwI`m ziFEL7(xL}=M`SFnsxee-^>HbIJQ^+p(SGL)Pqz3M>bXCsOpFXY%r8*;_|&u7kbOv~ zql-I6W_$APa}IUbqhMpNE5@cAVj@>&0`i88Z&J4^Q7YVVP`S99v(XiwLEbq=iN_?e z&sRZG-usS$gUTt?MS}hbS*vzpM_BL0_I5y}QMdh`@PU);44SJ`4Zuvot6lHgH%zMN zV)X!Dz5=zFTH0hvEvk8oPd$$7=VFTaLuNX-F|Vy{hT>(ia>CMMPNEpzixYu52ajvH zJMm8t?0;NWz{7tmr!8ASamy$)y70D63hsO)yUXiL-rqyQ&zz`MDm>F;%nf@95e`L| zf6;S@&YWlcqSbmAFIS&cf`@@gek~R3y}2 zC{>aNAff(aK1X*#Y1}Q=uw-{Hk;wT8I`4!uW4Zdf-U(}D+jf%ILk8eROFe6YN`ES{ zGzhE61o~lTaoO>csU||Zn;;E5X#+l;fn$~?QkEON)0x?fEIVClahFH#ExiIbAvJ9} zp3}LJ3Y80kq_pl5G@xgb+i#j~0N1N8F>n4(g#I^vzSRsqS4vy*9I}7pFQb&Ys_zV8 zh>$WRmwhmXhz2{5ZD&8Ey&j}kXccTfHoI&0Ze&i%f-u%;*R)Kn_nA5+w=bNQAK^eY zpSSgcIrvp{=H7UH)oNon3Gm`RdxS>&gc3j~hxB1kwaS2Ibvr4nm1H;utNI7o;at36 zuL+E=gm|uBTGDxYwm>E!Kok6H&3;`{i^Tgy(|vsGZwNLB2J}V=^G?WMkrz@7Ww6#e zLwPqn&NB@(Ws3gbZ-I-8tG>}Of^X>~V!O!%v%)y`m(7hgQfDv6`?FIhT53OJ62kh)egDR>JAb3{ z$Un@Q0EXCfpKQEZnt+{KjSqdmV({$A;_3^teV2_`g7w96DEk~zm+9A$FKHH}Y2;Fp zLzWam*OQH_m|e?1#vr#H(OEJ{d7a%a?JOMyMN{tyTFY2XBoG|8kBd^vlTXz}F7Jgg zulBtfjUXfVfe{e@%-~v>l|N$Nmqlu5XmXdCg)&m24Oy*J8++R|jom}z<78O*b+uG!!mUvzrB3U|wA|#GMXvNKDc9Fq^n)5#OqYFU5hq4p{VKFw=wTfR46PM|FMys`U;}H{+2&y(tex*-LfDc3WB%Q5vz#LzI`ah}~j_BWU zIH%`U%ofnl=tg~hsN5>TM)nMUT8DHXfV)9^aICrgQ(s4XcMivnDoJ7@k_oE7g)YP{ zUYx}bT;pX;I;j%Kmv2wC-xm()Z5{mW1%@EG`L8{=^xr`k6qv2+wC`J# zit#2V4<^ak+Q#OQj^e-Vrs9&ihr@B$Z#bhSwV$O?89-d}JU~O^J=cT;*H=rHtQPK$ zg!{Tw(h+3RBltBx$TdpjS@@Ll58`<(P-!iO!-f!yt~Z7^)-#s*@FcJ=4Jtl8=gs*O zvhGVZ_`nvcoz4AVqZ59nCr-M~Wf+#-X-Q^rOto5`!a7z;wSP)vv9dr#7jbj`(}|j{ zq){##zN%X{s)L>}K*tHW%xTZ~n3gv;4MNAN2YHTS@|5gMKNkIFGWV{qqno!1t*CLh zS$R~8*>ynd-$xuS_{3OJ8WkF~iaesiLcBQ}?8L*nCk(buPUiLNpKCfD&53Xth!8~s{e;U}T*XpQ`WOB`5z?~70;~L~ zMw(>V4Q?0e`(gRls6#;?6~ySMzf!Er#8tiPKI# zz?D%!;InDN#@XF*Qj4KOLTK0)T9Ob~(4J3lMN7p9_YoF1)9siL0#sYHA5(hEb<||M zOsgoOfyk*js@~|- z3izZNS@q5vYzS(sAGuv5*l~_)UC(9+C$y)M;nDxX&FU{hBDpQ52uNpSyZ37YsfS9P!ik24rwueY`cFu zgm+Q}#gAYC=`kM1kuB~^A75;^sXCCj6QtIIeaN-Sd?cHFw!zd3BH`yh<1Ou54}J8- zPDj|psjz-+r{9h|0Msve-&R*(E`B>0_>AWg0Dp5VJ*|79<#g5E2`;pp04+(Y(Fsi< z#~Tg7TM0K;gYy-Dy|{pJhc8Pt#aHT}P7q7z!$wb>2$Rwk0PtvdvrIb~rD{3Nv!=C4 zP2g~G1e-r`%kGvn=;vIms41)MAIjg%)`~YD5UaaCqdae87rL99$m@AjQ2@ql@2Gso zhZAdT^FiJ(@IO42*YNcyQFD)pm{7)^sst7x=V}s>{n_i;KyRSE@7aJ+cs9N`ng9L- z0@vd&dD3p>A-2l6UNb89KagD7uR$$D)A}4KlX-4+cjKRjA7R zL$m4fUKWEbYGN^dr>G|J9j3Z)?Q(Vf7K;5n$?eYb%La&b##!Et(9RcZtYg9%tWOgD z9zIATzl(fiSgJ#$45z#yO=MS=G&2GD}t_PH$bDPjKnbg5Rs>`(xmrX0xoQdFSq^fElXnZzN&WOk2$LYHrD-<&SZ?{+v&KGE%)YxT&`oz-~^m%2-foPKmW zThS|4`WOMU@5*wMw&fzQD?bz(vVF{UDRM=CsGhlOJ(KT3*ZC%PDN6RH{?zrmEvD9q z2oZH>C!-m5;8ChwTFI&FpU~)p&D6FO@avh*w^>ti;(dcfP?nGlTb~ctS*JKP*wU^Z zm!YU%Y(|}umy;JIW+P48VbCtyd;4FLxB-`UJS(vIDVK3gEcQv#vYcV84 zO~bdjw?Vd|0&!Kni}fSv_S0zg0(xyiR$7d_WnzoObqpF$4V>1&bt_!(moq|;+5%hX zk~xvXY)Z#6UdrrM=NQcGqNwv(zvon8k12UxEsDtUjEcZJkV7*Wg*3UkVhM?0Uyv!9 zYvh6tWm2Y$9Bx$B?L2WBcp5(povhq20+EW06Hmh;=rw!`=AFwcE6>)oKs?>!ua^)$Uqw;EJ5x!Rp%JSNCm4VeCldUop3ELfsEV58kN(<(8V}Z zwT_4kks80mj#c%Vucww#WDMj{UbazIjW$B1ue{MOMwH$a<@uv z{j{kOasR#U!-qS4L*L?ad3}1S4iUZjijB1k`D^RXuTLKvg*)7=yXVpQ{Z3q22{!tA zK*k9hO_$w978F@onSD*&QR!xkX7*&z*&UwTWh6b=P%~@#&Vp}eo00B3cD${1tDxl%bQc@li~;%GT)9( zRW=S?p0)CT zGMbGtFMTMDeuK zqHoDgB8>yBCPY*?gjaQ`g=D+4$=~hr_qjWgNW~Ae$V7m(*Z=U=D7D#s8STsYqD8C) zb1sVfx#c^VyoI|R$|+r=T&dg>lj25KB0vS6M6PPJZgCswXq#O?YGO6qL?yt#MOe1H zXwA*Zczg4EVC|Z9su$u7FbB9Pt`x?%eP ziq?tf9J^Q7Ted?EExWV;#XY51aOcXz?(-BlgU*&iVPoW8$Yy=@7d>Rm6DsIYtcz#2 zJp9tS7@Cf*Y8pGmF`pJnSHgKG@NfoE8NRDqRv6`U8?swhe{34UBQ?a=;^ys5Q_M>? z=fGsYbZYHV=jn$i0g?^__7ktj9$@XIJpJns-%jS_BWJ%H?w=+XJLrkKUY2>0h-;J% zwbpoTd^q`5ZQm(t-RP=5ECFgO*Wp)Wb*sx0czrbRbh~J2#*c?Yb4`^Aax+(uKYx)B z2bb;kxVK}PXZ8&wx+bt>W0yj_ErA#kuDtT)(3=s_XZ%4C&31&Dy*4<))psNqtL#8he>8%i!v8rq!y%EOn+F+tWe$3?yL^kt?2BCUmX(M|nN z%q+pF_!Np3b616eMhd=pSJ%j2FjW`Vbxbi5sUlFfy}lCbaCUOVbng~5{#;enny97d zbrnC4*0ZqG=$^IIB{GZX);hynOmvZ#f_hJ?ro|9&Vkq)R)#iZ^h)QeB`Lu9e-0nb< z_g?KQy<&1vc`g30Mbd5Kvq@PY-*`)FOL{u;ogP|2g12n@i}d1!O89pSEgOP(Be`DJ z7NCVfU(P7*O%m#~hx3VXRh>{6HKp|Qm^7@SJtYTq-72f()!orq27`%KsMOKNRCT#u z&R$RPdG8Xl9$*S|eXc>PqU#)q^-*onv0pk@4IwK<);{s@6a5->&rm0y{Ih8kv#&_h z*80kU%B6u5cLB`x-&gIhS%vyQcN@~nLs?F5Fyt$Cem zI@YM7j z-U2JkFVxPWN*7m~m-ka~snY?q_5wYkw2~L-Rz?1u^|;2$cI#RLT`G=H(%F;RW!Ew8 z!2~1iYPt}r(3KSQ!EEyqihQn^CM``;7viJB)CTd%;CWn^yYD6-kguAbKESVHzXPc| z^P5H>w_~RbmJpQJ#al;xJT&P(o7+_I4#8_Xz{$puLHR?hJ+HrR`wi|QqKkKbrH_EC zb&kp`y^59Ba9gQC+55`(WUUSYMwiD=pNrA09=VG#r90DMwQnmK-wq1H`gG@30o^X* z+lSn)AD?db`gY;m6Zq?g`S~qZz`}Zi{rPsd78VxXEe*U~@8A6Qum9bq|6YmzemVa| fiT|Gv@zjWN;P(Tp&XH$-p|qT|vQ(LbalrooglZpQ literal 0 HcmV?d00001 diff --git a/Wino.Mail/Assets/WinoIcons.ttf b/Wino.Mail/Assets/WinoIcons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..505f058ad46c6f7d70a86c3b6464ee43a2a73774 GIT binary patch literal 15104 zcmcJ0dwg5fo##3CN>^7`S8q$QBula^OR}RlvLj2fE!(p5B1!WwY2u{81UnBC0(lWA zP#~${!_qXgkUm)A(oQ~1r`yRgY)Z2X+jao6U1rOaPHCI6{V>z;Xep&zrePr6Pe1i# zzrS-O#|ccg^T#T=_nv#sx##hFKaLq^j5*jRnan!Ze>A_?^;Ba4T@yRg$uD~uD^tJHZd9n; z(u?=6eXrow%w!AW4=^j{KOxbG_nS}t8&=?UywCq}Ec?>m z5M#f8!XoO-J0n=sf6bymv(eRrHuEWqUQNuxX-|`E2=ix9*Zj)lD>uA);kB)=z5d#} zzc~EM-@dW*jpe^O^{Xd;^}{z?-(34^%dhWwYw25ezV+F+m%aVjx4-uGZ+`dgdE5Ee z`H!Ff#QFQrfAL?R`qzJYSAW<2p8dVxdoAy^zqjkX6Yo9w-Vfh<|HAIyJAePg`?K%A zFIM#bnuqaCKFNG+A?s!9K#eUn zB@_$=D|~UeRP4@Xa-4UUONHd(P%y?DY~BW&l1jE@GevKv81goRf@nfdZ?cFl(W6!| z!0~M=$xk{pjdQ!*`3wr0=6uF@rm3l2I^5pWl<4kWX>42B-JO_dPImA|I+D$^ce(BO zxuwJAbM`K&if>(1>2liboZ&lsU(LmgEvvc#^LpaUkEEOg88F1JB^=s_xJ< zhhD`P3{-p%%gJZu+ri%@_7S#&9W!?sz)~x`R4&mTME$4WQu*fcFXAhM#`a?~_zj z|H2JlvU|=9b#yf7j>b?@8cl{89eP7FGW&cyzD85+c2$!`&FAbXnKdU$#o?i1DbY-& zpMr&*Afh zXg16`8uIxZA6J!a#>2UIT)Gc))~2M#><_B-`7X{ZCRCImMOD=y%xKq?NMpFgiK5~x zrdx>(G*)F*c}AXLUY2BCY#AG6yV-5*D0`Sa2CUR*OaN0L!Cxc76aX(^rkF4`A#799 zb3|I}P~jgOCC*3^z`=jjF|Ug8owg$oM$rpdY4_(?5?5O!x*3Unepf)jn`>TmpbfJtX{8kSXDbz zB6?JKy;j93G0_SNpiUQC%}(;nyg4xF?BTiPU{On?Or}`O;77~a2JVQs-Q}e#HK8EbLvKtg@hHvDj(IIKF&N&9Z$pO)N{B{JmqmYoi2}&Yiqk=#n{zj zW9!y-b=vKT_|hetH(#@D!`B-9KDDdBPmPU?baZgurCOTz_`G9#Z`imo9&1f+*|Jy4 zi7`NbG~kpD(xVdHN4IU-G&m4$bh}H%4I8e$`ePqkwk+AAC>>p@&)@j9@x6RBpTF|T zv9S@aZ%?zL_1bL9mtD8}+R5smfYT(Kls_v^vl#1PtJzkQ62NR?<9RMNUo2-cd4eBy zEcQ=aAF!1Rm+U`4B2;K1A+pi=azP=nBfGC#v?w0CX4~Pz2b6E?c1`M(TWwNLdE2)A z;~O?~b#+*>Cmibbg9kQkip8?ov9W`uP{mzRZJI}SICPJ=%hM}Y-tzG~?%1@+>*T_~7L27-l}%{Key5Dj|i zM3zg3?(MG)jj3qr{yJZtl25@#YGwUwqsf=VNd!#-lplmcnk2y?e?(257p?ym9Dx`U zf+qA#$dyZc#^;MhefZHmD49efNtSwnpY7@0vE$I89Xon^diy3OZoYY9qOW)3qDAZ1 zkBzNgzX-p2iC3e3ALo8(d%w@;=TExHW^$|lTzj59D@LL5Zn}v^5#wDp2n`3?lGzlS zk&nn#*2r35`7pm1hMh3hvR;UhRFaGjB8UPgt-?dLRI#0ur^#5Ri3j4CBF!POVkRR| z$@qtrs&)`~8^VTn_VoNEZ{@Y^8w>zAt*g?EaTp4}HC^OO3Yko=f)e)AQAjrUqsB90 zYZ0DQ2}e^k-O$DsLnho>*SV&`NwbI@uG6F?=JLnIeo~1K-R!w_OO|HwTe@W3x}{5~v}EZzXxnj} zOjLbbgKpNeZKm})Znw+Km;&e$%?E{45m-O2yK^Evij* zIFx=!UWaO{C?sjsNt-5Vip=7%+zWu2B@znhF3vrA2o&g&G}V@H`HXj~i#j?MRrxe# zZj2h!G$Ur7j)qzSLCzZkEurY-hhh7yLQ-DsdqA_{r#;Z8l7v?#$xVYS*w3DjUzT5H zA;_y7`xx->Z@{e#umC9pNI%b*nDGk{o&>myUTYBcQ`VLSnjqLpY+y z(%ZwOGI>np($H|Zhe|!=q5dw;5*ABiXyL-%_gU6r>FQj%tXBfh&VIMi=j9tU?b=v) z!1yXv{U3|NIG=A$NG++nG>AfDOky<5@X)10ms9XsySo=HibnbB_gQ(_(ymUc)mZtx zu-7a3d||%qv}`T90?9M&sEI`_EiHLtV?LRr!Y_R;AOzdj zhLqO)_Yfc_#3jjha5=BeS5lnKf17~_s=rGl!s{;=wVKbjb$%s$>P_rH`9I5hfU5;; z0G7+OSd(d+!r#qiOd24WogxaiDfd&8XLor&6Ud1rIpI&NVw4S9}?kk%5HCKJGSlWJ$tU+cC4)} zoxW#mY;U;Tk2NDQ#Wq=({GZqr?6c7OSi>O4f)bFvSQ>b>b8*+=60N(G&2;w?Tg-U*o$bJMYULLGUt*7SJ>wb-`RX+e!+qTAEkXIlRcrJ zOL2QW&B}F$6RoMW?QQMt?QLsYTN9~*+v@gu6N=u}wD|Cn;lqVn#hCAZ$e7ZNOLjIj z*+Z`O$U&Mz;*wS7vSN{GYA|j%?ECV~$%5CdSgo4o^EHMC(ya?HE9N$S`td|#C;@9* zrDyAvId8KS^)16qix)309QfdX?~4IJf#bC}V3f79GAQvf(h(qqVL^b-0x2B8GO5Q8 z5b{CjFM$w=jjma9kV0_>*Q^66L0G2Av$dnNiQFjzivfkj|BGPp&AcHDqINDCrq+z_e^T5AL%&<_bj zOaY1rGyva$hAtvCV7wF5RqO^~*sio!`j7VZTJ4QaXQSQP+k3RXV)y$~fBZ_yFW>Iy zAGoitVskb)@!!^0Io99ra9dLzx!aSnx~22h=EUkmT(;sT$5CvyYCS!lP?{5~5^;-S z!T&gl&5BL8$(72ddwV^pl&81%)0K*hDv}2E7+EV@MDY@PJ#?6*sFYw^4#Ui*B=8^) zu3V~eL=7N!sbsZ&PK)f~`;C_!!r+yw=F@mtt0+FN z^XRFfdg>_b6wjG%NpXJWLLNi7-6}ZA>GIv2zsDuXj#o9Wr{)Vx!CyH7 z-QR=AAnAYFtuR-Gd1U$lq}jaiSK+*vW<8V&?5zT+IT5tR3y~uj9G}OyOqNwr*t4e1 zrocqtH9bdRprQ6?6KTEO{zwQ;?i8Xz)hUSZDaiPz_z;3)#xt<+pMtT@A1Y=iDYR!W zctA2KRpIoU!w?wi9Nzgu5&v%AI6_iQ(d>BLEttLQoEhgkCsiq$G?^_LyHOyIO31=G z|Ftk=k!arn&t$SJE}JGg`RKrF%}zH%B&7OH@5WUBw6oJ=YuA!RxOVN>ZDX%HoKCph zZ)6+%qQ>}Ly0tpEdi7wHB9vySH7%bMjpD;~Z@__eIvuZfluG@g#yE}ct?A1?1ph5z z%Mi=`4&v$w@LwrJ9)pboyk);kmz@heZ~7x^JbtePH zT$N%2M&ynx3#slZVN6N*na!{#>~2vSCq<4 zF?js0&)+^)YITFUT_dGZgWum!Dy?6?1t*Fd2=7Uw(>?=B1s77Aq97Yc*YIn$&4a97kAAG&~%V1!*5*|}@o z`cQD;!mV4k@2Cz*Onfc|jmPRk!hRfw-+vN$00(e5jM&U1;1MVYwgpH6wu}A{(YVRz zGWIN@sTadu6)pn^g6&~chN$Z$VZlPE24qu=5KQ^$lSptN%~4&jpi)_|;2mAF+cmvw zQ0eFxcx#}eLmAA208sVLGD|d)ek&b`S_WocdrUAeflPvMc-8dDO%Tg@mn%hila$Lf z2#a9BpvxrI+20Mq2xuRaJhk^TY3i1iw0$+PLU}DtnSrD!A4t?t9b*dMGAutWKg~AR zawI3%Ujs@C;h5;0B3ZzDh-~7rsG)b060$aeS;*`GunF$Sl(S?L+Jxg|vWOT(e4MQV zsz!m3vGs63P5#u=D0OP}U-m_vp6fKsrCdHAk6YwqOJ`>`YuCc}CsL`z{b9|X&31OS zBxOrHp3mp*_xX;u|Cv4EiynvXg(#WNZ^p=|T#uMZ)hMx?*)UcwL{MowHQ#@cUc77# z?Z^KeYw+Fwq5GPhH+N+AE;GtyE>x=0n(IrOotf9hx6X68z!#KDpqOQdbs__QC7Xa` zg#r_f4{%G2P#5)=X$kbH=>~62bkq@*z05fbSTE~vY;j@Jrpd`on+mWJ>m_c+DKADW zMQPq@cU}ZAP_Sg)rX+URSTw5SxojvA1~o$S5mTKveDo5R6@(AioRR?@$j>?18Ss*l z7ZfM*M?z|PDFh=#Nz#iP9dZ{gr}2`=ka&2`>7rZ)H`5#*AL)L+y;|3)UeV#U^4x^(}FD=awDBe744b)^t@y#mVwhTPED zw7^T(k*c$79?=^T)YiJ(hFM^8EsW1Ek!g$!(8}#k#a@g*0Xdhf~eQUp^VCye5?X_3xo5S}y0vrI)FI5}}cthBt zk3lz&KsR@=G3*VTgcX{yBtf)oQlx20&FLbuvRoFtXzC!FNvoG1e*oUh1`H`3()H_g zpI6uQ)Wpd8Y*yC?HLuU*=G@VtX-%<8-^!%lrZk2^^slbfTz~P~T^lyE zrhWe97|JaZ+q(BSox0Djr!1xNmM!Dss}aT2Xyl$1S1eiD-mauP;YP*gU*kll;;L24 zS0JrbtJ`zQ_kESIvF$rn>mpVxLk3kLpJ(8sZGaqL{@Q-cJwXrvKsDL(fpZ_FIYWM) zBNwU*?V1=vs1EMhr67N2 zI{*-uQ}6J4j64}jBjD-3DA{fEigl${;nMNN%U5)Dbr~sdgQ2@&H^~<3nBtMXlE~!} zU7sr?662pUrW9%9oXzrGqun&H_(MyKQ?+7f=q0oCkbI;I+3>Cv%NH9-k1}Sp$T+Ix z(hX!l9#15?zR(@d7*$>&|igq)g!J#i=26GaYGSQ2oB zNmvn!rjo*(AT@=UIpU7OcOchSdL{swa~iokH84A2S9J>siIcM@rSWM+k;mb(`TVZ8 zf9v-7pNBY?Y&NI#FG*v`3s4Re%a>u*)4X3nuD>91kHR;E^_j<653*s*NlimG6uP*k z9M6iZ2(o@QZ+ef+9KsuY$+)Vvie-o@AU=Cgy655&mk+JLvZiPMu$AwWADm^v>D6AE zTiThWU~|Mc0`*0k3;q69V_L#m_aIODAo8Ss&}tWOHs?jmCD95_kn6m}nKw%miIiGe zm>F^!(fVXEKl_CFl@FyE4;MiG`H3e0h+%cYMclT>rs0|Eti8L?=H%+#!hQl#pel{mdX6L6-iN z(@7;%r;T8!zF2{pBFw%^vxWuv!DgS=YK?>uC62o_S$4XDp~i4{b~(SGN`}Xznox7v zI6a@9qS5)pcE%k~w6=yL7K_)Hj6}l0fXfMOcPtVWgmj`o`fu~;YlUK*nMZucJxn5w zIxSC%^Gjt!97n(r_hE-*))HqD!Qh2B%d_Xp#@B6yjc`kaek)3zL7ny(T|P! zx8%}}IUL6{w`a}h!DuEEIU0@bvt%PtNs30YvrkYd63(8(!GLdkgL@H4acG|L+4H;| z2HiRHm0RRJG=hEbW|hvZP2=2}n>7osd<0(koot#t&YlCdYAjKY*AYVqaZ3u8 zppr%hLM3$&;-c0;a1}bxIY0r(n%h{O*I#HCKcrvn+(D^K=8rgJEu>Ax8iWwUzZ#%{ zEue&sX)9TzWiIwLrM~EuN{S^CeTj~=$N?@f9R0$9EJ2?qO%IX|qKHGR(;>HqbGIu9 zs-@@c@%VxTv3NYTU_m@?Ft;lZtaos^3%PiLb84eATkVOCW~9_DTP>~|qENriNVvJV zS>vza9*#I&eqZzk7g{ZrL~~BjjC;|kDcYGYm-C&`CbSxFI4xESkKl$g2RL~kPXwmt3=c6w3LYFW-xs$2&Z_a zIgtniHBAWy6-^5U5{YKYjt67tFoS(b(IEei==W|ppQm%^`F#0Zv{%uL-@E2XjCbkG zc|C^{LbiSgzQP?QUkixW12_Vyg=E0g7xT2Ui6op2F`cDQYMs> zF-a65@^y>`&)hGlgDsYL>)N~{b{k-?IGh7NWuM*OP2k!Ze`#PC)}!h50d;A zi_aT9Kca?$-eXU$)c^KA63UrIWG!CLkht06}RF%&2 zMg0v`e8L$x(WuT9>utc%W_AGQqaT57y&O0K3TTxH340|4XZj+r@^BO%VhboFnx#7- zt;)-07xD=cs1{B9zpGxK-;ccEHD`TpkAhsdYdURF?QVC2-}}^4UVnqzZC5SnX`JRz z6p!0?_Ti15)VDtsQIcOzB)^tW8b9@Iq-^i>&>xC;X5to#7Wf?%WBo z)8P;Ye)OOYbJnLjE%Dn=#ch$hqp5Fg@p!g;D;2#vVvCcFZeh10E^q{K0Xl2iC(fFh z(tl3ai$62qC4}%u?m{?IyKL%MU=S*{OhyoLRwC3#nm0(81^W(w{>gK~`HYub;B=SE z-4JlOX8#UN8&4052|jXKQDE@#1_w zeJ*PJtattT-ctchI_q-Hjc5EA$E8|%XRDmalzvvgco==F53%$g`+Pj-kGwJhP}!k6`_;*(_$WcQ9&2x z58s$Q=k7Gp{9ljRa6-k0FI8`r(H_hCF~OuDF!`h61DW4NfU{w>uPaqYoH^HCd>X$?2yqIFW4`coVA z-;C>au`>Oa{f`Cp3y zhZ}zy9tl4iS%w)2%02Aw>EsZ8b!>>2+RcT($uV)k8F}?)S%SxKW34QszQ0zspnPww zY(-u#S}QB4-&`weIIHmpq#(E0QR734S(ca!e+6WgWz;XPl`SYgP%B&EcV%j21@+^# zvIfcjoz2(n+rMhZ{(Xlq)pcwijuNiIAA0Ra>Cot|8xLK#e_wOgqE2XwU0C}ebfKnZ zNTfxq^G|&HCz>|wy7uN9CT@gk--W|(H?tdH6yEqJ`mfl(@22K!ckSDC+x6*dg;}Zugp04#qZvPy4bgFC5p?f~kiCmKW2mh8L7Ug{l@>H0t84ujPU~V0nI? z9DGhDBATZxFHCKJTsYcDTu>}A==J{oJWm_VuE+A<&RH6vD*LZ41lrGCw?{f!&Nc>I zzX#{?Z&<>D=d5H7VTZIdGUn=eZMhcjkH_ez4`APO53c%HXs+ivU+}K%UE{4O)*(Ky z;GHUMK0<6O<)3dv2iaEV4XjrtjH>Mu6}6nZ04dkmtxrwAV*@G)&APpOaDlnD;ER@&X$MEm zdfyAfU=pSA;#A3diYLO~P^QKDDcAopg$m9uyk_K*_9G9-!Pj9pj9O5Lz2$)Bw2(iF z$GN2v#T!fXD~NXgx|wp3c59)ScFTcKc_5$NSS9^HP?{~L zVMI(Y(5oC}YO;n1S;_&d4Fx6*G?3wB>lwgZcG2vdtk{T-2s$3H4d6x@lN*An)KIkl^w*#J7v~C7t{+qkAGxYf^_nhs> z7qXTqe|XBT>L7SpjN@+xB+fIk0l+Cy+v)Spg+ayc-`-+`DK`NWUMwf=s2> z1Nz-(I>(^GoaL@Gerp|m5>|Noc#Ynv+2msgP7t3OR2b+*5=s=L)@7 zV&4avIA;btT80k5Yq9}Ng7gEP&T7cwnH+oC@JNa05ClC;Ubxc_qlE4*Nbv5nT6f-} z@6hQihnkT5iN-gCiu!(*dbsrpP!oK^Y9}l`-`5T?$!@spun1~iNI+H4gjevoCV?)z zuBZ*~MqAUid61JX0eiad+Y+f}%Xu$Kv~_?$-wTqRr}qo;g#V^rLO!-+slr}4Qbm_v zFEudlc`6tp#%#R7Iw~jA zse%z}tf$LPm;08Uy==xYJ=(6aXKcFM5)$X!5fN8`caU?mnMGUCs$i|EhXM%t6x6!1QlrA*01io5azwaaj--E@c8(m{o>p_$cM!8 zHS6M3rBZYXC~|}%+Da@Ep1+Fn8D|dYs9Ah1b09|^di*Ne+_u^=OIb_d;A;AJl3B|L z>=0x}xx|ZSd{gjQPtH)|DQw;pK}*{Bc`OiU0El-NJ|(XP>Hmng`R|(c^Gqefo0c$j zdReAxZ5~D$tn5;njiGN_{U0aA)&So|hWR^t5An@xbx3-(t^)65(JYuT0c@>cy$)yzXzj=r&uM2VmwTjhS(u-M)K#e+m!w8aIiAi+*5OtW| zEJL$h37Zl1%E|{ScqQDrRFx&swB7p?!*;?qf*Xx(0cD(T-T}#v?!6qV_frf&?gLaj z2lWWYmy|c^)d`eNJ)N+-)AYh;HZq#{-@n8iCth>xc)7R^_Muanrif=Vyx%J5 z^@o#}a*|mM(ndWwqqZlAe)x5cBg(V%-KMGMT2qry(sd!X<#dSxb?X6EI#|E|Jgl$ zufSIRbj|jhfk4EjmL)zU4kg~_pp&r?;uw5nUZ*D#WvcG=D)~IrGo*uUR6$3fAw=3( zRZf?(+zElIdS1Jw2S^HNWo+*HOSsCN@b6Q@krE_*uV|?-3Dg@j0>{|#ulNS{G|X*0 zPMi!y26KvhJ6`Rapo^6}(tN$5`-(_Y_bw(b`5_XO~6 z_iD%6sG3#7t#z;s`J`C*?DvC1^Ug}WL+82vpXj{IFi7F2^gtJtnw%q3-_jx(=?X&S z!{8uAstX$VMh&31KIIL|kfY!;Z_zhnL1%0FGAU1MBP=o|C0%c&aT`4kejP}bMuri# z_9o&>)!ki8TJ|Q%L!^{mpha7Z`yh+)n}dmH)~ZSY0p)JJ>!+2KxHY?(Cp2OTxS?9X zV%xW=?^aEooW=P138kE7lY%4Md@a8_(?s{lS*J~RzAL|$Si|$kraGi(pGjI9FsdZ( z6Xoft%<`Q*PZ@=*#^EMoyn@L2u-1E8EtgX^T5Fx>h0Er7vW<2PN_!vUnUP#;{Bx}m zKtbqie1~j7n!w7Tx8CT7o;qn@|~ymj!)mNhx;c#XHgaxKf#! z#_0|nW&oYGiy(J1AYp_&_=1!&7F#uD(1M|^%Cwx^IO=-w%G&*F=6-pxs!w9~Nv!AN zbRlY5xd|c+eXebfNo@yC?Fu7nJbyTcJWczs5TB8hu60CL17rg-3=uYs_Zc0VCuuGK>!UoKdQbuM8&mW{zxb z7cPCViV0D1lg8+zJiHiRs>2TO;cGIq3>I=+gr{; zlK18d(2rO(9rB<+RJd4r8xIVduyTIx~^Y_`LC}0^7wH z#e`g<8!YV)yifJ~W6<9a@-7|7`P9d%3(oP2X*ucsO|Dl5nxpZ~1_Q=gdKr##ow*r( zA$&x^8eKPdrpD7mWkLwUA=FU{$8!V&?QD;pAV%M%qg*xZX$rwp zCFX#OLwlkeC!A*!o3_b;5VW@Z*H}J4f+zU2yyAy$8$G6b6 z&D}1u99{{)yC)f|JZT0O4Wx_$<^4QBzV%dR(C`C!_{3+l-}U7&#I4)Rb=@j88J3S; zFaAaZ>GbmP(`LYNCoA9e-dW=D3OA<|i$@+RJ1 zW?8t?vsHHjsQ1~ib<#KLhbwoj7u*`AktpH)b-0~wT$VBOdwqsFD5Fx+*>2>q5W-4a zEX&WAuX}IVWFuGEzIdDy>cRfqUM9-vaNAyzYWLIAO?oZ;PNLZ&NNE#ga`7WsxyG5) zTnsl|{oTPc?b`@DCy?M;i=zgUlaKs6xQyGaot^AwggB6yk{%@Mk!T%sUu^yLi;W(- z8F#>fR7}6gN}0gE;3KAcOPZtJg1}Yecmf`frfMCEU#8 z3$6&3Mqc?MQ=bV7E-7&Jx+Yn}rb?CC)){=A<^x^s7!zR$Y*oY-N_BohNN4jt$#%5d z=3?E92wJY-8Mj9%5#A1iZR<4;ye+()RL>M4ijEAWjvffJOln0MQm!O$w$ewRlHRiE z_dUei>Ju9!{vl6#yw=_L~leAMy?O3qOBtZ*G>g=s5nGJV;EphFXpise`J$(UB2Co2<5ot#;D37NhxT zD({sT4H*dKx}4JVhlks+^Kluin6}X|Z$FyJI@PUQm$s4XKX}LTr z43ekox8YHK=O*$)7R{vEMO^e(O!T~dKvyvHKPOLKFWug_a|w>>v$~5eC)VvH!LsX* zPgx@C<23ip&thv>vnQ^62fdly1t!Qhm>kKVYAcZ@H@s1o%z!+BWB&N&Qw)@bfT3f_0Dc~OgcGWG| zz&;b}WY*wh?umhAR^Y3oM555mpEI$an~bcdK+COg#2+QE=p2`a$SZ(Gku`+PFNA!f z`gT_FX=*k?IhW$Zrx?AV6ugOk@1?#TSY+??qh0+z?A-Z+K}8&Sjd=9XR0@DrKW!1uy66Gw3;;YuCf=rgUqxEw)x8yaN*Nq%O0;pVal)SkvqvVD?Uoa@zVjz zBUsfohK5k9kmmbjM_|9ZnHFBPN;0QNDuFzH5fgYPCOxVGv;rES#mMkzv(zz+Id3vO zqQAcZnK+d2)R)OtI=3EZZ`>Zs4^YS!S4c}8S<(w$JM1ADkENP9-77f{_-#uH)QB8S;hBJGgKPKP3AJHF#Wlt|hi(JJ#`fB+`CHwk|{u(8LY@Y6tEYXVvwjQ2aaCChT;rbDmNU?VD;gxxNuQ?KDRG zLVUdr7JWNcb?+0@x6{uvIdnqG8w@P28-re)I$V}7$&$L?A%|BVk{0uE61PSI&1h}m z)Onn%;QI7uXQGpE zYwUrH%YNo97Ab8+$J68rjqh{*zhHrZe_5h{+QI4PG8-y8Qfb32uLr|}mdE0=PLpKJ ztKm+x58Dk1S-J&o{FaeU1 zQ0{uVzVs+^2KyaSM#=55u*rzuUrST-D6Wy2r28!Btm zkRcGL7V>bqjnO8fGxd}5fB{b3(O!@nc{{coaZp_1xT)mQq8!S*+1b>=QfI3hG-j!@ zh*w6_x2jmPT2b_E)kAY=KwG?R7IjTcKb?P@0b-xEKQ_n9EKh%(lT|b;!UH(;c;~lN zWnG#ZC#Tv}_fF8wR@BNO!;|COPAQ{Ic$7czE2VpaRlktT?^%;LW&~c^hcwa$g^u)n z2#(qw)8Z9gjcIKg2R)u=IpLp!cNFwix^54a`*%McSIY9R$&W3sh$E)@&$ww*hd zfG|+V$5ZbBjfAX)QlHUNP#hO;fGk2e|&8*kBur-l zSADw?d2?N9p!X+^#RCXlPXFlx{r;f8{`It^aK*_x7aKEI!tfod*}&bjr(TE@nQy)Q z*bmqQzx-yuzD^kXB=W&2Ry2=>{~Yc}n+`%AryNm5TZ-)i!qP zmBQY5q<3wu1iLtYuwaVf;dMTkGM9Bnbku(JqET@7={AkJ;ucc1m}!tnI~q_@M7bI* z8wIM| z(Y!QP+)(H~n-8-`e_=r0K359w!Ts6GykJx4ANnRrT(v%gck&ZxRREA=iP`(qpL*T| z^9be^a{Tikx{454vN_j^*j%B|u`Wmm)eS1lDJ(KQ0;(@3ylgHEKIO?~)6PTPmBuO! z(luR9!B3-3$5yx0Y>3Da)&ZZ8UYfgQN;FnWjg}CrMw@yh|G}bS2q3cAHbKc9;IiZo zLJNt(h@kg;0nn5XqEjjM+NEc(xMcA5mkD2r@9Za+S268&TN#qVJWxl0T`#_kz9>|r zf$P?@esc9r!eooJrU%UV=RrvM+^bd7rMQ<<5xTDke%MG$2X}kRSI48v$7+S{<29vW zUjt9#eYZADd|^|`bqM8taVU_WgV>eJ_C4u$MJLs;l%P+ptR3beugHGu4P(a5Cm*qS zw=hHwD6@`ndO(h9#hE|y|M@AaF4#*v}1Xk#?CXi#&_^y!n-r2w)ytm(rb-X&I?55w1*mF?u4M{vnm1q5ybhiKFQ|Cw5Hd zOz?qsqr6w3S5ffSDK2~N%H$X@7INdzh-yC zg%s#ILEh3SR1RB$u&P0zgefulH9E<*M}lt|?tv^QMJ(y!(3oM-d4|{4I*lM6Z{)u9 z3;FMAJ+{sJQY~shG)Daw%u7)@Td}C5AC|pxS73Q1g{rG68`qMb542e$Jght?xRZ}? zA>>O(TN#1fxRcfyi$*Qs?ZnzH@%w-!<@_VN_$~>SJj>y%-NSck_wy0WHm(j?h|f2$ zIe=@n@;5nd%4oQ;2e2!8bNvs!!8ZvQ3rk>|xXXpjhfaL+l8SO5$xI1tM`Fyact?af67`0q! zcbT$hIc!fAI|h_{J+2gq`UK;Nr&Q}XW#>V<;AebKd!jg6*lvL3=ZE0{&(=l!O*Uy~ z&^03dK<9W}LMe06^G?1DfWg&D2vB2zWqQqbir0w!d4_a0v6D0Ga7*uoO)Ih5HyyFP zWqG^Pvu<=A<9SEu4u^S-cy_qR&**aRpkG>;%)uz!2HGvlwua^{kWB!iWyX~_p$MpMAptCj;vaYXA=`RwoPaI|*f)}~fQ z8qB|Sz>y5^3b86jWicn6iY44ij}Uw@$qNJaBK*wza<&_L6?IqTZ?-NjkRjhl zvW$KPX}nwWrHW@kGZ-GD!^Ef>@;uZa?ihOC3`#Rc4ZbiC5R=s7E zQrX@Qfk`2`xMU}GlhPj}OoAC0U|ni1_4hSCt2g`^UDh)4OAD7*eQN0yNwC& zR6Q6xSO_Mg;f@i9o1>pUY+Y}fP+ndezn=NJAp)xO#B-bZPc77?+#2W z8*|dT2sN8ypuJ_A7G{kMdtHxxO5_8ZToi`_WRF7aI)f8~_aG7UJ)4$Sh8-B#+!oH@ z*}A>mrY>>zuQrTH&n}xoG;84a=e{I_dC_EbF{U+s_zw#38^Wh%E59`nTa{M8N!g$; zTDo6Au97)DAN^Cxw)L_=knYJ!k1FuX=RRZ6x~fu{y#ftY&t4er>(zBM|Kue z@2Rwkianf)a5V>1^UEskZ$cGSrxyLoBq1pvYp3~kn;ZVAytY_MrNP#lgO^68d!46$ zf^A()ho1D8^Y{4UJ)NAtN)W5v&q-?fhoT4JTgTue6NkCv4bd|eRYNUKwa!Zbxq-zr zoUvUHEkwp@ic>d{RNb(bEu|p@xIw%HmsuS(=3XmyURRnh;g$(PQ?=)geg=>EPwfKv zOgjlfBYItOM@u6D@5#D_B*i?@E<06k{?$m^)KdY3oOE9K9NkAWb``a{&q9A91Mjx( zxkFC=U$9{PB{AQzWS3nbJL8ek3DcvN+ni!~XQtOezdCR17p)#e2YD|)`LeK*JD^?G z3;i8EqP%42(RxGdbWcQZ{jL}b>Qb5OKCSt{RR&j=T~_UZWJVs?2x%Zqga$w_`$Wo5y2pd|Tk)K6NZ zX~v~9z&cM){SE!1O=_x6=wr;%m=tLdFgueNPYU@lKykB~)rX24t%k(dGyJFjG!thr zsTdP8FPO(}nHm~bGbtCg!50v=2hF1WjjJ@*cT=^UMc8Z?knUJf6RqM|KP$cNEQ%V& zp>GF(GMrCOv6VkPyiBJMm!R74%m@eXwl0H@!6%oA%NhRSB-Jm)aCUU4EnrkRAQmCG zvB^k~GO}=5zRuB@7%z=e{TIgkFHqiuJcwoiSQ#Q}Y6KpvUNIewM>mM32BJNBi;l`U z-12X$7pYjhg4Ls6J5blI+3yvsJ~UM!Y&^K=Ep&V*>FjJT=_EGN5NO$G(4pk{DL8@{ zuq`1+T=nf|{s&Tn49Z&f%uPGG(yL*-f1_3j-bfe*u1B$xOUeGcXYy&{fl;>9`wbm& zsLN6*P7{b}|E}DgmO*m14ssy9 z?wN2NP^RZ}jYS*$@%IL9{Z;)$zs=%a+A;M5-PsHsfOL;M*S4&q`lWazw)r^4OhhQ?-L>eN1#6v;eMN=@4SZ&L1KLD}AVoH| zB+PdiPmwas;6^a7SAz0-lHV@$1>WpP?8Tw;r0T~%@NP6SUFEJMO^x@jXTdsB0P@KA z62Fn~Ri^sWf*^oDP5-ZX%NlPfcG|N9y731}yML@~xS@kLT-nlDPyl;n#XV_wZUVKf z`XeClX1q%PZsF`z^q1{$h+D|{8^&qF2ze4CKlU(59A!C?+%@mDaRH)o~uy#?dMLTNYyL6^benM+!abzD#P4pt! ziY7cT_(IazcM_62L21h+B@e=Od2LBe9Kv$>EWZW(qFE>qIsZmem#5 zDL6sX6*-FO{Hw1GQ6#|1)Up1P6;NJ~8S=mR#*-usMFfb-nSBt+qi^bnb6M|maui%$?yuGIso?4`E?I_{FAh$FtQym0qB&*y=T zJE~isN@|$%YdkYLc94bke8lV-)OF6mKsW#oHxm7%6jTjx9_lXTLNG8jcEx zKCfQw-0k=8k3QW$G|Duw1B~>0@kMy+33bmn3B|v|gS`Jre^u>a^;rVh=>87?a?rdy zny&3!Bl9W1>GxdhXNz-6xI4&?E?@O^b|ULx7lvMN<(bA-Rq%dX_Q@GbW@O0u(hCA2 zWK6Oe9YtH&vyZEE9tn3UHl)I>E&lv1Y`iUTr*Wk{K|oSK->(zJH-3@|uLx}4i-batpJ8u-?-)dt2h zkn%yzuU;vZU;e*WX4{>54kW)%FyCPK!&TeD650m;qEU>7$X+?xK5);b>)T_FL*fo&@mza;Hf9!qy^X0erE@3S-acqsTsR|*LP@) zXV-h^U&1B90uW8n9b^J>$7L@!wt+tAZ9;h2kWwSlSyIgKZa}k#;lRYkOCi9Ozk>e; zSL`TOw_@NT-hMs}Q7}5UPH+in2-sw-(FJ~KDzr0pLBM@6ajoDNxe z7YEc`9t;(99NCJ&@uiozJ0YXEtlrg1-mhPOJAeG9k8c!FL*RT}ofsyJ;*FST2P|8c zf{+5Q0rn=AC8cC^g?Tk6D82CTP&gE(^z4oxZsmv zg6`#y&e}?1Nan)Lx-rd6%3R=7f8dj|o|L4H8@4devTtO+La^HJrWyv*c$%Dd**CsoxeI1Zc!2= zl%7!zx9Hbj*Zk74bqWUx&?qJ!I@eey-vURaYSCg>G=WtZA_l){Jmu|z(Y^dO?8zZ8 zWt;Eon|rNZ*~*@rPr|OXmrDn6)$u;Fax+{$&hD{4VDLDENDd~7b}<_J8;M!12T^95 zCVk(DudRoR>1fje_Z@Md6#^Z{jna1~RY6 zV1axplFmjL5@}c+J5rR)eY(ZPCHrtc&Ob9!+6pY=>;=}wre$-uC2F+ripvi) z_Wp~-;7RCi-G%jbo=!v>tMQw#eMd^muLmpi!lw7ePdko_(l(tV$+Lwu`z}u}J?Ctp zdj}99OPf=yHwO=_2gjfB!|qyULUl__$;Ld#>^y`K-*|)LU#DEMkP=FPnbV*}_?MHA z-@CmfAw)D@LmO?SVFCL$&{6!sjF9RAB*_ZyV*M&?xo-r%~JkJ1JqHTm1 zMYDIA1>r-Yv9dQA-D38iIx% zR%cJ0&n6ovGmO(tA8k82ho}@(w)Pp@TP%s{t&J zS4_7V6lcJl_L3X)m6TVO?{Ozitr|%=CppC%@`jQrzmt}@H-P%x*9uuY_P2>CG<{Dm z_Q`^6U@2Lc8h8Klx9)2T^tWTXfgY-_2{T>HL7go{|JG$&GizWbkVMgVN7Pzj9j2hpDy2cnDHK`Up|O0w)?UMIb6x;~#Gt zo@-;WG_Mo|*ha`k+^+|#=VCLm?-AMTs>TpTfB6EoECAmH;A4NH_G_g0iREI1=PRI& z_D^R{??`5kMuIH}r26&M)L=@#SvuF@*I=rLm#8Cc+a#JrwwMn^;5zPsSBl(Rt|ZF5IdO0N%^rVdNhKQ`Ha*q`g1`t*1zbh2U*l<%Xf*FVNzZ=3x= zhC)9HT)w|{SlaREbi{Nud~QvmBmPWAZ@(q^LDap=Y5N8LO78rT8>=<2+;Q+`T1S-KEPFh667Atp^ZZ9Bg*ohSo zdjB;Eq}%yz0Lxm>o21DmfcDgN=-`+gTMpk>Iw%exx#&M1w908!ccSJ6>UAvb>}F

`Q?)+XdDHF*gE(j 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 M07*qoM6N<$f^+kRO#lD@ literal 0 HcmV?d00001 diff --git a/Wino.Mail/BackgroundImages/Clouds.jpg b/Wino.Mail/BackgroundImages/Clouds.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f643572d1e1e3bedd57fa6274bd753838ee15f4f GIT binary patch literal 124682 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 N2?9E*j{o}L{{ogE6DI%w literal 0 HcmV?d00001 diff --git a/Wino.Mail/BackgroundImages/Forest.jpg b/Wino.Mail/BackgroundImages/Forest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa58e6af16ba465421a9a1d3e6b725b41877078e GIT binary patch literal 84848 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 b0BZjLApW8M0Hwe4$NvC|dw=0V{FndPr(Ac& literal 0 HcmV?d00001 diff --git a/Wino.Mail/BackgroundImages/Garden.jpg b/Wino.Mail/BackgroundImages/Garden.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eaf1d05aedba37fc899cb6c3c2e47a7b05760b55 GIT binary patch literal 56394 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/BackgroundImages/Mica.jpg b/Wino.Mail/BackgroundImages/Mica.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10519a41625198bb44a3d004174f295dbc0debfa GIT binary patch literal 91893 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�uj=nhlQrM5?@#c<5kLF$L;Z(zmcBzn=?4w+y9j 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%0DpJ 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 z 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≠q@LnHbzx`5*c_SI!czkschoa`e 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 tn3YnQ6f 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%0Dk1xB4R9er&+CFd>fHur7KpjERu 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

ZO?7# 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail/BackgroundImages/Snowflake.jpg b/Wino.Mail/BackgroundImages/Snowflake.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5129640c5ccd899be9d3b965de2ebeff91e104f GIT binary patch literal 81795 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 + { + public UIElement ShellContent + { + get { return (UIElement)GetValue(ShellContentProperty); } + set { SetValue(ShellContentProperty, value); } + } + + public static readonly DependencyProperty ShellContentProperty = DependencyProperty.Register(nameof(ShellContent), typeof(UIElement), typeof(BasePage), new PropertyMetadata(null)); + + public void Receive(LanguageChanged message) + { + OnLanguageChanged(); + } + + public virtual void OnLanguageChanged() { } + } + + public abstract class BasePage : BasePage where T : BaseViewModel + { + public T ViewModel { get; } = App.Current.Services.GetService(); + + protected BasePage() + { + ViewModel.Dispatcher = new UWPDispatcher(Dispatcher); + } + + ~BasePage() + { + Debug.WriteLine($"Disposed {this.GetType().Name}"); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + var mode = GetNavigationMode(e.NavigationMode); + var parameter = e.Parameter; + + WeakReferenceMessenger.Default.UnregisterAll(this); + WeakReferenceMessenger.Default.RegisterAll(this); + + ViewModel.OnNavigatedTo(mode, parameter); + } + + protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) + { + base.OnNavigatingFrom(e); + + var mode = GetNavigationMode(e.NavigationMode); + var parameter = e.Parameter; + + WeakReferenceMessenger.Default.UnregisterAll(this); + + ViewModel.OnNavigatedFrom(mode, parameter); + + GC.Collect(); + } + + private Core.Domain.Models.Navigation.NavigationMode GetNavigationMode(NavigationMode mode) + { + return (Core.Domain.Models.Navigation.NavigationMode)mode; + } + } +} diff --git a/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs b/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs new file mode 100644 index 00000000..d554fdea --- /dev/null +++ b/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs @@ -0,0 +1,202 @@ +using Microsoft.Xaml.Interactivity; +using System.Collections; +using System.Collections.Specialized; +using System.Windows.Input; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Wino.Controls; +using Wino.Core.Domain.Models.Menus; +using Wino.Helpers; + +namespace Wino.Behaviors +{ + public class BindableCommandBarBehavior : Behavior + { + public static readonly DependencyProperty PrimaryCommandsProperty = DependencyProperty.Register( + "PrimaryCommands", typeof(object), typeof(BindableCommandBarBehavior), + new PropertyMetadata(null, UpdateCommands)); + + public static readonly DependencyProperty ItemTemplateSelectorProperty = DependencyProperty.Register( + "ItemTemplateSelector", typeof(DataTemplateSelector), typeof(BindableCommandBarBehavior), + new PropertyMetadata(null, null)); + + public ICommand ItemClickedCommand + { + get { return (ICommand)GetValue(ItemClickedCommandProperty); } + set { SetValue(ItemClickedCommandProperty, value); } + } + + public static readonly DependencyProperty ItemClickedCommandProperty = DependencyProperty.Register(nameof(ItemClickedCommand), typeof(ICommand), typeof(BindableCommandBarBehavior), new PropertyMetadata(null)); + + public DataTemplateSelector ItemTemplateSelector + { + get { return (DataTemplateSelector)GetValue(ItemTemplateSelectorProperty); } + set { SetValue(ItemTemplateSelectorProperty, value); } + } + + public object PrimaryCommands + { + get { return GetValue(PrimaryCommandsProperty); } + set { SetValue(PrimaryCommandsProperty, value); } + } + + protected override void OnDetaching() + { + base.OnDetaching(); + + AttachChanges(false); + + if (PrimaryCommands is IEnumerable enumerable) + { + foreach (var item in enumerable) + { + if (item is ButtonBase button) + { + button.Click -= Button_Click; + } + } + } + } + + private void UpdatePrimaryCommands() + { + if (AssociatedObject == null) + return; + + if (PrimaryCommands == null) + return; + + if (AssociatedObject.PrimaryCommands is IEnumerable enumerableObjects) + { + foreach (var item in enumerableObjects) + { + if (item is ButtonBase button) + { + button.Click -= Button_Click; + } + } + } + + if (AssociatedObject.SecondaryCommands is IEnumerable secondaryObject) + { + foreach (var item in secondaryObject) + { + if (item is ButtonBase button) + { + button.Click -= Button_Click; + } + } + } + + AssociatedObject.PrimaryCommands.Clear(); + AssociatedObject.SecondaryCommands.Clear(); + + if (!(PrimaryCommands is IEnumerable enumerable)) return; + + foreach (var command in enumerable) + { + if (command is MailOperationMenuItem mailOperationMenuItem) + { + if (mailOperationMenuItem.Operation == Core.Domain.Enums.MailOperation.Seperator) + { + var seperator = new AppBarSeparator(); + + if (mailOperationMenuItem.IsSecondaryMenuPreferred) + { + AssociatedObject.SecondaryCommands.Add(seperator); + } + else + { + AssociatedObject.PrimaryCommands.Add(seperator); + } + } + else + { + var menuItem = new AppBarButton() + { + Icon = new WinoFontIcon() { Glyph = ControlConstants.WinoIconFontDictionary[XamlHelpers.GetWinoIconGlyph(mailOperationMenuItem.Operation)] }, + Label = XamlHelpers.GetOperationString(mailOperationMenuItem.Operation), + DataContext = mailOperationMenuItem, + }; + + menuItem.Click -= Button_Click; + menuItem.Click += Button_Click; + + if (mailOperationMenuItem.IsSecondaryMenuPreferred) + { + AssociatedObject.SecondaryCommands.Add(menuItem); + } + else + { + AssociatedObject.PrimaryCommands.Add(menuItem); + } + } + } + + //if (dependencyObject is ICommandBarElement icommandBarElement) + //{ + // if (dependencyObject is ButtonBase button) + // { + // button.Click -= Button_Click; + // button.Click += Button_Click; + // } + + // if (command is MailOperationMenuItem mailOperationMenuItem) + // { + + // } + //} + } + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + ItemClickedCommand?.Execute(((ButtonBase)sender).DataContext); + } + + protected override void OnAttached() + { + base.OnAttached(); + + AttachChanges(true); + + UpdatePrimaryCommands(); + } + + private void PrimaryCommandsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + UpdatePrimaryCommands(); + } + + private static void UpdateCommands(DependencyObject dependencyObject, + DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + if (!(dependencyObject is BindableCommandBarBehavior behavior)) return; + + if (dependencyPropertyChangedEventArgs.OldValue is INotifyCollectionChanged oldList) + { + oldList.CollectionChanged -= behavior.PrimaryCommandsCollectionChanged; + } + + behavior.AttachChanges(true); + behavior.UpdatePrimaryCommands(); + } + + private void AttachChanges(bool register) + { + if (PrimaryCommands is null) return; + + if (PrimaryCommands is INotifyCollectionChanged collectionChanged) + { + if (register) + { + collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged; + collectionChanged.CollectionChanged += PrimaryCommandsCollectionChanged; + } + else + collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged; + } + } + } +} diff --git a/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs b/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs new file mode 100644 index 00000000..6726a351 --- /dev/null +++ b/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs @@ -0,0 +1,86 @@ +using System.Collections.ObjectModel; +using Microsoft.Xaml.Interactivity; +using Windows.UI.Xaml; +using Wino.Controls; +using Wino.Core.MenuItems; + +namespace Wino.Behaviors +{ + public class CreateMailNavigationItemBehavior : Behavior + { + public MenuItemBase SelectedMenuItem + { + get { return (MenuItemBase)GetValue(SelectedMenuItemProperty); } + set { SetValue(SelectedMenuItemProperty, value); } + } + + public ObservableCollection MenuItems + { + get { return (ObservableCollection)GetValue(MenuItemsProperty); } + set { SetValue(MenuItemsProperty, value); } + } + + public static readonly DependencyProperty MenuItemsProperty = DependencyProperty.Register(nameof(MenuItems), typeof(ObservableCollection), typeof(CreateMailNavigationItemBehavior), new PropertyMetadata(null, OnMenuItemsChanged)); + public static readonly DependencyProperty SelectedMenuItemProperty = DependencyProperty.Register(nameof(SelectedMenuItem), typeof(MenuItemBase), typeof(CreateMailNavigationItemBehavior), new PropertyMetadata(null, OnSelectedMenuItemChanged)); + + public CreateMailNavigationItemBehavior() + { + + } + + protected override void OnAttached() + { + base.OnAttached(); + } + + protected override void OnDetaching() + { + base.OnDetaching(); + } + + private static void OnMenuItemsChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + if (dependencyObject is CreateMailNavigationItemBehavior behavior) + { + if (dependencyPropertyChangedEventArgs.NewValue != null) + behavior.RegisterMenuItemChanges(); + + behavior.ManageAccounts(); + } + } + + private void RegisterMenuItemChanges() + { + if (MenuItems != null) + { + MenuItems.CollectionChanged -= MenuCollectionUpdated; + MenuItems.CollectionChanged += MenuCollectionUpdated; + } + } + + private void MenuCollectionUpdated(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + ManageAccounts(); + } + + private static void OnSelectedMenuItemChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + if (dependencyObject is CreateMailNavigationItemBehavior behavior) + { + behavior.ManageAccounts(); + } + } + + private void ManageAccounts() + { + if (MenuItems == null) return; + + AssociatedObject.MenuItems.Clear(); + + if (SelectedMenuItem == null) + { + // ?? + } + } + } +} diff --git a/Wino.Mail/Controls/AccountNavigationItem.cs b/Wino.Mail/Controls/AccountNavigationItem.cs new file mode 100644 index 00000000..90aeda7a --- /dev/null +++ b/Wino.Mail/Controls/AccountNavigationItem.cs @@ -0,0 +1,55 @@ +using System.Diagnostics; +using System.Numerics; +using CommunityToolkit.WinUI; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml; + +namespace Wino.Controls +{ + public class AccountNavigationItem : WinoNavigationViewItem + { + public bool IsActiveAccount + { + get { return (bool)GetValue(IsActiveAccountProperty); } + set { SetValue(IsActiveAccountProperty, value); } + } + + public static readonly DependencyProperty IsActiveAccountProperty = DependencyProperty.Register(nameof(IsActiveAccount), typeof(bool), typeof(AccountNavigationItem), new PropertyMetadata(false, new PropertyChangedCallback(OnIsActiveAccountChanged))); + + + private const string PART_NavigationViewItemMenuItemsHost = "NavigationViewItemMenuItemsHost"; + private const string PART_SelectionIndicator = "SelectionIndicator"; + + private ItemsRepeater _itemsRepeater; + private Windows.UI.Xaml.Shapes.Rectangle _selectionIndicator; + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _itemsRepeater = GetTemplateChild(PART_NavigationViewItemMenuItemsHost) as ItemsRepeater; + _selectionIndicator = GetTemplateChild(PART_SelectionIndicator) as Windows.UI.Xaml.Shapes.Rectangle; + + if (_itemsRepeater == null) return; + + (_itemsRepeater.Layout as StackLayout).Spacing = 0; + + UpdateSelectionBorder(); + } + + private static void OnIsActiveAccountChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is AccountNavigationItem control) + control.UpdateSelectionBorder(); + } + + private void UpdateSelectionBorder() + { + if (_selectionIndicator == null) return; + + _selectionIndicator.Scale = IsActiveAccount ? new Vector3(1,1,1) : new Vector3(0,0,0); + _selectionIndicator.Visibility = IsActiveAccount ? Visibility.Visible : Visibility.Collapsed; + } + } +} diff --git a/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml b/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml new file mode 100644 index 00000000..191a87d6 --- /dev/null +++ b/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs b/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs new file mode 100644 index 00000000..7396bc91 --- /dev/null +++ b/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs @@ -0,0 +1,169 @@ +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace Wino.Controls.Advanced +{ + public sealed partial class WinoAppTitleBar : UserControl + { + public event TypedEventHandler BackButtonClicked; + + public string CoreWindowText + { + get { return (string)GetValue(CoreWindowTextProperty); } + set { SetValue(CoreWindowTextProperty, value); } + } + + public double SystemReserved + { + get { return (double)GetValue(SystemReservedProperty); } + set { SetValue(SystemReservedProperty, value); } + } + + public UIElement ShellFrameContent + { + get { return (UIElement)GetValue(ShellFrameContentProperty); } + set { SetValue(ShellFrameContentProperty, value); } + } + + public Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode NavigationViewDisplayMode + { + get { return (Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode)GetValue(NavigationViewDisplayModeProperty); } + set { SetValue(NavigationViewDisplayModeProperty, value); } + } + + public bool IsNavigationPaneOpen + { + get { return (bool)GetValue(IsNavigationPaneOpenProperty); } + set { SetValue(IsNavigationPaneOpenProperty, value); } + } + + public double OpenPaneLength + { + get { return (double)GetValue(OpenPaneLengthProperty); } + set { SetValue(OpenPaneLengthProperty, value); } + } + + public bool IsBackButtonVisible + { + get { return (bool)GetValue(IsBackButtonVisibleProperty); } + set { SetValue(IsBackButtonVisibleProperty, value); } + } + + public bool IsReaderNarrowed + { + get { return (bool)GetValue(IsReaderNarrowedProperty); } + set { SetValue(IsReaderNarrowedProperty, value); } + } + + public bool IsRenderingPaneVisible + { + get { return (bool)GetValue(IsRenderingPaneVisibleProperty); } + set { SetValue(IsRenderingPaneVisibleProperty, value); } + } + + public static readonly DependencyProperty IsRenderingPaneVisibleProperty = DependencyProperty.Register(nameof(IsRenderingPaneVisible), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnDrawingPropertyChanged)); + public static readonly DependencyProperty IsReaderNarrowedProperty = DependencyProperty.Register(nameof(IsReaderNarrowed), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnIsReaderNarrowedChanged)); + public static readonly DependencyProperty IsBackButtonVisibleProperty = DependencyProperty.Register(nameof(IsBackButtonVisible), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnDrawingPropertyChanged)); + public static readonly DependencyProperty OpenPaneLengthProperty = DependencyProperty.Register(nameof(OpenPaneLength), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(0d, OnDrawingPropertyChanged)); + public static readonly DependencyProperty IsNavigationPaneOpenProperty = DependencyProperty.Register(nameof(IsNavigationPaneOpen), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnDrawingPropertyChanged)); + public static readonly DependencyProperty NavigationViewDisplayModeProperty = DependencyProperty.Register(nameof(NavigationViewDisplayMode), typeof(Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode), typeof(WinoAppTitleBar), new PropertyMetadata(Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Compact, OnDrawingPropertyChanged)); + public static readonly DependencyProperty ShellFrameContentProperty = DependencyProperty.Register(nameof(ShellFrameContent), typeof(UIElement), typeof(WinoAppTitleBar), new PropertyMetadata(null, OnDrawingPropertyChanged)); + public static readonly DependencyProperty SystemReservedProperty = DependencyProperty.Register(nameof(SystemReserved), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(0, OnDrawingPropertyChanged)); + public static readonly DependencyProperty CoreWindowTextProperty = DependencyProperty.Register(nameof(CoreWindowText), typeof(string), typeof(WinoAppTitleBar), new PropertyMetadata(string.Empty, OnDrawingPropertyChanged)); + public static readonly DependencyProperty ReadingPaneLengthProperty = DependencyProperty.Register(nameof(ReadingPaneLength), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(420d, OnDrawingPropertyChanged)); + + + public double ReadingPaneLength + { + get { return (double)GetValue(ReadingPaneLengthProperty); } + set { SetValue(ReadingPaneLengthProperty, value); } + } + + private static void OnIsReaderNarrowedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoAppTitleBar bar) + { + bar.DrawTitleBar(); + } + } + + private static void OnDrawingPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoAppTitleBar bar) + { + bar.DrawTitleBar(); + } + } + + private void DrawTitleBar() + { + UpdateLayout(); + + CoreWindowTitleTextBlock.Visibility = Visibility.Collapsed; + ContentGrid.Width = double.NaN; + ContentGrid.Margin = new Thickness(0, 0, 0, 0); + ContentGrid.HorizontalAlignment = HorizontalAlignment.Stretch; + + EmptySpaceWidth.Width = new GridLength(1, GridUnitType.Star); + + // Menu is not visible. + if (NavigationViewDisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Minimal) + { + + } + else if (NavigationViewDisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Compact) + { + // Icons are visible. + + if (!IsReaderNarrowed) + { + ContentGrid.HorizontalAlignment = HorizontalAlignment.Left; + ContentGrid.Width = ReadingPaneLength; + } + } + else if (NavigationViewDisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Expanded) + { + if (IsNavigationPaneOpen) + { + CoreWindowTitleTextBlock.Visibility = Visibility.Visible; + + // LMargin = OpenPaneLength - LeftMenuStackPanel + ContentGrid.Margin = new Thickness(OpenPaneLength - LeftMenuStackPanel.ActualSize.X, 0, 0, 0); + + if (!IsReaderNarrowed) + { + ContentGrid.HorizontalAlignment = HorizontalAlignment.Left; + ContentGrid.Width = ReadingPaneLength; + } + } + else + { + EmptySpaceWidth.Width = new GridLength(ReadingPaneLength, GridUnitType.Pixel); + } + } + } + + public WinoAppTitleBar() + { + this.InitializeComponent(); + + Window.Current.SetTitleBar(dragbar); + } + + private void BackClicked(object sender, RoutedEventArgs e) + { + BackButtonClicked?.Invoke(this, e); + } + + private void PaneClicked(object sender, RoutedEventArgs e) + { + IsNavigationPaneOpen = !IsNavigationPaneOpen; + } + + private void asd(object sender, SizeChangedEventArgs e) + { + DrawTitleBar(); + } + } +} diff --git a/Wino.Mail/Controls/Advanced/WinoListView.cs b/Wino.Mail/Controls/Advanced/WinoListView.cs new file mode 100644 index 00000000..a6382321 --- /dev/null +++ b/Wino.Mail/Controls/Advanced/WinoListView.cs @@ -0,0 +1,382 @@ +using System; +using System.Linq; +using System.Windows.Input; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.UI.Xaml.Controls; +using MoreLinq; +using Serilog; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; +using Wino.Mail.ViewModels.Messages; + +namespace Wino.Controls.Advanced +{ + ///

+ /// Custom ListView control that handles multiple selection with Extended/Multiple selection mode + /// and supports threads. + /// + public class WinoListView : ListView, IDisposable + { + private ILogger logger = Log.ForContext(); + + private const string PART_ScrollViewer = "ScrollViewer"; + private ScrollViewer internalScrollviewer; + + /// + /// Gets or sets whether this ListView belongs to thread items. + /// This is important for detecting selected items etc. + /// + public bool IsThreadListView + { + get { return (bool)GetValue(IsThreadListViewProperty); } + set { SetValue(IsThreadListViewProperty, value); } + } + + public ICommand ItemDeletedCommand + { + get { return (ICommand)GetValue(ItemDeletedCommandProperty); } + set { SetValue(ItemDeletedCommandProperty, value); } + } + + public ICommand LoadMoreCommand + { + get { return (ICommand)GetValue(LoadMoreCommandProperty); } + set { SetValue(LoadMoreCommandProperty, value); } + } + + public static readonly DependencyProperty LoadMoreCommandProperty = DependencyProperty.Register(nameof(LoadMoreCommand), typeof(ICommand), typeof(WinoListView), new PropertyMetadata(null)); + public static readonly DependencyProperty IsThreadListViewProperty = DependencyProperty.Register(nameof(IsThreadListView), typeof(bool), typeof(WinoListView), new PropertyMetadata(false)); + public static readonly DependencyProperty ItemDeletedCommandProperty = DependencyProperty.Register(nameof(ItemDeletedCommand), typeof(ICommand), typeof(WinoListView), new PropertyMetadata(null)); + + public WinoListView() + { + CanDragItems = true; + IsItemClickEnabled = true; + IsMultiSelectCheckBoxEnabled = true; + IsRightTapEnabled = true; + SelectionMode = ListViewSelectionMode.Extended; + ShowsScrollingPlaceholders = false; + SingleSelectionFollowsFocus = true; + + DragItemsCompleted += ItemDragCompleted; + DragItemsStarting += ItemDragStarting; + SelectionChanged += SelectedItemsChanged; + ItemClick += MailItemClicked; + ProcessKeyboardAccelerators += ProcessDelKey; + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + internalScrollviewer = GetTemplateChild(PART_ScrollViewer) as ScrollViewer; + + if (internalScrollviewer == null) + { + logger.Warning("WinoListView does not have an internal ScrollViewer. Infinite scrolling behavior might be effected."); + return; + } + + internalScrollviewer.ViewChanged -= InternalScrollVeiwerViewChanged; + internalScrollviewer.ViewChanged += InternalScrollVeiwerViewChanged; + } + + private double lastestRaisedOffset = 0; + private int lastItemSize = 0; + + // TODO: This is buggy. Does not work all the time. Debug. + + private void InternalScrollVeiwerViewChanged(object sender, ScrollViewerViewChangedEventArgs e) + { + if (internalScrollviewer == null) return; + + // No need to raise init request if there are no items in the list. + if (Items.Count == 0) return; + + // If the scrolling is finished, check the current viewport height. + if (e.IsIntermediate) + { + var currentOffset = internalScrollviewer.VerticalOffset; + var maxOffset = internalScrollviewer.ScrollableHeight; + + if (currentOffset + 10 >= maxOffset && lastestRaisedOffset != maxOffset && Items.Count != lastItemSize) + { + // We must load more. + lastestRaisedOffset = maxOffset; + lastItemSize = Items.Count; + + LoadMoreCommand?.Execute(null); + } + } + } + + private void ProcessDelKey(UIElement sender, Windows.UI.Xaml.Input.ProcessKeyboardAcceleratorEventArgs args) + { + if (args.Key == Windows.System.VirtualKey.Delete) + { + args.Handled = true; + + ItemDeletedCommand?.Execute((int)MailOperation.SoftDelete); + } + } + + private void ItemDragCompleted(ListViewBase sender, DragItemsCompletedEventArgs args) + { + if (args.Items.Any(a => a is MailItemViewModel)) + { + args.Items.Cast().ForEach(a => a.IsCustomFocused = false); + } + } + + private void ItemDragStarting(object sender, DragItemsStartingEventArgs args) + { + // Dragging multiple mails from different accounts/folders are supported with the condition below: + // All mails belongs to the drag will be matched on the dropped folder's account. + // Meaning that if users drag 1 mail from Account A/Inbox and 1 mail from Account B/Inbox, + // and drop to Account A/Inbox, the mail from Account B/Inbox will NOT be moved. + + if (IsThreadListView) + { + var allItems = args.Items.Cast(); + + // Highlight all items + allItems.ForEach(a => a.IsCustomFocused = true); + + // Set native drag arg properties. + + var dragPackage = new MailDragPackage(allItems.Cast()); + + args.Data.Properties.Add(nameof(MailDragPackage), dragPackage); + } + else + { + var dragPackage = new MailDragPackage(args.Items.Cast()); + + args.Data.Properties.Add(nameof(MailDragPackage), dragPackage); + } + } + + private void MailItemClicked(object sender, ItemClickEventArgs e) + { + if (e.ClickedItem is ThreadMailItemViewModel clickedThread) + { + clickedThread.IsThreadExpanded = !clickedThread.IsThreadExpanded; + + if (!clickedThread.IsThreadExpanded) + { + SelectedItems.Clear(); + } + } + } + + public void ChangeSelectionMode(ListViewSelectionMode selectionMode) + { + SelectionMode = selectionMode; + + if (!IsThreadListView) + { + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + var threadListView = GetThreadInternalListView(c); + + if (threadListView != null) + { + threadListView.SelectionMode = selectionMode; + } + }); + } + } + + /// + /// Finds the container for given mail item and adds it to selected items. + /// + /// Mail to be added to selected items. + /// Whether selection was successful or not. + public bool SelectMailItemContainer(MailItemViewModel mailItemViewModel) + { + var itemContainer = ContainerFromItem(mailItemViewModel); + + // This item might be in thread container. + if (itemContainer == null) + { + bool found = false; + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + if (!found) + { + var threadListView = GetThreadInternalListView(c); + + if (threadListView != null) + found = threadListView.SelectMailItemContainer(mailItemViewModel); + } + }); + + return found; + } + + SelectedItems.Add(mailItemViewModel); + return true; + } + + /// + /// Recursively clears all selections except the given mail. + /// + /// Exceptional mail item to be not unselected. + /// Whether expansion states of thread containers should stay as it is or not. + public void ClearSelections(MailItemViewModel exceptViewModel = null, bool preserveThreadExpanding = false) + { + SelectedItems.Clear(); + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + var threadListView = GetThreadInternalListView(c); + + if (threadListView == null) + return; + + if (exceptViewModel != null) + { + if (!threadListView.SelectedItems.Contains(exceptViewModel)) + { + if (!preserveThreadExpanding) + { + c.IsThreadExpanded = false; + } + + threadListView.SelectedItems.Clear(); + } + } + else + { + if (!preserveThreadExpanding) + { + c.IsThreadExpanded = false; + } + + threadListView.SelectedItems.Clear(); + } + }); + } + + /// + /// Recursively selects all mails, including thread items. + /// + public void SelectAllWino() + { + SelectAll(); + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + c.IsThreadExpanded = true; + + var threadListView = GetThreadInternalListView(c); + + threadListView?.SelectAll(); + }); + } + + // SelectedItems changed. + private void SelectedItemsChanged(object sender, SelectionChangedEventArgs e) + { + if (e.RemovedItems != null) + { + foreach (var removedItem in e.RemovedItems) + { + if (removedItem is MailItemViewModel removedMailItemViewModel) + { + // Mail item un-selected. + + removedMailItemViewModel.IsSelected = false; + WeakReferenceMessenger.Default.Send(new MailItemSelectionRemovedEvent(removedMailItemViewModel)); + } + } + } + + if (e.AddedItems != null) + { + foreach (var addedItem in e.AddedItems) + { + if (addedItem is MailItemViewModel addedMailItemViewModel) + { + // Mail item selected. + + addedMailItemViewModel.IsSelected = true; + + WeakReferenceMessenger.Default.Send(new MailItemSelectedEvent(addedMailItemViewModel)); + } + else if (addedItem is ThreadMailItemViewModel threadMailItemViewModel) + { + threadMailItemViewModel.IsThreadExpanded = true; + + // Don't select thread containers. + SelectedItems.Remove(addedItem); + } + } + } + + if (!IsThreadListView) + { + if (SelectionMode == ListViewSelectionMode.Extended && SelectedItems.Count == 1) + { + // Only 1 single item is selected in extended mode for main list view. + // We should un-select all thread items. + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + // c.IsThreadExpanded = false; + + var threadListView = GetThreadInternalListView(c); + + threadListView?.SelectedItems.Clear(); + }); + } + } + else + { + if (SelectionMode == ListViewSelectionMode.Extended && SelectedItems.Count == 1) + { + // Tell main list view to unselect all his items. + + if (SelectedItems[0] is MailItemViewModel selectedMailItemViewModel) + { + WeakReferenceMessenger.Default.Send(new ResetSingleMailItemSelectionEvent(selectedMailItemViewModel)); + } + } + } + } + + private WinoListView GetThreadInternalListView(ThreadMailItemViewModel threadMailItemViewModel) + { + var itemContainer = ContainerFromItem(threadMailItemViewModel); + + if (itemContainer is ListViewItem listItem) + { + var expander = listItem.GetChildByName("ThreadExpander"); + + if (expander != null) + return expander.Content as WinoListView; + } + + return null; + } + + public void Dispose() + { + DragItemsCompleted -= ItemDragCompleted; + DragItemsStarting -= ItemDragStarting; + SelectionChanged -= SelectedItemsChanged; + ItemClick -= MailItemClicked; + ProcessKeyboardAccelerators -= ProcessDelKey; + + if (internalScrollviewer != null) + { + internalScrollviewer.ViewChanged -= InternalScrollVeiwerViewChanged; + } + } + } +} diff --git a/Wino.Mail/Controls/ControlConstants.cs b/Wino.Mail/Controls/ControlConstants.cs new file mode 100644 index 00000000..4353f2f6 --- /dev/null +++ b/Wino.Mail/Controls/ControlConstants.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; + +namespace Wino.Controls +{ + public static class ControlConstants + { + public static Dictionary WinoIconFontDictionary = new Dictionary() + { + { WinoIconGlyph.None, "\u0020" }, + { WinoIconGlyph.Archive, "\uE066" }, + { WinoIconGlyph.UnArchive, "\uE06C" }, + { WinoIconGlyph.Reply, "\uF176" }, + { WinoIconGlyph.ReplyAll, "\uF17A" }, + { WinoIconGlyph.Sync, "\uE902" }, + { WinoIconGlyph.Send, "\uEA8E" }, + { WinoIconGlyph.LightEditor, "\uE1F6" }, + { WinoIconGlyph.Delete, "\uEEA6" }, + { WinoIconGlyph.DarkEditor, "\uEE44" }, + { WinoIconGlyph.Draft, "\uF3BE" }, + { WinoIconGlyph.Flag, "\uF40C" }, + { WinoIconGlyph.ClearFlag, "\uF40F" }, + { WinoIconGlyph.Folder, "\uE643" }, + { WinoIconGlyph.Forward, "\uE7AA" }, + { WinoIconGlyph.Inbox, "\uF516" }, + { WinoIconGlyph.MarkRead, "\uF522" }, + { WinoIconGlyph.MarkUnread, "\uF529" }, + { WinoIconGlyph.MultiSelect, "\uE84D" }, + { WinoIconGlyph.Save, "\uEA43" }, + { WinoIconGlyph.CreateFolder, "\uE645" }, + { WinoIconGlyph.Pin, "\uF5FF" }, + { WinoIconGlyph.UnPin, "\uE985" }, + { WinoIconGlyph.Star, "\uF70D" }, + { WinoIconGlyph.Ignore, "\uF5D0" }, + { WinoIconGlyph.Junk, "\uE903" }, + { WinoIconGlyph.Find, "\uEA7D" }, + { WinoIconGlyph.Zoom, "\uEE8E" }, + { WinoIconGlyph.SpecialFolderInbox, "\uF516" }, + { WinoIconGlyph.SpecialFolderStarred, "\uF70D" }, + { WinoIconGlyph.SpecialFolderImportant, "\uE2F4" }, + { WinoIconGlyph.SpecialFolderSent, "\uEA8E" }, + { WinoIconGlyph.SpecialFolderDraft, "\uF3BE" }, + { WinoIconGlyph.SpecialFolderArchive, "\uE066" }, + { WinoIconGlyph.SpecialFolderDeleted, "\uEEA6" }, + { WinoIconGlyph.SpecialFolderJunk, "\uE903" }, + { WinoIconGlyph.SpecialFolderChat, "\uE2E3" }, + { WinoIconGlyph.SpecialFolderCategory, "\uF599" }, + { WinoIconGlyph.SpecialFolderUnread, "\uF529" }, + { WinoIconGlyph.SpecialFolderForums, "\uF5B8" }, + { WinoIconGlyph.SpecialFolderUpdated, "\uF565" }, + { WinoIconGlyph.SpecialFolderPersonal, "\uE25A" }, + { WinoIconGlyph.SpecialFolderPromotions, "\uF7B6" }, + { WinoIconGlyph.SpecialFolderSocial, "\uEEEB" }, + { WinoIconGlyph.SpecialFolderOther, "\uE643" }, + { WinoIconGlyph.SpecialFolderMore, "\uF0F4" }, + { WinoIconGlyph.Microsoft, "\uE900" }, + { WinoIconGlyph.Google, "\uE901" }, + { WinoIconGlyph.NewMail, "\uF107" }, + { WinoIconGlyph.TurnOfNotifications, "\uF11D" }, + { WinoIconGlyph.Rename, "\uF668" }, + { WinoIconGlyph.EmptyFolder, "\uE47E" }, + { WinoIconGlyph.DontSync, "\uF195" }, + { WinoIconGlyph.Move, "\uE7B8" }, + { WinoIconGlyph.Mail, "\uF509" }, + { WinoIconGlyph.More, "\uE824" }, + { WinoIconGlyph.CustomServer, "\uF509" }, + }; + } +} diff --git a/Wino.Mail/Controls/ImagePreviewControl.cs b/Wino.Mail/Controls/ImagePreviewControl.cs new file mode 100644 index 00000000..9c0fa0db --- /dev/null +++ b/Wino.Mail/Controls/ImagePreviewControl.cs @@ -0,0 +1,145 @@ +using System; +using System.Text.RegularExpressions; +using Fernandezja.ColorHashSharp; +using Windows.UI; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Media.Imaging; +using Windows.UI.Xaml.Shapes; +using Wino.Core.Services; + +namespace Wino.Controls +{ + public class ImagePreviewControl : Control + { + private const string PART_EllipseInitialsGrid = "EllipseInitialsGrid"; + private const string PART_InitialsTextBlock = "InitialsTextBlock"; + private const string PART_KnownHostImage = "KnownHostImage"; + private const string PART_Ellipse = "Ellipse"; + + #region Dependency Properties + + public static readonly DependencyProperty FromNameProperty = DependencyProperty.Register(nameof(FromName), typeof(string), typeof(ImagePreviewControl), new PropertyMetadata(string.Empty, OnAddressInformationChanged)); + public static readonly DependencyProperty FromAddressProperty = DependencyProperty.Register(nameof(FromAddress), typeof(string), typeof(ImagePreviewControl), new PropertyMetadata(string.Empty, OnAddressInformationChanged)); + public static readonly DependencyProperty IsKnownProperty = DependencyProperty.Register(nameof(IsKnown), typeof(bool), typeof(ImagePreviewControl), new PropertyMetadata(false)); + + public string FromName + { + get { return (string)GetValue(FromNameProperty); } + set { SetValue(FromNameProperty, value); } + } + + public string FromAddress + { + get { return (string)GetValue(FromAddressProperty); } + set { SetValue(FromAddressProperty, value); } + } + + public bool IsKnown + { + get { return (bool)GetValue(IsKnownProperty); } + set { SetValue(IsKnownProperty, value); } + } + + + + #endregion + + private Ellipse Ellipse; + private Grid InitialsGrid; + private TextBlock InitialsTextblock; + private Image KnownHostImage; + + public ImagePreviewControl() + { + DefaultStyleKey = nameof(ImagePreviewControl); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + InitialsGrid = GetTemplateChild(PART_EllipseInitialsGrid) as Grid; + InitialsTextblock = GetTemplateChild(PART_InitialsTextBlock) as TextBlock; + KnownHostImage = GetTemplateChild(PART_KnownHostImage) as Image; + Ellipse = GetTemplateChild(PART_Ellipse) as Ellipse; + + UpdateInformation(); + } + + private static void OnAddressInformationChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is ImagePreviewControl control) + control.UpdateInformation(); + } + + private void UpdateInformation() + { + if (KnownHostImage == null || InitialsGrid == null || InitialsTextblock == null || (string.IsNullOrEmpty(FromName) && string.IsNullOrEmpty(FromAddress))) + return; + + var host = ThumbnailService.GetHost(FromAddress); + + if (!string.IsNullOrEmpty(host)) + { + var tuple = ThumbnailService.CheckIsKnown(host); + + IsKnown = tuple.Item1; + host = tuple.Item2; + } + + if (IsKnown) + { + // Unrealize others. + + KnownHostImage.Visibility = Visibility.Visible; + InitialsGrid.Visibility = Visibility.Collapsed; + + // Apply company logo. + KnownHostImage.Source = new BitmapImage(new Uri(ThumbnailService.GetKnownHostImage(host))); + } + else + { + KnownHostImage.Visibility = Visibility.Collapsed; + InitialsGrid.Visibility = Visibility.Visible; + + var colorHash = new ColorHash(); + var rgb = colorHash.Rgb(FromAddress); + + Ellipse.Fill = new SolidColorBrush(Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B)); + + InitialsTextblock.Text = ExtractInitialsFromName(FromName); + } + } + + public string ExtractInitialsFromName(string name) + { + // Change from name to from address in case of name doesn't exists. + if (string.IsNullOrEmpty(name)) + { + name = FromAddress; + } + + // first remove all: punctuation, separator chars, control chars, and numbers (unicode style regexes) + string initials = Regex.Replace(name, @"[\p{P}\p{S}\p{C}\p{N}]+", ""); + + // Replacing all possible whitespace/separator characters (unicode style), with a single, regular ascii space. + initials = Regex.Replace(initials, @"\p{Z}+", " "); + + // Remove all Sr, Jr, I, II, III, IV, V, VI, VII, VIII, IX at the end of names + initials = Regex.Replace(initials.Trim(), @"\s+(?:[JS]R|I{1,3}|I[VX]|VI{0,3})$", "", RegexOptions.IgnoreCase); + + // Extract up to 2 initials from the remaining cleaned name. + initials = Regex.Replace(initials, @"^(\p{L})[^\s]*(?:\s+(?:\p{L}+\s+(?=\p{L}))?(?:(\p{L})\p{L}*)?)?$", "$1$2").Trim(); + + if (initials.Length > 2) + { + // Worst case scenario, everything failed, just grab the first two letters of what we have left. + initials = initials.Substring(0, 2); + } + + return initials.ToUpperInvariant(); + } + } +} diff --git a/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml new file mode 100644 index 00000000..2e0e45b5 --- /dev/null +++ b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs new file mode 100644 index 00000000..4aee47b7 --- /dev/null +++ b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs @@ -0,0 +1,282 @@ +using System; +using System.ComponentModel; +using System.Numerics; +using System.Windows.Input; +using Microsoft.UI.Xaml.Controls; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Input; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Controls +{ + public sealed partial class MailItemDisplayInformationControl : UserControl, INotifyPropertyChanged + { + public ImagePreviewControl GetImagePreviewControl() => ContactImage; + + public static readonly DependencyProperty DisplayModeProperty = DependencyProperty.Register(nameof(DisplayMode), typeof(MailListDisplayMode), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailListDisplayMode.Spacious)); + public static readonly DependencyProperty ShowPreviewTextProperty = DependencyProperty.Register(nameof(ShowPreviewText), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty SnippetProperty = DependencyProperty.Register(nameof(Snippet), typeof(string), typeof(MailItemDisplayInformationControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty FromNameProperty = DependencyProperty.Register(nameof(FromName), typeof(string), typeof(MailItemDisplayInformationControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty SubjectProperty = DependencyProperty.Register(nameof(Subject), typeof(string), typeof(MailItemDisplayInformationControl), new PropertyMetadata("(no-subject)")); + public static readonly DependencyProperty IsReadProperty = DependencyProperty.Register(nameof(IsRead), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsFlaggedProperty = DependencyProperty.Register(nameof(IsFlagged), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty FromAddressProperty = DependencyProperty.Register(nameof(FromAddress), typeof(string), typeof(MailItemDisplayInformationControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty HasAttachmentsProperty = DependencyProperty.Register(nameof(HasAttachments), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsCustomFocusedProperty = DependencyProperty.Register(nameof(IsCustomFocused), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty ReceivedDateProperty = DependencyProperty.Register(nameof(ReceivedDate), typeof(DateTime), typeof(MailItemDisplayInformationControl), new PropertyMetadata(default(DateTime))); + public static readonly DependencyProperty IsDraftProperty = DependencyProperty.Register(nameof(IsDraft), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsAvatarVisibleProperty = DependencyProperty.Register(nameof(IsAvatarVisible), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty IsSubjectVisibleProperty = DependencyProperty.Register(nameof(IsSubjectVisible), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty ConnectedExpanderProperty = DependencyProperty.Register(nameof(ConnectedExpander), typeof(Expander), typeof(MailItemDisplayInformationControl), new PropertyMetadata(null)); + public static readonly DependencyProperty LeftHoverActionProperty = DependencyProperty.Register(nameof(LeftHoverAction), typeof(MailOperation), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailOperation.None)); + public static readonly DependencyProperty CenterHoverActionProperty = DependencyProperty.Register(nameof(CenterHoverAction), typeof(MailOperation), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailOperation.None)); + public static readonly DependencyProperty RightHoverActionProperty = DependencyProperty.Register(nameof(RightHoverAction), typeof(MailOperation), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailOperation.None)); + public static readonly DependencyProperty HoverActionExecutedCommandProperty = DependencyProperty.Register(nameof(HoverActionExecutedCommand), typeof(ICommand), typeof(MailItemDisplayInformationControl), new PropertyMetadata(null)); + public static readonly DependencyProperty MailItemProperty = DependencyProperty.Register(nameof(MailItem), typeof(IMailItem), typeof(MailItemDisplayInformationControl), new PropertyMetadata(null)); + public static readonly DependencyProperty IsHoverActionsEnabledProperty = DependencyProperty.Register(nameof(IsHoverActionsEnabled), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty Prefer24HourTimeFormatProperty = DependencyProperty.Register(nameof(Prefer24HourTimeFormat), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + + public bool Prefer24HourTimeFormat + { + get { return (bool)GetValue(Prefer24HourTimeFormatProperty); } + set { SetValue(Prefer24HourTimeFormatProperty, value); } + } + + public bool IsHoverActionsEnabled + { + get { return (bool)GetValue(IsHoverActionsEnabledProperty); } + set { SetValue(IsHoverActionsEnabledProperty, value); } + } + + public IMailItem MailItem + { + get { return (IMailItem)GetValue(MailItemProperty); } + set { SetValue(MailItemProperty, value); } + } + + public ICommand HoverActionExecutedCommand + { + get { return (ICommand)GetValue(HoverActionExecutedCommandProperty); } + set { SetValue(HoverActionExecutedCommandProperty, value); } + } + + public MailOperation LeftHoverAction + { + get { return (MailOperation)GetValue(LeftHoverActionProperty); } + set { SetValue(LeftHoverActionProperty, value); } + } + + public MailOperation CenterHoverAction + { + get { return (MailOperation)GetValue(CenterHoverActionProperty); } + set { SetValue(CenterHoverActionProperty, value); } + } + + public MailOperation RightHoverAction + { + get { return (MailOperation)GetValue(RightHoverActionProperty); } + set { SetValue(RightHoverActionProperty, value); } + } + + + public event PropertyChangedEventHandler PropertyChanged; + + public Expander ConnectedExpander + { + get { return (Expander)GetValue(ConnectedExpanderProperty); } + set { SetValue(ConnectedExpanderProperty, value); } + } + + public bool IsSubjectVisible + { + get { return (bool)GetValue(IsSubjectVisibleProperty); } + set { SetValue(IsSubjectVisibleProperty, value); } + } + + public bool IsAvatarVisible + { + get { return (bool)GetValue(IsAvatarVisibleProperty); } + set { SetValue(IsAvatarVisibleProperty, value); } + } + + public bool IsDraft + { + get { return (bool)GetValue(IsDraftProperty); } + set { SetValue(IsDraftProperty, value); } + } + + public DateTime ReceivedDate + { + get { return (DateTime)GetValue(ReceivedDateProperty); } + set { SetValue(ReceivedDateProperty, value); } + } + public bool IsCustomFocused + { + get { return (bool)GetValue(IsCustomFocusedProperty); } + set { SetValue(IsCustomFocusedProperty, value); } + } + + public bool HasAttachments + { + get { return (bool)GetValue(HasAttachmentsProperty); } + set { SetValue(HasAttachmentsProperty, value); } + } + + public bool IsRead + { + get { return (bool)GetValue(IsReadProperty); } + set { SetValue(IsReadProperty, value); } + } + + public bool IsFlagged + { + get { return (bool)GetValue(IsFlaggedProperty); } + set { SetValue(IsFlaggedProperty, value); } + } + + public string FromAddress + { + get { return (string)GetValue(FromAddressProperty); } + set + { + SetValue(FromAddressProperty, value); + + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayName))); + } + } + + public string DisplayName + { + get + { + if (string.IsNullOrEmpty(FromName)) + return FromAddress; + + return FromName; + } + } + public string FromName + { + get => (string)GetValue(FromNameProperty); + set + { + SetValue(FromNameProperty, value); + + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayName))); + } + } + + public string Subject + { + get { return (string)GetValue(SubjectProperty); } + set { SetValue(SubjectProperty, value); } + } + + public string Snippet + { + get { return (string)GetValue(SnippetProperty); } + set { SetValue(SnippetProperty, value); } + } + + public bool ShowPreviewText + { + get { return (bool)GetValue(ShowPreviewTextProperty); } + set { SetValue(ShowPreviewTextProperty, value); } + } + + public MailListDisplayMode DisplayMode + { + get { return (MailListDisplayMode)GetValue(DisplayModeProperty); } + set { SetValue(DisplayModeProperty, value); } + } + + private bool tappedHandlingFlag = false; + + public MailItemDisplayInformationControl() + { + this.InitializeComponent(); + + var compositor = this.Visual().Compositor; + + var leftBackgroundVisual = compositor.CreateSpriteVisual(); + RootContainerVisualWrapper.SetChildVisual(leftBackgroundVisual); + MainContentContainer.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + + RootContainer.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + ContentGrid.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + ContentStackpanel.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + IconsContainer.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + + RootContainerVisualWrapper.SizeChanged += (s, e) => leftBackgroundVisual.Size = e.NewSize.ToVector2(); + } + + private void ControlPointerEntered(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) + { + if (IsHoverActionsEnabled) + { + HoverActionButtons.Visibility = Visibility.Visible; + } + } + + private void ControlPointerExited(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) + { + if (IsHoverActionsEnabled) + { + HoverActionButtons.Visibility = Visibility.Collapsed; + } + } + + private void ExecuteHoverAction(MailOperation operation) + { + MailOperationPreperationRequest package = null; + + if (MailItem is MailItemViewModel mailItemViewModel) + package = new MailOperationPreperationRequest(operation, mailItemViewModel.MailCopy, toggleExecution: true); + else if (MailItem is ThreadMailItemViewModel threadMailItemViewModel) + package = new MailOperationPreperationRequest(operation, threadMailItemViewModel.GetMailCopies(), toggleExecution: true); + + if (package == null) return; + + tappedHandlingFlag = true; + + HoverActionExecutedCommand?.Execute(package); + } + + private void ThreadHeaderTapped(object sender, TappedRoutedEventArgs e) + { + // Due to CanDrag=True, outer expander doesn't get the click event and it doesn't expand. We expand here manually. + // Also hover action button clicks will be delegated here after the execution runs. + // We should not expand the thread if the reason we are here is for hover actions. + + if (tappedHandlingFlag) + { + tappedHandlingFlag = false; + e.Handled = true; + return; + } + + if (ConnectedExpander == null) return; + + ConnectedExpander.IsExpanded = !ConnectedExpander.IsExpanded; + } + + private void FirstActionClicked(object sender, RoutedEventArgs e) + { + ExecuteHoverAction(LeftHoverAction); + } + + private void SecondActionClicked(object sender, RoutedEventArgs e) + { + ExecuteHoverAction(CenterHoverAction); + } + + private void ThirdActionClicked(object sender, RoutedEventArgs e) + { + ExecuteHoverAction(RightHoverAction); + } + } +} diff --git a/Wino.Mail/Controls/RendererCommandBar.cs b/Wino.Mail/Controls/RendererCommandBar.cs new file mode 100644 index 00000000..693a7597 --- /dev/null +++ b/Wino.Mail/Controls/RendererCommandBar.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Windows.Input; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Menus; +using Wino.Helpers; +using Wino.MenuFlyouts; + +namespace Wino.Controls +{ + public class RendererCommandBar : CommandBar, IDisposable + { + public static readonly DependencyProperty MenuItemsProperty = DependencyProperty.Register(nameof(MenuItemsProperty), typeof(ObservableCollection), typeof(RendererCommandBar), new PropertyMetadata(null, OnMenuItemsChanged)); + public static readonly DependencyProperty OperationClickedCommandProperty = DependencyProperty.Register(nameof(OperationClickedCommand), typeof(ICommand), typeof(RendererCommandBar), new PropertyMetadata(null)); + + public ICommand OperationClickedCommand + { + get { return (ICommand)GetValue(OperationClickedCommandProperty); } + set { SetValue(OperationClickedCommandProperty, value); } + } + + public ObservableCollection MenuItems + { + get { return (ObservableCollection)GetValue(MenuItemsProperty); } + set { SetValue(MenuItemsProperty, value); } + } + + public RendererCommandBar() + { + this.DefaultStyleKey = typeof(CommandBar); + } + + private static void OnMenuItemsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is RendererCommandBar commandBar) + { + if (args.OldValue != null) + commandBar.UnregisterButtonCollection(args.NewValue as ObservableCollection); + + if (args.NewValue != null) + commandBar.RegisterButtonCollection(args.NewValue as ObservableCollection); + } + } + + private void RegisterButtonCollection(ObservableCollection collection) + { + collection.CollectionChanged -= ButtonCollectionChanged; + collection.CollectionChanged += ButtonCollectionChanged; + + InitItems(collection); + } + + private void UnregisterButtonCollection(ObservableCollection collection) + { + collection.CollectionChanged -= ButtonCollectionChanged; + } + + // One time initializer on registration. + private void InitItems(IEnumerable items) + { + foreach (var item in items) + { + var operationText = XamlHelpers.GetOperationString(item.Operation); + + var operationAppBarItem = new AppBarButton() + { + Label = operationText + }; + + ToolTipService.SetToolTip(operationAppBarItem, operationText); + + PrimaryCommands.Add(operationAppBarItem); + } + } + + private void ButtonCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Reset) + { + PrimaryCommands.Clear(); + SecondaryCommands.Clear(); + } + + if (e.NewItems != null) + { + foreach (var newItem in e.NewItems) + { + if (newItem is MailOperationMenuItem item) + { + var button = new RendererCommandBarItem(item.Operation, Clicked) + { + IsEnabled = item.IsEnabled + }; + + if (!item.IsSecondaryMenuPreferred) + PrimaryCommands.Add(button); + else + SecondaryCommands.Add(button); + } + } + } + } + + private void Clicked(MailOperation operation) + { + OperationClickedCommand?.Execute(operation); + } + + private void DisposeMenuItems() + { + foreach (var item in this.PrimaryCommands) + { + if (item is RendererCommandBarItem rendererCommandBarItem) + { + rendererCommandBarItem.Dispose(); + } + } + + foreach (var item in this.SecondaryCommands) + { + if (item is RendererCommandBarItem rendererCommandBarItem) + { + rendererCommandBarItem.Dispose(); + } + } + } + + public void Dispose() + { + DisposeMenuItems(); + } + } +} diff --git a/Wino.Mail/Controls/SettingsMenuItemControl.cs b/Wino.Mail/Controls/SettingsMenuItemControl.cs new file mode 100644 index 00000000..b37b45f7 --- /dev/null +++ b/Wino.Mail/Controls/SettingsMenuItemControl.cs @@ -0,0 +1,73 @@ +using System; +using System.Windows.Input; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace Wino.Controls +{ + /// + /// Templated button for each setting in Settings Dialog. + /// + public class SettingsMenuItemControl : Control + { + public string Title + { + get { return (string)GetValue(TitleProperty); } + set { SetValue(TitleProperty, value); } + } + + public string Description + { + get { return (string)GetValue(DescriptionProperty); } + set { SetValue(DescriptionProperty, value); } + } + + public FrameworkElement Icon + { + get { return (FrameworkElement)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + + + public ICommand Command + { + get { return (ICommand)GetValue(CommandProperty); } + set { SetValue(CommandProperty, value); } + } + + + + public object CommandParameter + { + get { return (object)GetValue(CommandParameterProperty); } + set { SetValue(CommandParameterProperty, value); } + } + + public bool IsClickable + { + get { return (bool)GetValue(IsClickableProperty); } + set { SetValue(IsClickableProperty, value); } + } + + public bool IsNavigateIconVisible + { + get { return (bool)GetValue(IsNavigateIconVisibleProperty); } + set { SetValue(IsNavigateIconVisibleProperty, value); } + } + + public FrameworkElement SideContent + { + get { return (FrameworkElement)GetValue(SideContentProperty); } + set { SetValue(SideContentProperty, value); } + } + + public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(nameof(CommandParameter), typeof(object), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty SideContentProperty = DependencyProperty.Register(nameof(SideContent), typeof(FrameworkElement), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty IsClickableProperty = DependencyProperty.Register(nameof(IsClickable), typeof(bool), typeof(SettingsMenuItemControl), new PropertyMetadata(true)); + public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(nameof(Command), typeof(ICommand), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(FrameworkElement), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register(nameof(Description), typeof(string), typeof(SettingsMenuItemControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(SettingsMenuItemControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty IsNavigateIconVisibleProperty = DependencyProperty.Register(nameof(IsNavigateIconVisible), typeof(bool), typeof(SettingsMenuItemControl), new PropertyMetadata(true)); + } +} diff --git a/Wino.Mail/Controls/WinoFontIcon.cs b/Wino.Mail/Controls/WinoFontIcon.cs new file mode 100644 index 00000000..ba5c9cc3 --- /dev/null +++ b/Wino.Mail/Controls/WinoFontIcon.cs @@ -0,0 +1,96 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace Wino.Controls +{ + public enum WinoIconGlyph + { + None, + NewMail, + Google, + Microsoft, + CustomServer, + Archive, + UnArchive, + Reply, + ReplyAll, + LightEditor, + DarkEditor, + Delete, + Move, + Mail, + Draft, + Flag, + ClearFlag, + Folder, + Forward, + Inbox, + MarkRead, + MarkUnread, + Send, + Save, + Sync, + MultiSelect, + Zoom, + Pin, + UnPin, + Ignore, + Star, + CreateFolder, + Junk, + More, + Find, + SpecialFolderInbox, + SpecialFolderStarred, + SpecialFolderImportant, + SpecialFolderSent, + SpecialFolderDraft, + SpecialFolderArchive, + SpecialFolderDeleted, + SpecialFolderJunk, + SpecialFolderChat, + SpecialFolderCategory, + SpecialFolderUnread, + SpecialFolderForums, + SpecialFolderUpdated, + SpecialFolderPersonal, + SpecialFolderPromotions, + SpecialFolderSocial, + SpecialFolderOther, + SpecialFolderMore, + TurnOfNotifications, + EmptyFolder, + Rename, + DontSync + } + + public class WinoFontIcon : FontIcon + { + public WinoIconGlyph Icon + { + get { return (WinoIconGlyph)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(WinoIconGlyph), typeof(WinoFontIcon), new PropertyMetadata(WinoIconGlyph.Flag, OnIconChanged)); + + public WinoFontIcon() + { + FontFamily = new Windows.UI.Xaml.Media.FontFamily("ms-appx:///Assets/WinoIcons.ttf#WinoIcons"); + FontSize = 32; + } + + private static void OnIconChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoFontIcon fontIcon) + { + fontIcon.UpdateGlyph(); + } + } + + private void UpdateGlyph() + { + Glyph = ControlConstants.WinoIconFontDictionary[Icon]; + } + } +} diff --git a/Wino.Mail/Controls/WinoFontIconSource.cs b/Wino.Mail/Controls/WinoFontIconSource.cs new file mode 100644 index 00000000..150bf2d8 --- /dev/null +++ b/Wino.Mail/Controls/WinoFontIconSource.cs @@ -0,0 +1,34 @@ +using Windows.UI.Xaml; + +namespace Wino.Controls +{ + public class WinoFontIconSource : Microsoft.UI.Xaml.Controls.FontIconSource + { + public WinoIconGlyph Icon + { + get { return (WinoIconGlyph)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(WinoIconGlyph), typeof(WinoFontIconSource), new PropertyMetadata(WinoIconGlyph.Flag, OnIconChanged)); + + public WinoFontIconSource() + { + FontFamily = new Windows.UI.Xaml.Media.FontFamily("ms-appx:///Assets/WinoIcons.ttf#WinoIcons"); + FontSize = 32; + } + + private static void OnIconChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoFontIconSource fontIcon) + { + fontIcon.UpdateGlyph(); + } + } + + private void UpdateGlyph() + { + Glyph = ControlConstants.WinoIconFontDictionary[Icon]; + } + } +} diff --git a/Wino.Mail/Controls/WinoInfoBar.cs b/Wino.Mail/Controls/WinoInfoBar.cs new file mode 100644 index 00000000..6f2e288e --- /dev/null +++ b/Wino.Mail/Controls/WinoInfoBar.cs @@ -0,0 +1,91 @@ +using System; +using System.Numerics; +using CommunityToolkit.WinUI.Animations; +using Microsoft.UI.Xaml.Controls; +using Windows.UI.Xaml; +using Wino.Core.Domain.Enums; + +namespace Wino.Controls +{ + public class WinoInfoBar : InfoBar + { + public static readonly DependencyProperty AnimationTypeProperty = DependencyProperty.Register(nameof(AnimationType), typeof(InfoBarAnimationType), typeof(WinoInfoBar), new PropertyMetadata(InfoBarAnimationType.SlideFromRightToLeft)); + public static readonly DependencyProperty DismissIntervalProperty = DependencyProperty.Register(nameof(DismissInterval), typeof(int), typeof(WinoInfoBar), new PropertyMetadata(5, new PropertyChangedCallback(OnDismissIntervalChanged))); + + public InfoBarAnimationType AnimationType + { + get { return (InfoBarAnimationType)GetValue(AnimationTypeProperty); } + set { SetValue(AnimationTypeProperty, value); } + } + + public int DismissInterval + { + get { return (int)GetValue(DismissIntervalProperty); } + set { SetValue(DismissIntervalProperty, value); } + } + + private readonly DispatcherTimer _dispatcherTimer = new DispatcherTimer(); + + public WinoInfoBar() + { + RegisterPropertyChangedCallback(IsOpenProperty, IsOpenChanged); + + _dispatcherTimer.Interval = TimeSpan.FromSeconds(DismissInterval); + } + + private static void OnDismissIntervalChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoInfoBar bar) + { + bar.UpdateInterval(bar.DismissInterval); + } + } + + private void UpdateInterval(int seconds) => _dispatcherTimer.Interval = TimeSpan.FromSeconds(seconds); + + private async void IsOpenChanged(DependencyObject sender, DependencyProperty dp) + { + if (sender is WinoInfoBar control) + { + // Message shown. + if (!control.IsOpen) return; + + Opacity = 1; + + _dispatcherTimer.Stop(); + + _dispatcherTimer.Tick -= TimerTick; + _dispatcherTimer.Tick += TimerTick; + + _dispatcherTimer.Start(); + + // Slide from right. + if (AnimationType == InfoBarAnimationType.SlideFromRightToLeft) + { + await AnimationBuilder.Create().Translation(new Vector3(0, 0, 0), new Vector3(150, 0, 0), null, TimeSpan.FromSeconds(0.5)).StartAsync(this); + } + else if (AnimationType == InfoBarAnimationType.SlideFromBottomToTop) + { + await AnimationBuilder.Create().Translation(new Vector3(0, 0, 0), new Vector3(0, 50, 0), null, TimeSpan.FromSeconds(0.5)).StartAsync(this); + } + } + } + + private async void TimerTick(object sender, object e) + { + _dispatcherTimer.Stop(); + _dispatcherTimer.Tick -= TimerTick; + + if (AnimationType == InfoBarAnimationType.SlideFromRightToLeft) + { + await AnimationBuilder.Create().Translation(new Vector3((float)ActualWidth, 0, 0), new Vector3(0, 0, 0), null, TimeSpan.FromSeconds(0.5)).StartAsync(this); + } + else if (AnimationType == InfoBarAnimationType.SlideFromBottomToTop) + { + await AnimationBuilder.Create().Translation(new Vector3(0, (float)ActualHeight, 0), new Vector3(0, 0, 0), null, TimeSpan.FromSeconds(0.5)).StartAsync(this); + } + + IsOpen = false; + } + } +} diff --git a/Wino.Mail/Controls/WinoNavigationViewItem.cs b/Wino.Mail/Controls/WinoNavigationViewItem.cs new file mode 100644 index 00000000..e28070b8 --- /dev/null +++ b/Wino.Mail/Controls/WinoNavigationViewItem.cs @@ -0,0 +1,47 @@ +using System.Numerics; +using Microsoft.UI.Xaml.Controls; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Hosting; + +namespace Wino.Controls +{ + public class WinoNavigationViewItem : NavigationViewItem + { + public bool IsDraggingItemOver + { + get { return (bool)GetValue(IsDraggingItemOverProperty); } + set { SetValue(IsDraggingItemOverProperty, value); } + } + + public static readonly DependencyProperty IsDraggingItemOverProperty = DependencyProperty.Register(nameof(IsDraggingItemOver), typeof(bool), typeof(WinoNavigationViewItem), new PropertyMetadata(false, OnIsDraggingItemOverChanged)); + + private static void OnIsDraggingItemOverChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoNavigationViewItem control) + control.UpdateDragEnterState(); + } + + private void UpdateDragEnterState() + { + // TODO: Add animation. Maybe after overriding DragUI in shell? + + //if (IsDraggingItemOver) + //{ + // ScaleAnimation(new System.Numerics.Vector3(1.2f, 1.2f, 1.2f)); + //} + //else + //{ + // ScaleAnimation(new System.Numerics.Vector3(1f, 1f, 1f)); + //} + } + + private void ScaleAnimation(Vector3 vector) + { + if (this.Content is UIElement content) + { + var visual = ElementCompositionPreview.GetElementVisual(content); + visual.Scale = vector; + } + } + } +} diff --git a/Wino.Mail/Controls/WinoPivotControl.xaml b/Wino.Mail/Controls/WinoPivotControl.xaml new file mode 100644 index 00000000..a524e6d3 --- /dev/null +++ b/Wino.Mail/Controls/WinoPivotControl.xaml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Controls/WinoPivotControl.xaml.cs b/Wino.Mail/Controls/WinoPivotControl.xaml.cs new file mode 100644 index 00000000..975871bc --- /dev/null +++ b/Wino.Mail/Controls/WinoPivotControl.xaml.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Numerics; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI; +using Windows.UI.Composition; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; +using Wino.Extensions; + +namespace Wino.Controls +{ + // TODO: Memory leak with FolderPivot bindings. + public sealed partial class WinoPivotControl : UserControl + { + private Compositor _compositor; + private ShapeVisual _shapeVisual; + private CompositionSpriteShape _spriteShape; + private CompositionRoundedRectangleGeometry _roundedRectangle; + + public event EventHandler SelectionChanged; + + public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(nameof(SelectedItem), typeof(object), typeof(WinoPivotControl), new PropertyMetadata(null)); + public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), typeof(object), typeof(WinoPivotControl), new PropertyMetadata(null)); + public static readonly DependencyProperty SelectorPipeColorProperty = DependencyProperty.Register(nameof(SelectorPipeColor), typeof(SolidColorBrush), typeof(WinoPivotControl), new PropertyMetadata(Colors.Transparent, OnSelectorPipeColorChanged)); + public static readonly DependencyProperty DataTemplateProperty = DependencyProperty.Register(nameof(DataTemplate), typeof(DataTemplate), typeof(WinoPivotControl), new PropertyMetadata(null)); + + public DataTemplate DataTemplate + { + get { return (DataTemplate)GetValue(DataTemplateProperty); } + set { SetValue(DataTemplateProperty, value); } + } + + public SolidColorBrush SelectorPipeColor + { + get { return (SolidColorBrush)GetValue(SelectorPipeColorProperty); } + set { SetValue(SelectorPipeColorProperty, value); } + } + + public object SelectedItem + { + get { return (object)GetValue(SelectedItemProperty); } + set { SetValue(SelectedItemProperty, value); } + } + + public object ItemsSource + { + get { return (object)GetValue(ItemsSourceProperty); } + set { SetValue(ItemsSourceProperty, value); } + } + + private static void OnSelectorPipeColorChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoPivotControl control) + { + control.UpdateSelectorPipeColor(); + } + } + + private void UpdateSelectorPipeColor() + { + if (_spriteShape != null && _compositor != null) + { + _spriteShape.FillBrush = _compositor.CreateColorBrush(SelectorPipeColor.Color); + } + } + + private void CreateSelectorVisuals() + { + _compositor = this.Visual().Compositor; + + _roundedRectangle = _compositor.CreateRoundedRectangleGeometry(); + _roundedRectangle.CornerRadius = new Vector2(3, 3); + + _spriteShape = _compositor.CreateSpriteShape(_roundedRectangle); + _spriteShape.CenterPoint = new Vector2(100, 100); + + _shapeVisual = _compositor.CreateShapeVisual(); + + _shapeVisual.Shapes.Clear(); + _shapeVisual.Shapes.Add(_spriteShape); + + SelectorPipe.SetChildVisual(_shapeVisual); + + _shapeVisual.EnableImplicitAnimation(VisualPropertyType.Size, 400); + } + + public WinoPivotControl() + { + this.InitializeComponent(); + + CreateSelectorVisuals(); + } + + private bool IsContainerPresent() + { + return SelectedItem != null && PivotHeaders.ContainerFromItem(SelectedItem) != null; + } + + private void PivotHeaders_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + UpdateVisuals(); + + SelectionChanged?.Invoke(sender, e); + } + + private void UpdateVisuals() + { + MoveSelector(); + } + + private void UpdateSelectorVisibility() + { + SelectorPipe.Visibility = IsContainerPresent() ? Visibility.Visible : Visibility.Collapsed; + } + + private async void MoveSelector() + { + if (PivotHeaders.SelectedItem != null) + { + // Get selected item container position + // TODO: It's bad... + while(PivotHeaders.ContainerFromItem(PivotHeaders.SelectedItem) == null) + { + await Task.Delay(100); + } + + UpdateSelectorVisibility(); + + var container = PivotHeaders.ContainerFromItem(PivotHeaders.SelectedItem) as FrameworkElement; + + if (container != null) + { + var transformToVisual = container.TransformToVisual(this); + Point screenCoords = transformToVisual.TransformPoint(new Point(0, 0)); + + float actualWidth = 0, leftMargin = 0, translateX = 0; + + leftMargin = (float)(screenCoords.X); + + if (PivotHeaders.Items.Count > 1) + { + // Multiple items, pipe is centered. + + actualWidth = (float)(container.ActualWidth + 12) / 2; + translateX = leftMargin - 10 + (actualWidth / 2); + } + else + { + actualWidth = (float)(container.ActualWidth) - 12; + translateX = leftMargin + 4; + } + + SelectorPipe.Width = actualWidth; + SelectorPipe.Translation = new Vector3(translateX, 0, 0); + } + else + { + Debug.WriteLine("Container null"); + } + } + } + + private void SelectorPipeSizeChanged(object sender, SizeChangedEventArgs e) + { + _roundedRectangle.Size = e.NewSize.ToVector2(); + _shapeVisual.Size = e.NewSize.ToVector2(); + } + + private void ControlUnloaded(object sender, RoutedEventArgs e) + { + //PivotHeaders.SelectionChanged -= PivotHeaders_SelectionChanged; + //PivotHeaders.SelectedItem = null; + + //SelectedItem = null; + //ItemsSource = null; + } + + private void ControlLoaded(object sender, RoutedEventArgs e) + { + // Bindings.Update(); + } + } +} diff --git a/Wino.Mail/Controls/WinoSwipeControlItems.cs b/Wino.Mail/Controls/WinoSwipeControlItems.cs new file mode 100644 index 00000000..eb5cef74 --- /dev/null +++ b/Wino.Mail/Controls/WinoSwipeControlItems.cs @@ -0,0 +1,82 @@ +using System.Linq; +using Microsoft.UI.Xaml.Controls; +using Windows.UI.Xaml; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Helpers; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Controls +{ + public class WinoSwipeControlItems : SwipeItems + { + public static readonly DependencyProperty SwipeOperationProperty = DependencyProperty.Register(nameof(SwipeOperation), typeof(MailOperation), typeof(WinoSwipeControlItems), new PropertyMetadata(default(MailOperation), new PropertyChangedCallback(OnItemsChanged))); + public static readonly DependencyProperty MailItemProperty = DependencyProperty.Register(nameof(MailItem), typeof(IMailItem), typeof(WinoSwipeControlItems), new PropertyMetadata(null)); + + public IMailItem MailItem + { + get { return (IMailItem)GetValue(MailItemProperty); } + set { SetValue(MailItemProperty, value); } + } + + + public MailOperation SwipeOperation + { + get { return (MailOperation)GetValue(SwipeOperationProperty); } + set { SetValue(SwipeOperationProperty, value); } + } + + private static void OnItemsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoSwipeControlItems control) + { + control.BuildSwipeItems(); + } + } + + private void BuildSwipeItems() + { + this.Clear(); + + var swipeItem = GetSwipeItem(SwipeOperation); + + this.Add(swipeItem); + } + + private SwipeItem GetSwipeItem(MailOperation operation) + { + if (MailItem == null) return null; + + var finalOperation = operation; + + bool isSingleItem = MailItem is MailItemViewModel; + + if (isSingleItem) + { + var singleItem = MailItem as MailItemViewModel; + + if (operation == MailOperation.MarkAsRead && singleItem.IsRead) + finalOperation = MailOperation.MarkAsUnread; + else if (operation == MailOperation.MarkAsUnread && !singleItem.IsRead) + finalOperation = MailOperation.MarkAsRead; + } + else + { + var threadItem = MailItem as ThreadMailItemViewModel; + + if (operation == MailOperation.MarkAsRead && threadItem.ThreadItems.All(a => a.IsRead)) + finalOperation = MailOperation.MarkAsUnread; + else if (operation == MailOperation.MarkAsUnread && threadItem.ThreadItems.All(a => !a.IsRead)) + finalOperation = MailOperation.MarkAsRead; + } + + var item = new SwipeItem() + { + IconSource = new WinoFontIconSource() { Icon = XamlHelpers.GetWinoIconGlyph(finalOperation) }, + Text = XamlHelpers.GetOperationString(finalOperation), + }; + + return item; + } + } +} diff --git a/Wino.Mail/Converters/ReverseBooleanConverter.cs b/Wino.Mail/Converters/ReverseBooleanConverter.cs new file mode 100644 index 00000000..d706e0a5 --- /dev/null +++ b/Wino.Mail/Converters/ReverseBooleanConverter.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace Wino.Converters +{ + public class ReverseBooleanConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, string language) + { + if (value is bool boolval) + return !boolval; + + return false; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wino.Mail/Converters/ReverseBooleanToVisibilityConverter.cs b/Wino.Mail/Converters/ReverseBooleanToVisibilityConverter.cs new file mode 100644 index 00000000..04eaf98d --- /dev/null +++ b/Wino.Mail/Converters/ReverseBooleanToVisibilityConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace Wino.Converters +{ + public class ReverseBooleanToVisibilityConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, string language) + { + return ((bool)value) ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wino.Mail/Dialogs/AccountCreationDialog.xaml b/Wino.Mail/Dialogs/AccountCreationDialog.xaml new file mode 100644 index 00000000..98cac4d6 --- /dev/null +++ b/Wino.Mail/Dialogs/AccountCreationDialog.xaml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs b/Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs new file mode 100644 index 00000000..d100a983 --- /dev/null +++ b/Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs @@ -0,0 +1,33 @@ +using Wino.Core.Domain.Enums; +using Wino.Helpers; + +namespace Wino.Dialogs +{ + public sealed partial class AccountCreationDialog : BaseAccountCreationDialog + { + public AccountCreationDialog() + { + InitializeComponent(); + } + + public override void UpdateState() + { + switch (State) + { + case AccountCreationDialogState.SigningIn: + StatusText.Text = "Account information is being saved."; + DialogIcon.Data = XamlHelpers.GetPathIcon("SavingAccountPathIcon"); + break; + case AccountCreationDialogState.PreparingFolders: + StatusText.Text = "We are getting folder information at the moment."; + DialogIcon.Data = XamlHelpers.GetPathIcon("PreparingFoldersPathIcon"); + break; + case AccountCreationDialogState.Completed: + StatusText.Text = "All done."; + break; + default: + break; + } + } + } +} diff --git a/Wino.Mail/Dialogs/AccountEditDialog.xaml b/Wino.Mail/Dialogs/AccountEditDialog.xaml new file mode 100644 index 00000000..34cba8f8 --- /dev/null +++ b/Wino.Mail/Dialogs/AccountEditDialog.xaml @@ -0,0 +1,19 @@ + + + + + + diff --git a/Wino.Mail/Dialogs/AccountEditDialog.xaml.cs b/Wino.Mail/Dialogs/AccountEditDialog.xaml.cs new file mode 100644 index 00000000..e158b8b3 --- /dev/null +++ b/Wino.Mail/Dialogs/AccountEditDialog.xaml.cs @@ -0,0 +1,22 @@ +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Entities; + +namespace Wino.Dialogs +{ + public sealed partial class AccountEditDialog : ContentDialog + { + public MailAccount Account { get; private set; } + public bool IsSaved { get; set; } + + public AccountEditDialog(MailAccount account) + { + InitializeComponent(); + Account = account; + } + + private void SaveClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + IsSaved = true; + } + } +} diff --git a/Wino.Mail/Dialogs/AccountPickerDialog.xaml b/Wino.Mail/Dialogs/AccountPickerDialog.xaml new file mode 100644 index 00000000..f06da6d2 --- /dev/null +++ b/Wino.Mail/Dialogs/AccountPickerDialog.xaml @@ -0,0 +1,19 @@ + + + + diff --git a/Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs b/Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs new file mode 100644 index 00000000..9b4c46c4 --- /dev/null +++ b/Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Entities; + +namespace Wino.Dialogs +{ + public sealed partial class AccountPickerDialog : ContentDialog + { + public MailAccount PickedAccount { get; set; } + + public List AvailableAccounts { get; set; } + + public AccountPickerDialog(List availableAccounts) + { + AvailableAccounts = availableAccounts; + + InitializeComponent(); + } + + private void AccountClicked(object sender, ItemClickEventArgs e) + { + PickedAccount = e.ClickedItem as MailAccount; + + Hide(); + } + } +} diff --git a/Wino.Mail/Dialogs/BaseAccountCreationDialog.cs b/Wino.Mail/Dialogs/BaseAccountCreationDialog.cs new file mode 100644 index 00000000..9c928793 --- /dev/null +++ b/Wino.Mail/Dialogs/BaseAccountCreationDialog.cs @@ -0,0 +1,52 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Dialogs +{ + public abstract class BaseAccountCreationDialog : ContentDialog, IAccountCreationDialog + { + public AccountCreationDialogState State + { + get { return (AccountCreationDialogState)GetValue(StateProperty); } + set { SetValue(StateProperty, value); } + } + + public static readonly DependencyProperty StateProperty = DependencyProperty.Register(nameof(State), typeof(AccountCreationDialogState), typeof(BaseAccountCreationDialog), new PropertyMetadata(AccountCreationDialogState.Idle, OnStateChanged)); + + // Prevent users from dismissing it by ESC key. + private void DialogClosing(ContentDialog sender, ContentDialogClosingEventArgs args) + { + if (args.Result == ContentDialogResult.None) + { + args.Cancel = true; + } + } + + public void ShowDialog() + { + _ = ShowAsync(); + } + + public void Complete() + { + State = AccountCreationDialogState.Completed; + + // Unregister from closing event. + Closing -= DialogClosing; + + Hide(); + } + + private static void OnStateChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is BaseAccountCreationDialog dialog) + { + dialog.UpdateState(); + } + } + + public abstract void UpdateState(); + } +} diff --git a/Wino.Mail/Dialogs/ConfirmationDialog.xaml b/Wino.Mail/Dialogs/ConfirmationDialog.xaml new file mode 100644 index 00000000..5f7c5070 --- /dev/null +++ b/Wino.Mail/Dialogs/ConfirmationDialog.xaml @@ -0,0 +1,29 @@ + + + + 250 + 500 + 200 + 756 + + + + diff --git a/Wino.Mail/Dialogs/ConfirmationDialog.xaml.cs b/Wino.Mail/Dialogs/ConfirmationDialog.xaml.cs new file mode 100644 index 00000000..a2257157 --- /dev/null +++ b/Wino.Mail/Dialogs/ConfirmationDialog.xaml.cs @@ -0,0 +1,80 @@ +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Dialogs +{ + public sealed partial class ConfirmationDialog : ContentDialog, IConfirmationDialog + { + private TaskCompletionSource _completionSource; + + #region Dependency Properties + + public string DialogTitle + { + get { return (string)GetValue(DialogTitleProperty); } + set { SetValue(DialogTitleProperty, value); } + } + + public static readonly DependencyProperty DialogTitleProperty = DependencyProperty.Register(nameof(DialogTitle), typeof(string), typeof(ConfirmationDialog), new PropertyMetadata(string.Empty)); + + public string Message + { + get { return (string)GetValue(MessageProperty); } + set { SetValue(MessageProperty, value); } + } + + public static readonly DependencyProperty MessageProperty = DependencyProperty.Register(nameof(Message), typeof(string), typeof(ConfirmationDialog), new PropertyMetadata(string.Empty)); + + public string ApproveButtonTitle + { + get { return (string)GetValue(ApproveButtonTitleProperty); } + set { SetValue(ApproveButtonTitleProperty, value); } + } + + public static readonly DependencyProperty ApproveButtonTitleProperty = DependencyProperty.Register(nameof(ApproveButtonTitle), typeof(string), typeof(ConfirmationDialog), new PropertyMetadata(string.Empty)); + + #endregion + + private bool _isApproved; + public ConfirmationDialog() + { + InitializeComponent(); + } + + public async Task ShowDialogAsync(string title, string message, string approveButtonTitle) + { + _completionSource = new TaskCompletionSource(); + + DialogTitle = title; + Message = message; + ApproveButtonTitle = approveButtonTitle; + +#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed + ShowAsync(); +#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed + + return await _completionSource.Task; + } + + private void DialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) + { + _completionSource.TrySetResult(_isApproved); + } + + private void ApproveClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + _isApproved = true; + + Hide(); + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + _isApproved = false; + + Hide(); + } + } +} diff --git a/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml b/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml new file mode 100644 index 00000000..89e46480 --- /dev/null +++ b/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml @@ -0,0 +1,85 @@ + + + + 600 + 900 + 200 + 756 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs b/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs new file mode 100644 index 00000000..633fce37 --- /dev/null +++ b/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs @@ -0,0 +1,65 @@ +using System; +using CommunityToolkit.WinUI.Helpers; +using Microsoft.Extensions.DependencyInjection; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; +using Wino.Core.Domain.Interfaces; +using Wino.Services; + +namespace Wino.Dialogs +{ + public sealed partial class CustomThemeBuilderDialog : ContentDialog + { + public byte[] WallpaperData { get; private set; } + public string AccentColor { get; private set; } + + private IThemeService _themeService; + + public CustomThemeBuilderDialog() + { + InitializeComponent(); + + _themeService = App.Current.Services.GetService(); + } + + private async void ApplyClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + if (Array.Empty() == WallpaperData) + return; + + var deferal = args.GetDeferral(); + + try + { + await _themeService.CreateNewCustomThemeAsync(ThemeNameBox.Text, AccentColor, WallpaperData); + } + catch (Exception exception) + { + ErrorTextBlock.Text = exception.Message; + } + finally + { + deferal.Complete(); + } + } + + private async void BrowseWallpaperClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) + { + var dialogService = App.Current.Services.GetService(); + + var pickedFileData = await dialogService.PickWindowsFileContentAsync(".jpg", ".png"); + + if (pickedFileData == Array.Empty()) return; + + IsPrimaryButtonEnabled = true; + + WallpaperData = pickedFileData; + } + + private void PickerColorChanged(Microsoft.UI.Xaml.Controls.ColorPicker sender, Microsoft.UI.Xaml.Controls.ColorChangedEventArgs args) + { + PreviewAccentColorGrid.Background = new SolidColorBrush(args.NewColor); + AccentColor = args.NewColor.ToHex(); + } + } +} diff --git a/Wino.Mail/Dialogs/MoveMailDialog.xaml b/Wino.Mail/Dialogs/MoveMailDialog.xaml new file mode 100644 index 00000000..970b300d --- /dev/null +++ b/Wino.Mail/Dialogs/MoveMailDialog.xaml @@ -0,0 +1,59 @@ + + + + 600 + 600 + 756 + 756 + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Dialogs/MoveMailDialog.xaml.cs b/Wino.Mail/Dialogs/MoveMailDialog.xaml.cs new file mode 100644 index 00000000..4c0d92a6 --- /dev/null +++ b/Wino.Mail/Dialogs/MoveMailDialog.xaml.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Dialogs +{ + public sealed partial class MoveMailDialog : ContentDialog + { + public IMailItemFolder SelectedFolder + { + get { return (IMailItemFolder)GetValue(SelectedFolderProperty); } + set { SetValue(SelectedFolderProperty, value); } + } + + public static readonly DependencyProperty SelectedFolderProperty = DependencyProperty.Register(nameof(SelectedFolder), typeof(IMailItemFolder), typeof(MoveMailDialog), new PropertyMetadata(null, OnSelectedFolderChanged)); + + + public List FolderList { get; set; } + + public MoveMailDialog(List allFolders) + { + InitializeComponent(); + + if (allFolders == null) return; + + FolderList = allFolders; + } + + private static void OnSelectedFolderChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MoveMailDialog dialog) + { + dialog.VerifySelection(); + } + } + + private void VerifySelection() + { + if (SelectedFolder != null) + { + // Don't select non-move capable folders like Categories or More. + + if (!SelectedFolder.IsMoveTarget) + { + // Warn users for only proper mail folders. Not ghost folders. + InvalidFolderText.Visibility = Visibility.Visible; + InvalidFolderText.Text = string.Format(Translator.MoveMailDialog_InvalidFolderMessage, SelectedFolder.FolderName); + + if (FolderTreeView.SelectedItem != null) + { + // Toggle the expansion for the selected container if available. + // I don't like the expand arrow touch area. It's better this way. + + if (FolderTreeView.ContainerFromItem(FolderTreeView.SelectedItem) is Microsoft.UI.Xaml.Controls.TreeViewItem container) + { + container.IsExpanded = !container.IsExpanded; + } + } + SelectedFolder = null; + } + else + { + Hide(); + } + } + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + Hide(); + } + } +} diff --git a/Wino.Mail/Dialogs/NewAccountDialog.xaml b/Wino.Mail/Dialogs/NewAccountDialog.xaml new file mode 100644 index 00000000..332c1447 --- /dev/null +++ b/Wino.Mail/Dialogs/NewAccountDialog.xaml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Dialogs/NewAccountDialog.xaml.cs b/Wino.Mail/Dialogs/NewAccountDialog.xaml.cs new file mode 100644 index 00000000..7d36d300 --- /dev/null +++ b/Wino.Mail/Dialogs/NewAccountDialog.xaml.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +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; + +namespace Wino.Dialogs +{ + public sealed partial class NewAccountDialog : ContentDialog + { + /// + /// Gets or sets current selected mail provider in the dialog. + /// + public ProviderDetail SelectedMailProvider + { + get { return (ProviderDetail)GetValue(SelectedMailProviderProperty); } + set { SetValue(SelectedMailProviderProperty, value); } + } + + public static readonly DependencyProperty SelectedMailProviderProperty = DependencyProperty.Register(nameof(SelectedMailProvider), typeof(ProviderDetail), typeof(NewAccountDialog), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedProviderChanged))); + + // List of available mail providers for now. + + public List Providers { get; set; } + + public Tuple AccountInformationTuple = null; + + public NewAccountDialog() + { + InitializeComponent(); + + // AccountColorPicker.Color = Colors.Blue; + } + + private static void OnSelectedProviderChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is NewAccountDialog dialog) + dialog.ValidateCreateButton(); + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + Hide(); + } + + private void CreateClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + ValidateCreateButton(); + + if (IsSecondaryButtonEnabled) + { + AccountInformationTuple = new Tuple(AccountNameTextbox.Text.Trim(), SelectedMailProvider.Type); + Hide(); + } + } + + private void AccountNameChanged(object sender, TextChangedEventArgs e) + { + ValidateCreateButton(); + } + + // Returns whether we can create account or not. + private void ValidateCreateButton() + { + bool shouldEnable = SelectedMailProvider != null + && SelectedMailProvider.IsSupported + && !string.IsNullOrEmpty(AccountNameTextbox.Text); + + IsPrimaryButtonEnabled = shouldEnable; + } + + private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) + { + ValidateCreateButton(); + } + } +} diff --git a/Wino.Mail/Dialogs/NewImapSetupDialog.xaml b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml new file mode 100644 index 00000000..09ffaba7 --- /dev/null +++ b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml @@ -0,0 +1,25 @@ + + + + 0,0,0,0 + + 1920 + + + + + diff --git a/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs new file mode 100644 index 00000000..e2e04581 --- /dev/null +++ b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs @@ -0,0 +1,79 @@ +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media.Animation; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Messages.Mails; +using Wino.Views.ImapSetup; + +namespace Wino.Dialogs +{ + public enum ImapSetupState + { + Welcome, + AutoDiscovery, + TestingConnection, + PreparingFolder + } + + public sealed partial class NewImapSetupDialog : ContentDialog, + IRecipient, + IRecipient, + IRecipient, + ICustomServerAccountCreationDialog + { + private TaskCompletionSource _getServerInfoTaskCompletionSource = new TaskCompletionSource(); + + private bool isDismissRequested = false; + + public NewImapSetupDialog() + { + InitializeComponent(); + + ImapFrame.Navigate(typeof(WelcomeImapSetupPage), null, new DrillInNavigationTransitionInfo()); + } + + // Not used for now. + public AccountCreationDialogState State { get; set; } + + public void Complete() + { + if (!_getServerInfoTaskCompletionSource.Task.IsCompleted) + _getServerInfoTaskCompletionSource.TrySetResult(null); + + isDismissRequested = true; + + Hide(); + } + + public Task GetCustomServerInformationAsync() => _getServerInfoTaskCompletionSource.Task; + + public void Receive(ImapSetupBackNavigationRequested message) + { + ImapFrame.Navigate(message.PageType, message.Parameter, new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromLeft }); + } + + public void Receive(ImapSetupNavigationRequested message) + { + ImapFrame.Navigate(message.PageType, message.Parameter, new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromRight }); + } + + public void Receive(ImapSetupDismissRequested message) => _getServerInfoTaskCompletionSource.TrySetResult(message.CompletedServerInformation); + + public void ShowDialog() => _ = ShowAsync(); + + public void ShowPreparingFolders() + { + ImapFrame.Navigate(typeof(PreparingImapFoldersPage), new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromLeft }); + } + + private void ImapSetupDialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) => WeakReferenceMessenger.Default.UnregisterAll(this); + + private void ImapSetupDialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) => WeakReferenceMessenger.Default.RegisterAll(this); + + // Don't hide the dialog unless dismiss is requested from the inner pages specifically. + private void OnDialogClosing(ContentDialog sender, ContentDialogClosingEventArgs args) => args.Cancel = !isDismissRequested; + } +} diff --git a/Wino.Mail/Dialogs/StoreRatingDialog.xaml b/Wino.Mail/Dialogs/StoreRatingDialog.xaml new file mode 100644 index 00000000..be839312 --- /dev/null +++ b/Wino.Mail/Dialogs/StoreRatingDialog.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/Wino.Mail/Dialogs/StoreRatingDialog.xaml.cs b/Wino.Mail/Dialogs/StoreRatingDialog.xaml.cs new file mode 100644 index 00000000..eb6a771b --- /dev/null +++ b/Wino.Mail/Dialogs/StoreRatingDialog.xaml.cs @@ -0,0 +1,21 @@ +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Dialogs +{ + public sealed partial class StoreRatingDialog : ContentDialog, IStoreRatingDialog + { + public bool DontAskAgain { get; set; } + public bool RateWinoClicked { get; set; } + + public StoreRatingDialog() + { + this.InitializeComponent(); + } + + private void RateClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + RateWinoClicked = true; + } + } +} diff --git a/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml b/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml new file mode 100644 index 00000000..1e634077 --- /dev/null +++ b/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml.cs b/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml.cs new file mode 100644 index 00000000..70aee9d5 --- /dev/null +++ b/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; + +namespace Wino.Dialogs +{ + public sealed partial class SystemFolderConfigurationDialog : ContentDialog + { + private bool canDismissDialog = false; + + public SystemFolderConfiguration Configuration { get; set; } + public List AvailableFolders { get; } + + public MailItemFolder Sent { get; set; } + public MailItemFolder Draft { get; set; } + public MailItemFolder Archive { get; set; } + public MailItemFolder Junk { get; set; } + public MailItemFolder Trash { get; set; } + + public SystemFolderConfigurationDialog(List availableFolders) + { + InitializeComponent(); + + AvailableFolders = availableFolders; + + Sent = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Sent); + Draft = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Draft); + Archive = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Archive); + Junk = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Junk); + Trash = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Deleted); + } + + private void DialogClosing(ContentDialog sender, ContentDialogClosingEventArgs args) + { + args.Cancel = !canDismissDialog; + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + => canDismissDialog = true; + + private void SaveClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + ValidationErrorTextBlock.Text = string.Empty; + + var allSpecialFolders = new List() + { + Sent, Draft, Archive, Trash, Junk + }; + + if (allSpecialFolders.Any(a => a != null && a.SpecialFolderType == SpecialFolderType.Inbox)) + ValidationErrorTextBlock.Text = Translator.SystemFolderConfigDialogValidation_InboxSelected; + + if (new HashSet(allSpecialFolders.Where(a => a != null).Select(x => x.Id)).Count != allSpecialFolders.Where(a => a != null).Count()) + ValidationErrorTextBlock.Text = Translator.SystemFolderConfigDialogValidation_DuplicateSystemFolders; + + // Check if we can save. + if (string.IsNullOrEmpty(ValidationErrorTextBlock.Text)) + { + var configuration = new SystemFolderConfiguration(Sent, Draft, Archive, Trash, Junk); + + canDismissDialog = true; + Configuration = configuration; + } + } + } +} diff --git a/Wino.Mail/Dialogs/TextInputDialog.xaml b/Wino.Mail/Dialogs/TextInputDialog.xaml new file mode 100644 index 00000000..ec60be81 --- /dev/null +++ b/Wino.Mail/Dialogs/TextInputDialog.xaml @@ -0,0 +1,29 @@ + + + + 400 + 400 + 200 + 756 + + + + + + + diff --git a/Wino.Mail/Dialogs/TextInputDialog.xaml.cs b/Wino.Mail/Dialogs/TextInputDialog.xaml.cs new file mode 100644 index 00000000..38c841ae --- /dev/null +++ b/Wino.Mail/Dialogs/TextInputDialog.xaml.cs @@ -0,0 +1,40 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace Wino.Dialogs +{ + public sealed partial class TextInputDialog : ContentDialog + { + public bool? HasInput { get; set; } + + public string CurrentInput + { + get { return (string)GetValue(CurrentInputProperty); } + set { SetValue(CurrentInputProperty, value); } + } + + public static readonly DependencyProperty CurrentInputProperty = DependencyProperty.Register(nameof(CurrentInput), typeof(string), typeof(TextInputDialog), new PropertyMetadata(string.Empty)); + + public TextInputDialog() + { + InitializeComponent(); + } + + public void SetDescription(string description) + { + DialogDescription.Text = description; + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + Hide(); + } + + private void UpdateOrCreateClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + HasInput = true; + + Hide(); + } + } +} diff --git a/Wino.Mail/Dialogs/WinoMessageDialog.xaml b/Wino.Mail/Dialogs/WinoMessageDialog.xaml new file mode 100644 index 00000000..d61fc010 --- /dev/null +++ b/Wino.Mail/Dialogs/WinoMessageDialog.xaml @@ -0,0 +1,25 @@ + + + + 250 + 900 + 200 + 756 + + + + diff --git a/Wino.Mail/Dialogs/WinoMessageDialog.xaml.cs b/Wino.Mail/Dialogs/WinoMessageDialog.xaml.cs new file mode 100644 index 00000000..4e30b9b9 --- /dev/null +++ b/Wino.Mail/Dialogs/WinoMessageDialog.xaml.cs @@ -0,0 +1,60 @@ +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace Wino.Dialogs +{ + public sealed partial class WinoMessageDialog : ContentDialog + { + private TaskCompletionSource _completionSource; + + #region Dependency Properties + + public string DialogTitle + { + get { return (string)GetValue(DialogTitleProperty); } + set { SetValue(DialogTitleProperty, value); } + } + + public static readonly DependencyProperty DialogTitleProperty = DependencyProperty.Register(nameof(DialogTitle), typeof(string), typeof(ConfirmationDialog), new PropertyMetadata(string.Empty)); + + public string Message + { + get { return (string)GetValue(MessageProperty); } + set { SetValue(MessageProperty, value); } + } + + public static readonly DependencyProperty MessageProperty = DependencyProperty.Register(nameof(Message), typeof(string), typeof(ConfirmationDialog), new PropertyMetadata(string.Empty)); + + #endregion + + public WinoMessageDialog() + { + InitializeComponent(); + } + + public async Task ShowDialogAsync(string title, string message) + { + _completionSource = new TaskCompletionSource(); + + DialogTitle = title; + Message = message; + +#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed + ShowAsync(); +#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed + + return await _completionSource.Task; + } + + private void ApproveClicked(object sender, RoutedEventArgs e) + { + Hide(); + } + + private void DialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) + { + _completionSource.TrySetResult(true); + } + } +} diff --git a/Wino.Mail/Extensions/AnimationExtensions.cs b/Wino.Mail/Extensions/AnimationExtensions.cs new file mode 100644 index 00000000..6ad7cb8a --- /dev/null +++ b/Wino.Mail/Extensions/AnimationExtensions.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Composition; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Media.Animation; + +namespace Wino.Extensions +{ + public static class AnimationExtensions + { + #region Composition + + public static ScalarKeyFrameAnimation CreateScalarKeyFrameAnimation(this Compositor compositor, float? from, float to, + double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior) + { + var animation = compositor.CreateScalarKeyFrameAnimation(); + + animation.Duration = TimeSpan.FromMilliseconds(duration); + if (!delay.Equals(0)) animation.DelayTime = TimeSpan.FromMilliseconds(delay); + if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing); + animation.InsertKeyFrame(1.0f, to, easing); + animation.IterationBehavior = iterationBehavior; + + return animation; + } + + public static Vector2KeyFrameAnimation CreateVector2KeyFrameAnimation(this Compositor compositor, Vector2? from, Vector2 to, + double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior) + { + var animation = compositor.CreateVector2KeyFrameAnimation(); + + animation.Duration = TimeSpan.FromMilliseconds(duration); + animation.DelayTime = TimeSpan.FromMilliseconds(delay); + if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing); + animation.InsertKeyFrame(1.0f, to, easing); + animation.IterationBehavior = iterationBehavior; + + return animation; + } + + public static Vector3KeyFrameAnimation CreateVector3KeyFrameAnimation(this Compositor compositor, Vector2? from, Vector2 to, + double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior) + { + var animation = compositor.CreateVector3KeyFrameAnimation(); + + animation.Duration = TimeSpan.FromMilliseconds(duration); + animation.DelayTime = TimeSpan.FromMilliseconds(delay); + if (from.HasValue) animation.InsertKeyFrame(0.0f, new Vector3(from.Value, 1.0f), easing); + animation.InsertKeyFrame(1.0f, new Vector3(to, 1.0f), easing); + animation.IterationBehavior = iterationBehavior; + + return animation; + } + + public static Vector3KeyFrameAnimation CreateVector3KeyFrameAnimation(this Compositor compositor, Vector3? from, Vector3 to, + double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior) + { + var animation = compositor.CreateVector3KeyFrameAnimation(); + + animation.Duration = TimeSpan.FromMilliseconds(duration); + animation.DelayTime = TimeSpan.FromMilliseconds(delay); + if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing); + animation.InsertKeyFrame(1.0f, to, easing); + animation.IterationBehavior = iterationBehavior; + + return animation; + } + + #endregion + + #region Xaml Storyboard + + public static void Animate(this DependencyObject target, double? from, double to, + string propertyPath, int duration = 400, int startTime = 0, + EasingFunctionBase easing = null, Action completed = null, bool enableDependentAnimation = false) + { + if (easing == null) + { + easing = new ExponentialEase(); + } + + var db = new DoubleAnimation + { + EnableDependentAnimation = enableDependentAnimation, + To = to, + From = from, + EasingFunction = easing, + Duration = TimeSpan.FromMilliseconds(duration) + }; + Storyboard.SetTarget(db, target); + Storyboard.SetTargetProperty(db, propertyPath); + + var sb = new Storyboard + { + BeginTime = TimeSpan.FromMilliseconds(startTime) + }; + + if (completed != null) + { + sb.Completed += (s, e) => + { + completed(); + }; + } + + sb.Children.Add(db); + sb.Begin(); + } + + #endregion + } +} diff --git a/Wino.Mail/Extensions/CompositionEnums.cs b/Wino.Mail/Extensions/CompositionEnums.cs new file mode 100644 index 00000000..4ac01d05 --- /dev/null +++ b/Wino.Mail/Extensions/CompositionEnums.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wino.Extensions +{ + public enum TransitionDirection + { + TopToBottom, + BottomToTop, + LeftToRight, + RightToLeft + } + + public enum ClipAnimationDirection + { + Top, + Bottom, + Left, + Right + } + + public enum AnimationAxis + { + X, + Y, + Z + } + + public enum AnimationType + { + KeyFrame, + Expression + } + + public enum FlickDirection + { + None, + Up, + Down, + Left, + Right + } + + public enum ViewState + { + Empty, + Small, + Big, + Full + } + + public enum Gesture + { + Initial, + Tap, + Swipe + } + + [Flags] + public enum VisualPropertyType + { + None = 0, + Opacity = 1 << 0, + Offset = 1 << 1, + Scale = 1 << 2, + Size = 1 << 3, + RotationAngleInDegrees = 1 << 4, + All = ~0 + } +} diff --git a/Wino.Mail/Extensions/CompositionExtensions.Implicit.cs b/Wino.Mail/Extensions/CompositionExtensions.Implicit.cs new file mode 100644 index 00000000..d043fd45 --- /dev/null +++ b/Wino.Mail/Extensions/CompositionExtensions.Implicit.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Composition; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Hosting; + +namespace Wino.Extensions +{ + public static partial class CompositionExtensions + { + public static void EnableFluidVisibilityAnimation(this UIElement element, AnimationAxis? axis = null, + float showFromOffset = 0.0f, float hideToOffset = 0.0f, Vector3? centerPoint = null, + float showFromScale = 1.0f, float hideToScale = 1.0f, float showDuration = 800.0f, float hideDuration = 800.0f, + int showDelay = 0, int hideDelay = 0, bool animateOpacity = true) + { + var elementVisual = element.Visual(); + var compositor = elementVisual.Compositor; + ElementCompositionPreview.SetIsTranslationEnabled(element, true); + + ScalarKeyFrameAnimation hideOpacityAnimation = null; + ScalarKeyFrameAnimation showOpacityAnimation = null; + ScalarKeyFrameAnimation hideOffsetAnimation = null; + ScalarKeyFrameAnimation showOffsetAnimation = null; + Vector2KeyFrameAnimation hideScaleAnimation = null; + Vector2KeyFrameAnimation showeScaleAnimation = null; + + if (animateOpacity) + { + hideOpacityAnimation = compositor.CreateScalarKeyFrameAnimation(); + hideOpacityAnimation.InsertKeyFrame(1.0f, 0.0f); + hideOpacityAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration); + hideOpacityAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay); + hideOpacityAnimation.Target = "Opacity"; + } + + if (!hideToOffset.Equals(0.0f)) + { + hideOffsetAnimation = compositor.CreateScalarKeyFrameAnimation(); + hideOffsetAnimation.InsertKeyFrame(1.0f, hideToOffset); + hideOffsetAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration); + hideOffsetAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay); + hideOffsetAnimation.Target = $"Translation.{axis}"; + } + + if (centerPoint.HasValue) + { + elementVisual.CenterPoint = centerPoint.Value; + } + + if (!hideToScale.Equals(1.0f)) + { + hideScaleAnimation = compositor.CreateVector2KeyFrameAnimation(); + hideScaleAnimation.InsertKeyFrame(1.0f, new Vector2(hideToScale)); + hideScaleAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration); + hideScaleAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay); + hideScaleAnimation.Target = "Scale.XY"; + } + + var hideAnimationGroup = compositor.CreateAnimationGroup(); + if (hideOpacityAnimation != null) + { + hideAnimationGroup.Add(hideOpacityAnimation); + } + if (hideOffsetAnimation != null) + { + hideAnimationGroup.Add(hideOffsetAnimation); + } + if (hideScaleAnimation != null) + { + hideAnimationGroup.Add(hideScaleAnimation); + } + + ElementCompositionPreview.SetImplicitHideAnimation(element, hideAnimationGroup); + + if (animateOpacity) + { + showOpacityAnimation = compositor.CreateScalarKeyFrameAnimation(); + showOpacityAnimation.InsertKeyFrame(1.0f, 1.0f); + showOpacityAnimation.Duration = TimeSpan.FromMilliseconds(showDuration); + showOpacityAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay); + showOpacityAnimation.Target = "Opacity"; + } + + if (!showFromOffset.Equals(0.0f)) + { + showOffsetAnimation = compositor.CreateScalarKeyFrameAnimation(); + showOffsetAnimation.InsertKeyFrame(0.0f, showFromOffset); + showOffsetAnimation.InsertKeyFrame(1.0f, 0.0f); + showOffsetAnimation.Duration = TimeSpan.FromMilliseconds(showDuration); + showOffsetAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay); + showOffsetAnimation.Target = $"Translation.{axis}"; + } + + if (!showFromScale.Equals(1.0f)) + { + showeScaleAnimation = compositor.CreateVector2KeyFrameAnimation(); + showeScaleAnimation.InsertKeyFrame(0.0f, new Vector2(showFromScale)); + showeScaleAnimation.InsertKeyFrame(1.0f, Vector2.One); + showeScaleAnimation.Duration = TimeSpan.FromMilliseconds(showDuration); + showeScaleAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay); + showeScaleAnimation.Target = "Scale.XY"; + } + + var showAnimationGroup = compositor.CreateAnimationGroup(); + if (showOpacityAnimation != null) + { + showAnimationGroup.Add(showOpacityAnimation); + } + if (showOffsetAnimation != null) + { + showAnimationGroup.Add(showOffsetAnimation); + } + if (showeScaleAnimation != null) + { + showAnimationGroup.Add(showeScaleAnimation); + } + + ElementCompositionPreview.SetImplicitShowAnimation(element, showAnimationGroup); + } + + public static void EnableImplicitAnimation(this UIElement element, VisualPropertyType typeToAnimate, + double duration = 800, double delay = 0, CompositionEasingFunction easing = null) + { + var visual = element.Visual(); + var compositor = visual.Compositor; + + var animationCollection = compositor.CreateImplicitAnimationCollection(); + + foreach (var type in UtilExtensions.GetValues()) + { + if (!typeToAnimate.HasFlag(type)) continue; + + var animation = CreateAnimationByType(compositor, type, duration, delay, easing); + + if (animation != null) + { + animationCollection[type.ToString()] = animation; + } + } + + visual.ImplicitAnimations = animationCollection; + } + + public static void EnableImplicitAnimation(this Visual visual, VisualPropertyType typeToAnimate, + double duration = 800, double delay = 0, CompositionEasingFunction easing = null) + { + var compositor = visual.Compositor; + + var animationCollection = compositor.CreateImplicitAnimationCollection(); + + foreach (var type in UtilExtensions.GetValues()) + { + if (!typeToAnimate.HasFlag(type)) continue; + + var animation = CreateAnimationByType(compositor, type, duration, delay, easing); + + if (animation != null) + { + animationCollection[type.ToString()] = animation; + } + } + + visual.ImplicitAnimations = animationCollection; + } + + private static KeyFrameAnimation CreateAnimationByType(Compositor compositor, VisualPropertyType type, + double duration = 800, double delay = 0, CompositionEasingFunction easing = null) + { + KeyFrameAnimation animation; + + switch (type) + { + case VisualPropertyType.Offset: + case VisualPropertyType.Scale: + animation = compositor.CreateVector3KeyFrameAnimation(); + break; + case VisualPropertyType.Size: + animation = compositor.CreateVector2KeyFrameAnimation(); + break; + case VisualPropertyType.Opacity: + case VisualPropertyType.RotationAngleInDegrees: + animation = compositor.CreateScalarKeyFrameAnimation(); + break; + default: + return null; + } + + animation.InsertExpressionKeyFrame(1.0f, "this.FinalValue", easing); + animation.Duration = TimeSpan.FromMilliseconds(duration); + animation.DelayTime = TimeSpan.FromMilliseconds(delay); + animation.Target = type.ToString(); + + return animation; + } + } +} diff --git a/Wino.Mail/Extensions/CompositionExtensions.Size.cs b/Wino.Mail/Extensions/CompositionExtensions.Size.cs new file mode 100644 index 00000000..42adf0af --- /dev/null +++ b/Wino.Mail/Extensions/CompositionExtensions.Size.cs @@ -0,0 +1,127 @@ +using System; +using System.Numerics; +using System.Threading.Tasks; +using Windows.UI.Composition; +using Windows.UI.Xaml; + +namespace Wino.Extensions +{ + public static partial class CompositionExtensions + { + public static void StartSizeAnimation(this UIElement element, Vector2? from = null, Vector2? to = null, + double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null, + AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) + { + CompositionScopedBatch batch = null; + + var visual = element.Visual(); + var compositor = visual.Compositor; + + if (completed != null) + { + batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + batch.Completed += (s, e) => completed(); + } + + if (to == null) + { + to = Vector2.One; + } + + visual.StartAnimation("Size", + compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); + + batch?.End(); + } + + public static void StartSizeAnimation(this Visual visual, Vector2? from = null, Vector2? to = null, + double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null, + AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) + { + CompositionScopedBatch batch = null; + var compositor = visual.Compositor; + + if (completed != null) + { + batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + batch.Completed += (s, e) => completed(); + } + + if (to == null) + { + to = Vector2.One; + } + + visual.StartAnimation("Size", + compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); + + batch?.End(); + } + + public static Task StartSizeAnimationAsync(this UIElement element, Vector2? from = null, Vector2? to = null, + double duration = 800, int delay = 0, CompositionEasingFunction easing = null, + AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) + { + CompositionScopedBatch batch; + + var visual = element.Visual(); + var compositor = visual.Compositor; + + var taskSource = new TaskCompletionSource(); + + void Completed(object o, CompositionBatchCompletedEventArgs e) + { + batch.Completed -= Completed; + taskSource.SetResult(true); + } + + batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + batch.Completed += Completed; + + if (to == null) + { + to = Vector2.One; + } + + visual.StartAnimation("Size", + compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); + + batch.End(); + + return taskSource.Task; + } + + public static Task StartSizeAnimationAsync(this Visual visual, Vector2? from = null, Vector2? to = null, + double duration = 800, int delay = 0, CompositionEasingFunction easing = null, + AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) + { + CompositionScopedBatch batch; + + var compositor = visual.Compositor; + + var taskSource = new TaskCompletionSource(); + + void Completed(object o, CompositionBatchCompletedEventArgs e) + { + batch.Completed -= Completed; + taskSource.SetResult(true); + } + + batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + batch.Completed += Completed; + + if (to == null) + { + to = Vector2.One; + } + + visual.StartAnimation("Size", + compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); + + batch.End(); + + return taskSource.Task; + } + + } +} diff --git a/Wino.Mail/Extensions/EnumerableExtensions.cs b/Wino.Mail/Extensions/EnumerableExtensions.cs new file mode 100644 index 00000000..4d94a9be --- /dev/null +++ b/Wino.Mail/Extensions/EnumerableExtensions.cs @@ -0,0 +1,18 @@ +using System.Collections; + +namespace Wino.Extensions +{ + public static class EnumerableExtensions + { + public static IEnumerable OfType(this IEnumerable source) + { + foreach (object item in source) + { + if (item is T1 || item is T2) + { + yield return item; + } + } + } + } +} diff --git a/Wino.Mail/Extensions/MimeKitExtensions.cs b/Wino.Mail/Extensions/MimeKitExtensions.cs new file mode 100644 index 00000000..4b776fce --- /dev/null +++ b/Wino.Mail/Extensions/MimeKitExtensions.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Threading.Tasks; +using Windows.Storage; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Extensions +{ + public static class MimeKitExtensions + { + public static async Task ToAttachmentViewModelAsync(this StorageFile storageFile) + { + if (storageFile == null) return null; + + var bytes = await File.ReadAllBytesAsync(storageFile.Name); + + return new MailAttachmentViewModel(storageFile.Name, bytes); + } + } +} diff --git a/Wino.Mail/Extensions/UIExtensions.cs b/Wino.Mail/Extensions/UIExtensions.cs new file mode 100644 index 00000000..65a4723b --- /dev/null +++ b/Wino.Mail/Extensions/UIExtensions.cs @@ -0,0 +1,20 @@ +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; + +namespace Wino.Extensions +{ + public static class UIExtensions + { + public static InfoBarSeverity AsMUXCInfoBarSeverity(this InfoBarMessageType messageType) + { + return messageType switch + { + InfoBarMessageType.Error => InfoBarSeverity.Error, + InfoBarMessageType.Warning => InfoBarSeverity.Warning, + InfoBarMessageType.Information => InfoBarSeverity.Informational, + InfoBarMessageType.Success => InfoBarSeverity.Success, + _ => InfoBarSeverity.Informational + }; + } + } +} diff --git a/Wino.Mail/Extensions/UtilExtensions.cs b/Wino.Mail/Extensions/UtilExtensions.cs new file mode 100644 index 00000000..bfbea266 --- /dev/null +++ b/Wino.Mail/Extensions/UtilExtensions.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Windows.Foundation; +using Windows.UI.Composition; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Hosting; +using Windows.UI.Xaml.Media; + +namespace Wino.Extensions +{ + public static class UtilExtensions + { + public static float ToFloat(this double value) => (float)value; + + public static List Children(this DependencyObject parent) + { + var list = new List(); + + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) + { + var child = VisualTreeHelper.GetChild(parent, i); + + if (child is FrameworkElement) + { + list.Add(child as FrameworkElement); + } + + list.AddRange(Children(child)); + } + + return list; + } + + public static T GetChildByName(this DependencyObject parent, string name) + { + var childControls = Children(parent); + var controls = childControls.OfType(); + + if (controls == null) + { + return default(T); + } + + var control = controls + .Where(x => x.Name.Equals(name)) + .Cast() + .First(); + + return control; + } + + public static Visual Visual(this UIElement element) => + ElementCompositionPreview.GetElementVisual(element); + + public static void SetChildVisual(this UIElement element, Visual childVisual) => + ElementCompositionPreview.SetElementChildVisual(element, childVisual); + + public static Point RelativePosition(this UIElement element, UIElement other) => + element.TransformToVisual(other).TransformPoint(new Point(0, 0)); + + public static bool IsFullyVisibile(this FrameworkElement element, FrameworkElement parent) + { + if (element == null || parent == null) + return false; + + if (element.Visibility != Visibility.Visible) + return false; + + var elementBounds = element.TransformToVisual(parent).TransformBounds(new Windows.Foundation.Rect(0, 0, element.ActualWidth, element.ActualHeight)); + var containerBounds = new Windows.Foundation.Rect(0, 0, parent.ActualWidth, parent.ActualHeight); + + var originalElementWidth = elementBounds.Width; + var originalElementHeight = elementBounds.Height; + + elementBounds.Intersect(containerBounds); + + var newElementWidth = elementBounds.Width; + var newElementHeight = elementBounds.Height; + + return originalElementWidth.Equals(newElementWidth) && originalElementHeight.Equals(newElementHeight); + } + + public static void ScrollToElement(this ScrollViewer scrollViewer, FrameworkElement element, + bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null, bool bringToTopOrLeft = true) + { + if (!bringToTopOrLeft && element.IsFullyVisibile(scrollViewer)) + return; + + var contentArea = (FrameworkElement)scrollViewer.Content; + var position = element.RelativePosition(contentArea); + + if (isVerticalScrolling) + { + scrollViewer.ChangeView(null, position.Y, zoomFactor, !smoothScrolling); + } + else + { + scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling); + } + } + + + public static IEnumerable GetValues() => Enum.GetValues(typeof(T)).Cast(); + } +} diff --git a/Wino.Mail/GlobalSuppressions.cs b/Wino.Mail/GlobalSuppressions.cs new file mode 100644 index 00000000..7d5444aa --- /dev/null +++ b/Wino.Mail/GlobalSuppressions.cs @@ -0,0 +1,8 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Minor Code Smell", "S2094:Classes should not be empty", Justification = "", Scope = "type", Target = "~T:Wino.PubSub.BackBreadcrumNavigationRequest")] diff --git a/Wino.Mail/Helpers/JsonHelpers.cs b/Wino.Mail/Helpers/JsonHelpers.cs new file mode 100644 index 00000000..c04ecfcc --- /dev/null +++ b/Wino.Mail/Helpers/JsonHelpers.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; + +using Newtonsoft.Json; + +namespace Wino.Helpers +{ + public static class JsonHelpers + { + public static async Task ToObjectAsync(string value) + { + return await Task.Run(() => + { + return JsonConvert.DeserializeObject(value); + }); + } + + public static async Task StringifyAsync(object value) + { + return await Task.Run(() => + { + return JsonConvert.SerializeObject(value); + }); + } + } +} diff --git a/Wino.Mail/Helpers/SettingsStorageExtensions.cs b/Wino.Mail/Helpers/SettingsStorageExtensions.cs new file mode 100644 index 00000000..a566e891 --- /dev/null +++ b/Wino.Mail/Helpers/SettingsStorageExtensions.cs @@ -0,0 +1,119 @@ +using System; +using System.IO; +using System.Threading.Tasks; + +using Windows.Storage; +using Windows.Storage.Streams; + +namespace Wino.Helpers +{ + // Use these extension methods to store and retrieve local and roaming app data + // More details regarding storing and retrieving app data at https://docs.microsoft.com/windows/uwp/app-settings/store-and-retrieve-app-data + public static class SettingsStorageExtensions + { + private const string FileExtension = ".json"; + + public static bool IsRoamingStorageAvailable(this ApplicationData appData) + { + return appData.RoamingStorageQuota == 0; + } + + public static async Task SaveAsync(this StorageFolder folder, string name, T content) + { + var file = await folder.CreateFileAsync(GetFileName(name), CreationCollisionOption.ReplaceExisting); + var fileContent = await JsonHelpers.StringifyAsync(content); + + await FileIO.WriteTextAsync(file, fileContent); + } + + public static async Task ReadAsync(this StorageFolder folder, string name) + { + if (!File.Exists(Path.Combine(folder.Path, GetFileName(name)))) + { + return default; + } + + var file = await folder.GetFileAsync($"{name}.json"); + var fileContent = await FileIO.ReadTextAsync(file); + + return await JsonHelpers.ToObjectAsync(fileContent); + } + + public static async Task SaveAsync(this ApplicationDataContainer settings, string key, T value) + { + settings.SaveString(key, await JsonHelpers.StringifyAsync(value)); + } + + public static void SaveString(this ApplicationDataContainer settings, string key, string value) + { + settings.Values[key] = value; + } + + public static async Task ReadAsync(this ApplicationDataContainer settings, string key) + { + object obj = null; + + if (settings.Values.TryGetValue(key, out obj)) + { + return await JsonHelpers.ToObjectAsync((string)obj); + } + + return default; + } + + public static async Task SaveFileAsync(this StorageFolder folder, byte[] content, string fileName, CreationCollisionOption options = CreationCollisionOption.ReplaceExisting) + { + if (content == null) + { + throw new ArgumentNullException(nameof(content)); + } + + if (string.IsNullOrEmpty(fileName)) + { + throw new ArgumentException("File name is null or empty. Specify a valid file name", nameof(fileName)); + } + + var storageFile = await folder.CreateFileAsync(fileName, options); + await FileIO.WriteBytesAsync(storageFile, content); + return storageFile; + } + + public static async Task ReadFileAsync(this StorageFolder folder, string fileName) + { + var item = await folder.TryGetItemAsync(fileName).AsTask().ConfigureAwait(false); + + if ((item != null) && item.IsOfType(StorageItemTypes.File)) + { + var storageFile = await folder.GetFileAsync(fileName); + byte[] content = await storageFile.ReadBytesAsync(); + return content; + } + + return null; + } + + public static async Task ReadBytesAsync(this StorageFile file) + { + if (file != null) + { + using (IRandomAccessStream stream = await file.OpenReadAsync()) + { + using (var reader = new DataReader(stream.GetInputStreamAt(0))) + { + await reader.LoadAsync((uint)stream.Size); + var bytes = new byte[stream.Size]; + reader.ReadBytes(bytes); + return bytes; + } + } + } + + return null; + } + + private static string GetFileName(string name) + { + return string.Concat(name, FileExtension); + } + } +} diff --git a/Wino.Mail/Helpers/WinoVisualTreeHelper.cs b/Wino.Mail/Helpers/WinoVisualTreeHelper.cs new file mode 100644 index 00000000..ded3482e --- /dev/null +++ b/Wino.Mail/Helpers/WinoVisualTreeHelper.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Media; + +namespace Wino.Helpers +{ + public static class WinoVisualTreeHelper + { + public static T GetChildObject(DependencyObject obj, string name) where T : FrameworkElement + { + DependencyObject child = null; + T grandChild = null; + + for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++) + { + child = VisualTreeHelper.GetChild(obj, i); + + if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name))) + { + return (T)child; + } + else + { + grandChild = GetChildObject(child, name); + } + if (grandChild != null) + { + return grandChild; + } + } + return null; + } + } +} diff --git a/Wino.Mail/Helpers/XamlHelpers.cs b/Wino.Mail/Helpers/XamlHelpers.cs new file mode 100644 index 00000000..7bef3d83 --- /dev/null +++ b/Wino.Mail/Helpers/XamlHelpers.cs @@ -0,0 +1,399 @@ +using System; +using System.Linq; +using Microsoft.Toolkit.Uwp.Helpers; +using Microsoft.UI.Xaml.Controls; +using Windows.UI; +using Windows.UI.Text; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Markup; +using Windows.UI.Xaml.Media; +using Wino.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Reader; + +namespace Wino.Helpers +{ + public static class XamlHelpers + { + #region Converters + + public static Visibility ReverseBoolToVisibilityConverter(bool value) => value ? Visibility.Collapsed : Visibility.Visible; + public static Visibility ReverseVisibilityConverter(Visibility visibility) => visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; + public static bool ReverseBoolConverter(bool value) => !value; + public static bool ShouldDisplayPreview(string text) => text.Any(x => char.IsLetter(x)); + public static bool CountToBooleanConverter(int value) => value > 0; + public static bool ObjectEquals(object obj1, object obj2) => object.Equals(obj1, obj2); + public static Visibility CountToVisibilityConverter(int value) => value > 0 ? Visibility.Visible : Visibility.Collapsed; + public static InfoBarSeverity InfoBarSeverityConverter(InfoBarMessageType messageType) + { + switch (messageType) + { + case InfoBarMessageType.Information: + return InfoBarSeverity.Informational; + case InfoBarMessageType.Success: + return InfoBarSeverity.Success; + case InfoBarMessageType.Warning: + return InfoBarSeverity.Warning; + case InfoBarMessageType.Error: + return InfoBarSeverity.Error; + default: + return InfoBarSeverity.Informational; + } + } + public static SolidColorBrush GetSolidColorBrushFromHex(string colorHex) => string.IsNullOrEmpty(colorHex) ? new SolidColorBrush(Colors.Transparent) : new SolidColorBrush(colorHex.ToColor()); + public static Visibility IsSelectionModeMultiple(ListViewSelectionMode mode) => mode == ListViewSelectionMode.Multiple ? Visibility.Visible : Visibility.Collapsed; + public static FontWeight GetFontWeightBySyncState(bool isSyncing) => isSyncing ? FontWeights.SemiBold : FontWeights.Normal; + public static FontWeight GetFontWeightByChildSelectedState(bool isChildSelected) => isChildSelected ? FontWeights.SemiBold : FontWeights.Normal; + public static Geometry GetPathIcon(string resourceName) => GetPathGeometry(Application.Current.Resources[$"{resourceName}"] as string); + public static GridLength GetGridLength(double width) => new GridLength(width, GridUnitType.Pixel); + public static double MailListAdaptivityConverter(double mailListPaneLength) => mailListPaneLength + 300d; + public static string GetMailItemDisplaySummaryForListing(bool isDraft, DateTime receivedDate, bool prefer24HourTime) + { + if (isDraft) + return Translator.Draft; + else + { + var localTime = receivedDate.ToLocalTime(); + + return prefer24HourTime ? localTime.ToString("HH:mm") : localTime.ToString("hh:mm tt"); + } + } + + public static string GetCreationDateString(DateTime date) + { + var localTime = date.ToLocalTime(); + return $"{localTime.ToLongDateString()} {localTime.ToLongTimeString()}"; + } + + public static string GetMailGroupDateString(object groupObject) + { + if (groupObject is string stringObject) + return stringObject; + + object dateObject = null; + + // From regular mail header template + if (groupObject is DateTime groupedDate) + dateObject = groupedDate; + else if (groupObject is IGrouping groupKey) + { + // From semantic group header. + dateObject = groupKey.Key; + } + + if (dateObject != null) + { + if (dateObject is DateTime dateTimeValue) + { + if (dateTimeValue == DateTime.Today) + return Translator.Today; + else if (dateTimeValue == DateTime.Today.AddDays(-1)) + return Translator.Yesterday; + else + return dateTimeValue.ToLongDateString(); + } + else + return dateObject.ToString(); + } + + return Translator.UnknownDateHeader; + } + + #endregion + + #region Wino Font Icon Transformation + + public static WinoIconGlyph GetWinoIconGlyph(FilterOptionType type) + { + switch (type) + { + case FilterOptionType.All: + return WinoIconGlyph.SpecialFolderCategory; + case FilterOptionType.Unread: + return WinoIconGlyph.MarkUnread; + case FilterOptionType.Flagged: + return WinoIconGlyph.Flag; + case FilterOptionType.Mentions: + return WinoIconGlyph.NewMail; + default: + return WinoIconGlyph.None; + } + } + + public static WinoIconGlyph GetWinoIconGlyph(MailOperation operation) + { + switch (operation) + { + case MailOperation.None: + return WinoIconGlyph.None; + case MailOperation.Archive: + return WinoIconGlyph.Archive; + case MailOperation.UnArchive: + return WinoIconGlyph.UnArchive; + case MailOperation.SoftDelete: + case MailOperation.HardDelete: + return WinoIconGlyph.Delete; + case MailOperation.Move: + return WinoIconGlyph.Forward; + case MailOperation.MoveToJunk: + return WinoIconGlyph.Junk; + case MailOperation.MoveToFocused: + break; + case MailOperation.MoveToOther: + break; + case MailOperation.AlwaysMoveToOther: + break; + case MailOperation.AlwaysMoveToFocused: + break; + case MailOperation.SetFlag: + return WinoIconGlyph.Flag; + case MailOperation.ClearFlag: + return WinoIconGlyph.ClearFlag; + case MailOperation.MarkAsRead: + return WinoIconGlyph.MarkRead; + case MailOperation.MarkAsUnread: + return WinoIconGlyph.MarkUnread; + case MailOperation.MarkAsNotJunk: + return WinoIconGlyph.Junk; + case MailOperation.Ignore: + return WinoIconGlyph.Ignore; + case MailOperation.Reply: + return WinoIconGlyph.Reply; + case MailOperation.ReplyAll: + return WinoIconGlyph.ReplyAll; + case MailOperation.Zoom: + return WinoIconGlyph.Zoom; + case MailOperation.SaveAs: + return WinoIconGlyph.Save; + case MailOperation.Find: + return WinoIconGlyph.Find; + case MailOperation.Forward: + return WinoIconGlyph.Forward; + case MailOperation.DarkEditor: + return WinoIconGlyph.DarkEditor; + case MailOperation.LightEditor: + return WinoIconGlyph.LightEditor; + } + + return WinoIconGlyph.None; + } + + public static WinoIconGlyph GetPathGeometry(FolderOperation operation) + { + switch (operation) + { + case FolderOperation.None: + return WinoIconGlyph.None; + case FolderOperation.Pin: + return WinoIconGlyph.Pin; + case FolderOperation.Unpin: + return WinoIconGlyph.UnPin; + case FolderOperation.MarkAllAsRead: + return WinoIconGlyph.MarkRead; + case FolderOperation.DontSync: + return WinoIconGlyph.DontSync; + case FolderOperation.Empty: + return WinoIconGlyph.EmptyFolder; + case FolderOperation.Rename: + return WinoIconGlyph.Rename; + case FolderOperation.Delete: + return WinoIconGlyph.Delete; + case FolderOperation.Move: + return WinoIconGlyph.Forward; + case FolderOperation.TurnOffNotifications: + return WinoIconGlyph.TurnOfNotifications; + case FolderOperation.CreateSubFolder: + return WinoIconGlyph.CreateFolder; + } + + return WinoIconGlyph.None; + } + + public static WinoIconGlyph GetSpecialFolderPathIconGeometry(SpecialFolderType specialFolderType) + { + switch (specialFolderType) + { + case SpecialFolderType.Inbox: + return WinoIconGlyph.SpecialFolderInbox; + case SpecialFolderType.Starred: + return WinoIconGlyph.SpecialFolderStarred; + case SpecialFolderType.Important: + return WinoIconGlyph.SpecialFolderImportant; + case SpecialFolderType.Sent: + return WinoIconGlyph.SpecialFolderSent; + case SpecialFolderType.Draft: + return WinoIconGlyph.SpecialFolderDraft; + case SpecialFolderType.Archive: + return WinoIconGlyph.SpecialFolderArchive; + case SpecialFolderType.Deleted: + return WinoIconGlyph.SpecialFolderDeleted; + case SpecialFolderType.Junk: + return WinoIconGlyph.SpecialFolderJunk; + case SpecialFolderType.Chat: + return WinoIconGlyph.SpecialFolderChat; + case SpecialFolderType.Category: + return WinoIconGlyph.SpecialFolderCategory; + case SpecialFolderType.Unread: + return WinoIconGlyph.SpecialFolderUnread; + case SpecialFolderType.Forums: + return WinoIconGlyph.SpecialFolderForums; + case SpecialFolderType.Updates: + return WinoIconGlyph.SpecialFolderUpdated; + case SpecialFolderType.Personal: + return WinoIconGlyph.SpecialFolderPersonal; + case SpecialFolderType.Promotions: + return WinoIconGlyph.SpecialFolderPromotions; + case SpecialFolderType.Social: + return WinoIconGlyph.SpecialFolderSocial; + case SpecialFolderType.Other: + return WinoIconGlyph.SpecialFolderOther; + case SpecialFolderType.More: + return WinoIconGlyph.SpecialFolderMore; + } + + return WinoIconGlyph.None; + } + + public static WinoIconGlyph GetProviderIcon(MailProviderType providerType) + { + switch (providerType) + { + case MailProviderType.Outlook: + return WinoIconGlyph.Microsoft; + case MailProviderType.Gmail: + return WinoIconGlyph.Google; + case MailProviderType.Office365: + return WinoIconGlyph.Microsoft; + case MailProviderType.IMAP4: + return WinoIconGlyph.Mail; + } + + return WinoIconGlyph.None; + } + + public static Geometry GetPathGeometry(string pathMarkup) + { + string xaml = + "" + + "" + pathMarkup + ""; + var path = XamlReader.Load(xaml) as Windows.UI.Xaml.Shapes.Path; + + Geometry geometry = path.Data; + path.Data = null; + return geometry; + } + + #endregion + + #region Toolbar Section Initialization + + public static Visibility IsFormatSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Format ? Visibility.Visible : Visibility.Collapsed; + public static Visibility IsInsertSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Insert ? Visibility.Visible : Visibility.Collapsed; + public static Visibility IsDrawSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Draw ? Visibility.Visible : Visibility.Collapsed; + public static Visibility IsOptionsSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Options ? Visibility.Visible : Visibility.Collapsed; + + #endregion + + #region Internationalization + + public static string GetOperationString(MailOperation operation) + { + switch (operation) + { + case MailOperation.None: + return "unknown"; + case MailOperation.Archive: + return Translator.MailOperation_Archive; + case MailOperation.UnArchive: + return Translator.MailOperation_Unarchive; + case MailOperation.SoftDelete: + return Translator.MailOperation_Delete; + case MailOperation.HardDelete: + return Translator.MailOperation_Delete; + case MailOperation.Move: + return Translator.MailOperation_Move; + case MailOperation.MoveToJunk: + return Translator.MailOperation_MoveJunk; + case MailOperation.MoveToFocused: + return Translator.MailOperation_MoveFocused; + case MailOperation.MoveToOther: + return Translator.MailOperation_MoveOther; + case MailOperation.AlwaysMoveToOther: + return Translator.MailOperation_AlwaysMoveOther; + case MailOperation.AlwaysMoveToFocused: + return Translator.MailOperation_AlwaysMoveFocused; + case MailOperation.SetFlag: + return Translator.MailOperation_SetFlag; + case MailOperation.ClearFlag: + return Translator.MailOperation_ClearFlag; + case MailOperation.MarkAsRead: + return Translator.MailOperation_MarkAsRead; + case MailOperation.MarkAsUnread: + return Translator.MailOperation_MarkAsUnread; + case MailOperation.MarkAsNotJunk: + return Translator.MailOperation_MarkNotJunk; + case MailOperation.Seperator: + return string.Empty; + case MailOperation.Ignore: + return Translator.MailOperation_Ignore; + case MailOperation.Reply: + return Translator.MailOperation_Reply; + case MailOperation.ReplyAll: + return Translator.MailOperation_ReplyAll; + case MailOperation.Zoom: + return Translator.MailOperation_Zoom; + case MailOperation.SaveAs: + return Translator.MailOperation_SaveAs; + case MailOperation.Find: + return Translator.MailOperation_Find; + case MailOperation.Forward: + return Translator.MailOperation_Forward; + case MailOperation.DarkEditor: + return string.Empty; + case MailOperation.LightEditor: + return string.Empty; + case MailOperation.Print: + return Translator.MailOperation_Print; + case MailOperation.Navigate: + return Translator.MailOperation_Navigate; + default: + return "unknown"; + } + } + + public static string GetOperationString(FolderOperation operation) + { + switch (operation) + { + case FolderOperation.None: + break; + case FolderOperation.Pin: + return Translator.FolderOperation_Pin; + case FolderOperation.Unpin: + return Translator.FolderOperation_Unpin; + case FolderOperation.MarkAllAsRead: + return Translator.FolderOperation_MarkAllAsRead; + case FolderOperation.DontSync: + return Translator.FolderOperation_DontSync; + case FolderOperation.Empty: + return Translator.FolderOperation_Empty; + case FolderOperation.Rename: + return Translator.FolderOperation_Rename; + case FolderOperation.Delete: + return Translator.FolderOperation_Delete; + case FolderOperation.Move: + return Translator.FolderOperation_Move; + case FolderOperation.CreateSubFolder: + return Translator.FolderOperation_CreateSubFolder; + } + + return string.Empty; + } + + #endregion + } +} diff --git a/Wino.Mail/JS/Quill/Editor/full.html b/Wino.Mail/JS/Quill/Editor/full.html new file mode 100644 index 00000000..ca55e9d8 --- /dev/null +++ b/Wino.Mail/JS/Quill/Editor/full.html @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + + + diff --git a/Wino.Mail/JS/Quill/darkreader.js b/Wino.Mail/JS/Quill/darkreader.js new file mode 100644 index 00000000..6e45c600 --- /dev/null +++ b/Wino.Mail/JS/Quill/darkreader.js @@ -0,0 +1,3187 @@ +/** + * Dark Reader v4.9.1 + * https://darkreader.org/ + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.DarkReader = {})); +}(this, (function (exports) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function isFirefox() { + return navigator.userAgent.includes('Firefox'); + } + function isMacOS() { + return navigator.platform.toLowerCase().startsWith('mac'); + } + function isDeepSelectorSupported() { + try { + document.querySelector('x /deep/ x'); + return true; + } + catch (err) { + return false; + } + } + function isHostSelectorSupported() { + try { + document.querySelector(':host x'); + return true; + } + catch (err) { + return false; + } + } + function isDefinedSelectorSupported() { + try { + document.querySelector(':defined'); + return true; + } + catch (err) { + return false; + } + } + + function getOKResponse(url, mimeType) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, fetch(url, { + cache: 'force-cache', + credentials: 'omit', + })]; + case 1: + response = _a.sent(); + if (isFirefox() && mimeType === 'text/css' && url.startsWith('moz-extension://') && url.endsWith('.css')) { + return [2, response]; + } + if (mimeType && !response.headers.get('Content-Type').startsWith(mimeType)) { + throw new Error("Mime type mismatch when loading " + url); + } + if (!response.ok) { + throw new Error("Unable to load " + url + " " + response.status + " " + response.statusText); + } + return [2, response]; + } + }); + }); + } + function loadAsDataURL(url, mimeType) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, getOKResponse(url, mimeType)]; + case 1: + response = _a.sent(); + return [4, readResponseAsDataURL(response)]; + case 2: return [2, _a.sent()]; + } + }); + }); + } + function readResponseAsDataURL(response) { + return __awaiter(this, void 0, void 0, function () { + var blob, dataURL; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, response.blob()]; + case 1: + blob = _a.sent(); + return [4, (new Promise(function (resolve) { + var reader = new FileReader(); + reader.onloadend = function () { return resolve(reader.result); }; + reader.readAsDataURL(blob); + }))]; + case 2: + dataURL = _a.sent(); + return [2, dataURL]; + } + }); + }); + } + + var throwCORSError = function (url) { return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2, Promise.reject(new Error([ + 'Embedded Dark Reader cannot access a cross-origin resource', + url, + 'Overview your URLs and CORS policies or use', + '`DarkReader.setFetchMethod(fetch: (url) => Promise))`.', + 'See if using `DarkReader.setFetchMethod(window.fetch)`', + 'before `DarkReader.enable()` works.' + ].join(' ')))]; + }); + }); }; + var fetcher = throwCORSError; + function setFetchMethod(fetch) { + if (fetch) { + fetcher = fetch; + } + else { + fetcher = throwCORSError; + } + } + function callFetchMethod(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, fetcher(url)]; + case 1: return [2, _a.sent()]; + } + }); + }); + } + + if (!window.chrome) { + window.chrome = {}; + } + if (!chrome.runtime) { + chrome.runtime = {}; + } + var messageListeners = new Set(); + function sendMessage() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var id_1, _a, url, responseType, response, text_1, error_1; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!(args[0] && args[0].type === 'fetch')) return [3, 8]; + id_1 = args[0].id; + _b.label = 1; + case 1: + _b.trys.push([1, 7, , 8]); + _a = args[0].data, url = _a.url, responseType = _a.responseType; + return [4, callFetchMethod(url)]; + case 2: + response = _b.sent(); + if (!(responseType === 'data-url')) return [3, 4]; + return [4, readResponseAsDataURL(response)]; + case 3: + text_1 = _b.sent(); + return [3, 6]; + case 4: return [4, response.text()]; + case 5: + text_1 = _b.sent(); + _b.label = 6; + case 6: + messageListeners.forEach(function (cb) { return cb({ type: 'fetch-response', data: text_1, error: null, id: id_1 }); }); + return [3, 8]; + case 7: + error_1 = _b.sent(); + console.error(error_1); + messageListeners.forEach(function (cb) { return cb({ type: 'fetch-response', data: null, error: error_1, id: id_1 }); }); + return [3, 8]; + case 8: return [2]; + } + }); + }); + } + function addMessageListener(callback) { + messageListeners.add(callback); + } + if (typeof chrome.runtime.sendMessage === 'function') { + var nativeSendMessage_1 = chrome.runtime.sendMessage; + chrome.runtime.sendMessage = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + sendMessage.apply(void 0, args); + nativeSendMessage_1.apply(chrome.runtime, args); + }; + } + else { + chrome.runtime.sendMessage = sendMessage; + } + if (!chrome.runtime.onMessage) { + chrome.runtime.onMessage = {}; + } + if (typeof chrome.runtime.onMessage.addListener === 'function') { + var nativeAddListener_1 = chrome.runtime.onMessage.addListener; + chrome.runtime.onMessage.addListener = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + addMessageListener.apply(void 0, args); + nativeAddListener_1.apply(chrome.runtime.onMessage, args); + }; + } + else { + chrome.runtime.onMessage.addListener = addMessageListener; + } + + var ThemeEngines = { + cssFilter: 'cssFilter', + svgFilter: 'svgFilter', + staticTheme: 'staticTheme', + dynamicTheme: 'dynamicTheme', + }; + + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return a; + } + function getAbsoluteURL($base, $relative) { + if ($relative.match(/^.*?\/\//) || $relative.match(/^data\:/)) { + if ($relative.startsWith('//')) { + return "" + location.protocol + $relative; + } + return $relative; + } + var b = parseURL($base); + if ($relative.startsWith('/')) { + var u_1 = parseURL(b.protocol + "//" + b.host + $relative); + return u_1.href; + } + var pathParts = b.pathname.split('/').concat($relative.split('/')).filter(function (p) { return p; }); + var backwardIndex; + while ((backwardIndex = pathParts.indexOf('..')) > 0) { + pathParts.splice(backwardIndex - 1, 2); + } + var u = parseURL(b.protocol + "//" + b.host + "/" + pathParts.join('/')); + return u.href; + } + + function logInfo() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + } + function logWarn() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + } + + function iterateCSSRules(rules, iterate) { + Array.from(rules) + .forEach(function (rule) { + if (rule instanceof CSSMediaRule) { + var media = Array.from(rule.media); + if (media.includes('screen') || media.includes('all') || !(media.includes('print') || media.includes('speech'))) { + iterateCSSRules(rule.cssRules, iterate); + } + } + else if (rule instanceof CSSStyleRule) { + iterate(rule); + } + else if (rule instanceof CSSImportRule) { + try { + iterateCSSRules(rule.styleSheet.cssRules, iterate); + } + catch (err) { + logWarn(err); + } + } + else { + logWarn("CSSRule type not supported", rule); + } + }); + } + function iterateCSSDeclarations(style, iterate) { + Array.from(style).forEach(function (property) { + var value = style.getPropertyValue(property).trim(); + if (!value) { + return; + } + iterate(property, value); + }); + } + function isCSSVariable(property) { + return property.startsWith('--') && !property.startsWith('--darkreader'); + } + function getCSSVariables(rules) { + var variables = new Map(); + rules && iterateCSSRules(rules, function (rule) { + rule.style && iterateCSSDeclarations(rule.style, function (property, value) { + if (isCSSVariable(property)) { + variables.set(property, value); + } + }); + }); + return variables; + } + function getElementCSSVariables(element) { + var variables = new Map(); + iterateCSSDeclarations(element.style, function (property, value) { + if (isCSSVariable(property)) { + variables.set(property, value); + } + }); + return variables; + } + var cssURLRegex = /url\((('.+?')|(".+?")|([^\)]*?))\)/g; + var cssImportRegex = /@import (url\()?(('.+?')|(".+?")|([^\)]*?))\)?;?/g; + function getCSSURLValue(cssURL) { + return cssURL.replace(/^url\((.*)\)$/, '$1').replace(/^"(.*)"$/, '$1').replace(/^'(.*)'$/, '$1'); + } + function getCSSBaseBath(url) { + var cssURL = parseURL(url); + return cssURL.protocol + "//" + cssURL.host + cssURL.pathname.replace(/\?.*$/, '').replace(/(\/)([^\/]+)$/i, '$1'); + } + function replaceCSSRelativeURLsWithAbsolute($css, cssBasePath) { + return $css.replace(cssURLRegex, function (match) { + var pathValue = getCSSURLValue(match); + return "url(\"" + getAbsoluteURL(cssBasePath, pathValue) + "\")"; + }); + } + var cssCommentsRegex = /\/\*[\s\S]*?\*\//g; + function removeCSSComments($css) { + return $css.replace(cssCommentsRegex, ''); + } + var fontFaceRegex = /@font-face\s*{[^}]*}/g; + function replaceCSSFontFace($css) { + return $css.replace(fontFaceRegex, ''); + } + var varRegex = /var\((--[^\s,]+),?\s*([^\(\)]*(\([^\(\)]*\)[^\(\)]*)*\s*)\)/g; + function replaceCSSVariables(value, variables) { + var missing = false; + var result = value.replace(varRegex, function (match, name, fallback) { + if (variables.has(name)) { + return variables.get(name); + } + else if (fallback) { + return fallback; + } + else { + logWarn("Variable " + name + " not found"); + missing = true; + } + return match; + }); + if (missing) { + return result; + } + if (result.match(varRegex)) { + return replaceCSSVariables(result, variables); + } + return result; + } + + function throttle(callback) { + var pending = false; + var frameId = null; + var lastArgs; + var throttled = (function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + lastArgs = args; + if (frameId) { + pending = true; + } + else { + callback.apply(void 0, lastArgs); + frameId = requestAnimationFrame(function () { + frameId = null; + if (pending) { + callback.apply(void 0, lastArgs); + pending = false; + } + }); + } + }); + var cancel = function () { + cancelAnimationFrame(frameId); + pending = false; + frameId = null; + }; + return Object.assign(throttled, { cancel: cancel }); + } + function createAsyncTasksQueue() { + var tasks = []; + var frameId = null; + function runTasks() { + var task; + while (task = tasks.shift()) { + task(); + } + frameId = null; + } + function add(task) { + tasks.push(task); + if (!frameId) { + frameId = requestAnimationFrame(runTasks); + } + } + function cancel() { + tasks.splice(0); + cancelAnimationFrame(frameId); + frameId = null; + } + return { add: add, cancel: cancel }; + } + + function getDuration(time) { + var duration = 0; + if (time.seconds) { + duration += time.seconds * 1000; + } + if (time.minutes) { + duration += time.minutes * 60 * 1000; + } + if (time.hours) { + duration += time.hours * 60 * 60 * 1000; + } + if (time.days) { + duration += time.days * 24 * 60 * 60 * 1000; + } + return duration; + } + + function removeNode(node) { + node && node.parentNode && node.parentNode.removeChild(node); + } + function watchForNodePosition(node, _a) { + var _b = _a.onRestore, onRestore = _b === void 0 ? Function.prototype : _b, _c = _a.watchParent, watchParent = _c === void 0 ? true : _c, _d = _a.watchSibling, watchSibling = _d === void 0 ? false : _d; + var MAX_ATTEMPTS_COUNT = 10; + var ATTEMPTS_INTERVAL = getDuration({ seconds: 10 }); + var prevSibling = node.previousSibling; + var parent = node.parentNode; + if (!parent) { + logWarn('Unable to watch for node position: parent element not found', node, prevSibling); + return { stop: Function.prototype }; + } + var attempts = 0; + var start = null; + var restore = throttle(function () { + attempts++; + var now = Date.now(); + if (start == null) { + start = now; + } + else if (attempts >= MAX_ATTEMPTS_COUNT) { + if (now - start < ATTEMPTS_INTERVAL) { + logWarn('Node position watcher stopped: some script conflicts with Dark Reader and can cause high CPU usage', node, prevSibling); + stop(); + return; + } + start = now; + attempts = 1; + } + if (prevSibling && prevSibling.parentNode !== parent) { + logWarn('Unable to restore node position: sibling was removed', node, prevSibling, parent); + stop(); + return; + } + logWarn('Node was removed, restoring it\'s position', node, prevSibling, parent); + parent.insertBefore(node, prevSibling ? prevSibling.nextSibling : parent.firstChild); + onRestore && onRestore(); + }); + var observer = new MutationObserver(function () { + if ((watchParent && !node.parentNode) || + (watchSibling && node.previousSibling !== prevSibling)) { + restore(); + observer.takeRecords(); + } + }); + var run = function () { + observer.observe(parent, { childList: true }); + }; + var stop = function () { + observer.disconnect(); + }; + run(); + return { run: run, stop: stop }; + } + function iterateShadowNodes(root, iterator) { + var walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, { + acceptNode: function (node) { + return node.shadowRoot == null ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT; + } + }, false); + for (var node = (root.shadowRoot ? walker.currentNode : walker.nextNode()); node != null; node = walker.nextNode()) { + iterator(node); + iterateShadowNodes(node.shadowRoot, iterator); + } + } + + function hslToRGB(_a) { + var h = _a.h, s = _a.s, l = _a.l, _b = _a.a, a = _b === void 0 ? 1 : _b; + if (s === 0) { + var _c = [l, l, l].map(function (x) { return Math.round(x * 255); }), r_1 = _c[0], b_1 = _c[1], g_1 = _c[2]; + return { r: r_1, g: g_1, b: b_1, a: a }; + } + var c = (1 - Math.abs(2 * l - 1)) * s; + var x = c * (1 - Math.abs((h / 60) % 2 - 1)); + var m = l - c / 2; + var _d = (h < 60 ? [c, x, 0] : + h < 120 ? [x, c, 0] : + h < 180 ? [0, c, x] : + h < 240 ? [0, x, c] : + h < 300 ? [x, 0, c] : + [c, 0, x]).map(function (n) { return Math.round((n + m) * 255); }), r = _d[0], g = _d[1], b = _d[2]; + return { r: r, g: g, b: b, a: a }; + } + function rgbToHSL(_a) { + var r255 = _a.r, g255 = _a.g, b255 = _a.b, _b = _a.a, a = _b === void 0 ? 1 : _b; + var r = r255 / 255; + var g = g255 / 255; + var b = b255 / 255; + var max = Math.max(r, g, b); + var min = Math.min(r, g, b); + var c = max - min; + var l = (max + min) / 2; + if (c === 0) { + return { h: 0, s: 0, l: l, a: a }; + } + var h = (max === r ? (((g - b) / c) % 6) : + max === g ? ((b - r) / c + 2) : + ((r - g) / c + 4)) * 60; + if (h < 0) { + h += 360; + } + var s = c / (1 - Math.abs(2 * l - 1)); + return { h: h, s: s, l: l, a: a }; + } + function toFixed(n, digits) { + if (digits === void 0) { digits = 0; } + var fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + var dot = fixed.indexOf('.'); + if (dot >= 0) { + var zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToString(rgb) { + var r = rgb.r, g = rgb.g, b = rgb.b, a = rgb.a; + if (a != null && a < 1) { + return "rgba(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ", " + toFixed(a, 2) + ")"; + } + return "rgb(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ")"; + } + function rgbToHexString(_a) { + var r = _a.r, g = _a.g, b = _a.b, a = _a.a; + return "#" + (a != null && a < 1 ? [r, g, b, Math.round(a * 255)] : [r, g, b]).map(function (x) { + return "" + (x < 16 ? '0' : '') + x.toString(16); + }).join(''); + } + var rgbMatch = /^rgba?\([^\(\)]+\)$/; + var hslMatch = /^hsla?\([^\(\)]+\)$/; + var hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + var c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === 'transparent') { + return { r: 0, g: 0, b: 0, a: 0 }; + } + throw new Error("Unable to parse " + $color); + } + function getNumbersFromString(str, splitter, range, units) { + var raw = str.split(splitter).filter(function (x) { return x; }); + var unitsList = Object.entries(units); + var numbers = raw.map(function (r) { return r.trim(); }).map(function (r, i) { + var n; + var unit = unitsList.find(function (_a) { + var u = _a[0]; + return r.endsWith(u); + }); + if (unit) { + n = parseFloat(r.substring(0, r.length - unit[0].length)) / unit[1] * range[i]; + } + else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + var rgbSplitter = /rgba?|\(|\)|\/|,|\s/ig; + var rgbRange = [255, 255, 255, 1]; + var rgbUnits = { '%': 100 }; + function parseRGB($rgb) { + var _a = getNumbersFromString($rgb, rgbSplitter, rgbRange, rgbUnits), r = _a[0], g = _a[1], b = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; + return { r: r, g: g, b: b, a: a }; + } + var hslSplitter = /hsla?|\(|\)|\/|,|\s/ig; + var hslRange = [360, 1, 1, 1]; + var hslUnits = { '%': 100, 'deg': 360, 'rad': 2 * Math.PI, 'turn': 1 }; + function parseHSL($hsl) { + var _a = getNumbersFromString($hsl, hslSplitter, hslRange, hslUnits), h = _a[0], s = _a[1], l = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; + return hslToRGB({ h: h, s: s, l: l, a: a }); + } + function parseHex($hex) { + var h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + var _a = [0, 1, 2].map(function (i) { return parseInt("" + h[i] + h[i], 16); }), r = _a[0], g = _a[1], b = _a[2]; + var a = h.length === 3 ? 1 : (parseInt("" + h[3] + h[3], 16) / 255); + return { r: r, g: g, b: b, a: a }; + } + case 6: + case 8: { + var _b = [0, 2, 4].map(function (i) { return parseInt(h.substring(i, i + 2), 16); }), r = _b[0], g = _b[1], b = _b[2]; + var a = h.length === 6 ? 1 : (parseInt(h.substring(6, 8), 16) / 255); + return { r: r, g: g, b: b, a: a }; + } + } + throw new Error("Unable to parse " + $hex); + } + function getColorByName($color) { + var n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + var n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + var knownColors = new Map(Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32, + })); + var systemColors = new Map(Object.entries({ + ActiveBorder: 0x3b99fc, + ActiveCaption: 0x000000, + AppWorkspace: 0xaaaaaa, + Background: 0x6363ce, + ButtonFace: 0xffffff, + ButtonHighlight: 0xe9e9e9, + ButtonShadow: 0x9fa09f, + ButtonText: 0x000000, + CaptionText: 0x000000, + GrayText: 0x7f7f7f, + Highlight: 0xb2d7ff, + HighlightText: 0x000000, + InactiveBorder: 0xffffff, + InactiveCaption: 0xffffff, + InactiveCaptionText: 0x000000, + InfoBackground: 0xfbfcc5, + InfoText: 0x000000, + Menu: 0xf6f6f6, + MenuText: 0xffffff, + Scrollbar: 0xaaaaaa, + ThreeDDarkShadow: 0x000000, + ThreeDFace: 0xc0c0c0, + ThreeDHighlight: 0xffffff, + ThreeDLightShadow: 0xffffff, + ThreeDShadow: 0x000000, + Window: 0xececec, + WindowFrame: 0xaaaaaa, + WindowText: 0x000000, + '-webkit-focus-ring-color': 0xe59700 + }).map(function (_a) { + var key = _a[0], value = _a[1]; + return [key.toLowerCase(), value]; + })); + + function scale(x, inLow, inHigh, outLow, outHigh) { + return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + function multiplyMatrices(m1, m2) { + var result = []; + for (var i = 0; i < m1.length; i++) { + result[i] = []; + for (var j = 0; j < m2[0].length; j++) { + var sum = 0; + for (var k = 0; k < m1[0].length; k++) { + sum += m1[i][k] * m2[k][j]; + } + result[i][j] = sum; + } + } + return result; + } + + function getMatches(regex, input, group) { + if (group === void 0) { group = 0; } + var matches = []; + var m; + while (m = regex.exec(input)) { + matches.push(m[group]); + } + return matches; + } + + function createFilterMatrix(config) { + var m = Matrix.identity(); + if (config.sepia !== 0) { + m = multiplyMatrices(m, Matrix.sepia(config.sepia / 100)); + } + if (config.grayscale !== 0) { + m = multiplyMatrices(m, Matrix.grayscale(config.grayscale / 100)); + } + if (config.contrast !== 100) { + m = multiplyMatrices(m, Matrix.contrast(config.contrast / 100)); + } + if (config.brightness !== 100) { + m = multiplyMatrices(m, Matrix.brightness(config.brightness / 100)); + } + if (config.mode === 1) { + m = multiplyMatrices(m, Matrix.invertNHue()); + } + return m; + } + function applyColorMatrix(_a, matrix) { + var r = _a[0], g = _a[1], b = _a[2]; + var rgb = [[r / 255], [g / 255], [b / 255], [1], [1]]; + var result = multiplyMatrices(matrix, rgb); + return [0, 1, 2].map(function (i) { return clamp(Math.round(result[i][0] * 255), 0, 255); }); + } + var Matrix = { + identity: function () { + return [ + [1, 0, 0, 0, 0], + [0, 1, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + invertNHue: function () { + return [ + [0.333, -0.667, -0.667, 0, 1], + [-0.667, 0.333, -0.667, 0, 1], + [-0.667, -0.667, 0.333, 0, 1], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + brightness: function (v) { + return [ + [v, 0, 0, 0, 0], + [0, v, 0, 0, 0], + [0, 0, v, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + contrast: function (v) { + var t = (1 - v) / 2; + return [ + [v, 0, 0, 0, t], + [0, v, 0, 0, t], + [0, 0, v, 0, t], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + sepia: function (v) { + return [ + [(0.393 + 0.607 * (1 - v)), (0.769 - 0.769 * (1 - v)), (0.189 - 0.189 * (1 - v)), 0, 0], + [(0.349 - 0.349 * (1 - v)), (0.686 + 0.314 * (1 - v)), (0.168 - 0.168 * (1 - v)), 0, 0], + [(0.272 - 0.272 * (1 - v)), (0.534 - 0.534 * (1 - v)), (0.131 + 0.869 * (1 - v)), 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + grayscale: function (v) { + return [ + [(0.2126 + 0.7874 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], + [(0.2126 - 0.2126 * (1 - v)), (0.7152 + 0.2848 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], + [(0.2126 - 0.2126 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 + 0.9278 * (1 - v)), 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + }; + + var colorModificationCache = new Map(); + function clearColorModificationCache() { + colorModificationCache.clear(); + } + function modifyColorWithCache(rgb, filter, modifyHSL) { + var fnCache; + if (colorModificationCache.has(modifyHSL)) { + fnCache = colorModificationCache.get(modifyHSL); + } + else { + fnCache = new Map(); + colorModificationCache.set(modifyHSL, fnCache); + } + var id = Object.entries(rgb) + .concat(Object.entries(filter).filter(function (_a) { + var key = _a[0]; + return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].indexOf(key) >= 0; + })) + .map(function (_a) { + var key = _a[0], value = _a[1]; + return key + ":" + value; + }) + .join(';'); + if (fnCache.has(id)) { + return fnCache.get(id); + } + var hsl = rgbToHSL(rgb); + var modified = modifyHSL(hsl); + var _a = hslToRGB(modified), r = _a.r, g = _a.g, b = _a.b, a = _a.a; + var matrix = createFilterMatrix(filter); + var _b = applyColorMatrix([r, g, b], matrix), rf = _b[0], gf = _b[1], bf = _b[2]; + var color = (a === 1 ? + rgbToHexString({ r: rf, g: gf, b: bf }) : + rgbToString({ r: rf, g: gf, b: bf, a: a })); + fnCache.set(id, color); + return color; + } + function noopHSL(hsl) { + return hsl; + } + function modifyColor(rgb, theme) { + return modifyColorWithCache(rgb, theme, noopHSL); + } + function modifyLightModeHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMin = 0; + var lMid = 0.4; + var lMax = 0.9; + var sNeutralLim = 0.36; + var lNeutralDark = 0.2; + var lNeutralLight = 0.8; + var sColored = 0.16; + var hColoredL0 = 205; + var hColoredL1 = 40; + var lx = scale(l, 0, 1, lMin, lMax); + var hx = h; + var sx = s; + var isNeutral = l < lNeutralDark || l > lNeutralLight || s < sNeutralLim; + if (isNeutral) { + sx = (l < lMid ? + scale(l, 0, lMid, sColored, 0) : + scale(l, lMid, 1, 0, sColored)); + hx = (l < lMid ? hColoredL0 : hColoredL1); + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyBgHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMin = 0.1; + var lMaxS0 = 0.25; + var lMaxS1 = 0.4; + var sNeutralLim = 0.12; + var lNeutralLight = 0.8; + var sColored = 0.05; + var hColored = 205; + var hBlue0 = 200; + var hBlue1 = 280; + var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); + var lx = (l < lMax ? + l : + l < 0.5 ? + lMax : + scale(l, 0.5, 1, lMax, lMin)); + var isNeutral = (l >= lNeutralLight && h > hBlue0 && h < hBlue1) || s < sNeutralLim; + var hx = h; + var sx = s; + if (isNeutral) { + sx = sColored; + hx = hColored; + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyBackgroundColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign(__assign({}, filter), { mode: 0 }), modifyBgHSL); + } + function modifyFgHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMax = 0.9; + var lMinS0 = 0.7; + var lMinS1 = 0.6; + var sNeutralLim = 0.24; + var lNeutralDark = 0.2; + var sColored = 0.10; + var hColored = 40; + var hBlue0 = 205; + var hBlue1 = 245; + var hBlueMax = 220; + var lBlueMin = 0.7; + var isBlue = h > hBlue0 && h <= hBlue1; + var lMin = scale(s, 0, 1, isBlue ? scale(h, hBlue0, hBlue1, lMinS0, lBlueMin) : lMinS0, lMinS1); + var lx = (l < 0.5 ? + scale(l, 0, 0.5, lMax, lMin) : + l < lMin ? + lMin : + l); + var hx = h; + var sx = s; + if (isBlue) { + hx = scale(hx, hBlue0, hBlue1, hBlue0, hBlueMax); + } + var isNeutral = l < lNeutralDark || s < sNeutralLim; + if (isNeutral) { + sx = sColored; + hx = hColored; + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyForegroundColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign(__assign({}, filter), { mode: 0 }), modifyFgHSL); + } + function modifyBorderHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMinS0 = 0.2; + var lMinS1 = 0.3; + var lMaxS0 = 0.4; + var lMaxS1 = 0.5; + var lMin = scale(s, 0, 1, lMinS0, lMinS1); + var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); + var lx = scale(l, 0, 1, lMax, lMin); + return { h: h, s: s, l: lx, a: a }; + } + function modifyBorderColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign(__assign({}, filter), { mode: 0 }), modifyBorderHSL); + } + function modifyShadowColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + function modifyGradientColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + + function getURLHost(url) { + return url.match(/^(.*?\/{2,3})?(.+?)(\/|$)/)[2]; + } + + function createTextStyle(config) { + var lines = []; + lines.push('* {'); + if (config.useFont && config.fontFamily) { + lines.push(" font-family: " + config.fontFamily + " !important;"); + } + if (config.textStroke > 0) { + lines.push(" -webkit-text-stroke: " + config.textStroke + "px !important;"); + lines.push(" text-stroke: " + config.textStroke + "px !important;"); + } + lines.push('}'); + return lines.join('\n'); + } + + var FilterMode; + (function (FilterMode) { + FilterMode[FilterMode["light"] = 0] = "light"; + FilterMode[FilterMode["dark"] = 1] = "dark"; + })(FilterMode || (FilterMode = {})); + function getCSSFilterValue(config) { + var filters = []; + if (config.mode === FilterMode.dark) { + filters.push('invert(100%) hue-rotate(180deg)'); + } + if (config.brightness !== 100) { + filters.push("brightness(" + config.brightness + "%)"); + } + if (config.contrast !== 100) { + filters.push("contrast(" + config.contrast + "%)"); + } + if (config.grayscale !== 0) { + filters.push("grayscale(" + config.grayscale + "%)"); + } + if (config.sepia !== 0) { + filters.push("sepia(" + config.sepia + "%)"); + } + if (filters.length === 0) { + return null; + } + return filters.join(' '); + } + + function toSVGMatrix(matrix) { + return matrix.slice(0, 4).map(function (m) { return m.map(function (m) { return m.toFixed(3); }).join(' '); }).join(' '); + } + function getSVGFilterMatrixValue(config) { + return toSVGMatrix(createFilterMatrix(config)); + } + + var counter = 0; + var resolvers = new Map(); + var rejectors = new Map(); + function bgFetch(request) { + return new Promise(function (resolve, reject) { + var id = ++counter; + resolvers.set(id, resolve); + rejectors.set(id, reject); + chrome.runtime.sendMessage({ type: 'fetch', data: request, id: id }); + }); + } + chrome.runtime.onMessage.addListener(function (_a) { + var type = _a.type, data = _a.data, error = _a.error, id = _a.id; + if (type === 'fetch-response') { + var resolve = resolvers.get(id); + var reject = rejectors.get(id); + resolvers.delete(id); + rejectors.delete(id); + if (error) { + reject && reject(error); + } + else { + resolve && resolve(data); + } + } + }); + + function getImageDetails(url) { + return __awaiter(this, void 0, void 0, function () { + var dataURL, image, info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url.startsWith('data:')) return [3, 1]; + dataURL = url; + return [3, 3]; + case 1: return [4, getImageDataURL(url)]; + case 2: + dataURL = _a.sent(); + _a.label = 3; + case 3: return [4, urlToImage(dataURL)]; + case 4: + image = _a.sent(); + info = analyzeImage(image); + return [2, __assign({ src: url, dataURL: dataURL, width: image.naturalWidth, height: image.naturalHeight }, info)]; + } + }); + }); + } + function getImageDataURL(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(getURLHost(url) === location.host)) return [3, 2]; + return [4, loadAsDataURL(url)]; + case 1: return [2, _a.sent()]; + case 2: return [4, bgFetch({ url: url, responseType: 'data-url' })]; + case 3: return [2, _a.sent()]; + } + }); + }); + } + function urlToImage(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2, new Promise(function (resolve, reject) { + var image = new Image(); + image.onload = function () { return resolve(image); }; + image.onerror = function () { return reject("Unable to load image " + url); }; + image.src = url; + })]; + }); + }); + } + function analyzeImage(image) { + var MAX_ANALIZE_PIXELS_COUNT = 32 * 32; + var naturalPixelsCount = image.naturalWidth * image.naturalHeight; + var k = Math.min(1, Math.sqrt(MAX_ANALIZE_PIXELS_COUNT / naturalPixelsCount)); + var width = Math.max(1, Math.round(image.naturalWidth * k)); + var height = Math.max(1, Math.round(image.naturalHeight * k)); + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + var context = canvas.getContext('2d'); + context.imageSmoothingEnabled = false; + context.drawImage(image, 0, 0, width, height); + var imageData = context.getImageData(0, 0, width, height); + var d = imageData.data; + var TRANSPARENT_ALPHA_THRESHOLD = 0.05; + var DARK_LIGHTNESS_THRESHOLD = 0.4; + var LIGHT_LIGHTNESS_THRESHOLD = 0.7; + var transparentPixelsCount = 0; + var darkPixelsCount = 0; + var lightPixelsCount = 0; + var i, x, y; + var r, g, b, a; + var l, min, max; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + i = 4 * (y * width + x); + r = d[i + 0] / 255; + g = d[i + 1] / 255; + b = d[i + 2] / 255; + a = d[i + 3] / 255; + if (a < TRANSPARENT_ALPHA_THRESHOLD) { + transparentPixelsCount++; + } + else { + min = Math.min(r, g, b); + max = Math.max(r, g, b); + l = (max + min) / 2; + if (l < DARK_LIGHTNESS_THRESHOLD) { + darkPixelsCount++; + } + if (l > LIGHT_LIGHTNESS_THRESHOLD) { + lightPixelsCount++; + } + } + } + } + var totalPixelsCount = width * height; + var opaquePixelsCount = totalPixelsCount - transparentPixelsCount; + var DARK_IMAGE_THRESHOLD = 0.7; + var LIGHT_IMAGE_THRESHOLD = 0.7; + var TRANSPARENT_IMAGE_THRESHOLD = 0.1; + var LARGE_IMAGE_PIXELS_COUNT = 800 * 600; + return { + isDark: ((darkPixelsCount / opaquePixelsCount) >= DARK_IMAGE_THRESHOLD), + isLight: ((lightPixelsCount / opaquePixelsCount) >= LIGHT_IMAGE_THRESHOLD), + isTransparent: ((transparentPixelsCount / totalPixelsCount) >= TRANSPARENT_IMAGE_THRESHOLD), + isLarge: (naturalPixelsCount >= LARGE_IMAGE_PIXELS_COUNT), + }; + } + function getFilteredImageDataURL(_a, filter) { + var dataURL = _a.dataURL, width = _a.width, height = _a.height; + var matrix = getSVGFilterMatrixValue(filter); + var svg = [ + "", + '', + '', + "", + '', + '', + "", + '', + ].join(''); + var bytes = new Uint8Array(svg.length); + for (var i = 0; i < svg.length; i++) { + bytes[i] = svg.charCodeAt(i); + } + var blob = new Blob([bytes], { type: 'image/svg+xml' }); + var objectURL = URL.createObjectURL(blob); + return objectURL; + } + + function getModifiableCSSDeclaration(property, value, rule, isCancelled) { + var important = Boolean(rule && rule.style && rule.style.getPropertyPriority(property)); + var sourceValue = value; + if (property.startsWith('--')) { + return null; + } + else if ((property.indexOf('color') >= 0 && property !== '-webkit-print-color-adjust') || + property === 'fill' || + property === 'stroke') { + var modifier = getColorModifier(property, value); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + else if (property === 'background-image') { + var modifier = getBgImageModifier(property, value, rule, isCancelled); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + else if (property.indexOf('shadow') >= 0) { + var modifier = getShadowModifier(property, value); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + return null; + } + function getModifiedUserAgentStyle(filter, isIFrame) { + var lines = []; + if (!isIFrame) { + lines.push('html {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); + lines.push('}'); + } + lines.push((isIFrame ? '' : 'html, body, ') + "input, textarea, select, button {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('html, body, input, textarea, select, button {'); + lines.push(" border-color: " + modifyBorderColor({ r: 76, g: 76, b: 76 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + ";"); + lines.push('}'); + lines.push('a {'); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 64, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('table {'); + lines.push(" border-color: " + modifyBorderColor({ r: 128, g: 128, b: 128 }, filter) + ";"); + lines.push('}'); + lines.push('::placeholder {'); + lines.push(" color: " + modifyForegroundColor({ r: 169, g: 169, b: 169 }, filter) + ";"); + lines.push('}'); + ['::selection', '::-moz-selection'].forEach(function (selection) { + lines.push(selection + " {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 0, g: 96, b: 212 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + }); + lines.push('input:-webkit-autofill,'); + lines.push('textarea:-webkit-autofill,'); + lines.push('select:-webkit-autofill {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 250, g: 255, b: 189 }, filter) + " !important;"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); + lines.push('}'); + if (!isMacOS()) { + lines.push('::-webkit-scrollbar {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb:hover {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 166, g: 166, b: 166 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb:active {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-corner {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('* {'); + lines.push(" scrollbar-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + " " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); + lines.push('}'); + } + return lines.join('\n'); + } + function getModifiedFallbackStyle(filter, _a) { + var strict = _a.strict; + var lines = []; + lines.push("html, body, " + (strict ? 'body *' : 'body > *') + " {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); + lines.push(" border-color: " + modifyBorderColor({ r: 64, g: 64, b: 64 }, filter) + " !important;"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); + lines.push('}'); + return lines.join('\n'); + } + var unparsableColors = new Set([ + 'inherit', + 'transparent', + 'initial', + 'currentcolor', + 'none', + ]); + var colorParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (colorParseCache.has($color)) { + return colorParseCache.get($color); + } + var color = parse($color); + colorParseCache.set($color, color); + return color; + } + function tryParseColor($color) { + try { + return parseColorWithCache($color); + } + catch (err) { + return null; + } + } + function getColorModifier(prop, value) { + if (unparsableColors.has(value.toLowerCase())) { + return value; + } + try { + var rgb_1 = parseColorWithCache(value); + if (prop.indexOf('background') >= 0) { + return function (filter) { return modifyBackgroundColor(rgb_1, filter); }; + } + if (prop.indexOf('border') >= 0 || prop.indexOf('outline') >= 0) { + return function (filter) { return modifyBorderColor(rgb_1, filter); }; + } + return function (filter) { return modifyForegroundColor(rgb_1, filter); }; + } + catch (err) { + logWarn('Color parse error', err); + return null; + } + } + var gradientRegex = /[\-a-z]+gradient\(([^\(\)]*(\(([^\(\)]*(\(.*?\)))*[^\(\)]*\))){0,15}[^\(\)]*\)/g; + var imageDetailsCache = new Map(); + var awaitingForImageLoading = new Map(); + function getBgImageModifier(prop, value, rule, isCancelled) { + var _this = this; + try { + var gradients = getMatches(gradientRegex, value); + var urls = getMatches(cssURLRegex, value); + if (urls.length === 0 && gradients.length === 0) { + return value; + } + var getIndices = function (matches) { + var index = 0; + return matches.map(function (match) { + var valueIndex = value.indexOf(match, index); + index = valueIndex + match.length; + return { match: match, index: valueIndex }; + }); + }; + var matches_1 = getIndices(urls).map(function (i) { return (__assign({ type: 'url' }, i)); }) + .concat(getIndices(gradients).map(function (i) { return (__assign({ type: 'gradient' }, i)); })) + .sort(function (a, b) { return a.index - b.index; }); + var getGradientModifier_1 = function (gradient) { + var match = gradient.match(/^(.*-gradient)\((.*)\)$/); + var type = match[1]; + var content = match[2]; + var partsRegex = /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?[^\(\),]*),?/g; + var colorStopRegex = /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/; + var parts = getMatches(partsRegex, content, 1).map(function (part) { + part = part.trim(); + var rgb = tryParseColor(part); + if (rgb) { + return function (filter) { return modifyGradientColor(rgb, filter); }; + } + var space = part.lastIndexOf(' '); + rgb = tryParseColor(part.substring(0, space)); + if (rgb) { + return function (filter) { return modifyGradientColor(rgb, filter) + " " + part.substring(space + 1); }; + } + var colorStopMatch = part.match(colorStopRegex); + if (colorStopMatch) { + rgb = tryParseColor(colorStopMatch[3]); + if (rgb) { + return function (filter) { return colorStopMatch[1] + "(" + (colorStopMatch[2] ? colorStopMatch[2] + ", " : '') + modifyGradientColor(rgb, filter) + ")"; }; + } + } + return function () { return part; }; + }); + return function (filter) { + return type + "(" + parts.map(function (modify) { return modify(filter); }).join(', ') + ")"; + }; + }; + var getURLModifier_1 = function (urlValue) { + var url = getCSSURLValue(urlValue); + if (rule.parentStyleSheet.href) { + var basePath = getCSSBaseBath(rule.parentStyleSheet.href); + url = getAbsoluteURL(basePath, url); + } + else if (rule.parentStyleSheet.ownerNode && rule.parentStyleSheet.ownerNode.baseURI) { + url = getAbsoluteURL(rule.parentStyleSheet.ownerNode.baseURI, url); + } + else { + url = getAbsoluteURL(location.origin, url); + } + var absoluteValue = "url(\"" + url + "\")"; + return function (filter) { return __awaiter(_this, void 0, void 0, function () { + var imageDetails, awaiters_1, err_1, bgImageValue; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!imageDetailsCache.has(url)) return [3, 1]; + imageDetails = imageDetailsCache.get(url); + return [3, 7]; + case 1: + _a.trys.push([1, 6, , 7]); + if (!awaitingForImageLoading.has(url)) return [3, 3]; + awaiters_1 = awaitingForImageLoading.get(url); + return [4, new Promise(function (resolve) { return awaiters_1.push(resolve); })]; + case 2: + imageDetails = _a.sent(); + if (!imageDetails) { + return [2, null]; + } + return [3, 5]; + case 3: + awaitingForImageLoading.set(url, []); + return [4, getImageDetails(url)]; + case 4: + imageDetails = _a.sent(); + imageDetailsCache.set(url, imageDetails); + awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(imageDetails); }); + awaitingForImageLoading.delete(url); + _a.label = 5; + case 5: + if (isCancelled()) { + return [2, null]; + } + return [3, 7]; + case 6: + err_1 = _a.sent(); + logWarn(err_1); + if (awaitingForImageLoading.has(url)) { + awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(null); }); + awaitingForImageLoading.delete(url); + } + return [2, absoluteValue]; + case 7: + bgImageValue = getBgImageValue_1(imageDetails, filter) || absoluteValue; + return [2, bgImageValue]; + } + }); + }); }; + }; + var getBgImageValue_1 = function (imageDetails, filter) { + var isDark = imageDetails.isDark, isLight = imageDetails.isLight, isTransparent = imageDetails.isTransparent, isLarge = imageDetails.isLarge, width = imageDetails.width; + var result; + if (isDark && isTransparent && filter.mode === 1 && !isLarge && width > 2) { + logInfo("Inverting dark image " + imageDetails.src); + var inverted = getFilteredImageDataURL(imageDetails, __assign(__assign({}, filter), { sepia: clamp(filter.sepia + 10, 0, 100) })); + result = "url(\"" + inverted + "\")"; + } + else if (isLight && !isTransparent && filter.mode === 1) { + if (isLarge) { + result = 'none'; + } + else { + logInfo("Dimming light image " + imageDetails.src); + var dimmed = getFilteredImageDataURL(imageDetails, filter); + result = "url(\"" + dimmed + "\")"; + } + } + else if (filter.mode === 0 && isLight && !isLarge) { + logInfo("Applying filter to image " + imageDetails.src); + var filtered = getFilteredImageDataURL(imageDetails, __assign(__assign({}, filter), { brightness: clamp(filter.brightness - 10, 5, 200), sepia: clamp(filter.sepia + 10, 0, 100) })); + result = "url(\"" + filtered + "\")"; + } + else { + result = null; + } + return result; + }; + var modifiers_1 = []; + var index_1 = 0; + matches_1.forEach(function (_a, i) { + var match = _a.match, type = _a.type, matchStart = _a.index; + var prefixStart = index_1; + var matchEnd = matchStart + match.length; + index_1 = matchEnd; + modifiers_1.push(function () { return value.substring(prefixStart, matchStart); }); + modifiers_1.push(type === 'url' ? getURLModifier_1(match) : getGradientModifier_1(match)); + if (i === matches_1.length - 1) { + modifiers_1.push(function () { return value.substring(matchEnd); }); + } + }); + return function (filter) { + var results = modifiers_1.map(function (modify) { return modify(filter); }); + if (results.some(function (r) { return r instanceof Promise; })) { + return Promise.all(results) + .then(function (asyncResults) { + return asyncResults.join(''); + }); + } + return results.join(''); + }; + } + catch (err) { + logWarn("Unable to parse gradient " + value, err); + return null; + } + } + function getShadowModifier(prop, value) { + try { + var index_2 = 0; + var colorMatches_1 = getMatches(/(^|\s)([a-z]+\(.+?\)|#[0-9a-f]+|[a-z]+)(.*?(inset|outset)?($|,))/ig, value, 2); + var modifiers_2 = colorMatches_1.map(function (match, i) { + var prefixIndex = index_2; + var matchIndex = value.indexOf(match, index_2); + var matchEnd = matchIndex + match.length; + index_2 = matchEnd; + var rgb = tryParseColor(match); + if (!rgb) { + return function () { return value.substring(prefixIndex, matchEnd); }; + } + return function (filter) { return "" + value.substring(prefixIndex, matchIndex) + modifyShadowColor(rgb, filter) + (i === colorMatches_1.length - 1 ? value.substring(matchEnd) : ''); }; + }); + return function (filter) { return modifiers_2.map(function (modify) { return modify(filter); }).join(''); }; + } + catch (err) { + logWarn("Unable to parse shadow " + value, err); + return null; + } + } + function cleanModificationCache() { + colorParseCache.clear(); + clearColorModificationCache(); + imageDetailsCache.clear(); + awaitingForImageLoading.clear(); + } + + var overrides = { + 'background-color': { + customProp: '--darkreader-inline-bgcolor', + cssProp: 'background-color', + dataAttr: 'data-darkreader-inline-bgcolor', + store: new WeakSet(), + }, + 'background-image': { + customProp: '--darkreader-inline-bgimage', + cssProp: 'background-image', + dataAttr: 'data-darkreader-inline-bgimage', + store: new WeakSet(), + }, + 'border-color': { + customProp: '--darkreader-inline-border', + cssProp: 'border-color', + dataAttr: 'data-darkreader-inline-border', + store: new WeakSet(), + }, + 'border-bottom-color': { + customProp: '--darkreader-inline-border-bottom', + cssProp: 'border-bottom-color', + dataAttr: 'data-darkreader-inline-border-bottom', + store: new WeakSet(), + }, + 'border-left-color': { + customProp: '--darkreader-inline-border-left', + cssProp: 'border-left-color', + dataAttr: 'data-darkreader-inline-border-left', + store: new WeakSet(), + }, + 'border-right-color': { + customProp: '--darkreader-inline-border-right', + cssProp: 'border-right-color', + dataAttr: 'data-darkreader-inline-border-right', + store: new WeakSet(), + }, + 'border-top-color': { + customProp: '--darkreader-inline-border-top', + cssProp: 'border-top-color', + dataAttr: 'data-darkreader-inline-border-top', + store: new WeakSet(), + }, + 'box-shadow': { + customProp: '--darkreader-inline-boxshadow', + cssProp: 'box-shadow', + dataAttr: 'data-darkreader-inline-boxshadow', + store: new WeakSet(), + }, + 'color': { + customProp: '--darkreader-inline-color', + cssProp: 'color', + dataAttr: 'data-darkreader-inline-color', + store: new WeakSet(), + }, + 'fill': { + customProp: '--darkreader-inline-fill', + cssProp: 'fill', + dataAttr: 'data-darkreader-inline-fill', + store: new WeakSet(), + }, + 'stroke': { + customProp: '--darkreader-inline-stroke', + cssProp: 'stroke', + dataAttr: 'data-darkreader-inline-stroke', + store: new WeakSet(), + }, + 'outline-color': { + customProp: '--darkreader-inline-outline', + cssProp: 'outline-color', + dataAttr: 'data-darkreader-inline-outline', + store: new WeakSet(), + }, + }; + var overridesList = Object.values(overrides); + var INLINE_STYLE_ATTRS = ['style', 'fill', 'stroke', 'bgcolor', 'color']; + var INLINE_STYLE_SELECTOR = INLINE_STYLE_ATTRS.map(function (attr) { return "[" + attr + "]"; }).join(', '); + function getInlineOverrideStyle() { + return overridesList.map(function (_a) { + var dataAttr = _a.dataAttr, customProp = _a.customProp, cssProp = _a.cssProp; + return [ + "[" + dataAttr + "] {", + " " + cssProp + ": var(" + customProp + ") !important;", + '}', + ].join('\n'); + }).join('\n'); + } + function expand(nodes, selector) { + var results = []; + nodes.forEach(function (n) { + if (n instanceof Element) { + if (n.matches(selector)) { + results.push(n); + } + results.push.apply(results, Array.from(n.querySelectorAll(selector))); + } + }); + return results; + } + var observers = new Map(); + function watchForInlineStyles(elementStyleDidChange, shadowRootDiscovered) { + deepWatchForInlineStyles(document.documentElement, elementStyleDidChange, shadowRootDiscovered); + iterateShadowNodes(document.documentElement, function (node) { + deepWatchForInlineStyles(node.shadowRoot, elementStyleDidChange, shadowRootDiscovered); + }); + } + function deepWatchForInlineStyles(root, elementStyleDidChange, shadowRootDiscovered) { + if (observers.has(root)) { + observers.get(root).disconnect(); + } + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (m) { + var createdInlineStyles = expand(Array.from(m.addedNodes), INLINE_STYLE_SELECTOR); + if (createdInlineStyles.length > 0) { + createdInlineStyles.forEach(function (el) { return elementStyleDidChange(el); }); + } + if (m.type === 'attributes') { + if (INLINE_STYLE_ATTRS.includes(m.attributeName)) { + elementStyleDidChange(m.target); + } + overridesList + .filter(function (_a) { + var store = _a.store, dataAttr = _a.dataAttr; + return store.has(m.target) && !m.target.hasAttribute(dataAttr); + }) + .forEach(function (_a) { + var dataAttr = _a.dataAttr; + return m.target.setAttribute(dataAttr, ''); + }); + } + }); + mutations.forEach(function (m) { + m.addedNodes.forEach(function (added) { + if (added.isConnected) { + iterateShadowNodes(added, function (n) { + shadowRootDiscovered(n.shadowRoot); + deepWatchForInlineStyles(n.shadowRoot, elementStyleDidChange, shadowRootDiscovered); + }); + } + }); + }); + }); + observer.observe(root, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: INLINE_STYLE_ATTRS.concat(overridesList.map(function (_a) { + var dataAttr = _a.dataAttr; + return dataAttr; + })), + }); + observers.set(root, observer); + } + function stopWatchingForInlineStyles() { + observers.forEach(function (o) { return o.disconnect(); }); + observers.clear(); + } + var inlineStyleCache = new WeakMap(); + var filterProps = ['brightness', 'contrast', 'grayscale', 'sepia', 'mode']; + function getInlineStyleCacheKey(el, theme) { + return INLINE_STYLE_ATTRS + .map(function (attr) { return attr + "=\"" + el.getAttribute(attr) + "\""; }) + .concat(filterProps.map(function (prop) { return prop + "=\"" + theme[prop] + "\""; })) + .join(' '); + } + function overrideInlineStyle(element, theme) { + var cacheKey = getInlineStyleCacheKey(element, theme); + if (cacheKey === inlineStyleCache.get(element)) { + return; + } + var unsetProps = new Set(Object.keys(overrides)); + function setCustomProp(targetCSSProp, modifierCSSProp, cssVal) { + var _a = overrides[targetCSSProp], customProp = _a.customProp, dataAttr = _a.dataAttr; + var mod = getModifiableCSSDeclaration(modifierCSSProp, cssVal, null, null); + if (!mod) { + return; + } + var value = mod.value; + if (typeof value === 'function') { + value = value(theme); + } + element.style.setProperty(customProp, value); + if (!element.hasAttribute(dataAttr)) { + element.setAttribute(dataAttr, ''); + } + unsetProps.delete(targetCSSProp); + } + if (element.hasAttribute('bgcolor')) { + var value = element.getAttribute('bgcolor'); + if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { + value = "#" + value; + } + setCustomProp('background-color', 'background-color', value); + } + if (element.hasAttribute('color')) { + var value = element.getAttribute('color'); + if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { + value = "#" + value; + } + setCustomProp('color', 'color', value); + } + if (element.hasAttribute('fill') && element instanceof SVGElement) { + var SMALL_SVG_LIMIT = 32; + var value = element.getAttribute('fill'); + var isBg = false; + if (!(element instanceof SVGTextElement)) { + var _a = element.getBoundingClientRect(), width = _a.width, height = _a.height; + isBg = (width > SMALL_SVG_LIMIT || height > SMALL_SVG_LIMIT); + } + setCustomProp('fill', isBg ? 'background-color' : 'color', value); + } + if (element.hasAttribute('stroke')) { + var value = element.getAttribute('stroke'); + setCustomProp('stroke', element instanceof SVGLineElement || element instanceof SVGTextElement ? 'border-color' : 'color', value); + } + element.style && iterateCSSDeclarations(element.style, function (property, value) { + if (property === 'background-image' && value.indexOf('url') >= 0) { + return; + } + if (overrides.hasOwnProperty(property)) { + setCustomProp(property, property, value); + } + }); + if (element.style && element instanceof SVGTextElement && element.style.fill) { + setCustomProp('fill', 'color', element.style.getPropertyValue('fill')); + } + Array.from(unsetProps).forEach(function (cssProp) { + var _a = overrides[cssProp], store = _a.store, dataAttr = _a.dataAttr; + store.delete(element); + element.removeAttribute(dataAttr); + }); + inlineStyleCache.set(element, getInlineStyleCacheKey(element, theme)); + } + + var metaThemeColorName = 'theme-color'; + var metaThemeColorSelector = "meta[name=\"" + metaThemeColorName + "\"]"; + var srcMetaThemeColor = null; + var observer = null; + function changeMetaThemeColor(meta, theme) { + srcMetaThemeColor = srcMetaThemeColor || meta.content; + try { + var color = parse(srcMetaThemeColor); + meta.content = modifyBackgroundColor(color, theme); + } + catch (err) { + logWarn(err); + } + } + function changeMetaThemeColorWhenAvailable(theme) { + var meta = document.querySelector(metaThemeColorSelector); + if (meta) { + changeMetaThemeColor(meta, theme); + } + else { + if (observer) { + observer.disconnect(); + } + observer = new MutationObserver(function (mutations) { + loop: for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) { + var m = mutations_1[_i]; + for (var _a = 0, _b = Array.from(m.addedNodes); _a < _b.length; _a++) { + var node = _b[_a]; + if (node instanceof HTMLMetaElement && node.name === metaThemeColorName) { + observer.disconnect(); + observer = null; + changeMetaThemeColor(node, theme); + break loop; + } + } + } + }); + observer.observe(document.head, { childList: true }); + } + } + function restoreMetaThemeColor() { + if (observer) { + observer.disconnect(); + observer = null; + } + var meta = document.querySelector(metaThemeColorSelector); + if (meta && srcMetaThemeColor) { + meta.content = srcMetaThemeColor; + } + } + + var STYLE_SELECTOR = (function () { + var selectors = [ + 'html /deep/ link[rel*="stylesheet" i]:not([disabled])', + 'html /deep/ style', + ':host /deep/ link[rel*="stylesheet" i]:not([disabled])', + ':host /deep/ style', + ':host link[rel*="stylesheet" i]:not([disabled])', + ':host style', + ]; + if (!isDeepSelectorSupported()) { + selectors = selectors.map(function (s) { return s.replace('/deep/ ', ''); }); + } + if (!isHostSelectorSupported()) { + selectors = selectors.filter(function (s) { return s.startsWith(':host'); }); + } + return selectors.join(', '); + })(); + function shouldManageStyle(element) { + return (((element instanceof HTMLStyleElement) || + (element instanceof SVGStyleElement) || + (element instanceof HTMLLinkElement && + element.rel && + element.rel.toLowerCase().includes('stylesheet') && + !element.disabled)) && + !element.classList.contains('darkreader') && + element.media !== 'print'); + } + var asyncQueue = createAsyncTasksQueue(); + function manageStyle(element, _a) { + var update = _a.update, loadingStart = _a.loadingStart, loadingEnd = _a.loadingEnd; + var prevStyles = []; + var next = element; + while ((next = next.nextElementSibling) && next.matches('.darkreader')) { + prevStyles.push(next); + } + var corsCopy = prevStyles.find(function (el) { return el.matches('.darkreader--cors'); }) || null; + var syncStyle = prevStyles.find(function (el) { return el.matches('.darkreader--sync'); }) || null; + var corsCopyPositionWatcher = null; + var syncStylePositionWatcher = null; + var cancelAsyncOperations = false; + function isCancelled() { + return cancelAsyncOperations; + } + var observer = new MutationObserver(function () { + update(); + }); + var observerOptions = { attributes: true, childList: true, characterData: true }; + function containsCSSImport() { + return element instanceof HTMLStyleElement && element.textContent.trim().match(cssImportRegex); + } + function getRulesSync() { + if (corsCopy) { + return corsCopy.sheet.cssRules; + } + if (element.sheet == null) { + return null; + } + if (element instanceof HTMLLinkElement) { + try { + return element.sheet.cssRules; + } + catch (err) { + logWarn(err); + return null; + } + } + if (containsCSSImport()) { + return null; + } + return safeGetSheetRules(); + } + function insertStyle() { + if (corsCopy) { + if (element.nextSibling !== corsCopy) { + element.parentNode.insertBefore(corsCopy, element.nextSibling); + } + if (corsCopy.nextSibling !== syncStyle) { + element.parentNode.insertBefore(syncStyle, corsCopy.nextSibling); + } + } + else if (element.nextSibling !== syncStyle) { + element.parentNode.insertBefore(syncStyle, element.nextSibling); + } + } + function createSyncStyle() { + syncStyle = element instanceof SVGStyleElement ? + document.createElementNS('http://www.w3.org/2000/svg', 'style') : + document.createElement('style'); + syncStyle.classList.add('darkreader'); + syncStyle.classList.add('darkreader--sync'); + syncStyle.media = 'screen'; + } + var isLoadingRules = false; + var wasLoadingError = false; + function getRulesAsync() { + return __awaiter(this, void 0, void 0, function () { + var cssText, cssBasePath, err_1, fullCSSText, err_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(element instanceof HTMLLinkElement)) return [3, 6]; + if (!(element.sheet == null)) return [3, 4]; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4, linkLoading(element)]; + case 2: + _a.sent(); + if (cancelAsyncOperations) { + return [2, null]; + } + return [3, 4]; + case 3: + err_1 = _a.sent(); + logWarn(err_1); + wasLoadingError = true; + return [2, null]; + case 4: + try { + if (element.sheet.cssRules != null) { + return [2, element.sheet.cssRules]; + } + } + catch (err) { + logWarn(err); + } + return [4, loadText(element.href)]; + case 5: + cssText = _a.sent(); + cssBasePath = getCSSBaseBath(element.href); + if (cancelAsyncOperations) { + return [2, null]; + } + return [3, 7]; + case 6: + if (containsCSSImport()) { + cssText = element.textContent.trim(); + cssBasePath = getCSSBaseBath(location.href); + } + else { + return [2, null]; + } + _a.label = 7; + case 7: + if (!cssText) return [3, 12]; + _a.label = 8; + case 8: + _a.trys.push([8, 10, , 11]); + return [4, replaceCSSImports(cssText, cssBasePath)]; + case 9: + fullCSSText = _a.sent(); + corsCopy = createCORSCopy(element, fullCSSText); + return [3, 11]; + case 10: + err_2 = _a.sent(); + logWarn(err_2); + return [3, 11]; + case 11: + if (corsCopy) { + corsCopyPositionWatcher = watchForNodePosition(corsCopy, { watchParent: true, watchSibling: true }); + return [2, corsCopy.sheet.cssRules]; + } + _a.label = 12; + case 12: return [2, null]; + } + }); + }); + } + function details() { + var rules = getRulesSync(); + if (!rules) { + if (isLoadingRules || wasLoadingError) { + return null; + } + isLoadingRules = true; + loadingStart(); + getRulesAsync().then(function (results) { + isLoadingRules = false; + loadingEnd(); + if (results) { + update(); + } + }).catch(function (err) { + logWarn(err); + isLoadingRules = false; + loadingEnd(); + }); + return null; + } + var variables = getCSSVariables(rules); + return { variables: variables }; + } + function getFilterKey(filter) { + return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].map(function (p) { return p + ":" + filter[p]; }).join(';'); + } + var renderId = 0; + var rulesTextCache = new Map(); + var rulesModCache = new Map(); + var prevFilterKey = null; + var forceRestore = false; + function render(filter, variables) { + var rules = getRulesSync(); + if (!rules) { + return; + } + cancelAsyncOperations = false; + var rulesChanged = (rulesModCache.size === 0); + var notFoundCacheKeys = new Set(rulesModCache.keys()); + var filterKey = getFilterKey(filter); + var filterChanged = (filterKey !== prevFilterKey); + var modRules = []; + iterateCSSRules(rules, function (rule) { + var cssText = rule.cssText; + var textDiffersFromPrev = false; + notFoundCacheKeys.delete(cssText); + if (!rulesTextCache.has(cssText)) { + rulesTextCache.set(cssText, cssText); + textDiffersFromPrev = true; + } + var vars = null; + var varsRule = null; + if (variables.size > 0 || cssText.includes('var(')) { + var cssTextWithVariables = replaceCSSVariables(cssText, variables); + if (rulesTextCache.get(cssText) !== cssTextWithVariables) { + rulesTextCache.set(cssText, cssTextWithVariables); + textDiffersFromPrev = true; + vars = document.createElement('style'); + vars.classList.add('darkreader'); + vars.classList.add('darkreader--vars'); + vars.media = 'screen'; + vars.textContent = cssTextWithVariables; + element.parentNode.insertBefore(vars, element.nextSibling); + varsRule = vars.sheet.cssRules[0]; + } + } + if (textDiffersFromPrev) { + rulesChanged = true; + } + else { + modRules.push(rulesModCache.get(cssText)); + return; + } + var modDecs = []; + var targetRule = varsRule || rule; + targetRule && targetRule.style && iterateCSSDeclarations(targetRule.style, function (property, value) { + var mod = getModifiableCSSDeclaration(property, value, rule, isCancelled); + if (mod) { + modDecs.push(mod); + } + }); + var modRule = null; + if (modDecs.length > 0) { + modRule = { selector: rule.selectorText, declarations: modDecs }; + if (rule.parentRule instanceof CSSMediaRule) { + modRule.media = rule.parentRule.media.mediaText; + } + modRules.push(modRule); + } + rulesModCache.set(cssText, modRule); + removeNode(vars); + }); + notFoundCacheKeys.forEach(function (key) { + rulesTextCache.delete(key); + rulesModCache.delete(key); + }); + prevFilterKey = filterKey; + if (!forceRestore && !rulesChanged && !filterChanged) { + return; + } + renderId++; + forceRestore = false; + function setRule(target, index, declarations) { + var selector = declarations[0].selector; + target.insertRule(selector + " {}", index); + var style = target.cssRules.item(index).style; + declarations.forEach(function (_a) { + var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; + style.setProperty(property, value == null ? sourceValue : value, important ? 'important' : ''); + }); + } + var readyDeclarations = []; + var asyncDeclarations = new Map(); + var asyncDeclarationCounter = 0; + function buildStyleSheet() { + var groups = []; + readyDeclarations.forEach(function (decl, i) { + var mediaGroup; + var selectorGroup; + var prev = i === 0 ? null : readyDeclarations[i - 1]; + var isSameMedia = prev && prev.media === decl.media; + var isSameMediaAndSelector = prev && isSameMedia && prev.selector === decl.selector; + if (isSameMedia) { + mediaGroup = groups[groups.length - 1]; + } + else { + mediaGroup = []; + groups.push(mediaGroup); + } + if (isSameMediaAndSelector) { + selectorGroup = mediaGroup[mediaGroup.length - 1]; + } + else { + selectorGroup = []; + mediaGroup.push(selectorGroup); + } + selectorGroup.push(decl); + }); + if (!syncStyle) { + createSyncStyle(); + } + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + insertStyle(); + var sheet = syncStyle.sheet; + for (var i = sheet.cssRules.length - 1; i >= 0; i--) { + sheet.deleteRule(i); + } + groups.forEach(function (mediaGroup) { + var media = mediaGroup[0][0].media; + var target; + if (media) { + sheet.insertRule("@media " + media + " {}", sheet.cssRules.length); + target = sheet.cssRules[sheet.cssRules.length - 1]; + } + else { + target = sheet; + } + mediaGroup.forEach(function (selectorGroup) { + var asyncItems = selectorGroup.filter(function (_a) { + var value = _a.value; + return value == null; + }); + if (asyncItems.length > 0) { + asyncItems.forEach(function (_a) { + var asyncKey = _a.asyncKey; + return asyncDeclarations.set(asyncKey, { declarations: selectorGroup, target: target, index: target.cssRules.length }); + }); + } + setRule(target, target.cssRules.length, selectorGroup); + }); + }); + if (syncStylePositionWatcher) { + syncStylePositionWatcher.run(); + } + else { + syncStylePositionWatcher = watchForNodePosition(syncStyle, { onRestore: buildStyleSheet, watchSibling: true, watchParent: true }); + } + } + function rebuildAsyncRule(key) { + var _a = asyncDeclarations.get(key), declarations = _a.declarations, target = _a.target, index = _a.index; + target.deleteRule(index); + setRule(target, index, declarations); + asyncDeclarations.delete(key); + } + modRules.filter(function (r) { return r; }).forEach(function (_a) { + var selector = _a.selector, declarations = _a.declarations, media = _a.media; + declarations.forEach(function (_a) { + var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; + if (typeof value === 'function') { + var modified = value(filter); + if (modified instanceof Promise) { + var index_1 = readyDeclarations.length; + var asyncKey_1 = asyncDeclarationCounter++; + readyDeclarations.push({ media: media, selector: selector, property: property, value: null, important: important, asyncKey: asyncKey_1, sourceValue: sourceValue }); + var promise = modified; + var currentRenderId_1 = renderId; + promise.then(function (asyncValue) { + if (!asyncValue || cancelAsyncOperations || currentRenderId_1 !== renderId) { + return; + } + readyDeclarations[index_1].value = asyncValue; + asyncQueue.add(function () { + if (cancelAsyncOperations || currentRenderId_1 !== renderId) { + return; + } + rebuildAsyncRule(asyncKey_1); + }); + }); + } + else { + readyDeclarations.push({ media: media, selector: selector, property: property, value: modified, important: important, sourceValue: sourceValue }); + } + } + else { + readyDeclarations.push({ media: media, selector: selector, property: property, value: value, important: important, sourceValue: sourceValue }); + } + }); + }); + buildStyleSheet(); + } + var rulesChangeKey = null; + var rulesCheckFrameId = null; + function safeGetSheetRules() { + try { + if (element.sheet == null) { + return null; + } + return element.sheet.cssRules; + } + catch (err) { + logWarn(err); + return null; + } + } + function updateRulesChangeKey() { + var rules = safeGetSheetRules(); + if (rules) { + rulesChangeKey = rules.length; + } + } + function didRulesKeyChange() { + var rules = safeGetSheetRules(); + return rules && rules.length !== rulesChangeKey; + } + function subscribeToSheetChanges() { + updateRulesChangeKey(); + unsubscribeFromSheetChanges(); + var checkForUpdate = function () { + if (didRulesKeyChange()) { + updateRulesChangeKey(); + update(); + } + rulesCheckFrameId = requestAnimationFrame(checkForUpdate); + }; + checkForUpdate(); + } + function unsubscribeFromSheetChanges() { + cancelAnimationFrame(rulesCheckFrameId); + } + function pause() { + observer.disconnect(); + cancelAsyncOperations = true; + corsCopyPositionWatcher && corsCopyPositionWatcher.stop(); + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + unsubscribeFromSheetChanges(); + } + function destroy() { + pause(); + removeNode(corsCopy); + removeNode(syncStyle); + } + function watch() { + observer.observe(element, observerOptions); + if (element instanceof HTMLStyleElement) { + subscribeToSheetChanges(); + } + } + var maxMoveCount = 10; + var moveCount = 0; + function restore() { + if (!syncStyle) { + return; + } + moveCount++; + if (moveCount > maxMoveCount) { + logWarn('Style sheet was moved multiple times', element); + return; + } + logWarn('Restore style', syncStyle, element); + var shouldRestore = syncStyle.sheet == null || syncStyle.sheet.cssRules.length > 0; + insertStyle(); + if (shouldRestore) { + forceRestore = true; + updateRulesChangeKey(); + update(); + } + } + return { + details: details, + render: render, + pause: pause, + destroy: destroy, + watch: watch, + restore: restore, + }; + } + function linkLoading(link) { + return new Promise(function (resolve, reject) { + var cleanUp = function () { + link.removeEventListener('load', onLoad); + link.removeEventListener('error', onError); + }; + var onLoad = function () { + cleanUp(); + resolve(); + }; + var onError = function () { + cleanUp(); + reject("Link loading failed " + link.href); + }; + link.addEventListener('load', onLoad); + link.addEventListener('error', onError); + }); + } + function getCSSImportURL(importDeclaration) { + return getCSSURLValue(importDeclaration.substring(8).replace(/;$/, '')); + } + function loadText(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url.startsWith('data:')) return [3, 3]; + return [4, fetch(url)]; + case 1: return [4, (_a.sent()).text()]; + case 2: return [2, _a.sent()]; + case 3: return [4, bgFetch({ url: url, responseType: 'text', mimeType: 'text/css' })]; + case 4: return [2, _a.sent()]; + } + }); + }); + } + function replaceCSSImports(cssText, basePath) { + return __awaiter(this, void 0, void 0, function () { + var importMatches, _i, importMatches_1, match, importURL, absoluteURL, importedCSS, err_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + cssText = removeCSSComments(cssText); + cssText = replaceCSSFontFace(cssText); + cssText = replaceCSSRelativeURLsWithAbsolute(cssText, basePath); + importMatches = getMatches(cssImportRegex, cssText); + _i = 0, importMatches_1 = importMatches; + _a.label = 1; + case 1: + if (!(_i < importMatches_1.length)) return [3, 8]; + match = importMatches_1[_i]; + importURL = getCSSImportURL(match); + absoluteURL = getAbsoluteURL(basePath, importURL); + importedCSS = void 0; + _a.label = 2; + case 2: + _a.trys.push([2, 5, , 6]); + return [4, loadText(absoluteURL)]; + case 3: + importedCSS = _a.sent(); + return [4, replaceCSSImports(importedCSS, getCSSBaseBath(absoluteURL))]; + case 4: + importedCSS = _a.sent(); + return [3, 6]; + case 5: + err_3 = _a.sent(); + logWarn(err_3); + importedCSS = ''; + return [3, 6]; + case 6: + cssText = cssText.split(match).join(importedCSS); + _a.label = 7; + case 7: + _i++; + return [3, 1]; + case 8: + cssText = cssText.trim(); + return [2, cssText]; + } + }); + }); + } + function createCORSCopy(srcElement, cssText) { + if (!cssText) { + return null; + } + var cors = document.createElement('style'); + cors.classList.add('darkreader'); + cors.classList.add('darkreader--cors'); + cors.media = 'screen'; + cors.textContent = cssText; + srcElement.parentNode.insertBefore(cors, srcElement.nextSibling); + cors.sheet.disabled = true; + return cors; + } + + var observer$1 = null; + function getAllManageableStyles(nodes) { + var results = []; + Array.from(nodes).forEach(function (node) { + if (node instanceof Element) { + if (shouldManageStyle(node)) { + results.push(node); + } + } + if (node instanceof Element || node instanceof ShadowRoot) { + results.push.apply(results, Array.from(node.querySelectorAll(STYLE_SELECTOR)).filter(shouldManageStyle)); + } + }); + return results; + } + var undefinedGroups = new Map(); + var elementsDefinitionCallback; + function collectUndefinedElements(root) { + if (!isDefinedSelectorSupported()) { + return; + } + root.querySelectorAll(':not(:defined)') + .forEach(function (el) { + var tag = el.tagName.toLowerCase(); + if (!undefinedGroups.has(tag)) { + undefinedGroups.set(tag, new Set()); + customElementsWhenDefined(tag).then(function () { + if (elementsDefinitionCallback) { + var elements = undefinedGroups.get(tag); + undefinedGroups.delete(tag); + elementsDefinitionCallback(Array.from(elements)); + } + }); + } + undefinedGroups.get(tag).add(el); + }); + } + function customElementsWhenDefined(tag) { + return new Promise(function (resolve) { + if (window.customElements && typeof window.customElements.whenDefined === 'function') { + customElements.whenDefined(tag).then(resolve); + } + else { + var checkIfDefined_1 = function () { + var elements = undefinedGroups.get(tag); + if (elements && elements.size > 0) { + if (elements.values().next().value.matches(':defined')) { + resolve(); + } + else { + requestAnimationFrame(checkIfDefined_1); + } + } + }; + requestAnimationFrame(checkIfDefined_1); + } + }); + } + function watchWhenCustomElementsDefined(callback) { + elementsDefinitionCallback = callback; + } + function unsubscribeFromDefineCustomElements() { + elementsDefinitionCallback = null; + undefinedGroups.clear(); + } + var shadowObservers = new Set(); + var nodesShadowObservers = new WeakMap(); + function unsubscribeFromShadowRootChanges() { + shadowObservers.forEach(function (o) { return o.disconnect(); }); + shadowObservers.clear(); + nodesShadowObservers = new WeakMap(); + } + function watchForStyleChanges(update) { + if (observer$1) { + observer$1.disconnect(); + shadowObservers.forEach(function (o) { return o.disconnect(); }); + shadowObservers.clear(); + nodesShadowObservers = new WeakMap(); + } + function handleMutations(mutations) { + var createdStyles = new Set(); + var updatedStyles = new Set(); + var removedStyles = new Set(); + var movedStyles = new Set(); + var additions = new Set(); + var deletions = new Set(); + var styleUpdates = new Set(); + mutations.forEach(function (m) { + m.addedNodes.forEach(function (n) { return additions.add(n); }); + m.removedNodes.forEach(function (n) { return deletions.add(n); }); + if (m.type === 'attributes' && shouldManageStyle(m.target)) { + styleUpdates.add(m.target); + } + }); + var styleAdditions = getAllManageableStyles(additions); + var styleDeletions = getAllManageableStyles(deletions); + additions.forEach(function (n) { + iterateShadowNodes(n, function (host) { + var shadowStyles = getAllManageableStyles(host.shadowRoot.children); + if (shadowStyles.length > 0) { + styleAdditions.push.apply(styleAdditions, shadowStyles); + } + }); + }); + deletions.forEach(function (n) { + iterateShadowNodes(n, function (host) { + var shadowStyles = getAllManageableStyles(host.shadowRoot.children); + if (shadowStyles.length > 0) { + styleDeletions.push.apply(styleDeletions, shadowStyles); + } + }); + }); + styleDeletions.forEach(function (style) { + if (style.isConnected) { + movedStyles.add(style); + } + else { + removedStyles.add(style); + } + }); + styleUpdates.forEach(function (style) { + if (!removedStyles.has(style)) { + updatedStyles.add(style); + } + }); + styleAdditions.forEach(function (style) { + if (!(removedStyles.has(style) || movedStyles.has(style) || updatedStyles.has(style))) { + createdStyles.add(style); + } + }); + if (createdStyles.size + removedStyles.size + updatedStyles.size > 0) { + update({ + created: Array.from(createdStyles), + updated: Array.from(updatedStyles), + removed: Array.from(removedStyles), + moved: Array.from(movedStyles), + }); + } + additions.forEach(function (n) { + if (n.isConnected) { + iterateShadowNodes(n, subscribeForShadowRootChanges); + if (n instanceof Element) { + collectUndefinedElements(n); + } + } + }); + } + function subscribeForShadowRootChanges(node) { + if (nodesShadowObservers.has(node)) { + return; + } + var shadowObserver = new MutationObserver(handleMutations); + shadowObserver.observe(node.shadowRoot, mutationObserverOptions); + shadowObservers.add(shadowObserver); + nodesShadowObservers.set(node, shadowObserver); + } + var mutationObserverOptions = { childList: true, subtree: true, attributes: true, attributeFilter: ['rel', 'disabled'] }; + observer$1 = new MutationObserver(handleMutations); + observer$1.observe(document.documentElement, mutationObserverOptions); + iterateShadowNodes(document.documentElement, subscribeForShadowRootChanges); + watchWhenCustomElementsDefined(function (hosts) { + var newStyles = getAllManageableStyles(hosts.map(function (h) { return h.shadowRoot; })); + update({ created: newStyles, updated: [], removed: [], moved: [] }); + hosts.forEach(function (h) { return subscribeForShadowRootChanges(h); }); + }); + collectUndefinedElements(document); + } + function stopWatchingForStyleChanges() { + if (observer$1) { + observer$1.disconnect(); + observer$1 = null; + unsubscribeFromShadowRootChanges(); + unsubscribeFromDefineCustomElements(); + } + } + + var styleManagers = new Map(); + var variables = new Map(); + var filter = null; + var fixes = null; + var isIFrame = null; + function createOrUpdateStyle(className, root) { + if (root === void 0) { root = document.head || document; } + var style = root.querySelector("." + className); + if (!style) { + style = document.createElement('style'); + style.classList.add('darkreader'); + style.classList.add(className); + style.media = 'screen'; + } + return style; + } + var stylePositionWatchers = new Map(); + function setupStylePositionWatcher(node, alias) { + stylePositionWatchers.has(alias) && stylePositionWatchers.get(alias).stop(); + stylePositionWatchers.set(alias, watchForNodePosition(node, { watchParent: true, watchSibling: false })); + } + function stopStylePositionWatchers() { + Array.from(stylePositionWatchers.values()).forEach(function (watcher) { return watcher.stop(); }); + stylePositionWatchers.clear(); + } + function createStaticStyleOverrides() { + var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); + document.head.insertBefore(fallbackStyle, document.head.firstChild); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); + setupStylePositionWatcher(fallbackStyle, 'fallback'); + var userAgentStyle = createOrUpdateStyle('darkreader--user-agent'); + document.head.insertBefore(userAgentStyle, fallbackStyle.nextSibling); + userAgentStyle.textContent = getModifiedUserAgentStyle(filter, isIFrame); + setupStylePositionWatcher(userAgentStyle, 'user-agent'); + var textStyle = createOrUpdateStyle('darkreader--text'); + document.head.insertBefore(textStyle, fallbackStyle.nextSibling); + if (filter.useFont || filter.textStroke > 0) { + textStyle.textContent = createTextStyle(filter); + } + else { + textStyle.textContent = ''; + } + setupStylePositionWatcher(textStyle, 'text'); + var invertStyle = createOrUpdateStyle('darkreader--invert'); + document.head.insertBefore(invertStyle, textStyle.nextSibling); + if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) { + invertStyle.textContent = [ + fixes.invert.join(', ') + " {", + " filter: " + getCSSFilterValue(__assign(__assign({}, filter), { contrast: filter.mode === 0 ? filter.contrast : clamp(filter.contrast - 10, 0, 100) })) + " !important;", + '}', + ].join('\n'); + } + else { + invertStyle.textContent = ''; + } + setupStylePositionWatcher(invertStyle, 'invert'); + var inlineStyle = createOrUpdateStyle('darkreader--inline'); + document.head.insertBefore(inlineStyle, invertStyle.nextSibling); + inlineStyle.textContent = getInlineOverrideStyle(); + setupStylePositionWatcher(inlineStyle, 'inline'); + var overrideStyle = createOrUpdateStyle('darkreader--override'); + document.head.appendChild(overrideStyle); + overrideStyle.textContent = fixes && fixes.css ? replaceCSSTemplates(fixes.css) : ''; + setupStylePositionWatcher(overrideStyle, 'override'); + } + var shadowRootsWithOverrides = new Set(); + function createShadowStaticStyleOverrides(root) { + var inlineStyle = createOrUpdateStyle('darkreader--inline', root); + root.insertBefore(inlineStyle, root.firstChild); + inlineStyle.textContent = getInlineOverrideStyle(); + shadowRootsWithOverrides.add(root); + } + function replaceCSSTemplates($cssText) { + return $cssText.replace(/\${(.+?)}/g, function (m0, $color) { + try { + var color = parseColorWithCache($color); + return modifyColor(color, filter); + } + catch (err) { + logWarn(err); + return $color; + } + }); + } + function cleanFallbackStyle() { + var fallback = document.head.querySelector('.darkreader--fallback'); + if (fallback) { + fallback.textContent = ''; + } + } + function createDynamicStyleOverrides() { + cancelRendering(); + updateVariables(getElementCSSVariables(document.documentElement)); + var allStyles = Array.from(document.querySelectorAll(STYLE_SELECTOR)); + iterateShadowNodes(document.documentElement, function (node) { + var shadowStyles = node.shadowRoot.querySelectorAll(STYLE_SELECTOR); + if (shadowStyles.length > 0) { + allStyles.push.apply(allStyles, Array.from(shadowStyles)); + } + }); + var newManagers = Array.from(allStyles) + .filter(function (style) { return !styleManagers.has(style) && shouldManageStyle(style); }) + .map(function (style) { return createManager(style); }); + var newVariables = newManagers + .map(function (manager) { return manager.details(); }) + .filter(function (details) { return details && details.variables.size > 0; }) + .map(function (_a) { + var variables = _a.variables; + return variables; + }); + if (newVariables.length === 0) { + styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + } + else { + newVariables.forEach(function (variables) { return updateVariables(variables); }); + throttledRenderAllStyles(function () { + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + }); + } + newManagers.forEach(function (manager) { return manager.watch(); }); + var inlineStyleElements = Array.from(document.querySelectorAll(INLINE_STYLE_SELECTOR)); + iterateShadowNodes(document.documentElement, function (node) { + var elements = node.shadowRoot.querySelectorAll(INLINE_STYLE_SELECTOR); + if (elements.length > 0) { + createShadowStaticStyleOverrides(node.shadowRoot); + inlineStyleElements.push.apply(inlineStyleElements, Array.from(elements)); + } + }); + inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter); }); + } + var loadingStylesCounter = 0; + var loadingStyles = new Set(); + function createManager(element) { + if (styleManagers.has(element)) { + return; + } + var loadingStyleId = ++loadingStylesCounter; + function loadingStart() { + if (!isPageLoaded() || !didDocumentShowUp) { + loadingStyles.add(loadingStyleId); + var fallbackStyle = document.querySelector('.darkreader--fallback'); + if (!fallbackStyle.textContent) { + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: false }); + } + } + } + function loadingEnd() { + loadingStyles.delete(loadingStyleId); + if (loadingStyles.size === 0 && isPageLoaded()) { + cleanFallbackStyle(); + } + } + function update() { + var details = manager.details(); + if (!details) { + return; + } + if (details.variables.size === 0) { + manager.render(filter, variables); + } + else { + updateVariables(details.variables); + throttledRenderAllStyles(); + } + } + var manager = manageStyle(element, { update: update, loadingStart: loadingStart, loadingEnd: loadingEnd }); + styleManagers.set(element, manager); + return manager; + } + function updateVariables(newVars) { + if (newVars.size === 0) { + return; + } + newVars.forEach(function (value, key) { return variables.set(key, value); }); + variables.forEach(function (value, key) { return variables.set(key, replaceCSSVariables(value, variables)); }); + } + function removeManager(element) { + var manager = styleManagers.get(element); + if (manager) { + manager.destroy(); + styleManagers.delete(element); + } + } + var throttledRenderAllStyles = throttle(function (callback) { + styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); + callback && callback(); + }); + var cancelRendering = function () { + throttledRenderAllStyles.cancel(); + }; + function isPageLoaded() { + return document.readyState === 'complete' || document.readyState === 'interactive'; + } + function onReadyStateChange() { + if (!isPageLoaded()) { + return; + } + document.removeEventListener('readystatechange', onReadyStateChange); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + } + var documentVisibilityListener = null; + var didDocumentShowUp = !document.hidden; + function watchForDocumentVisibility(callback) { + var alreadyWatching = Boolean(documentVisibilityListener); + documentVisibilityListener = function () { + if (!document.hidden) { + stopWatchingForDocumentVisibility(); + callback(); + didDocumentShowUp = true; + } + }; + if (!alreadyWatching) { + document.addEventListener('visibilitychange', documentVisibilityListener); + } + } + function stopWatchingForDocumentVisibility() { + document.removeEventListener('visibilitychange', documentVisibilityListener); + documentVisibilityListener = null; + } + function createThemeAndWatchForUpdates() { + createStaticStyleOverrides(); + function runDynamicStyle() { + createDynamicStyleOverrides(); + watchForUpdates(); + } + if (document.hidden) { + watchForDocumentVisibility(runDynamicStyle); + } + else { + runDynamicStyle(); + } + changeMetaThemeColorWhenAvailable(filter); + } + function watchForUpdates() { + watchForStyleChanges(function (_a) { + var created = _a.created, updated = _a.updated, removed = _a.removed, moved = _a.moved; + var stylesToRemove = removed; + var stylesToManage = created.concat(updated).concat(moved) + .filter(function (style) { return !styleManagers.has(style); }); + var stylesToRestore = moved + .filter(function (style) { return styleManagers.has(style); }); + stylesToRemove.forEach(function (style) { return removeManager(style); }); + var newManagers = stylesToManage + .map(function (style) { return createManager(style); }); + var newVariables = newManagers + .map(function (manager) { return manager.details(); }) + .filter(function (details) { return details && details.variables.size > 0; }) + .map(function (_a) { + var variables = _a.variables; + return variables; + }); + if (newVariables.length === 0) { + newManagers.forEach(function (manager) { return manager.render(filter, variables); }); + } + else { + newVariables.forEach(function (variables) { return updateVariables(variables); }); + throttledRenderAllStyles(); + } + newManagers.forEach(function (manager) { return manager.watch(); }); + stylesToRestore.forEach(function (style) { return styleManagers.get(style).restore(); }); + }); + watchForInlineStyles(function (element) { + overrideInlineStyle(element, filter); + if (element === document.documentElement) { + var rootVariables = getElementCSSVariables(document.documentElement); + if (rootVariables.size > 0) { + updateVariables(rootVariables); + throttledRenderAllStyles(); + } + } + }, function (root) { + var inlineStyleElements = root.querySelectorAll(INLINE_STYLE_SELECTOR); + if (inlineStyleElements.length > 0) { + createShadowStaticStyleOverrides(root); + inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter); }); + } + }); + document.addEventListener('readystatechange', onReadyStateChange); + } + function stopWatchingForUpdates() { + styleManagers.forEach(function (manager) { return manager.pause(); }); + stopStylePositionWatchers(); + stopWatchingForStyleChanges(); + stopWatchingForInlineStyles(); + document.removeEventListener('readystatechange', onReadyStateChange); + } + function createOrUpdateDynamicTheme(filterConfig, dynamicThemeFixes, iframe) { + filter = filterConfig; + fixes = dynamicThemeFixes; + isIFrame = iframe; + if (document.head) { + createThemeAndWatchForUpdates(); + } + else { + if (!isFirefox()) { + var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); + document.documentElement.appendChild(fallbackStyle); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); + } + var headObserver_1 = new MutationObserver(function () { + if (document.head) { + headObserver_1.disconnect(); + createThemeAndWatchForUpdates(); + } + }); + headObserver_1.observe(document, { childList: true, subtree: true }); + } + } + function removeDynamicTheme() { + cleanDynamicThemeCache(); + removeNode(document.querySelector('.darkreader--fallback')); + if (document.head) { + restoreMetaThemeColor(); + removeNode(document.head.querySelector('.darkreader--user-agent')); + removeNode(document.head.querySelector('.darkreader--text')); + removeNode(document.head.querySelector('.darkreader--invert')); + removeNode(document.head.querySelector('.darkreader--inline')); + removeNode(document.head.querySelector('.darkreader--override')); + } + shadowRootsWithOverrides.forEach(function (root) { + removeNode(root.querySelector('.darkreader--inline')); + }); + shadowRootsWithOverrides.clear(); + Array.from(styleManagers.keys()).forEach(function (el) { return removeManager(el); }); + Array.from(document.querySelectorAll('.darkreader')).forEach(removeNode); + } + function cleanDynamicThemeCache() { + stopWatchingForDocumentVisibility(); + cancelRendering(); + stopWatchingForUpdates(); + cleanModificationCache(); + } + + var defaultTheme = { + mode: 1, + brightness: 100, + contrast: 100, + grayscale: 0, + sepia: 0, + useFont: false, + fontFamily: '', + textStroke: 0, + engine: ThemeEngines.dynamicTheme, + stylesheet: '', + }; + var isIFrame$1 = (function () { + try { + return window.self !== window.top; + } + catch (err) { + console.warn(err); + return true; + } + })(); + function enable(themeOptions, fixes) { + if (themeOptions === void 0) { themeOptions = {}; } + if (fixes === void 0) { fixes = null; } + var theme = __assign(__assign({}, defaultTheme), themeOptions); + if (theme.engine !== ThemeEngines.dynamicTheme) { + throw new Error('Theme engine is not supported'); + } + createOrUpdateDynamicTheme(theme, fixes, isIFrame$1); + } + function disable() { + removeDynamicTheme(); + } + var darkScheme = matchMedia('(prefers-color-scheme: dark)'); + var store = { + themeOptions: null, + fixes: null, + }; + function handleColorScheme() { + if (darkScheme.matches) { + enable(store.themeOptions, store.fixes); + } + else { + disable(); + } + } + function auto(themeOptions, fixes) { + if (themeOptions === void 0) { themeOptions = {}; } + if (fixes === void 0) { fixes = null; } + if (themeOptions) { + store = { themeOptions: themeOptions, fixes: fixes }; + handleColorScheme(); + darkScheme.addListener(handleColorScheme); + } + else { + darkScheme.removeListener(handleColorScheme); + disable(); + } + } + var setFetchMethod$1 = setFetchMethod; + + exports.auto = auto; + exports.disable = disable; + exports.enable = enable; + exports.setFetchMethod = setFetchMethod$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/Wino.Mail/JS/Quill/full.html b/Wino.Mail/JS/Quill/full.html new file mode 100644 index 00000000..7aa371b9 --- /dev/null +++ b/Wino.Mail/JS/Quill/full.html @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + + + + + + + + + + + + + + diff --git a/Wino.Mail/JS/Quill/highlight.min.js b/Wino.Mail/JS/Quill/highlight.min.js new file mode 100644 index 00000000..f30a334c --- /dev/null +++ b/Wino.Mail/JS/Quill/highlight.min.js @@ -0,0 +1,3 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var t="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):t&&(t.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return t.hljs}))}(function(e){function t(e){return e.replace(/&/g,"&").replace(//g,">")}function r(e){return e.nodeName.toLowerCase()}function a(e,t){var r=e&&e.exec(t);return r&&0===r.index}function n(e){return E.test(e)}function i(e){var t,r,a,i,s=e.className+" ";if(s+=e.parentNode?e.parentNode.className:"",r=M.exec(s))return w(r[1])?r[1]:"no-highlight";for(s=s.split(/\s+/),t=0,a=s.length;a>t;t++)if(i=s[t],n(i)||w(i))return i}function s(e){var t,r={},a=Array.prototype.slice.call(arguments,1);for(t in e)r[t]=e[t];return a.forEach(function(e){for(t in e)r[t]=e[t]}),r}function c(e){var t=[];return function a(e,n){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?n+=i.nodeValue.length:1===i.nodeType&&(t.push({event:"start",offset:n,node:i}),n=a(i,n),r(i).match(/br|hr|img|input/)||t.push({event:"stop",offset:n,node:i}));return n}(e,0),t}function o(e,a,n){function i(){return e.length&&a.length?e[0].offset!==a[0].offset?e[0].offset"}function c(e){u+=""}function o(e){("start"===e.event?s:c)(e.node)}for(var l=0,u="",d=[];e.length||a.length;){var b=i();if(u+=t(n.substring(l,b[0].offset)),l=b[0].offset,b===e){d.reverse().forEach(c);do o(b.splice(0,1)[0]),b=i();while(b===e&&b.length&&b[0].offset===l);d.reverse().forEach(s)}else"start"===b[0].event?d.push(b[0].node):d.pop(),o(b.splice(0,1)[0])}return u+t(n.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(t){return s(e,{v:null},t)})),e.cached_variants||e.eW&&[s(e)]||[e]}function u(e){function t(e){return e&&e.source||e}function r(r,a){return new RegExp(t(r),"m"+(e.cI?"i":"")+(a?"g":""))}function a(n,i){if(!n.compiled){if(n.compiled=!0,n.k=n.k||n.bK,n.k){var s={},c=function(t,r){e.cI&&(r=r.toLowerCase()),r.split(" ").forEach(function(e){var r=e.split("|");s[r[0]]=[t,r[1]?Number(r[1]):1]})};"string"==typeof n.k?c("keyword",n.k):k(n.k).forEach(function(e){c(e,n.k[e])}),n.k=s}n.lR=r(n.l||/\w+/,!0),i&&(n.bK&&(n.b="\\b("+n.bK.split(" ").join("|")+")\\b"),n.b||(n.b=/\B|\b/),n.bR=r(n.b),n.e||n.eW||(n.e=/\B|\b/),n.e&&(n.eR=r(n.e)),n.tE=t(n.e)||"",n.eW&&i.tE&&(n.tE+=(n.e?"|":"")+i.tE)),n.i&&(n.iR=r(n.i)),null==n.r&&(n.r=1),n.c||(n.c=[]),n.c=Array.prototype.concat.apply([],n.c.map(function(e){return l("self"===e?n:e)})),n.c.forEach(function(e){a(e,n)}),n.starts&&a(n.starts,i);var o=n.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([n.tE,n.i]).map(t).filter(Boolean);n.t=o.length?r(o.join("|"),!0):{exec:function(){return null}}}}a(e)}function d(e,r,n,i){function s(e,t){var r,n;for(r=0,n=t.c.length;n>r;r++)if(a(t.c[r].bR,e))return t.c[r]}function c(e,t){if(a(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?c(e.parent,t):void 0}function o(e,t){return!n&&a(t.iR,e)}function l(e,t){var r=v.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(r)&&e.k[r]}function p(e,t,r,a){var n=a?"":L.classPrefix,i='',i+t+s}function m(){var e,r,a,n;if(!N.k)return t(E);for(n="",r=0,N.lR.lastIndex=0,a=N.lR.exec(E);a;)n+=t(E.substring(r,a.index)),e=l(N,a),e?(M+=e[1],n+=p(e[0],t(a[0]))):n+=t(a[0]),r=N.lR.lastIndex,a=N.lR.exec(E);return n+t(E.substr(r))}function f(){var e="string"==typeof N.sL;if(e&&!x[N.sL])return t(E);var r=e?d(N.sL,E,!0,k[N.sL]):b(E,N.sL.length?N.sL:void 0);return N.r>0&&(M+=r.r),e&&(k[N.sL]=r.top),p(r.language,r.value,!1,!0)}function g(){C+=null!=N.sL?f():m(),E=""}function _(e){C+=e.cN?p(e.cN,"",!0):"",N=Object.create(e,{parent:{value:N}})}function h(e,t){if(E+=e,null==t)return g(),0;var r=s(t,N);if(r)return r.skip?E+=t:(r.eB&&(E+=t),g(),r.rB||r.eB||(E=t)),_(r,t),r.rB?0:t.length;var a=c(N,t);if(a){var n=N;n.skip?E+=t:(n.rE||n.eE||(E+=t),g(),n.eE&&(E=t));do N.cN&&(C+=R),N.skip||(M+=N.r),N=N.parent;while(N!==a.parent);return a.starts&&_(a.starts,""),n.rE?0:t.length}if(o(t,N))throw new Error('Illegal lexeme "'+t+'" for mode "'+(N.cN||"")+'"');return E+=t,t.length||1}var v=w(e);if(!v)throw new Error('Unknown language: "'+e+'"');u(v);var y,N=i||v,k={},C="";for(y=N;y!==v;y=y.parent)y.cN&&(C=p(y.cN,"",!0)+C);var E="",M=0;try{for(var B,S,$=0;;){if(N.t.lastIndex=$,B=N.t.exec(r),!B)break;S=h(r.substring($,B.index),B[0]),$=B.index+S}for(h(r.substr($)),y=N;y.parent;y=y.parent)y.cN&&(C+=R);return{r:M,value:C,language:e,top:N}}catch(A){if(A.message&&-1!==A.message.indexOf("Illegal"))return{r:0,value:t(r)};throw A}}function b(e,r){r=r||L.languages||k(x);var a={r:0,value:t(e)},n=a;return r.filter(w).forEach(function(t){var r=d(t,e,!1);r.language=t,r.r>n.r&&(n=r),r.r>a.r&&(n=a,a=r)}),n.language&&(a.second_best=n),a}function p(e){return L.tabReplace||L.useBR?e.replace(B,function(e,t){return L.useBR&&"\n"===e?"
":L.tabReplace?t.replace(/\t/g,L.tabReplace):""}):e}function m(e,t,r){var a=t?C[t]:r,n=[e.trim()];return e.match(/\bhljs\b/)||n.push("hljs"),-1===e.indexOf(a)&&n.push(a),n.join(" ").trim()}function f(e){var t,r,a,s,l,u=i(e);n(u)||(L.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):t=e,l=t.textContent,a=u?d(u,l,!0):b(l),r=c(t),r.length&&(s=document.createElementNS("http://www.w3.org/1999/xhtml","div"),s.innerHTML=a.value,a.value=o(r,c(s),l)),a.value=p(a.value),e.innerHTML=a.value,e.className=m(e.className,u,a.language),e.result={language:a.language,re:a.r},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.r}))}function g(e){L=s(L,e)}function _(){if(!_.called){_.called=!0;var e=document.querySelectorAll("pre code");N.forEach.call(e,f)}}function h(){addEventListener("DOMContentLoaded",_,!1),addEventListener("load",_,!1)}function v(t,r){var a=x[t]=r(e);a.aliases&&a.aliases.forEach(function(e){C[e]=t})}function y(){return k(x)}function w(e){return e=(e||"").toLowerCase(),x[e]||x[C[e]]}var N=[],k=Object.keys,x={},C={},E=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,B=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,R="
",L={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=d,e.highlightAuto=b,e.fixMarkup=p,e.highlightBlock=f,e.configure=g,e.initHighlighting=_,e.initHighlightingOnLoad=h,e.registerLanguage=v,e.listLanguages=y,e.getLanguage=w,e.inherit=s,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(t,r,a){var n=e.inherit({cN:"comment",b:t,e:r,c:[]},a||{});return n.c.push(e.PWM),n.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),n},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e.registerLanguage("apache",function(e){var t={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",t]},t,e.QSM]}}],i:/\S/}}),e.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},r={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,r,a,t]}}),e.registerLanguage("coffeescript",function(e){var t={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},r="[A-Za-z$_][0-9A-Za-z$_]*",a={cN:"subst",b:/#\{/,e:/}/,k:t},n=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,a]},{b:/"/,e:/"/,c:[e.BE,a]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[a,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+r},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];a.c=n;var i=e.inherit(e.TM,{b:r}),s="(\\(.*\\))?\\s*\\B[-=]>",c={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:t,c:["self"].concat(n)}]};return{aliases:["coffee","cson","iced"],k:t,i:/\/\*/,c:n.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+r+"\\s*=\\s*"+s,e:"[-=]>",rB:!0,c:[i,c]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:s,e:"[-=]>",rB:!0,c:[c]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[i]},i]},{b:r+":",e:":",rB:!0,rE:!0,r:0}])}}),e.registerLanguage("cpp",function(e){var t={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U)?L?"',e:'"',i:"\\n",c:[e.BE]},{b:'(u8?|U)?R"',e:'"',c:[e.BE]},{b:"'\\\\?.",e:"'",i:"."}]},a={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},n={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},e.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},e.CLCM,e.CBCM]},i=e.IR+"\\s*\\(",s={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},c=[t,e.CLCM,e.CBCM,a,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:s,i:"",k:s,c:["self",t]},{b:e.IR+"::",k:s},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:s,c:c.concat([{b:/\(/,e:/\)/,k:s,c:c.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+e.IR+"[\\*&\\s]+)+"+i,rB:!0,e:/[{;=]/,eE:!0,k:s,i:/[^\w\s\*&]/,c:[{b:i,rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:s,r:0,c:[e.CLCM,e.CBCM,r,a,t]},e.CLCM,e.CBCM,n]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},e.TM]}]),exports:{preprocessor:n,strings:r,k:s}}}),e.registerLanguage("cs",function(e){var t={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a=e.inherit(r,{i:/\n/}),n={cN:"subst",b:"{",e:"}",k:t},i=e.inherit(n,{i:/\n/}),s={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,i]},c={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},n]},o=e.inherit(c,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},i]});n.c=[c,s,r,e.ASM,e.QSM,e.CNM,e.CBCM],i.c=[o,s,a,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[c,s,r,e.ASM,e.QSM]},u=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:t,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+u+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}}),e.registerLanguage("css",function(e){var t="[a-zA-Z-][a-zA-Z0-9_-]*",r={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:t,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,r]}]}}),e.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}}),e.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}}),e.registerLanguage("ini",function(e){var t={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},t,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}}),e.registerLanguage("java",function(e){var t="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",r=t+"(<"+t+"(\\s*,\\s*"+t+")*>)?",a="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",n="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",i={cN:"number",b:n,r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+r+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},i,{cN:"meta",b:"@[A-Za-z]+"}]}}),e.registerLanguage("javascript",function(e){var t="[A-Za-z$_][0-9A-Za-z$_]*",r={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:r,c:[]},i={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,i,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:r,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,i,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:t+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:t,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+t+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:t},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:t}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}),e.registerLanguage("json",function(e){var t={literal:"true false null"},r=[e.QSM,e.CNM],a={e:",",eW:!0,eE:!0,c:r,k:t},n={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(a,{b:/:/})],i:"\\S"},i={b:"\\[",e:"\\]",c:[e.inherit(a)],i:"\\S"};return r.splice(r.length,0,n,i),{c:r,k:t,i:"\\S"}}),e.registerLanguage("makefile",function(e){var t={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},e.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[r],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[r],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},r]}]}}),e.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}}),e.registerLanguage("nginx",function(e){var t={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},r={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,t],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[t]},{cN:"regexp",c:[e.BE,t],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},t]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:r}],r:0}],i:"[^\\s\\}]"}}),e.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},r={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},a=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:r,l:a,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:a,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}}),e.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},a={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],s=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),a,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=s,a.c=s,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s}}),e.registerLanguage("php",function(e){var t={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},r={cN:"meta",b:/<\?(php)?|\?>/},a={cN:"string",c:[e.BE,r],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[r]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},r,{cN:"keyword",b:/\$this\b/},t,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",t,e.CBCM,a,n]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},a,n]}}),e.registerLanguage("python",function(e){var t={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},r={cN:"meta",b:/^(>>>|\.\.\.) /},a={cN:"subst",b:/\{/,e:/\}/,k:t,i:/#/},n={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[r],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[r,a]},{b:/(fr|rf|f)"""/,e:/"""/,c:[r,a]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[a]},{b:/(fr|rf|f)"/,e:/"/,c:[a]},e.ASM,e.QSM]},i={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},s={cN:"params",b:/\(/,e:/\)/,c:["self",r,i,n]};return a.c=[n,i,r],{aliases:["py","gyp"],k:t,i:/(<\/|->|\?)|=>/,c:[r,i,n,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,s,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}}),e.registerLanguage("ruby",function(e){ +var t="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},a={cN:"doctag",b:"@[A-Za-z]+"},n={b:"#<",e:">"},i=[e.C("#","$",{c:[a]}),e.C("^\\=begin","^\\=end",{c:[a],r:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:r},c={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},o={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},l=[c,n,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(i)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:t}),o].concat(i)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[c,{b:t}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[n,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(i),r:0}].concat(i);s.c=l,o.c=l;var u="[>?]>",d="[\\w#]+\\(\\w+\\):\\d+:\\d+>",b="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",p=[{b:/^\s*=>/,starts:{e:"$",c:l}},{cN:"meta",b:"^("+u+"|"+d+"|"+b+")",starts:{e:"$",c:l}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:i.concat(p).concat(l)}}),e.registerLanguage("shell",function(e){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}}),e.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}}),e}); \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/image-resize.min.js b/Wino.Mail/JS/Quill/image-resize.min.js new file mode 100644 index 00000000..804145d5 --- /dev/null +++ b/Wino.Mail/JS/Quill/image-resize.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ImageResize=e():t.ImageResize=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=38)}([function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},function(t,e,n){var o=n(22),r="object"==typeof self&&self&&self.Object===Object&&self,i=o||r||Function("return this")();t.exports=i},function(t,e){function n(t){return null!=t&&"object"==typeof t}t.exports=n},function(t,e,n){function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t-1&&t%1==0&&t<=o}var o=9007199254740991;t.exports=n},function(t,e,n){var o=n(49),r=n(54),i=n(86),a=i&&i.isTypedArray,s=a?r(a):o;t.exports=s},function(t,e,n){function o(t){return a(t)?r(t,!0):i(t)}var r=n(43),i=n(50),a=n(12);t.exports=o},function(t,e,n){"use strict";e.a={modules:["DisplaySize","Toolbar","Resize"],overlayStyles:{position:"absolute",boxSizing:"border-box",border:"1px dashed #444"},handleStyles:{position:"absolute",height:"12px",width:"12px",backgroundColor:"white",border:"1px solid #777",boxSizing:"border-box",opacity:"0.80"},displayStyles:{position:"absolute",font:"12px/1.0 Arial, Helvetica, sans-serif",padding:"4px 8px",textAlign:"center",backgroundColor:"white",color:"#333",border:"1px solid #777",boxSizing:"border-box",opacity:"0.80",cursor:"default"},toolbarStyles:{position:"absolute",top:"-12px",right:"0",left:"0",height:"0",minWidth:"100px",font:"12px/1.0 Arial, Helvetica, sans-serif",textAlign:"center",color:"#333",boxSizing:"border-box",cursor:"default"},toolbarButtonStyles:{display:"inline-block",width:"24px",height:"24px",background:"white",border:"1px solid #999",verticalAlign:"middle"},toolbarButtonSvgStyles:{fill:"#444",stroke:"#444",strokeWidth:"2"}}},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=n(9);n.d(e,"a",function(){return s});var s=function(t){function e(){var t,n,i,a;o(this,e);for(var s=arguments.length,u=Array(s),c=0;c120&&t[1]>30)Object.assign(i.display.style,{right:"4px",bottom:"4px",left:"auto"});else if("right"==i.img.style.float){var e=i.display.getBoundingClientRect();Object.assign(i.display.style,{right:"auto",bottom:"-"+(e.height+4)+"px",left:"-"+(e.width+4)+"px"})}else{var n=i.display.getBoundingClientRect();Object.assign(i.display.style,{right:"-"+(n.width+4)+"px",bottom:"-"+(n.height+4)+"px",left:"auto"})}}},i.getCurrentSize=function(){return[i.img.width,Math.round(i.img.width/i.img.naturalWidth*i.img.naturalHeight)]},a=n,r(i,a)}return i(e,t),e}(a.a)},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=n(9);n.d(e,"a",function(){return s});var s=function(t){function e(){var t,n,i,a;o(this,e);for(var s=arguments.length,u=Array(s),c=0;c0&&(o.style.borderLeftWidth="0"),Object.assign(o.children[0].style,i.options.toolbarButtonSvgStyles),e.isApplied()&&i._selectButton(o),i.toolbar.appendChild(o)})},i._selectButton=function(t){t.style.filter="invert(20%)"},a=n,r(i,a)}return i(e,t),e}(p.a)},function(t,e,n){var o=n(17),r=n(20),i=n(63),a=n(101),s=r(function(t){return t.push(void 0,i),o(a,void 0,t)});t.exports=s},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=n(37),i=n.n(r),a=n(33),s=n(34),u=n(36),c=n(35),l={DisplaySize:s.a,Toolbar:u.a,Resize:c.a},f=function t(e){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,t),this.initializeModules=function(){n.removeModules(),n.modules=n.moduleClasses.map(function(t){return new(l[t]||t)(n)}),n.modules.forEach(function(t){t.onCreate()}),n.onUpdate()},this.onUpdate=function(){n.repositionElements(),n.modules.forEach(function(t){t.onUpdate()})},this.removeModules=function(){n.modules.forEach(function(t){t.onDestroy()}),n.modules=[]},this.handleClick=function(t){if(t.target&&t.target.tagName&&"IMG"===t.target.tagName.toUpperCase()){if(n.img===t.target)return;n.img&&n.hide(),n.show(t.target)}else n.img&&n.hide()},this.show=function(t){n.img=t,n.showOverlay(),n.initializeModules()},this.showOverlay=function(){n.overlay&&n.hideOverlay(),n.quill.setSelection(null),n.setUserSelect("none"),document.addEventListener("keyup",n.checkImage,!0),n.quill.root.addEventListener("input",n.checkImage,!0),n.overlay=document.createElement("div"),Object.assign(n.overlay.style,n.options.overlayStyles),n.quill.root.parentNode.appendChild(n.overlay),n.repositionElements()},this.hideOverlay=function(){n.overlay&&(n.quill.root.parentNode.removeChild(n.overlay),n.overlay=void 0,document.removeEventListener("keyup",n.checkImage),n.quill.root.removeEventListener("input",n.checkImage),n.setUserSelect(""))},this.repositionElements=function(){if(n.overlay&&n.img){var t=n.quill.root.parentNode,e=n.img.getBoundingClientRect(),o=t.getBoundingClientRect();Object.assign(n.overlay.style,{left:e.left-o.left-1+t.scrollLeft+"px",top:e.top-o.top+t.scrollTop+"px",width:e.width+"px",height:e.height+"px"})}},this.hide=function(){n.hideOverlay(),n.removeModules(),n.img=void 0},this.setUserSelect=function(t){["userSelect","mozUserSelect","webkitUserSelect","msUserSelect"].forEach(function(e){n.quill.root.style[e]=t,document.documentElement.style[e]=t})},this.checkImage=function(t){n.img&&(46!=t.keyCode&&8!=t.keyCode||window.Quill.find(n.img).deleteAt(0),n.hide())},this.quill=e;var s=!1;r.modules&&(s=r.modules.slice()),this.options=i()({},r,a.a),s!==!1&&(this.options.modules=s),document.execCommand("enableObjectResizing",!1,"false"),this.quill.root.addEventListener("click",this.handleClick,!1),this.quill.root.parentNode.style.position=this.quill.root.parentNode.style.position||"relative",this.moduleClasses=this.options.modules,console.log("this.options.modules",this.options.modules),this.modules=[]};e.default=f,window.Quill&&window.Quill.register("modules/imageResize",f)},function(t,e,n){function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e1?n[r-1]:void 0,s=r>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(r--,a):void 0,s&&i(n[0],n[1],s)&&(a=r<3?void 0:a,r=1),e=Object(e);++o-1}var r=n(4);t.exports=o},function(t,e,n){function o(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}var r=n(4);t.exports=o},function(t,e,n){function o(){this.size=0,this.__data__={hash:new r,map:new(a||i),string:new r}}var r=n(39),i=n(3),a=n(15);t.exports=o},function(t,e,n){function o(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}var r=n(6);t.exports=o},function(t,e,n){function o(t){return r(this,t).get(t)}var r=n(6);t.exports=o},function(t,e,n){function o(t){return r(this,t).has(t)}var r=n(6);t.exports=o},function(t,e,n){function o(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}var r=n(6);t.exports=o},function(t,e){function n(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}t.exports=n},function(t,e,n){(function(t){var o=n(22),r="object"==typeof e&&e&&!e.nodeType&&e,i=r&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===r,s=a&&o.process,u=function(){try{return s&&s.binding&&s.binding("util")}catch(t){}}();t.exports=u}).call(e,n(14)(t))},function(t,e){function n(t){return r.call(t)}var o=Object.prototype,r=o.toString;t.exports=n},function(t,e){function n(t,e){return function(n){return t(e(n))}}t.exports=n},function(t,e,n){function o(t,e,n){return e=i(void 0===e?t.length-1:e,0),function(){for(var o=arguments,a=-1,s=i(o.length-e,0),u=Array(s);++a0){if(++e>=o)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var o=800,r=16,i=Date.now;t.exports=n},function(t,e,n){function o(){this.__data__=new r,this.size=0}var r=n(3);t.exports=o},function(t,e){function n(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}t.exports=n},function(t,e){function n(t){return this.__data__.get(t)}t.exports=n},function(t,e){function n(t){return this.__data__.has(t)}t.exports=n},function(t,e,n){function o(t,e){var n=this.__data__;if(n instanceof r){var o=n.__data__;if(!i||o.length\n \n \n \n'},function(t,e){t.exports='\n \n \n \n'},function(t,e){t.exports='\n \n \n \n'},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n}])}); \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/katex.min.css b/Wino.Mail/JS/Quill/katex.min.css new file mode 100644 index 00000000..d6fb8374 --- /dev/null +++ b/Wino.Mail/JS/Quill/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.eot);src:url(fonts/KaTeX_AMS-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_AMS-Regular.woff2) format('woff2'),url(fonts/KaTeX_AMS-Regular.woff) format('woff'),url(fonts/KaTeX_AMS-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.eot);src:url(fonts/KaTeX_Caligraphic-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Caligraphic-Bold.woff2) format('woff2'),url(fonts/KaTeX_Caligraphic-Bold.woff) format('woff'),url(fonts/KaTeX_Caligraphic-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.eot);src:url(fonts/KaTeX_Caligraphic-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Caligraphic-Regular.woff2) format('woff2'),url(fonts/KaTeX_Caligraphic-Regular.woff) format('woff'),url(fonts/KaTeX_Caligraphic-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.eot);src:url(fonts/KaTeX_Fraktur-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Fraktur-Bold.woff2) format('woff2'),url(fonts/KaTeX_Fraktur-Bold.woff) format('woff'),url(fonts/KaTeX_Fraktur-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.eot);src:url(fonts/KaTeX_Fraktur-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Fraktur-Regular.woff2) format('woff2'),url(fonts/KaTeX_Fraktur-Regular.woff) format('woff'),url(fonts/KaTeX_Fraktur-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.eot);src:url(fonts/KaTeX_Main-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Bold.woff2) format('woff2'),url(fonts/KaTeX_Main-Bold.woff) format('woff'),url(fonts/KaTeX_Main-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.eot);src:url(fonts/KaTeX_Main-Italic.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Italic.woff2) format('woff2'),url(fonts/KaTeX_Main-Italic.woff) format('woff'),url(fonts/KaTeX_Main-Italic.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.eot);src:url(fonts/KaTeX_Main-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Regular.woff2) format('woff2'),url(fonts/KaTeX_Main-Regular.woff) format('woff'),url(fonts/KaTeX_Main-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.eot);src:url(fonts/KaTeX_Math-Italic.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Math-Italic.woff2) format('woff2'),url(fonts/KaTeX_Math-Italic.woff) format('woff'),url(fonts/KaTeX_Math-Italic.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:KaTeX_SansSerif;src:url(fonts/KaTeX_SansSerif-Regular.eot);src:url(fonts/KaTeX_SansSerif-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_SansSerif-Regular.woff2) format('woff2'),url(fonts/KaTeX_SansSerif-Regular.woff) format('woff'),url(fonts/KaTeX_SansSerif-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.eot);src:url(fonts/KaTeX_Script-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Script-Regular.woff2) format('woff2'),url(fonts/KaTeX_Script-Regular.woff) format('woff'),url(fonts/KaTeX_Script-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.eot);src:url(fonts/KaTeX_Size1-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size1-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size1-Regular.woff) format('woff'),url(fonts/KaTeX_Size1-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.eot);src:url(fonts/KaTeX_Size2-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size2-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size2-Regular.woff) format('woff'),url(fonts/KaTeX_Size2-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.eot);src:url(fonts/KaTeX_Size3-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size3-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size3-Regular.woff) format('woff'),url(fonts/KaTeX_Size3-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.eot);src:url(fonts/KaTeX_Size4-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size4-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size4-Regular.woff) format('woff'),url(fonts/KaTeX_Size4-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.eot);src:url(fonts/KaTeX_Typewriter-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Typewriter-Regular.woff2) format('woff2'),url(fonts/KaTeX_Typewriter-Regular.woff) format('woff'),url(fonts/KaTeX_Typewriter-Regular.ttf) format('truetype');font-weight:400;font-style:normal}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:inline-block;text-align:initial}.katex{font:400 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;white-space:nowrap;text-indent:0}.katex .katex-html{display:inline-block}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .base,.katex .strut{display:inline-block}.katex .mathrm{font-style:normal}.katex .textit{font-style:italic}.katex .mathit{font-family:KaTeX_Math;font-style:italic}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .amsrm,.katex .mathbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr{font-family:KaTeX_Script}.katex .mathsf{font-family:KaTeX_SansSerif}.katex .mainit{font-family:KaTeX_Main;font-style:italic}.katex .mord+.mop{margin-left:.16667em}.katex .mord+.mbin{margin-left:.22222em}.katex .mord+.mrel{margin-left:.27778em}.katex .mop+.mop,.katex .mop+.mord,.katex .mord+.minner{margin-left:.16667em}.katex .mop+.mrel{margin-left:.27778em}.katex .mop+.minner{margin-left:.16667em}.katex .mbin+.minner,.katex .mbin+.mop,.katex .mbin+.mopen,.katex .mbin+.mord{margin-left:.22222em}.katex .mrel+.minner,.katex .mrel+.mop,.katex .mrel+.mopen,.katex .mrel+.mord{margin-left:.27778em}.katex .mclose+.mop{margin-left:.16667em}.katex .mclose+.mbin{margin-left:.22222em}.katex .mclose+.mrel{margin-left:.27778em}.katex .mclose+.minner,.katex .minner+.mop,.katex .minner+.mord,.katex .mpunct+.mclose,.katex .mpunct+.minner,.katex .mpunct+.mop,.katex .mpunct+.mopen,.katex .mpunct+.mord,.katex .mpunct+.mpunct,.katex .mpunct+.mrel{margin-left:.16667em}.katex .minner+.mbin{margin-left:.22222em}.katex .minner+.mrel{margin-left:.27778em}.katex .minner+.minner,.katex .minner+.mopen,.katex .minner+.mpunct{margin-left:.16667em}.katex .mbin.mtight,.katex .mclose.mtight,.katex .minner.mtight,.katex .mop.mtight,.katex .mopen.mtight,.katex .mord.mtight,.katex .mpunct.mtight,.katex .mrel.mtight{margin-left:0}.katex .mclose+.mop.mtight,.katex .minner+.mop.mtight,.katex .mop+.mop.mtight,.katex .mop+.mord.mtight,.katex .mord+.mop.mtight{margin-left:.16667em}.katex .reset-textstyle.textstyle{font-size:1em}.katex .reset-textstyle.scriptstyle{font-size:.7em}.katex .reset-textstyle.scriptscriptstyle{font-size:.5em}.katex .reset-scriptstyle.textstyle{font-size:1.42857em}.katex .reset-scriptstyle.scriptstyle{font-size:1em}.katex .reset-scriptstyle.scriptscriptstyle{font-size:.71429em}.katex .reset-scriptscriptstyle.textstyle{font-size:2em}.katex .reset-scriptscriptstyle.scriptstyle{font-size:1.4em}.katex .reset-scriptscriptstyle.scriptscriptstyle{font-size:1em}.katex .style-wrap{position:relative}.katex .vlist{display:inline-block}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist .baseline-fix{display:inline-table;table-layout:fixed}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{width:100%}.katex .mfrac .frac-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .mfrac .frac-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .mspace{display:inline-block}.katex .mspace.negativethinspace{margin-left:-.16667em}.katex .mspace.thinspace{width:.16667em}.katex .mspace.negativemediumspace{margin-left:-.22222em}.katex .mspace.mediumspace{width:.22222em}.katex .mspace.thickspace{width:.27778em}.katex .mspace.sixmuspace{width:.333333em}.katex .mspace.eightmuspace{width:.444444em}.katex .mspace.enspace{width:.5em}.katex .mspace.twelvemuspace{width:.666667em}.katex .mspace.quad{width:1em}.katex .mspace.qquad{width:2em}.katex .llap,.katex .rlap{width:0;position:relative}.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .rlap>.inner{left:0}.katex .katex-logo .a{font-size:.75em;margin-left:-.32em;position:relative;top:-.2em}.katex .katex-logo .t{margin-left:-.23em}.katex .katex-logo .e{margin-left:-.1667em;position:relative;top:.2155em}.katex .katex-logo .x{margin-left:-.125em}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .overline .overline-line,.katex .underline .underline-line{width:100%}.katex .overline .overline-line:before,.katex .underline .underline-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .overline .overline-line:after,.katex .underline .underline-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .sqrt>.sqrt-sign{position:relative}.katex .sqrt .sqrt-line{width:100%}.katex .sqrt .sqrt-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .sqrt .sqrt-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:2em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:3.46em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:4.14em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.98em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.47142857em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.95714286em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.55714286em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.875em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.125em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.25em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.5em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.8em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.1625em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.5875em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:3.1125em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.77777778em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.88888889em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.6em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.92222222em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.3em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.76666667em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.7em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.8em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.9em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.2em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.44em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.73em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:2.07em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.49em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.58333333em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.66666667em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.75em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.83333333em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44166667em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.725em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.075em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.48611111em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.55555556em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.625em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.69444444em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.20138889em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.4375em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72916667em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.28901734em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.40462428em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.46242775em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.52023121em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.57803468em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69364162em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83236994em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.19653179em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.43930636em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.24154589em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.33816425em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.38647343em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.43478261em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.48309179em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.57971014em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69565217em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83574879em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20289855em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.20080321em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2811245em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.32128514em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.36144578em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.40160643em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48192771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57831325em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69477912em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8313253em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist>span,.katex .op-limits>.vlist>span{text-align:center}.katex .accent .accent-body>span{width:0}.katex .accent .accent-body.accent-vec>span{position:relative;left:.326em}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid #000}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist{text-align:center}.katex .mtable .col-align-l>.vlist{text-align:left}.katex .mtable .col-align-r>.vlist{text-align:right} \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/katex.min.js b/Wino.Mail/JS/Quill/katex.min.js new file mode 100644 index 00000000..66c08216 --- /dev/null +++ b/Wino.Mail/JS/Quill/katex.min.js @@ -0,0 +1,4 @@ +(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.katex=e()}})(function(){var e,t,r;return function a(e,t,r){function i(s,l){if(!t[s]){if(!e[s]){var o=typeof require=="function"&&require;if(!l&&o)return o(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var p=t[s]={exports:{}};e[s][0].call(p.exports,function(t){var r=e[s][1][t];return i(r?r:t)},p,p.exports,a,e,t,r)}return t[s].exports}var n=typeof require=="function"&&require;for(var s=0;s15){o="\u2026"+s.slice(i-15,i)}else{o=s.slice(0,i)}var u;if(n+15v){return this.parseFunction(i)}else{throw new p("Got function '"+i.result+"' with no arguments "+"as "+e,t)}}else{return i.result}};h.prototype.handleUnsupportedCmd=function(){var e=this.nextToken.text;var t=[];for(var r=0;ri){c=this.parseFunction(h)}else{throw new p("Got function '"+h.result+"' as "+"argument to '"+e+"'",o)}}else{c=h.result}s.push(c);n.push(this.pos)}s.push(n);return s};h.prototype.parseGroupOfType=function(e,t){var r=this.mode;if(e==="original"){e=r}if(e==="color"){return this.parseColorGroup(t)}if(e==="size"){return this.parseSizeGroup(t)}this.switchMode(e);if(e==="text"){while(this.nextToken.text===" "){this.consume()}}var a=this.parseGroup(t);this.switchMode(r);return a};h.prototype.parseStringGroup=function(e,t){if(t&&this.nextToken.text!=="["){return null}var r=this.mode;this.mode="text";this.expect(t?"[":"{");var a="";var i=this.nextToken;var n=i;while(this.nextToken.text!==(t?"]":"}")){if(this.nextToken.text==="EOF"){throw new p("Unexpected end of input in "+e,i.range(this.nextToken,a))}n=this.nextToken;a+=n.text;this.consume()}this.mode=r;this.expect(t?"]":"}");return i.range(n,a)};h.prototype.parseRegexGroup=function(e,t){var r=this.mode;this.mode="text";var a=this.nextToken;var i=a;var n="";while(this.nextToken.text!=="EOF"&&e.test(n+this.nextToken.text)){i=this.nextToken;n+=i.text;this.consume()}if(n===""){throw new p("Invalid "+t+": '"+a.text+"'",a)}this.mode=r;return a.range(i,n)};h.prototype.parseColorGroup=function(e){var t=this.parseStringGroup("color",e);if(!t){return null}var r=/^(#[a-z0-9]+|[a-z]+)$/i.exec(t.text);if(!r){throw new p("Invalid color: '"+t.text+"'",t)}return new m(new c("color",r[0],this.mode),false)};h.prototype.parseSizeGroup=function(e){var t;if(!e&&this.nextToken.text!=="{"){t=this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2}$/,"size")}else{t=this.parseStringGroup("size",e)}if(!t){return null}var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t.text);if(!r){throw new p("Invalid size: '"+t.text+"'",t)}var a={number:+(r[1]+r[2]),unit:r[3]};if(a.unit!=="em"&&a.unit!=="ex"&&a.unit!=="mu"){throw new p("Invalid unit: '"+a.unit+"'",t)}return new m(new c("color",a,this.mode),false)};h.prototype.parseGroup=function(e){var t=this.nextToken;if(this.nextToken.text===(e?"[":"{")){this.consume();var r=this.parseExpression(false,e?"]":null);var a=this.nextToken;this.expect(e?"]":"}");if(this.mode==="text"){this.formLigatures(r)}return new m(new c("ordgroup",r,this.mode,t,a),false)}else{return e?null:this.parseSymbol()}};h.prototype.formLigatures=function(e){var t;var r=e.length-1;for(t=0;t0?t-1:0]}l.prototype.sup=function(){return y[x[this.id]]};l.prototype.sub=function(){return y[b[this.id]]};l.prototype.fracNum=function(){return y[w[this.id]]};l.prototype.fracDen=function(){return y[k[this.id]]};l.prototype.cramp=function(){return y[z[this.id]]};l.prototype.cls=function(){return d[this.size]+(this.cramped?" cramped":" uncramped")};l.prototype.reset=function(){return g[this.size]};l.prototype.isTight=function(){return this.size>=2};var o=0;var u=1;var p=2;var h=3;var c=4;var m=5;var f=6;var v=7;var d=["displaystyle textstyle","textstyle","scriptstyle","scriptscriptstyle"];var g=["reset-textstyle","reset-textstyle","reset-scriptstyle","reset-scriptscriptstyle"];var y=[new l(o,0,1,false),new l(u,0,1,true),new l(p,1,1,false),new l(h,1,1,true),new l(c,2,.7,false),new l(m,2,.7,true),new l(f,3,.5,false),new l(v,3,.5,true)];var x=[c,m,c,m,f,v,f,v];var b=[m,m,m,m,v,v,v,v];var w=[p,h,c,m,f,v,f,v];var k=[h,h,m,m,v,v,v,v];var z=[u,u,h,h,m,m,v,v];t.exports={DISPLAY:y[o],TEXT:y[p],SCRIPT:y[c],SCRIPTSCRIPT:y[f]}},{"./fontMetrics.js":17}],10:[function(e,t,r){var a=e("./domTree");var i=e("./fontMetrics");var n=e("./symbols");var s=e("./utils");var l=["\\Gamma","\\Delta","\\Theta","\\Lambda","\\Xi","\\Pi","\\Sigma","\\Upsilon","\\Phi","\\Psi","\\Omega"];var o=["\u0131","\u0237","\xa3"];var u=function(e,t,r,s,l){if(n[r][e]&&n[r][e].replace){e=n[r][e].replace}var o=i.getCharacterMetrics(e,t);var u;if(o){var p=o.italic;if(r==="text"){p=0}u=new a.symbolNode(e,o.height,o.depth,p,o.skew,l)}else{typeof console!=="undefined"&&console.warn("No character metrics for '"+e+"' in style '"+t+"'");u=new a.symbolNode(e,0,0,0,0,l)}if(s){if(s.style.isTight()){u.classes.push("mtight")}if(s.getColor()){u.style.color=s.getColor()}}return u};var p=function(e,t,r,a){if(e==="\\"||n[t][e].font==="main"){return u(e,"Main-Regular",t,r,a)}else{return u(e,"AMS-Regular",t,r,a.concat(["amsrm"]))}};var h=function(e,t,r,a,i){if(i==="mathord"){return c(e,t,r,a)}else if(i==="textord"){return u(e,"Main-Regular",t,r,a.concat(["mathrm"]))}else{throw new Error("unexpected type: "+i+" in mathDefault")}};var c=function(e,t,r,a){if(/[0-9]/.test(e.charAt(0))||s.contains(o,e)||s.contains(l,e)){return u(e,"Main-Italic",t,r,a.concat(["mainit"]))}else{return u(e,"Math-Italic",t,r,a.concat(["mathit"]))}};var m=function(e,t,r){var a=e.mode;var l=e.value;if(n[a][l]&&n[a][l].replace){l=n[a][l].replace}var p=["mord"];var m=t.font;if(m){if(m==="mathit"||s.contains(o,l)){return c(l,a,t,p)}else{var f=k[m].fontName;if(i.getCharacterMetrics(l,f)){return u(l,f,a,t,p.concat([m]))}else{return h(l,a,t,p,r)}}}else{return h(l,a,t,p,r)}};var f=function(e){var t=0;var r=0;var a=0;if(e.children){for(var i=0;it){t=e.children[i].height}if(e.children[i].depth>r){r=e.children[i].depth}if(e.children[i].maxFontSize>a){a=e.children[i].maxFontSize}}}e.height=t;e.depth=r;e.maxFontSize=a};var v=function(e,t,r){var i=new a.span(e,t,r);f(i);return i};var d=function(e,t){e.children=t.concat(e.children);f(e)};var g=function(e){var t=new a.documentFragment(e);f(t);return t};var y=function(e,t){var r=v([],[new a.symbolNode("\u200b")]);r.style.fontSize=t/e.style.sizeMultiplier+"em";var i=v(["fontsize-ensurer","reset-"+e.size,"size5"],[r]);return i};var x=function(e,t,r,i){var n;var s;var l;if(t==="individualShift"){var o=e;e=[o[0]];n=-o[0].shift-o[0].elem.depth;s=n;for(l=1;l0){f+=T;v-=T}}S=n.makeVList([{type:"elem",elem:s,shift:v},{type:"elem",elem:a,shift:-f}],"individualShift",null,t);if(r instanceof l.symbolNode){S.children[0].style.marginLeft=-r.italic+"em"}S.children[0].style.marginRight=k;S.children[1].style.marginRight=k}var A=d(r)||"mord";return p([A],[r,p(["msupsub"],[S])],t)};w.genfrac=function(e,t){var r=t.style;if(e.value.size==="display"){r=i.DISPLAY}else if(e.value.size==="text"){r=i.TEXT}var a=r.fracNum();var l=r.fracDen();var u;u=t.withStyle(a);var h=z(e.value.numer,u);var c=p([r.reset(),a.cls()],[h],u);u=t.withStyle(l);var m=z(e.value.denom,u);var f=p([r.reset(),l.cls()],[m],u);var v;if(e.value.hasBarLine){v=o.metrics.defaultRuleThickness/t.style.sizeMultiplier}else{v=0}var d;var g;var y;if(r.size===i.DISPLAY.size){d=r.metrics.num1;if(v>0){g=3*v}else{g=7*o.metrics.defaultRuleThickness}y=r.metrics.denom1}else{if(v>0){d=r.metrics.num2;g=v}else{d=r.metrics.num3;g=3*o.metrics.defaultRuleThickness}y=r.metrics.denom2}var x;if(v===0){var w=d-h.depth-(m.height-y);if(w0){N+=x;if(M=l){continue}var I;if(i>0||e.value.hskipBeforeAndAfter){I=u.deflt(O.pregap,f);if(I!==0){C=p(["arraycolsep"],[]);C.style.width=I+"em";E.push(C)}}var L=[];for(r=0;ra.height+a.depth+c){c=(c+d-a.height-a.depth)/2}var g=-(a.height+c+l)+v.height;v.style.top=g+"em";v.height-=g;v.depth+=g;var y;if(a.height===0&&a.depth===0){y=p()}else{y=n.makeVList([{type:"elem",elem:a},{type:"kern",size:c},{type:"elem",elem:u},{type:"kern",size:l}],"firstBaseline",null,t)}if(!e.value.index){return p(["mord","sqrt"],[v,y],t)}else{var x=t.withStyle(i.SCRIPTSCRIPT);var b=z(e.value.index,x);var w=p([r.reset(),i.SCRIPTSCRIPT.cls()],[b],x);var k=Math.max(v.height,y.height);var S=Math.max(v.depth,y.depth);var M=.6*(k-S);var T=n.makeVList([{type:"elem",elem:w}],"shift",-M,t);var A=p(["root"],[T]);return p(["mord","sqrt"],[A,v,y],t)}};w.sizing=function(e,t){var r=v(e.value.value,t.withSize(e.value.size),false);var a=t.style;var i=n.sizingMultiplier[e.value.size];i=i*a.sizeMultiplier;for(var s=0;s","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"];var b=[0,1.2,1.8,2.4,3];var w=function(e,t,r,i,n){if(e==="<"||e==="\\lt"){e="\\langle"}else if(e===">"||e==="\\gt"){e="\\rangle"}if(o.contains(g,e)||o.contains(x,e)){return f(e,t,false,r,i,n)}else if(o.contains(y,e)){return d(e,b[t],false,r,i,n)}else{throw new a("Illegal delimiter: '"+e+"'")}};var k=[{type:"small",style:i.SCRIPTSCRIPT},{type:"small",style:i.SCRIPT},{type:"small",style:i.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}];var z=[{type:"small",style:i.SCRIPTSCRIPT},{type:"small",style:i.SCRIPT},{type:"small",style:i.TEXT},{type:"stack"}];var S=[{type:"small",style:i.SCRIPTSCRIPT},{type:"small",style:i.SCRIPT},{type:"small",style:i.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}];var M=function(e){if(e.type==="small"){return"Main-Regular"}else if(e.type==="large"){return"Size"+e.size+"-Regular"}else if(e.type==="stack"){return"Size4-Regular"}};var T=function(e,t,r,a){var i=Math.min(2,3-a.style.size);for(var n=i;nt){return r[n]}}return r[r.length-1]};var A=function(e,t,r,a,i,n){if(e==="<"||e==="\\lt"){e="\\langle"}else if(e===">"||e==="\\gt"){e="\\rangle"}var s;if(o.contains(x,e)){s=k}else if(o.contains(g,e)){s=S}else{s=z}var l=T(e,t,s,a);if(l.type==="small"){return m(e,l.style,r,a,i,n)}else if(l.type==="large"){return f(e,l.size,r,a,i,n)}else if(l.type==="stack"){return d(e,t,r,a,i,n)}};var N=function(e,t,r,a,i,n){var l=a.style.metrics.axisHeight*a.style.sizeMultiplier;var o=901;var u=5/s.metrics.ptPerEm;var p=Math.max(t-l,r+l);var h=Math.max(p/500*o,2*p-u);return A(e,h,true,a,i,n)};t.exports={sizedDelim:w,customSizedDelim:A,leftRightDelim:N}},{"./ParseError":6,"./Style":9,"./buildCommon":10,"./fontMetrics":17,"./symbols":23,"./utils":25}],15:[function(e,t,r){var a=e("./unicodeRegexes");var i=e("./utils");var n=function(e){e=e.slice();for(var t=e.length-1;t>=0;t--){if(!e[t]){e.splice(t,1)}}return e.join(" ")};function s(e,t,r){this.classes=e||[];this.children=t||[];this.height=0;this.depth=0;this.maxFontSize=0;this.style={};this.attributes={};if(r){if(r.style.isTight()){this.classes.push("mtight")}if(r.getColor()){this.style.color=r.getColor()}}}s.prototype.setAttribute=function(e,t){this.attributes[e]=t};s.prototype.tryCombine=function(e){return false};s.prototype.toNode=function(){var e=document.createElement("span");e.className=n(this.classes);for(var t in this.style){if(Object.prototype.hasOwnProperty.call(this.style,t)){e.style[t]=this.style[t]}}for(var r in this.attributes){if(Object.prototype.hasOwnProperty.call(this.attributes,r)){e.setAttribute(r,this.attributes[r])}}for(var a=0;a";return e};function l(e){this.children=e||[];this.height=0;this.depth=0;this.maxFontSize=0}l.prototype.toNode=function(){var e=document.createDocumentFragment();for(var t=0;t0||n(this.classes)!==n(e.classes)||this.skew!==e.skew||this.maxFontSize!==e.maxFontSize){return false}for(var t in this.style){if(this.style.hasOwnProperty(t)&&this.style[t]!==e.style[t]){return false}}for(t in e.style){if(e.style.hasOwnProperty(t)&&this.style[t]!==e.style[t]){return false}}this.value+=e.value;this.height=Math.max(this.height,e.height);this.depth=Math.max(this.depth,e.depth);this.italic=e.italic;return true};u.prototype.toNode=function(){var e=document.createTextNode(this.value);var t=null;if(this.italic>0){t=document.createElement("span");t.style.marginRight=this.italic+"em"}if(this.classes.length>0){t=t||document.createElement("span");t.className=n(this.classes)}for(var r in this.style){if(this.style.hasOwnProperty(r)){t=t||document.createElement("span");t.style[r]=this.style[r]}}if(t){t.appendChild(e);return t}else{return e}};u.prototype.toMarkup=function(){var e=false;var t="0){r+="margin-right:"+this.italic+"em;"}for(var a in this.style){if(this.style.hasOwnProperty(a)){r+=i.hyphenate(a)+":"+this.style[a]+";"}}if(r){e=true;t+=' style="'+i.escape(r)+'"'}var s=i.escape(this.value);if(e){t+=">";t+=s;t+="";return t}else{return s}};t.exports={span:s,documentFragment:l,symbolNode:u}},{"./unicodeRegexes":24,"./utils":25}],16:[function(e,t,r){var a=e("./parseData");var i=e("./ParseError");var n=e("./Style");var s=a.ParseNode;function l(e,t){var r=[];var a=[r];var n=[];while(true){var l=e.parseExpression(false,null);r.push(new s("ordgroup",l,e.mode));var o=e.nextToken.text;if(o==="&"){e.consume()}else if(o==="\\end"){break}else if(o==="\\\\"||o==="\\cr"){var u=e.parseFunction();n.push(u.value.size);r=[];a.push(r)}else{throw new i("Expected & or \\\\ or \\end",e.nextToken)}}t.body=a;t.rowGaps=n;return new s(t.type,t,e.mode)}function o(e,r,a){if(typeof e==="string"){e=[e]}if(typeof r==="number"){r={numArgs:r}}var i={numArgs:r.numArgs||0,argTypes:r.argTypes,greediness:1,allowedInText:!!r.allowedInText,numOptionalArgs:r.numOptionalArgs||0,handler:a};for(var n=0;n0){o=2}t.value.cols[i]={type:"align",align:n,pregap:o,postgap:0}}return t})},{"./ParseError":6,"./Style":9,"./parseData":21}],17:[function(e,t,r){var a=e("./Style");var i=e("./unicodeRegexes").cjkRegex;var n={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25]};var s=0;var l=0;var o=0;var u=0;var p=.431;var h=1;var c=0;var m=.04;var f=.111;var v=.166;var d=.2;var g=.6;var y=.1;var x=10;var b=2/x;var w={defaultRuleThickness:m,bigOpSpacing1:f,bigOpSpacing2:v,bigOpSpacing3:d,bigOpSpacing4:g,bigOpSpacing5:y,ptPerEm:x,doubleRuleSep:b};var k=e("./fontMetricsData");var z={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xc6":"A","\xc7":"C","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xd0":"D","\xd1":"N","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xdd":"Y","\xde":"o","\xdf":"B","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xe6":"a","\xe7":"c","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xf0":"d","\xf1":"n","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xfd":"y","\xfe":"o","\xff":"y","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};var S=function(e,t){var r=e.charCodeAt(0);if(e[0]in z){r=z[e[0]].charCodeAt(0)}else if(i.test(e[0])){r="M".charCodeAt(0)}var a=k[t][r];if(a){return{depth:a[0],height:a[1],italic:a[2],skew:a[3],width:a[4]}}};t.exports={metrics:w,sigmas:n,getCharacterMetrics:S}},{"./Style":9,"./fontMetricsData":18,"./unicodeRegexes":24}],18:[function(e,t,r){t.exports={"AMS-Regular":{65:[0,.68889,0,0],66:[0,.68889,0,0],67:[0,.68889,0,0],68:[0,.68889,0,0],69:[0,.68889,0,0],70:[0,.68889,0,0],71:[0,.68889,0,0],72:[0,.68889,0,0],73:[0,.68889,0,0],74:[.16667,.68889,0,0],75:[0,.68889,0,0],76:[0,.68889,0,0],77:[0,.68889,0,0],78:[0,.68889,0,0],79:[.16667,.68889,0,0],80:[0,.68889,0,0],81:[.16667,.68889,0,0],82:[0,.68889,0,0],83:[0,.68889,0,0],84:[0,.68889,0,0],85:[0,.68889,0,0],86:[0,.68889,0,0],87:[0,.68889,0,0],88:[0,.68889,0,0],89:[0,.68889,0,0],90:[0,.68889,0,0],107:[0,.68889,0,0],165:[0,.675,.025,0],174:[.15559,.69224,0,0],240:[0,.68889,0,0],295:[0,.68889,0,0],710:[0,.825,0,0],732:[0,.9,0,0],770:[0,.825,0,0],771:[0,.9,0,0],989:[.08167,.58167,0,0],1008:[0,.43056,.04028,0],8245:[0,.54986,0,0],8463:[0,.68889,0,0],8487:[0,.68889,0,0],8498:[0,.68889,0,0],8502:[0,.68889,0,0],8503:[0,.68889,0,0],8504:[0,.68889,0,0],8513:[0,.68889,0,0],8592:[-.03598,.46402,0,0],8594:[-.03598,.46402,0,0],8602:[-.13313,.36687,0,0],8603:[-.13313,.36687,0,0],8606:[.01354,.52239,0,0],8608:[.01354,.52239,0,0],8610:[.01354,.52239,0,0],8611:[.01354,.52239,0,0],8619:[0,.54986,0,0],8620:[0,.54986,0,0],8621:[-.13313,.37788,0,0],8622:[-.13313,.36687,0,0],8624:[0,.69224,0,0],8625:[0,.69224,0,0],8630:[0,.43056,0,0],8631:[0,.43056,0,0],8634:[.08198,.58198,0,0],8635:[.08198,.58198,0,0],8638:[.19444,.69224,0,0],8639:[.19444,.69224,0,0],8642:[.19444,.69224,0,0],8643:[.19444,.69224,0,0],8644:[.1808,.675,0,0],8646:[.1808,.675,0,0],8647:[.1808,.675,0,0],8648:[.19444,.69224,0,0],8649:[.1808,.675,0,0],8650:[.19444,.69224,0,0],8651:[.01354,.52239,0,0],8652:[.01354,.52239,0,0],8653:[-.13313,.36687,0,0],8654:[-.13313,.36687,0,0],8655:[-.13313,.36687,0,0],8666:[.13667,.63667,0,0],8667:[.13667,.63667,0,0],8669:[-.13313,.37788,0,0],8672:[-.064,.437,0,0],8674:[-.064,.437,0,0],8705:[0,.825,0,0],8708:[0,.68889,0,0],8709:[.08167,.58167,0,0],8717:[0,.43056,0,0],8722:[-.03598,.46402,0,0],8724:[.08198,.69224,0,0],8726:[.08167,.58167,0,0],8733:[0,.69224,0,0],8736:[0,.69224,0,0],8737:[0,.69224,0,0],8738:[.03517,.52239,0,0],8739:[.08167,.58167,0,0],8740:[.25142,.74111,0,0],8741:[.08167,.58167,0,0],8742:[.25142,.74111,0,0],8756:[0,.69224,0,0],8757:[0,.69224,0,0],8764:[-.13313,.36687,0,0],8765:[-.13313,.37788,0,0],8769:[-.13313,.36687,0,0],8770:[-.03625,.46375,0,0],8774:[.30274,.79383,0,0],8776:[-.01688,.48312,0,0],8778:[.08167,.58167,0,0],8782:[.06062,.54986,0,0],8783:[.06062,.54986,0,0],8785:[.08198,.58198,0,0],8786:[.08198,.58198,0,0],8787:[.08198,.58198,0,0],8790:[0,.69224,0,0],8791:[.22958,.72958,0,0],8796:[.08198,.91667,0,0],8806:[.25583,.75583,0,0], +8807:[.25583,.75583,0,0],8808:[.25142,.75726,0,0],8809:[.25142,.75726,0,0],8812:[.25583,.75583,0,0],8814:[.20576,.70576,0,0],8815:[.20576,.70576,0,0],8816:[.30274,.79383,0,0],8817:[.30274,.79383,0,0],8818:[.22958,.72958,0,0],8819:[.22958,.72958,0,0],8822:[.1808,.675,0,0],8823:[.1808,.675,0,0],8828:[.13667,.63667,0,0],8829:[.13667,.63667,0,0],8830:[.22958,.72958,0,0],8831:[.22958,.72958,0,0],8832:[.20576,.70576,0,0],8833:[.20576,.70576,0,0],8840:[.30274,.79383,0,0],8841:[.30274,.79383,0,0],8842:[.13597,.63597,0,0],8843:[.13597,.63597,0,0],8847:[.03517,.54986,0,0],8848:[.03517,.54986,0,0],8858:[.08198,.58198,0,0],8859:[.08198,.58198,0,0],8861:[.08198,.58198,0,0],8862:[0,.675,0,0],8863:[0,.675,0,0],8864:[0,.675,0,0],8865:[0,.675,0,0],8872:[0,.69224,0,0],8873:[0,.69224,0,0],8874:[0,.69224,0,0],8876:[0,.68889,0,0],8877:[0,.68889,0,0],8878:[0,.68889,0,0],8879:[0,.68889,0,0],8882:[.03517,.54986,0,0],8883:[.03517,.54986,0,0],8884:[.13667,.63667,0,0],8885:[.13667,.63667,0,0],8888:[0,.54986,0,0],8890:[.19444,.43056,0,0],8891:[.19444,.69224,0,0],8892:[.19444,.69224,0,0],8901:[0,.54986,0,0],8903:[.08167,.58167,0,0],8905:[.08167,.58167,0,0],8906:[.08167,.58167,0,0],8907:[0,.69224,0,0],8908:[0,.69224,0,0],8909:[-.03598,.46402,0,0],8910:[0,.54986,0,0],8911:[0,.54986,0,0],8912:[.03517,.54986,0,0],8913:[.03517,.54986,0,0],8914:[0,.54986,0,0],8915:[0,.54986,0,0],8916:[0,.69224,0,0],8918:[.0391,.5391,0,0],8919:[.0391,.5391,0,0],8920:[.03517,.54986,0,0],8921:[.03517,.54986,0,0],8922:[.38569,.88569,0,0],8923:[.38569,.88569,0,0],8926:[.13667,.63667,0,0],8927:[.13667,.63667,0,0],8928:[.30274,.79383,0,0],8929:[.30274,.79383,0,0],8934:[.23222,.74111,0,0],8935:[.23222,.74111,0,0],8936:[.23222,.74111,0,0],8937:[.23222,.74111,0,0],8938:[.20576,.70576,0,0],8939:[.20576,.70576,0,0],8940:[.30274,.79383,0,0],8941:[.30274,.79383,0,0],8994:[.19444,.69224,0,0],8995:[.19444,.69224,0,0],9416:[.15559,.69224,0,0],9484:[0,.69224,0,0],9488:[0,.69224,0,0],9492:[0,.37788,0,0],9496:[0,.37788,0,0],9585:[.19444,.68889,0,0],9586:[.19444,.74111,0,0],9632:[0,.675,0,0],9633:[0,.675,0,0],9650:[0,.54986,0,0],9651:[0,.54986,0,0],9654:[.03517,.54986,0,0],9660:[0,.54986,0,0],9661:[0,.54986,0,0],9664:[.03517,.54986,0,0],9674:[.11111,.69224,0,0],9733:[.19444,.69224,0,0],10003:[0,.69224,0,0],10016:[0,.69224,0,0],10731:[.11111,.69224,0,0],10846:[.19444,.75583,0,0],10877:[.13667,.63667,0,0],10878:[.13667,.63667,0,0],10885:[.25583,.75583,0,0],10886:[.25583,.75583,0,0],10887:[.13597,.63597,0,0],10888:[.13597,.63597,0,0],10889:[.26167,.75726,0,0],10890:[.26167,.75726,0,0],10891:[.48256,.98256,0,0],10892:[.48256,.98256,0,0],10901:[.13667,.63667,0,0],10902:[.13667,.63667,0,0],10933:[.25142,.75726,0,0],10934:[.25142,.75726,0,0],10935:[.26167,.75726,0,0],10936:[.26167,.75726,0,0],10937:[.26167,.75726,0,0],10938:[.26167,.75726,0,0],10949:[.25583,.75583,0,0],10950:[.25583,.75583,0,0],10955:[.28481,.79383,0,0],10956:[.28481,.79383,0,0],57350:[.08167,.58167,0,0],57351:[.08167,.58167,0,0],57352:[.08167,.58167,0,0],57353:[0,.43056,.04028,0],57356:[.25142,.75726,0,0],57357:[.25142,.75726,0,0],57358:[.41951,.91951,0,0],57359:[.30274,.79383,0,0],57360:[.30274,.79383,0,0],57361:[.41951,.91951,0,0],57366:[.25142,.75726,0,0],57367:[.25142,.75726,0,0],57368:[.25142,.75726,0,0],57369:[.25142,.75726,0,0],57370:[.13597,.63597,0,0],57371:[.13597,.63597,0,0]},"Caligraphic-Regular":{48:[0,.43056,0,0],49:[0,.43056,0,0],50:[0,.43056,0,0],51:[.19444,.43056,0,0],52:[.19444,.43056,0,0],53:[.19444,.43056,0,0],54:[0,.64444,0,0],55:[.19444,.43056,0,0],56:[0,.64444,0,0],57:[.19444,.43056,0,0],65:[0,.68333,0,.19445],66:[0,.68333,.03041,.13889],67:[0,.68333,.05834,.13889],68:[0,.68333,.02778,.08334],69:[0,.68333,.08944,.11111],70:[0,.68333,.09931,.11111],71:[.09722,.68333,.0593,.11111],72:[0,.68333,.00965,.11111],73:[0,.68333,.07382,0],74:[.09722,.68333,.18472,.16667],75:[0,.68333,.01445,.05556],76:[0,.68333,0,.13889],77:[0,.68333,0,.13889],78:[0,.68333,.14736,.08334],79:[0,.68333,.02778,.11111],80:[0,.68333,.08222,.08334],81:[.09722,.68333,0,.11111],82:[0,.68333,0,.08334],83:[0,.68333,.075,.13889],84:[0,.68333,.25417,0],85:[0,.68333,.09931,.08334],86:[0,.68333,.08222,0],87:[0,.68333,.08222,.08334],88:[0,.68333,.14643,.13889],89:[.09722,.68333,.08222,.08334],90:[0,.68333,.07944,.13889]},"Fraktur-Regular":{33:[0,.69141,0,0],34:[0,.69141,0,0],38:[0,.69141,0,0],39:[0,.69141,0,0],40:[.24982,.74947,0,0],41:[.24982,.74947,0,0],42:[0,.62119,0,0],43:[.08319,.58283,0,0],44:[0,.10803,0,0],45:[.08319,.58283,0,0],46:[0,.10803,0,0],47:[.24982,.74947,0,0],48:[0,.47534,0,0],49:[0,.47534,0,0],50:[0,.47534,0,0],51:[.18906,.47534,0,0],52:[.18906,.47534,0,0],53:[.18906,.47534,0,0],54:[0,.69141,0,0],55:[.18906,.47534,0,0],56:[0,.69141,0,0],57:[.18906,.47534,0,0],58:[0,.47534,0,0],59:[.12604,.47534,0,0],61:[-.13099,.36866,0,0],63:[0,.69141,0,0],65:[0,.69141,0,0],66:[0,.69141,0,0],67:[0,.69141,0,0],68:[0,.69141,0,0],69:[0,.69141,0,0],70:[.12604,.69141,0,0],71:[0,.69141,0,0],72:[.06302,.69141,0,0],73:[0,.69141,0,0],74:[.12604,.69141,0,0],75:[0,.69141,0,0],76:[0,.69141,0,0],77:[0,.69141,0,0],78:[0,.69141,0,0],79:[0,.69141,0,0],80:[.18906,.69141,0,0],81:[.03781,.69141,0,0],82:[0,.69141,0,0],83:[0,.69141,0,0],84:[0,.69141,0,0],85:[0,.69141,0,0],86:[0,.69141,0,0],87:[0,.69141,0,0],88:[0,.69141,0,0],89:[.18906,.69141,0,0],90:[.12604,.69141,0,0],91:[.24982,.74947,0,0],93:[.24982,.74947,0,0],94:[0,.69141,0,0],97:[0,.47534,0,0],98:[0,.69141,0,0],99:[0,.47534,0,0],100:[0,.62119,0,0],101:[0,.47534,0,0],102:[.18906,.69141,0,0],103:[.18906,.47534,0,0],104:[.18906,.69141,0,0],105:[0,.69141,0,0],106:[0,.69141,0,0],107:[0,.69141,0,0],108:[0,.69141,0,0],109:[0,.47534,0,0],110:[0,.47534,0,0],111:[0,.47534,0,0],112:[.18906,.52396,0,0],113:[.18906,.47534,0,0],114:[0,.47534,0,0],115:[0,.47534,0,0],116:[0,.62119,0,0],117:[0,.47534,0,0],118:[0,.52396,0,0],119:[0,.52396,0,0],120:[.18906,.47534,0,0],121:[.18906,.47534,0,0],122:[.18906,.47534,0,0],8216:[0,.69141,0,0],8217:[0,.69141,0,0],58112:[0,.62119,0,0],58113:[0,.62119,0,0],58114:[.18906,.69141,0,0],58115:[.18906,.69141,0,0],58116:[.18906,.47534,0,0],58117:[0,.69141,0,0],58118:[0,.62119,0,0],58119:[0,.47534,0,0]},"Main-Bold":{33:[0,.69444,0,0],34:[0,.69444,0,0],35:[.19444,.69444,0,0],36:[.05556,.75,0,0],37:[.05556,.75,0,0],38:[0,.69444,0,0],39:[0,.69444,0,0],40:[.25,.75,0,0],41:[.25,.75,0,0],42:[0,.75,0,0],43:[.13333,.63333,0,0],44:[.19444,.15556,0,0],45:[0,.44444,0,0],46:[0,.15556,0,0],47:[.25,.75,0,0],48:[0,.64444,0,0],49:[0,.64444,0,0],50:[0,.64444,0,0],51:[0,.64444,0,0],52:[0,.64444,0,0],53:[0,.64444,0,0],54:[0,.64444,0,0],55:[0,.64444,0,0],56:[0,.64444,0,0],57:[0,.64444,0,0],58:[0,.44444,0,0],59:[.19444,.44444,0,0],60:[.08556,.58556,0,0],61:[-.10889,.39111,0,0],62:[.08556,.58556,0,0],63:[0,.69444,0,0],64:[0,.69444,0,0],65:[0,.68611,0,0],66:[0,.68611,0,0],67:[0,.68611,0,0],68:[0,.68611,0,0],69:[0,.68611,0,0],70:[0,.68611,0,0],71:[0,.68611,0,0],72:[0,.68611,0,0],73:[0,.68611,0,0],74:[0,.68611,0,0],75:[0,.68611,0,0],76:[0,.68611,0,0],77:[0,.68611,0,0],78:[0,.68611,0,0],79:[0,.68611,0,0],80:[0,.68611,0,0],81:[.19444,.68611,0,0],82:[0,.68611,0,0],83:[0,.68611,0,0],84:[0,.68611,0,0],85:[0,.68611,0,0],86:[0,.68611,.01597,0],87:[0,.68611,.01597,0],88:[0,.68611,0,0],89:[0,.68611,.02875,0],90:[0,.68611,0,0],91:[.25,.75,0,0],92:[.25,.75,0,0],93:[.25,.75,0,0],94:[0,.69444,0,0],95:[.31,.13444,.03194,0],96:[0,.69444,0,0],97:[0,.44444,0,0],98:[0,.69444,0,0],99:[0,.44444,0,0],100:[0,.69444,0,0],101:[0,.44444,0,0],102:[0,.69444,.10903,0],103:[.19444,.44444,.01597,0],104:[0,.69444,0,0],105:[0,.69444,0,0],106:[.19444,.69444,0,0],107:[0,.69444,0,0],108:[0,.69444,0,0],109:[0,.44444,0,0],110:[0,.44444,0,0],111:[0,.44444,0,0],112:[.19444,.44444,0,0],113:[.19444,.44444,0,0],114:[0,.44444,0,0],115:[0,.44444,0,0],116:[0,.63492,0,0],117:[0,.44444,0,0],118:[0,.44444,.01597,0],119:[0,.44444,.01597,0],120:[0,.44444,0,0],121:[.19444,.44444,.01597,0],122:[0,.44444,0,0],123:[.25,.75,0,0],124:[.25,.75,0,0],125:[.25,.75,0,0],126:[.35,.34444,0,0],168:[0,.69444,0,0],172:[0,.44444,0,0],175:[0,.59611,0,0],176:[0,.69444,0,0],177:[.13333,.63333,0,0],180:[0,.69444,0,0],215:[.13333,.63333,0,0],247:[.13333,.63333,0,0],305:[0,.44444,0,0],567:[.19444,.44444,0,0],710:[0,.69444,0,0],711:[0,.63194,0,0],713:[0,.59611,0,0],714:[0,.69444,0,0],715:[0,.69444,0,0],728:[0,.69444,0,0],729:[0,.69444,0,0],730:[0,.69444,0,0],732:[0,.69444,0,0],768:[0,.69444,0,0],769:[0,.69444,0,0],770:[0,.69444,0,0],771:[0,.69444,0,0],772:[0,.59611,0,0],774:[0,.69444,0,0],775:[0,.69444,0,0],776:[0,.69444,0,0],778:[0,.69444,0,0],779:[0,.69444,0,0],780:[0,.63194,0,0],824:[.19444,.69444,0,0],915:[0,.68611,0,0],916:[0,.68611,0,0],920:[0,.68611,0,0],923:[0,.68611,0,0],926:[0,.68611,0,0],928:[0,.68611,0,0],931:[0,.68611,0,0],933:[0,.68611,0,0],934:[0,.68611,0,0],936:[0,.68611,0,0],937:[0,.68611,0,0],8211:[0,.44444,.03194,0],8212:[0,.44444,.03194,0],8216:[0,.69444,0,0],8217:[0,.69444,0,0],8220:[0,.69444,0,0],8221:[0,.69444,0,0],8224:[.19444,.69444,0,0],8225:[.19444,.69444,0,0],8242:[0,.55556,0,0],8407:[0,.72444,.15486,0],8463:[0,.69444,0,0],8465:[0,.69444,0,0],8467:[0,.69444,0,0],8472:[.19444,.44444,0,0],8476:[0,.69444,0,0],8501:[0,.69444,0,0],8592:[-.10889,.39111,0,0],8593:[.19444,.69444,0,0],8594:[-.10889,.39111,0,0],8595:[.19444,.69444,0,0],8596:[-.10889,.39111,0,0],8597:[.25,.75,0,0],8598:[.19444,.69444,0,0],8599:[.19444,.69444,0,0],8600:[.19444,.69444,0,0],8601:[.19444,.69444,0,0],8636:[-.10889,.39111,0,0],8637:[-.10889,.39111,0,0],8640:[-.10889,.39111,0,0],8641:[-.10889,.39111,0,0],8656:[-.10889,.39111,0,0],8657:[.19444,.69444,0,0],8658:[-.10889,.39111,0,0],8659:[.19444,.69444,0,0],8660:[-.10889,.39111,0,0],8661:[.25,.75,0,0],8704:[0,.69444,0,0],8706:[0,.69444,.06389,0],8707:[0,.69444,0,0],8709:[.05556,.75,0,0],8711:[0,.68611,0,0],8712:[.08556,.58556,0,0],8715:[.08556,.58556,0,0],8722:[.13333,.63333,0,0],8723:[.13333,.63333,0,0],8725:[.25,.75,0,0],8726:[.25,.75,0,0],8727:[-.02778,.47222,0,0],8728:[-.02639,.47361,0,0],8729:[-.02639,.47361,0,0],8730:[.18,.82,0,0],8733:[0,.44444,0,0],8734:[0,.44444,0,0],8736:[0,.69224,0,0],8739:[.25,.75,0,0],8741:[.25,.75,0,0],8743:[0,.55556,0,0],8744:[0,.55556,0,0],8745:[0,.55556,0,0],8746:[0,.55556,0,0],8747:[.19444,.69444,.12778,0],8764:[-.10889,.39111,0,0],8768:[.19444,.69444,0,0],8771:[.00222,.50222,0,0],8776:[.02444,.52444,0,0],8781:[.00222,.50222,0,0],8801:[.00222,.50222,0,0],8804:[.19667,.69667,0,0],8805:[.19667,.69667,0,0],8810:[.08556,.58556,0,0],8811:[.08556,.58556,0,0],8826:[.08556,.58556,0,0],8827:[.08556,.58556,0,0],8834:[.08556,.58556,0,0],8835:[.08556,.58556,0,0],8838:[.19667,.69667,0,0],8839:[.19667,.69667,0,0],8846:[0,.55556,0,0],8849:[.19667,.69667,0,0],8850:[.19667,.69667,0,0],8851:[0,.55556,0,0],8852:[0,.55556,0,0],8853:[.13333,.63333,0,0],8854:[.13333,.63333,0,0],8855:[.13333,.63333,0,0],8856:[.13333,.63333,0,0],8857:[.13333,.63333,0,0],8866:[0,.69444,0,0],8867:[0,.69444,0,0],8868:[0,.69444,0,0],8869:[0,.69444,0,0],8900:[-.02639,.47361,0,0],8901:[-.02639,.47361,0,0],8902:[-.02778,.47222,0,0],8968:[.25,.75,0,0],8969:[.25,.75,0,0],8970:[.25,.75,0,0],8971:[.25,.75,0,0],8994:[-.13889,.36111,0,0],8995:[-.13889,.36111,0,0],9651:[.19444,.69444,0,0],9657:[-.02778,.47222,0,0],9661:[.19444,.69444,0,0],9667:[-.02778,.47222,0,0],9711:[.19444,.69444,0,0],9824:[.12963,.69444,0,0],9825:[.12963,.69444,0,0],9826:[.12963,.69444,0,0],9827:[.12963,.69444,0,0],9837:[0,.75,0,0],9838:[.19444,.69444,0,0],9839:[.19444,.69444,0,0],10216:[.25,.75,0,0],10217:[.25,.75,0,0],10815:[0,.68611,0,0],10927:[.19667,.69667,0,0],10928:[.19667,.69667,0,0]},"Main-Italic":{33:[0,.69444,.12417,0],34:[0,.69444,.06961,0],35:[.19444,.69444,.06616,0],37:[.05556,.75,.13639,0],38:[0,.69444,.09694,0],39:[0,.69444,.12417,0],40:[.25,.75,.16194,0],41:[.25,.75,.03694,0],42:[0,.75,.14917,0],43:[.05667,.56167,.03694,0],44:[.19444,.10556,0,0],45:[0,.43056,.02826,0],46:[0,.10556,0,0],47:[.25,.75,.16194,0],48:[0,.64444,.13556,0],49:[0,.64444,.13556,0],50:[0,.64444,.13556,0],51:[0,.64444,.13556,0],52:[.19444,.64444,.13556,0],53:[0,.64444,.13556,0],54:[0,.64444,.13556,0],55:[.19444,.64444,.13556,0],56:[0,.64444,.13556,0],57:[0,.64444,.13556,0],58:[0,.43056,.0582,0],59:[.19444,.43056,.0582,0],61:[-.13313,.36687,.06616,0],63:[0,.69444,.1225,0],64:[0,.69444,.09597,0],65:[0,.68333,0,0],66:[0,.68333,.10257,0],67:[0,.68333,.14528,0],68:[0,.68333,.09403,0],69:[0,.68333,.12028,0],70:[0,.68333,.13305,0],71:[0,.68333,.08722,0],72:[0,.68333,.16389,0],73:[0,.68333,.15806,0],74:[0,.68333,.14028,0],75:[0,.68333,.14528,0],76:[0,.68333,0,0],77:[0,.68333,.16389,0],78:[0,.68333,.16389,0],79:[0,.68333,.09403,0],80:[0,.68333,.10257,0],81:[.19444,.68333,.09403,0],82:[0,.68333,.03868,0],83:[0,.68333,.11972,0],84:[0,.68333,.13305,0],85:[0,.68333,.16389,0],86:[0,.68333,.18361,0],87:[0,.68333,.18361,0],88:[0,.68333,.15806,0],89:[0,.68333,.19383,0],90:[0,.68333,.14528,0],91:[.25,.75,.1875,0],93:[.25,.75,.10528,0],94:[0,.69444,.06646,0],95:[.31,.12056,.09208,0],97:[0,.43056,.07671,0],98:[0,.69444,.06312,0],99:[0,.43056,.05653,0],100:[0,.69444,.10333,0],101:[0,.43056,.07514,0],102:[.19444,.69444,.21194,0],103:[.19444,.43056,.08847,0],104:[0,.69444,.07671,0],105:[0,.65536,.1019,0],106:[.19444,.65536,.14467,0],107:[0,.69444,.10764,0],108:[0,.69444,.10333,0],109:[0,.43056,.07671,0],110:[0,.43056,.07671,0],111:[0,.43056,.06312,0],112:[.19444,.43056,.06312,0],113:[.19444,.43056,.08847,0],114:[0,.43056,.10764,0],115:[0,.43056,.08208,0],116:[0,.61508,.09486,0],117:[0,.43056,.07671,0],118:[0,.43056,.10764,0],119:[0,.43056,.10764,0],120:[0,.43056,.12042,0],121:[.19444,.43056,.08847,0],122:[0,.43056,.12292,0],126:[.35,.31786,.11585,0],163:[0,.69444,0,0],305:[0,.43056,0,.02778],567:[.19444,.43056,0,.08334],768:[0,.69444,0,0],769:[0,.69444,.09694,0],770:[0,.69444,.06646,0],771:[0,.66786,.11585,0],772:[0,.56167,.10333,0],774:[0,.69444,.10806,0],775:[0,.66786,.11752,0],776:[0,.66786,.10474,0],778:[0,.69444,0,0],779:[0,.69444,.1225,0],780:[0,.62847,.08295,0],915:[0,.68333,.13305,0],916:[0,.68333,0,0],920:[0,.68333,.09403,0],923:[0,.68333,0,0],926:[0,.68333,.15294,0],928:[0,.68333,.16389,0],931:[0,.68333,.12028,0],933:[0,.68333,.11111,0],934:[0,.68333,.05986,0],936:[0,.68333,.11111,0],937:[0,.68333,.10257,0],8211:[0,.43056,.09208,0],8212:[0,.43056,.09208,0],8216:[0,.69444,.12417,0],8217:[0,.69444,.12417,0],8220:[0,.69444,.1685,0],8221:[0,.69444,.06961,0],8463:[0,.68889,0,0]},"Main-Regular":{32:[0,0,0,0],33:[0,.69444,0,0],34:[0,.69444,0,0],35:[.19444,.69444,0,0],36:[.05556,.75,0,0],37:[.05556,.75,0,0],38:[0,.69444,0,0],39:[0,.69444,0,0],40:[.25,.75,0,0],41:[.25,.75,0,0],42:[0,.75,0,0],43:[.08333,.58333,0,0],44:[.19444,.10556,0,0],45:[0,.43056,0,0],46:[0,.10556,0,0],47:[.25,.75,0,0],48:[0,.64444,0,0],49:[0,.64444,0,0],50:[0,.64444,0,0],51:[0,.64444,0,0],52:[0,.64444,0,0],53:[0,.64444,0,0],54:[0,.64444,0,0],55:[0,.64444,0,0],56:[0,.64444,0,0],57:[0,.64444,0,0],58:[0,.43056,0,0],59:[.19444,.43056,0,0],60:[.0391,.5391,0,0],61:[-.13313,.36687,0,0],62:[.0391,.5391,0,0],63:[0,.69444,0,0],64:[0,.69444,0,0],65:[0,.68333,0,0],66:[0,.68333,0,0],67:[0,.68333,0,0],68:[0,.68333,0,0],69:[0,.68333,0,0],70:[0,.68333,0,0],71:[0,.68333,0,0],72:[0,.68333,0,0],73:[0,.68333,0,0],74:[0,.68333,0,0],75:[0,.68333,0,0],76:[0,.68333,0,0],77:[0,.68333,0,0],78:[0,.68333,0,0],79:[0,.68333,0,0],80:[0,.68333,0,0],81:[.19444,.68333,0,0],82:[0,.68333,0,0],83:[0,.68333,0,0],84:[0,.68333,0,0],85:[0,.68333,0,0],86:[0,.68333,.01389,0],87:[0,.68333,.01389,0],88:[0,.68333,0,0],89:[0,.68333,.025,0],90:[0,.68333,0,0],91:[.25,.75,0,0],92:[.25,.75,0,0],93:[.25,.75,0,0],94:[0,.69444,0,0],95:[.31,.12056,.02778,0],96:[0,.69444,0,0],97:[0,.43056,0,0],98:[0,.69444,0,0],99:[0,.43056,0,0],100:[0,.69444,0,0],101:[0,.43056,0,0],102:[0,.69444,.07778,0],103:[.19444,.43056,.01389,0],104:[0,.69444,0,0],105:[0,.66786,0,0],106:[.19444,.66786,0,0],107:[0,.69444,0,0],108:[0,.69444,0,0],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,0],112:[.19444,.43056,0,0],113:[.19444,.43056,0,0],114:[0,.43056,0,0],115:[0,.43056,0,0],116:[0,.61508,0,0],117:[0,.43056,0,0],118:[0,.43056,.01389,0],119:[0,.43056,.01389,0],120:[0,.43056,0,0],121:[.19444,.43056,.01389,0],122:[0,.43056,0,0],123:[.25,.75,0,0],124:[.25,.75,0,0],125:[.25,.75,0,0],126:[.35,.31786,0,0],160:[0,0,0,0],168:[0,.66786,0,0],172:[0,.43056,0,0],175:[0,.56778,0,0],176:[0,.69444,0,0],177:[.08333,.58333,0,0],180:[0,.69444,0,0],215:[.08333,.58333,0,0],247:[.08333,.58333,0,0],305:[0,.43056,0,0],567:[.19444,.43056,0,0],710:[0,.69444,0,0],711:[0,.62847,0,0],713:[0,.56778,0,0],714:[0,.69444,0,0],715:[0,.69444,0,0],728:[0,.69444,0,0],729:[0,.66786,0,0],730:[0,.69444,0,0],732:[0,.66786,0,0],768:[0,.69444,0,0],769:[0,.69444,0,0],770:[0,.69444,0,0],771:[0,.66786,0,0],772:[0,.56778,0,0],774:[0,.69444,0,0],775:[0,.66786,0,0],776:[0,.66786,0,0],778:[0,.69444,0,0],779:[0,.69444,0,0],780:[0,.62847,0,0],824:[.19444,.69444,0,0],915:[0,.68333,0,0],916:[0,.68333,0,0],920:[0,.68333,0,0],923:[0,.68333,0,0],926:[0,.68333,0,0],928:[0,.68333,0,0],931:[0,.68333,0,0],933:[0,.68333,0,0],934:[0,.68333,0,0],936:[0,.68333,0,0],937:[0,.68333,0,0],8211:[0,.43056,.02778,0],8212:[0,.43056,.02778,0],8216:[0,.69444,0,0],8217:[0,.69444,0,0],8220:[0,.69444,0,0],8221:[0,.69444,0,0],8224:[.19444,.69444,0,0],8225:[.19444,.69444,0,0],8230:[0,.12,0,0],8242:[0,.55556,0,0],8407:[0,.71444,.15382,0],8463:[0,.68889,0,0],8465:[0,.69444,0,0],8467:[0,.69444,0,.11111],8472:[.19444,.43056,0,.11111],8476:[0,.69444,0,0],8501:[0,.69444,0,0],8592:[-.13313,.36687,0,0],8593:[.19444,.69444,0,0],8594:[-.13313,.36687,0,0],8595:[.19444,.69444,0,0],8596:[-.13313,.36687,0,0],8597:[.25,.75,0,0],8598:[.19444,.69444,0,0],8599:[.19444,.69444,0,0],8600:[.19444,.69444,0,0],8601:[.19444,.69444,0,0],8614:[.011,.511,0,0],8617:[.011,.511,0,0],8618:[.011,.511,0,0],8636:[-.13313,.36687,0,0],8637:[-.13313,.36687,0,0],8640:[-.13313,.36687,0,0],8641:[-.13313,.36687,0,0],8652:[.011,.671,0,0],8656:[-.13313,.36687,0,0],8657:[.19444,.69444,0,0],8658:[-.13313,.36687,0,0],8659:[.19444,.69444,0,0],8660:[-.13313,.36687,0,0],8661:[.25,.75,0,0],8704:[0,.69444,0,0],8706:[0,.69444,.05556,.08334],8707:[0,.69444,0,0],8709:[.05556,.75,0,0],8711:[0,.68333,0,0],8712:[.0391,.5391,0,0],8715:[.0391,.5391,0,0],8722:[.08333,.58333,0,0],8723:[.08333,.58333,0,0],8725:[.25,.75,0,0],8726:[.25,.75,0,0],8727:[-.03472,.46528,0,0],8728:[-.05555,.44445,0,0],8729:[-.05555,.44445,0,0],8730:[.2,.8,0,0],8733:[0,.43056,0,0],8734:[0,.43056,0,0],8736:[0,.69224,0,0],8739:[.25,.75,0,0],8741:[.25,.75,0,0],8743:[0,.55556,0,0],8744:[0,.55556,0,0],8745:[0,.55556,0,0],8746:[0,.55556,0,0],8747:[.19444,.69444,.11111,0],8764:[-.13313,.36687,0,0],8768:[.19444,.69444,0,0],8771:[-.03625,.46375,0,0],8773:[-.022,.589,0,0],8776:[-.01688,.48312,0,0],8781:[-.03625,.46375,0,0],8784:[-.133,.67,0,0],8800:[.215,.716,0,0],8801:[-.03625,.46375,0,0],8804:[.13597,.63597,0,0],8805:[.13597,.63597,0,0],8810:[.0391,.5391,0,0],8811:[.0391,.5391,0,0],8826:[.0391,.5391,0,0],8827:[.0391,.5391,0,0],8834:[.0391,.5391,0,0],8835:[.0391,.5391,0,0],8838:[.13597,.63597,0,0],8839:[.13597,.63597,0,0],8846:[0,.55556,0,0],8849:[.13597,.63597,0,0],8850:[.13597,.63597,0,0],8851:[0,.55556,0,0],8852:[0,.55556,0,0],8853:[.08333,.58333,0,0],8854:[.08333,.58333,0,0],8855:[.08333,.58333,0,0],8856:[.08333,.58333,0,0],8857:[.08333,.58333,0,0],8866:[0,.69444,0,0],8867:[0,.69444,0,0],8868:[0,.69444,0,0],8869:[0,.69444,0,0],8872:[.249,.75,0,0],8900:[-.05555,.44445,0,0],8901:[-.05555,.44445,0,0],8902:[-.03472,.46528,0,0],8904:[.005,.505,0,0],8942:[.03,.9,0,0],8943:[-.19,.31,0,0],8945:[-.1,.82,0,0],8968:[.25,.75,0,0],8969:[.25,.75,0,0],8970:[.25,.75,0,0],8971:[.25,.75,0,0],8994:[-.14236,.35764,0,0],8995:[-.14236,.35764,0,0],9136:[.244,.744,0,0],9137:[.244,.744,0,0],9651:[.19444,.69444,0,0],9657:[-.03472,.46528,0,0],9661:[.19444,.69444,0,0],9667:[-.03472,.46528,0,0],9711:[.19444,.69444,0,0],9824:[.12963,.69444,0,0],9825:[.12963,.69444,0,0],9826:[.12963,.69444,0,0],9827:[.12963,.69444,0,0],9837:[0,.75,0,0],9838:[.19444,.69444,0,0],9839:[.19444,.69444,0,0],10216:[.25,.75,0,0],10217:[.25,.75,0,0],10222:[.244,.744,0,0],10223:[.244,.744,0,0],10229:[.011,.511,0,0],10230:[.011,.511,0,0],10231:[.011,.511,0,0],10232:[.024,.525,0,0],10233:[.024,.525,0,0],10234:[.024,.525,0,0],10236:[.011,.511,0,0],10815:[0,.68333,0,0],10927:[.13597,.63597,0,0],10928:[.13597,.63597,0,0]},"Math-BoldItalic":{47:[.19444,.69444,0,0],65:[0,.68611,0,0],66:[0,.68611,.04835,0],67:[0,.68611,.06979,0],68:[0,.68611,.03194,0],69:[0,.68611,.05451,0],70:[0,.68611,.15972,0],71:[0,.68611,0,0],72:[0,.68611,.08229,0],73:[0,.68611,.07778,0],74:[0,.68611,.10069,0],75:[0,.68611,.06979,0],76:[0,.68611,0,0],77:[0,.68611,.11424,0],78:[0,.68611,.11424,0],79:[0,.68611,.03194,0],80:[0,.68611,.15972,0],81:[.19444,.68611,0,0],82:[0,.68611,.00421,0],83:[0,.68611,.05382,0],84:[0,.68611,.15972,0],85:[0,.68611,.11424,0],86:[0,.68611,.25555,0],87:[0,.68611,.15972,0],88:[0,.68611,.07778,0],89:[0,.68611,.25555,0],90:[0,.68611,.06979,0],97:[0,.44444,0,0],98:[0,.69444,0,0],99:[0,.44444,0,0],100:[0,.69444,0,0],101:[0,.44444,0,0],102:[.19444,.69444,.11042,0],103:[.19444,.44444,.03704,0],104:[0,.69444,0,0],105:[0,.69326,0,0],106:[.19444,.69326,.0622,0],107:[0,.69444,.01852,0],108:[0,.69444,.0088,0],109:[0,.44444,0,0],110:[0,.44444,0,0],111:[0,.44444,0,0],112:[.19444,.44444,0,0],113:[.19444,.44444,.03704,0],114:[0,.44444,.03194,0],115:[0,.44444,0,0],116:[0,.63492,0,0],117:[0,.44444,0,0],118:[0,.44444,.03704,0],119:[0,.44444,.02778,0],120:[0,.44444,0,0],121:[.19444,.44444,.03704,0],122:[0,.44444,.04213,0],915:[0,.68611,.15972,0],916:[0,.68611,0,0],920:[0,.68611,.03194,0],923:[0,.68611,0,0],926:[0,.68611,.07458,0],928:[0,.68611,.08229,0],931:[0,.68611,.05451,0],933:[0,.68611,.15972,0],934:[0,.68611,0,0],936:[0,.68611,.11653,0],937:[0,.68611,.04835,0],945:[0,.44444,0,0],946:[.19444,.69444,.03403,0],947:[.19444,.44444,.06389,0],948:[0,.69444,.03819,0],949:[0,.44444,0,0],950:[.19444,.69444,.06215,0],951:[.19444,.44444,.03704,0],952:[0,.69444,.03194,0],953:[0,.44444,0,0],954:[0,.44444,0,0],955:[0,.69444,0,0],956:[.19444,.44444,0,0],957:[0,.44444,.06898,0],958:[.19444,.69444,.03021,0],959:[0,.44444,0,0],960:[0,.44444,.03704,0],961:[.19444,.44444,0,0],962:[.09722,.44444,.07917,0],963:[0,.44444,.03704,0],964:[0,.44444,.13472,0],965:[0,.44444,.03704,0],966:[.19444,.44444,0,0],967:[.19444,.44444,0,0],968:[.19444,.69444,.03704,0],969:[0,.44444,.03704,0],977:[0,.69444,0,0],981:[.19444,.69444,0,0],982:[0,.44444,.03194,0],1009:[.19444,.44444,0,0],1013:[0,.44444,0,0]},"Math-Italic":{47:[.19444,.69444,0,0],65:[0,.68333,0,.13889],66:[0,.68333,.05017,.08334],67:[0,.68333,.07153,.08334],68:[0,.68333,.02778,.05556],69:[0,.68333,.05764,.08334],70:[0,.68333,.13889,.08334],71:[0,.68333,0,.08334],72:[0,.68333,.08125,.05556],73:[0,.68333,.07847,.11111],74:[0,.68333,.09618,.16667],75:[0,.68333,.07153,.05556],76:[0,.68333,0,.02778],77:[0,.68333,.10903,.08334],78:[0,.68333,.10903,.08334],79:[0,.68333,.02778,.08334],80:[0,.68333,.13889,.08334],81:[.19444,.68333,0,.08334],82:[0,.68333,.00773,.08334],83:[0,.68333,.05764,.08334],84:[0,.68333,.13889,.08334],85:[0,.68333,.10903,.02778],86:[0,.68333,.22222,0],87:[0,.68333,.13889,0],88:[0,.68333,.07847,.08334],89:[0,.68333,.22222,0],90:[0,.68333,.07153,.08334],97:[0,.43056,0,0],98:[0,.69444,0,0],99:[0,.43056,0,.05556],100:[0,.69444,0,.16667],101:[0,.43056,0,.05556],102:[.19444,.69444,.10764,.16667],103:[.19444,.43056,.03588,.02778],104:[0,.69444,0,0],105:[0,.65952,0,0],106:[.19444,.65952,.05724,0],107:[0,.69444,.03148,0],108:[0,.69444,.01968,.08334],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,.05556],112:[.19444,.43056,0,.08334],113:[.19444,.43056,.03588,.08334],114:[0,.43056,.02778,.05556],115:[0,.43056,0,.05556],116:[0,.61508,0,.08334],117:[0,.43056,0,.02778],118:[0,.43056,.03588,.02778],119:[0,.43056,.02691,.08334],120:[0,.43056,0,.02778],121:[.19444,.43056,.03588,.05556],122:[0,.43056,.04398,.05556],915:[0,.68333,.13889,.08334],916:[0,.68333,0,.16667],920:[0,.68333,.02778,.08334],923:[0,.68333,0,.16667],926:[0,.68333,.07569,.08334],928:[0,.68333,.08125,.05556],931:[0,.68333,.05764,.08334],933:[0,.68333,.13889,.05556],934:[0,.68333,0,.08334],936:[0,.68333,.11,.05556],937:[0,.68333,.05017,.08334],945:[0,.43056,.0037,.02778],946:[.19444,.69444,.05278,.08334],947:[.19444,.43056,.05556,0],948:[0,.69444,.03785,.05556],949:[0,.43056,0,.08334],950:[.19444,.69444,.07378,.08334],951:[.19444,.43056,.03588,.05556],952:[0,.69444,.02778,.08334],953:[0,.43056,0,.05556],954:[0,.43056,0,0],955:[0,.69444,0,0],956:[.19444,.43056,0,.02778],957:[0,.43056,.06366,.02778],958:[.19444,.69444,.04601,.11111],959:[0,.43056,0,.05556],960:[0,.43056,.03588,0],961:[.19444,.43056,0,.08334],962:[.09722,.43056,.07986,.08334],963:[0,.43056,.03588,0],964:[0,.43056,.1132,.02778],965:[0,.43056,.03588,.02778],966:[.19444,.43056,0,.08334],967:[.19444,.43056,0,.05556],968:[.19444,.69444,.03588,.11111],969:[0,.43056,.03588,0],977:[0,.69444,0,.08334],981:[.19444,.69444,0,.08334],982:[0,.43056,.02778,0],1009:[.19444,.43056,0,.08334],1013:[0,.43056,0,.05556]},"Math-Regular":{65:[0,.68333,0,.13889],66:[0,.68333,.05017,.08334],67:[0,.68333,.07153,.08334],68:[0,.68333,.02778,.05556],69:[0,.68333,.05764,.08334],70:[0,.68333,.13889,.08334],71:[0,.68333,0,.08334],72:[0,.68333,.08125,.05556],73:[0,.68333,.07847,.11111],74:[0,.68333,.09618,.16667],75:[0,.68333,.07153,.05556],76:[0,.68333,0,.02778],77:[0,.68333,.10903,.08334],78:[0,.68333,.10903,.08334],79:[0,.68333,.02778,.08334],80:[0,.68333,.13889,.08334],81:[.19444,.68333,0,.08334],82:[0,.68333,.00773,.08334],83:[0,.68333,.05764,.08334],84:[0,.68333,.13889,.08334],85:[0,.68333,.10903,.02778],86:[0,.68333,.22222,0],87:[0,.68333,.13889,0],88:[0,.68333,.07847,.08334],89:[0,.68333,.22222,0],90:[0,.68333,.07153,.08334],97:[0,.43056,0,0],98:[0,.69444,0,0],99:[0,.43056,0,.05556],100:[0,.69444,0,.16667],101:[0,.43056,0,.05556],102:[.19444,.69444,.10764,.16667],103:[.19444,.43056,.03588,.02778],104:[0,.69444,0,0],105:[0,.65952,0,0],106:[.19444,.65952,.05724,0],107:[0,.69444,.03148,0],108:[0,.69444,.01968,.08334],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,.05556],112:[.19444,.43056,0,.08334],113:[.19444,.43056,.03588,.08334],114:[0,.43056,.02778,.05556],115:[0,.43056,0,.05556],116:[0,.61508,0,.08334],117:[0,.43056,0,.02778],118:[0,.43056,.03588,.02778],119:[0,.43056,.02691,.08334],120:[0,.43056,0,.02778],121:[.19444,.43056,.03588,.05556],122:[0,.43056,.04398,.05556],915:[0,.68333,.13889,.08334],916:[0,.68333,0,.16667],920:[0,.68333,.02778,.08334],923:[0,.68333,0,.16667],926:[0,.68333,.07569,.08334],928:[0,.68333,.08125,.05556],931:[0,.68333,.05764,.08334],933:[0,.68333,.13889,.05556],934:[0,.68333,0,.08334],936:[0,.68333,.11,.05556],937:[0,.68333,.05017,.08334],945:[0,.43056,.0037,.02778],946:[.19444,.69444,.05278,.08334],947:[.19444,.43056,.05556,0],948:[0,.69444,.03785,.05556],949:[0,.43056,0,.08334],950:[.19444,.69444,.07378,.08334],951:[.19444,.43056,.03588,.05556],952:[0,.69444,.02778,.08334],953:[0,.43056,0,.05556],954:[0,.43056,0,0],955:[0,.69444,0,0],956:[.19444,.43056,0,.02778],957:[0,.43056,.06366,.02778],958:[.19444,.69444,.04601,.11111],959:[0,.43056,0,.05556],960:[0,.43056,.03588,0],961:[.19444,.43056,0,.08334],962:[.09722,.43056,.07986,.08334],963:[0,.43056,.03588,0],964:[0,.43056,.1132,.02778],965:[0,.43056,.03588,.02778],966:[.19444,.43056,0,.08334],967:[.19444,.43056,0,.05556],968:[.19444,.69444,.03588,.11111],969:[0,.43056,.03588,0],977:[0,.69444,0,.08334],981:[.19444,.69444,0,.08334],982:[0,.43056,.02778,0],1009:[.19444,.43056,0,.08334],1013:[0,.43056,0,.05556]},"SansSerif-Regular":{33:[0,.69444,0,0],34:[0,.69444,0,0],35:[.19444,.69444,0,0],36:[.05556,.75,0,0],37:[.05556,.75,0,0],38:[0,.69444,0,0],39:[0,.69444,0,0],40:[.25,.75,0,0],41:[.25,.75,0,0],42:[0,.75,0,0],43:[.08333,.58333,0,0],44:[.125,.08333,0,0],45:[0,.44444,0,0],46:[0,.08333,0,0],47:[.25,.75,0,0],48:[0,.65556,0,0],49:[0,.65556,0,0],50:[0,.65556,0,0],51:[0,.65556,0,0],52:[0,.65556,0,0],53:[0,.65556,0,0],54:[0,.65556,0,0],55:[0,.65556,0,0],56:[0,.65556,0,0],57:[0,.65556,0,0],58:[0,.44444,0,0],59:[.125,.44444,0,0],61:[-.13,.37,0,0],63:[0,.69444,0,0],64:[0,.69444,0,0],65:[0,.69444,0,0],66:[0,.69444,0,0],67:[0,.69444,0,0],68:[0,.69444,0,0],69:[0,.69444,0,0],70:[0,.69444,0,0],71:[0,.69444,0,0],72:[0,.69444,0,0],73:[0,.69444,0,0],74:[0,.69444,0,0],75:[0,.69444,0,0],76:[0,.69444,0,0],77:[0,.69444,0,0],78:[0,.69444,0,0],79:[0,.69444,0,0],80:[0,.69444,0,0],81:[.125,.69444,0,0],82:[0,.69444,0,0],83:[0,.69444,0,0],84:[0,.69444,0,0],85:[0,.69444,0,0],86:[0,.69444,.01389,0],87:[0,.69444,.01389,0],88:[0,.69444,0,0],89:[0,.69444,.025,0],90:[0,.69444,0,0],91:[.25,.75,0,0],93:[.25,.75,0,0],94:[0,.69444,0,0],95:[.35,.09444,.02778,0],97:[0,.44444,0,0],98:[0,.69444,0,0],99:[0,.44444,0,0],100:[0,.69444,0,0],101:[0,.44444,0,0],102:[0,.69444,.06944,0],103:[.19444,.44444,.01389,0],104:[0,.69444,0,0],105:[0,.67937,0,0],106:[.19444,.67937,0,0],107:[0,.69444,0,0],108:[0,.69444,0,0],109:[0,.44444,0,0],110:[0,.44444,0,0],111:[0,.44444,0,0],112:[.19444,.44444,0,0],113:[.19444,.44444,0,0],114:[0,.44444,.01389,0],115:[0,.44444,0,0],116:[0,.57143,0,0],117:[0,.44444,0,0],118:[0,.44444,.01389,0],119:[0,.44444,.01389,0],120:[0,.44444,0,0],121:[.19444,.44444,.01389,0],122:[0,.44444,0,0],126:[.35,.32659,0,0],305:[0,.44444,0,0],567:[.19444,.44444,0,0],768:[0,.69444,0,0],769:[0,.69444,0,0],770:[0,.69444,0,0],771:[0,.67659,0,0],772:[0,.60889,0,0],774:[0,.69444,0,0],775:[0,.67937,0,0],776:[0,.67937,0,0],778:[0,.69444,0,0],779:[0,.69444,0,0],780:[0,.63194,0,0],915:[0,.69444,0,0],916:[0,.69444,0,0],920:[0,.69444,0,0],923:[0,.69444,0,0],926:[0,.69444,0,0],928:[0,.69444,0,0],931:[0,.69444,0,0],933:[0,.69444,0,0],934:[0,.69444,0,0],936:[0,.69444,0,0],937:[0,.69444,0,0],8211:[0,.44444,.02778,0],8212:[0,.44444,.02778,0],8216:[0,.69444,0,0],8217:[0,.69444,0,0],8220:[0,.69444,0,0],8221:[0,.69444,0,0]},"Script-Regular":{65:[0,.7,.22925,0],66:[0,.7,.04087,0],67:[0,.7,.1689,0],68:[0,.7,.09371,0],69:[0,.7,.18583,0],70:[0,.7,.13634,0],71:[0,.7,.17322,0],72:[0,.7,.29694,0],73:[0,.7,.19189,0],74:[.27778,.7,.19189,0],75:[0,.7,.31259,0],76:[0,.7,.19189,0],77:[0,.7,.15981,0],78:[0,.7,.3525,0],79:[0,.7,.08078,0],80:[0,.7,.08078,0],81:[0,.7,.03305,0],82:[0,.7,.06259,0],83:[0,.7,.19189,0],84:[0,.7,.29087,0],85:[0,.7,.25815,0],86:[0,.7,.27523,0],87:[0,.7,.27523,0],88:[0,.7,.26006,0],89:[0,.7,.2939,0],90:[0,.7,.24037,0]},"Size1-Regular":{40:[.35001,.85,0,0],41:[.35001,.85,0,0],47:[.35001,.85,0,0],91:[.35001,.85,0,0],92:[.35001,.85,0,0],93:[.35001,.85,0,0],123:[.35001,.85,0,0],125:[.35001,.85,0,0],710:[0,.72222,0,0],732:[0,.72222,0,0],770:[0,.72222,0,0],771:[0,.72222,0,0],8214:[-99e-5,.601,0,0],8593:[1e-5,.6,0,0],8595:[1e-5,.6,0,0],8657:[1e-5,.6,0,0],8659:[1e-5,.6,0,0],8719:[.25001,.75,0,0],8720:[.25001,.75,0,0],8721:[.25001,.75,0,0],8730:[.35001,.85,0,0],8739:[-.00599,.606,0,0],8741:[-.00599,.606,0,0],8747:[.30612,.805,.19445,0],8748:[.306,.805,.19445,0],8749:[.306,.805,.19445,0],8750:[.30612,.805,.19445,0],8896:[.25001,.75,0,0],8897:[.25001,.75,0,0],8898:[.25001,.75,0,0],8899:[.25001,.75,0,0],8968:[.35001,.85,0,0],8969:[.35001,.85,0,0],8970:[.35001,.85,0,0],8971:[.35001,.85,0,0],9168:[-99e-5,.601,0,0],10216:[.35001,.85,0,0],10217:[.35001,.85,0,0],10752:[.25001,.75,0,0],10753:[.25001,.75,0,0],10754:[.25001,.75,0,0],10756:[.25001,.75,0,0],10758:[.25001,.75,0,0]},"Size2-Regular":{40:[.65002,1.15,0,0],41:[.65002,1.15,0,0],47:[.65002,1.15,0,0],91:[.65002,1.15,0,0],92:[.65002,1.15,0,0],93:[.65002,1.15,0,0],123:[.65002,1.15,0,0],125:[.65002,1.15,0,0],710:[0,.75,0,0],732:[0,.75,0,0],770:[0,.75,0,0],771:[0,.75,0,0],8719:[.55001,1.05,0,0],8720:[.55001,1.05,0,0],8721:[.55001,1.05,0,0],8730:[.65002,1.15,0,0],8747:[.86225,1.36,.44445,0],8748:[.862,1.36,.44445,0],8749:[.862,1.36,.44445,0],8750:[.86225,1.36,.44445,0],8896:[.55001,1.05,0,0],8897:[.55001,1.05,0,0],8898:[.55001,1.05,0,0],8899:[.55001,1.05,0,0],8968:[.65002,1.15,0,0],8969:[.65002,1.15,0,0],8970:[.65002,1.15,0,0],8971:[.65002,1.15,0,0],10216:[.65002,1.15,0,0],10217:[.65002,1.15,0,0],10752:[.55001,1.05,0,0],10753:[.55001,1.05,0,0],10754:[.55001,1.05,0,0], +10756:[.55001,1.05,0,0],10758:[.55001,1.05,0,0]},"Size3-Regular":{40:[.95003,1.45,0,0],41:[.95003,1.45,0,0],47:[.95003,1.45,0,0],91:[.95003,1.45,0,0],92:[.95003,1.45,0,0],93:[.95003,1.45,0,0],123:[.95003,1.45,0,0],125:[.95003,1.45,0,0],710:[0,.75,0,0],732:[0,.75,0,0],770:[0,.75,0,0],771:[0,.75,0,0],8730:[.95003,1.45,0,0],8968:[.95003,1.45,0,0],8969:[.95003,1.45,0,0],8970:[.95003,1.45,0,0],8971:[.95003,1.45,0,0],10216:[.95003,1.45,0,0],10217:[.95003,1.45,0,0]},"Size4-Regular":{40:[1.25003,1.75,0,0],41:[1.25003,1.75,0,0],47:[1.25003,1.75,0,0],91:[1.25003,1.75,0,0],92:[1.25003,1.75,0,0],93:[1.25003,1.75,0,0],123:[1.25003,1.75,0,0],125:[1.25003,1.75,0,0],710:[0,.825,0,0],732:[0,.825,0,0],770:[0,.825,0,0],771:[0,.825,0,0],8730:[1.25003,1.75,0,0],8968:[1.25003,1.75,0,0],8969:[1.25003,1.75,0,0],8970:[1.25003,1.75,0,0],8971:[1.25003,1.75,0,0],9115:[.64502,1.155,0,0],9116:[1e-5,.6,0,0],9117:[.64502,1.155,0,0],9118:[.64502,1.155,0,0],9119:[1e-5,.6,0,0],9120:[.64502,1.155,0,0],9121:[.64502,1.155,0,0],9122:[-99e-5,.601,0,0],9123:[.64502,1.155,0,0],9124:[.64502,1.155,0,0],9125:[-99e-5,.601,0,0],9126:[.64502,1.155,0,0],9127:[1e-5,.9,0,0],9128:[.65002,1.15,0,0],9129:[.90001,0,0,0],9130:[0,.3,0,0],9131:[1e-5,.9,0,0],9132:[.65002,1.15,0,0],9133:[.90001,0,0,0],9143:[.88502,.915,0,0],10216:[1.25003,1.75,0,0],10217:[1.25003,1.75,0,0],57344:[-.00499,.605,0,0],57345:[-.00499,.605,0,0],57680:[0,.12,0,0],57681:[0,.12,0,0],57682:[0,.12,0,0],57683:[0,.12,0,0]},"Typewriter-Regular":{33:[0,.61111,0,0],34:[0,.61111,0,0],35:[0,.61111,0,0],36:[.08333,.69444,0,0],37:[.08333,.69444,0,0],38:[0,.61111,0,0],39:[0,.61111,0,0],40:[.08333,.69444,0,0],41:[.08333,.69444,0,0],42:[0,.52083,0,0],43:[-.08056,.53055,0,0],44:[.13889,.125,0,0],45:[-.08056,.53055,0,0],46:[0,.125,0,0],47:[.08333,.69444,0,0],48:[0,.61111,0,0],49:[0,.61111,0,0],50:[0,.61111,0,0],51:[0,.61111,0,0],52:[0,.61111,0,0],53:[0,.61111,0,0],54:[0,.61111,0,0],55:[0,.61111,0,0],56:[0,.61111,0,0],57:[0,.61111,0,0],58:[0,.43056,0,0],59:[.13889,.43056,0,0],60:[-.05556,.55556,0,0],61:[-.19549,.41562,0,0],62:[-.05556,.55556,0,0],63:[0,.61111,0,0],64:[0,.61111,0,0],65:[0,.61111,0,0],66:[0,.61111,0,0],67:[0,.61111,0,0],68:[0,.61111,0,0],69:[0,.61111,0,0],70:[0,.61111,0,0],71:[0,.61111,0,0],72:[0,.61111,0,0],73:[0,.61111,0,0],74:[0,.61111,0,0],75:[0,.61111,0,0],76:[0,.61111,0,0],77:[0,.61111,0,0],78:[0,.61111,0,0],79:[0,.61111,0,0],80:[0,.61111,0,0],81:[.13889,.61111,0,0],82:[0,.61111,0,0],83:[0,.61111,0,0],84:[0,.61111,0,0],85:[0,.61111,0,0],86:[0,.61111,0,0],87:[0,.61111,0,0],88:[0,.61111,0,0],89:[0,.61111,0,0],90:[0,.61111,0,0],91:[.08333,.69444,0,0],92:[.08333,.69444,0,0],93:[.08333,.69444,0,0],94:[0,.61111,0,0],95:[.09514,0,0,0],96:[0,.61111,0,0],97:[0,.43056,0,0],98:[0,.61111,0,0],99:[0,.43056,0,0],100:[0,.61111,0,0],101:[0,.43056,0,0],102:[0,.61111,0,0],103:[.22222,.43056,0,0],104:[0,.61111,0,0],105:[0,.61111,0,0],106:[.22222,.61111,0,0],107:[0,.61111,0,0],108:[0,.61111,0,0],109:[0,.43056,0,0],110:[0,.43056,0,0],111:[0,.43056,0,0],112:[.22222,.43056,0,0],113:[.22222,.43056,0,0],114:[0,.43056,0,0],115:[0,.43056,0,0],116:[0,.55358,0,0],117:[0,.43056,0,0],118:[0,.43056,0,0],119:[0,.43056,0,0],120:[0,.43056,0,0],121:[.22222,.43056,0,0],122:[0,.43056,0,0],123:[.08333,.69444,0,0],124:[.08333,.69444,0,0],125:[.08333,.69444,0,0],126:[0,.61111,0,0],127:[0,.61111,0,0],305:[0,.43056,0,0],567:[.22222,.43056,0,0],768:[0,.61111,0,0],769:[0,.61111,0,0],770:[0,.61111,0,0],771:[0,.61111,0,0],772:[0,.56555,0,0],774:[0,.61111,0,0],776:[0,.61111,0,0],778:[0,.61111,0,0],780:[0,.56597,0,0],915:[0,.61111,0,0],916:[0,.61111,0,0],920:[0,.61111,0,0],923:[0,.61111,0,0],926:[0,.61111,0,0],928:[0,.61111,0,0],931:[0,.61111,0,0],933:[0,.61111,0,0],934:[0,.61111,0,0],936:[0,.61111,0,0],937:[0,.61111,0,0],2018:[0,.61111,0,0],2019:[0,.61111,0,0],8242:[0,.61111,0,0]}}},{}],19:[function(e,t,r){var a=e("./utils");var i=e("./ParseError");var n=e("./parseData");var s=n.ParseNode;function l(e,r,a){if(typeof e==="string"){e=[e]}if(typeof r==="number"){r={numArgs:r}}var i={numArgs:r.numArgs,argTypes:r.argTypes,greediness:r.greediness===undefined?1:r.greediness,allowedInText:!!r.allowedInText,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,handler:a};for(var n=0;n","\\langle","\\rangle","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\\lmoustache","\\rmoustache","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];var c={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak"};l(["\\blue","\\orange","\\pink","\\red","\\green","\\gray","\\purple","\\blueA","\\blueB","\\blueC","\\blueD","\\blueE","\\tealA","\\tealB","\\tealC","\\tealD","\\tealE","\\greenA","\\greenB","\\greenC","\\greenD","\\greenE","\\goldA","\\goldB","\\goldC","\\goldD","\\goldE","\\redA","\\redB","\\redC","\\redD","\\redE","\\maroonA","\\maroonB","\\maroonC","\\maroonD","\\maroonE","\\purpleA","\\purpleB","\\purpleC","\\purpleD","\\purpleE","\\mintA","\\mintB","\\mintC","\\grayA","\\grayB","\\grayC","\\grayD","\\grayE","\\grayF","\\grayG","\\grayH","\\grayI","\\kaBlue","\\kaGreen"],{numArgs:1,allowedInText:true,greediness:3},function(e,t){var r=t[0];return{type:"color",color:"katex-"+e.funcName.slice(1),value:o(r)}});l(["\\arcsin","\\arccos","\\arctan","\\arg","\\cos","\\cosh","\\cot","\\coth","\\csc","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\tan","\\tanh"],{numArgs:0},function(e){return{type:"op",limits:false,symbol:false,body:e.funcName}});l(["\\det","\\gcd","\\inf","\\lim","\\liminf","\\limsup","\\max","\\min","\\Pr","\\sup"],{numArgs:0},function(e){return{type:"op",limits:true,symbol:false,body:e.funcName}});l(["\\int","\\iint","\\iiint","\\oint"],{numArgs:0},function(e){return{type:"op",limits:false,symbol:true,body:e.funcName}});l(["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint"],{numArgs:0},function(e){return{type:"op",limits:true,symbol:true,body:e.funcName}});l("\\mathop",{numArgs:1},function(e,t){var r=t[0];return{type:"op",limits:false,symbol:false,value:o(r)}});l(["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac"],{numArgs:2,greediness:2},function(e,t){var r=t[0];var a=t[1];var i;var n=null;var s=null;var l="auto";switch(e.funcName){case"\\dfrac":case"\\frac":case"\\tfrac":i=true;break;case"\\\\atopfrac":i=false;break;case"\\dbinom":case"\\binom":case"\\tbinom":i=false;n="(";s=")";break;default:throw new Error("Unrecognized genfrac command")}switch(e.funcName){case"\\dfrac":case"\\dbinom":l="display";break;case"\\tfrac":case"\\tbinom":l="text";break}return{type:"genfrac",numer:r,denom:a,hasBarLine:i,leftDelim:n,rightDelim:s,size:l}});l(["\\llap","\\rlap"],{numArgs:1,allowedInText:true},function(e,t){var r=t[0];return{type:e.funcName.slice(1),body:r}});var m=function(e,t){if(a.contains(h,e.value)){return e}else{throw new i("Invalid delimiter: '"+e.value+"' after '"+t.funcName+"'",e)}};l(["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],{numArgs:1},function(e,t){var r=m(t[0],e);return{type:"delimsizing",size:p[e.funcName].size,mclass:p[e.funcName].mclass,value:r.value}});l(["\\left","\\right"],{numArgs:1},function(e,t){var r=m(t[0],e);return{type:"leftright",value:r.value}});l("\\middle",{numArgs:1},function(e,t){var r=m(t[0],e);if(!e.parser.leftrightDepth){throw new i("\\middle without preceding \\left",r)}return{type:"middle",value:r.value}});l(["\\tiny","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],0,null);l(["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],0,null);l(["\\mathrm","\\mathit","\\mathbf","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],{numArgs:1,greediness:2},function(e,t){var r=t[0];var a=e.funcName;if(a in c){a=c[a]}return{type:"font",font:a.slice(1),body:r}});l(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot"],{numArgs:1},function(e,t){var r=t[0];return{type:"accent",accent:e.funcName,base:r}});l(["\\over","\\choose","\\atop"],{numArgs:0,infix:true},function(e){var t;switch(e.funcName){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",replaceWith:t,token:e.token}});l(["\\\\","\\cr"],{numArgs:0,numOptionalArgs:1,argTypes:["size"]},function(e,t){var r=t[0];return{type:"cr",size:r}});l(["\\begin","\\end"],{numArgs:1,argTypes:["text"]},function(e,t){var r=t[0];if(r.type!=="ordgroup"){throw new i("Invalid environment name",r)}var a="";for(var n=0;n";return e};function n(e){this.text=e}n.prototype.toNode=function(){return document.createTextNode(this.text)};n.prototype.toMarkup=function(){return a.escape(this.text)};t.exports={MathNode:i,TextNode:n}},{"./utils":25}],21:[function(e,t,r){function a(e,t,r,a,i){this.type=e;this.value=t;this.mode=r;if(a&&(!i||i.lexer===a.lexer)){this.lexer=a.lexer;this.start=a.start;this.end=(i||a).end}}t.exports={ParseNode:a}},{}],22:[function(e,t,r){var a=e("./Parser");var i=function(e,t){if(!(typeof e==="string"||e instanceof String)){throw new TypeError("KaTeX can only parse string typed expression")}var r=new a(e,t);return r.parse()};t.exports=i},{"./Parser":7}],23:[function(e,t,r){t.exports={math:{},text:{}};function a(e,r,a,i,n){t.exports[e][n]={font:r,group:a,replace:i}}var i="math";var n="text";var s="main";var l="ams";var o="accent";var u="bin";var p="close";var h="inner";var c="mathord";var m="op";var f="open";var v="punct";var d="rel";var g="spacing";var y="textord";a(i,s,d,"\u2261","\\equiv");a(i,s,d,"\u227a","\\prec");a(i,s,d,"\u227b","\\succ");a(i,s,d,"\u223c","\\sim");a(i,s,d,"\u22a5","\\perp");a(i,s,d,"\u2aaf","\\preceq");a(i,s,d,"\u2ab0","\\succeq");a(i,s,d,"\u2243","\\simeq");a(i,s,d,"\u2223","\\mid");a(i,s,d,"\u226a","\\ll");a(i,s,d,"\u226b","\\gg");a(i,s,d,"\u224d","\\asymp");a(i,s,d,"\u2225","\\parallel");a(i,s,d,"\u22c8","\\bowtie");a(i,s,d,"\u2323","\\smile");a(i,s,d,"\u2291","\\sqsubseteq");a(i,s,d,"\u2292","\\sqsupseteq");a(i,s,d,"\u2250","\\doteq");a(i,s,d,"\u2322","\\frown");a(i,s,d,"\u220b","\\ni");a(i,s,d,"\u221d","\\propto");a(i,s,d,"\u22a2","\\vdash");a(i,s,d,"\u22a3","\\dashv");a(i,s,d,"\u220b","\\owns");a(i,s,v,".","\\ldotp");a(i,s,v,"\u22c5","\\cdotp");a(i,s,y,"#","\\#");a(n,s,y,"#","\\#");a(i,s,y,"&","\\&");a(n,s,y,"&","\\&");a(i,s,y,"\u2135","\\aleph");a(i,s,y,"\u2200","\\forall");a(i,s,y,"\u210f","\\hbar");a(i,s,y,"\u2203","\\exists");a(i,s,y,"\u2207","\\nabla");a(i,s,y,"\u266d","\\flat");a(i,s,y,"\u2113","\\ell");a(i,s,y,"\u266e","\\natural");a(i,s,y,"\u2663","\\clubsuit");a(i,s,y,"\u2118","\\wp");a(i,s,y,"\u266f","\\sharp");a(i,s,y,"\u2662","\\diamondsuit");a(i,s,y,"\u211c","\\Re");a(i,s,y,"\u2661","\\heartsuit");a(i,s,y,"\u2111","\\Im");a(i,s,y,"\u2660","\\spadesuit");a(i,s,y,"\u2020","\\dag");a(i,s,y,"\u2021","\\ddag");a(i,s,p,"\u23b1","\\rmoustache");a(i,s,f,"\u23b0","\\lmoustache");a(i,s,p,"\u27ef","\\rgroup");a(i,s,f,"\u27ee","\\lgroup");a(i,s,u,"\u2213","\\mp");a(i,s,u,"\u2296","\\ominus");a(i,s,u,"\u228e","\\uplus");a(i,s,u,"\u2293","\\sqcap");a(i,s,u,"\u2217","\\ast");a(i,s,u,"\u2294","\\sqcup");a(i,s,u,"\u25ef","\\bigcirc");a(i,s,u,"\u2219","\\bullet");a(i,s,u,"\u2021","\\ddagger");a(i,s,u,"\u2240","\\wr");a(i,s,u,"\u2a3f","\\amalg");a(i,s,d,"\u27f5","\\longleftarrow");a(i,s,d,"\u21d0","\\Leftarrow");a(i,s,d,"\u27f8","\\Longleftarrow");a(i,s,d,"\u27f6","\\longrightarrow");a(i,s,d,"\u21d2","\\Rightarrow");a(i,s,d,"\u27f9","\\Longrightarrow");a(i,s,d,"\u2194","\\leftrightarrow");a(i,s,d,"\u27f7","\\longleftrightarrow");a(i,s,d,"\u21d4","\\Leftrightarrow");a(i,s,d,"\u27fa","\\Longleftrightarrow");a(i,s,d,"\u21a6","\\mapsto");a(i,s,d,"\u27fc","\\longmapsto");a(i,s,d,"\u2197","\\nearrow");a(i,s,d,"\u21a9","\\hookleftarrow");a(i,s,d,"\u21aa","\\hookrightarrow");a(i,s,d,"\u2198","\\searrow");a(i,s,d,"\u21bc","\\leftharpoonup");a(i,s,d,"\u21c0","\\rightharpoonup");a(i,s,d,"\u2199","\\swarrow");a(i,s,d,"\u21bd","\\leftharpoondown");a(i,s,d,"\u21c1","\\rightharpoondown");a(i,s,d,"\u2196","\\nwarrow");a(i,s,d,"\u21cc","\\rightleftharpoons");a(i,l,d,"\u226e","\\nless");a(i,l,d,"\ue010","\\nleqslant");a(i,l,d,"\ue011","\\nleqq");a(i,l,d,"\u2a87","\\lneq");a(i,l,d,"\u2268","\\lneqq");a(i,l,d,"\ue00c","\\lvertneqq");a(i,l,d,"\u22e6","\\lnsim");a(i,l,d,"\u2a89","\\lnapprox");a(i,l,d,"\u2280","\\nprec");a(i,l,d,"\u22e0","\\npreceq");a(i,l,d,"\u22e8","\\precnsim");a(i,l,d,"\u2ab9","\\precnapprox");a(i,l,d,"\u2241","\\nsim");a(i,l,d,"\ue006","\\nshortmid");a(i,l,d,"\u2224","\\nmid");a(i,l,d,"\u22ac","\\nvdash");a(i,l,d,"\u22ad","\\nvDash");a(i,l,d,"\u22ea","\\ntriangleleft");a(i,l,d,"\u22ec","\\ntrianglelefteq");a(i,l,d,"\u228a","\\subsetneq");a(i,l,d,"\ue01a","\\varsubsetneq");a(i,l,d,"\u2acb","\\subsetneqq");a(i,l,d,"\ue017","\\varsubsetneqq");a(i,l,d,"\u226f","\\ngtr");a(i,l,d,"\ue00f","\\ngeqslant");a(i,l,d,"\ue00e","\\ngeqq");a(i,l,d,"\u2a88","\\gneq");a(i,l,d,"\u2269","\\gneqq");a(i,l,d,"\ue00d","\\gvertneqq");a(i,l,d,"\u22e7","\\gnsim");a(i,l,d,"\u2a8a","\\gnapprox");a(i,l,d,"\u2281","\\nsucc");a(i,l,d,"\u22e1","\\nsucceq");a(i,l,d,"\u22e9","\\succnsim");a(i,l,d,"\u2aba","\\succnapprox");a(i,l,d,"\u2246","\\ncong");a(i,l,d,"\ue007","\\nshortparallel");a(i,l,d,"\u2226","\\nparallel");a(i,l,d,"\u22af","\\nVDash");a(i,l,d,"\u22eb","\\ntriangleright");a(i,l,d,"\u22ed","\\ntrianglerighteq");a(i,l,d,"\ue018","\\nsupseteqq");a(i,l,d,"\u228b","\\supsetneq");a(i,l,d,"\ue01b","\\varsupsetneq");a(i,l,d,"\u2acc","\\supsetneqq");a(i,l,d,"\ue019","\\varsupsetneqq");a(i,l,d,"\u22ae","\\nVdash");a(i,l,d,"\u2ab5","\\precneqq");a(i,l,d,"\u2ab6","\\succneqq");a(i,l,d,"\ue016","\\nsubseteqq");a(i,l,u,"\u22b4","\\unlhd");a(i,l,u,"\u22b5","\\unrhd");a(i,l,d,"\u219a","\\nleftarrow");a(i,l,d,"\u219b","\\nrightarrow");a(i,l,d,"\u21cd","\\nLeftarrow");a(i,l,d,"\u21cf","\\nRightarrow");a(i,l,d,"\u21ae","\\nleftrightarrow");a(i,l,d,"\u21ce","\\nLeftrightarrow");a(i,l,d,"\u25b3","\\vartriangle");a(i,l,y,"\u210f","\\hslash");a(i,l,y,"\u25bd","\\triangledown");a(i,l,y,"\u25ca","\\lozenge");a(i,l,y,"\u24c8","\\circledS");a(i,l,y,"\xae","\\circledR");a(i,l,y,"\u2221","\\measuredangle");a(i,l,y,"\u2204","\\nexists");a(i,l,y,"\u2127","\\mho");a(i,l,y,"\u2132","\\Finv");a(i,l,y,"\u2141","\\Game");a(i,l,y,"k","\\Bbbk");a(i,l,y,"\u2035","\\backprime");a(i,l,y,"\u25b2","\\blacktriangle");a(i,l,y,"\u25bc","\\blacktriangledown");a(i,l,y,"\u25a0","\\blacksquare");a(i,l,y,"\u29eb","\\blacklozenge");a(i,l,y,"\u2605","\\bigstar");a(i,l,y,"\u2222","\\sphericalangle");a(i,l,y,"\u2201","\\complement");a(i,l,y,"\xf0","\\eth");a(i,l,y,"\u2571","\\diagup");a(i,l,y,"\u2572","\\diagdown");a(i,l,y,"\u25a1","\\square");a(i,l,y,"\u25a1","\\Box");a(i,l,y,"\u25ca","\\Diamond");a(i,l,y,"\xa5","\\yen");a(i,l,y,"\u2713","\\checkmark");a(i,l,y,"\u2136","\\beth");a(i,l,y,"\u2138","\\daleth");a(i,l,y,"\u2137","\\gimel");a(i,l,y,"\u03dd","\\digamma");a(i,l,y,"\u03f0","\\varkappa");a(i,l,f,"\u250c","\\ulcorner");a(i,l,p,"\u2510","\\urcorner");a(i,l,f,"\u2514","\\llcorner");a(i,l,p,"\u2518","\\lrcorner");a(i,l,d,"\u2266","\\leqq");a(i,l,d,"\u2a7d","\\leqslant");a(i,l,d,"\u2a95","\\eqslantless");a(i,l,d,"\u2272","\\lesssim");a(i,l,d,"\u2a85","\\lessapprox");a(i,l,d,"\u224a","\\approxeq");a(i,l,u,"\u22d6","\\lessdot");a(i,l,d,"\u22d8","\\lll");a(i,l,d,"\u2276","\\lessgtr");a(i,l,d,"\u22da","\\lesseqgtr");a(i,l,d,"\u2a8b","\\lesseqqgtr");a(i,l,d,"\u2251","\\doteqdot");a(i,l,d,"\u2253","\\risingdotseq");a(i,l,d,"\u2252","\\fallingdotseq");a(i,l,d,"\u223d","\\backsim");a(i,l,d,"\u22cd","\\backsimeq");a(i,l,d,"\u2ac5","\\subseteqq");a(i,l,d,"\u22d0","\\Subset");a(i,l,d,"\u228f","\\sqsubset");a(i,l,d,"\u227c","\\preccurlyeq");a(i,l,d,"\u22de","\\curlyeqprec");a(i,l,d,"\u227e","\\precsim");a(i,l,d,"\u2ab7","\\precapprox");a(i,l,d,"\u22b2","\\vartriangleleft");a(i,l,d,"\u22b4","\\trianglelefteq");a(i,l,d,"\u22a8","\\vDash");a(i,l,d,"\u22aa","\\Vvdash");a(i,l,d,"\u2323","\\smallsmile");a(i,l,d,"\u2322","\\smallfrown");a(i,l,d,"\u224f","\\bumpeq");a(i,l,d,"\u224e","\\Bumpeq");a(i,l,d,"\u2267","\\geqq");a(i,l,d,"\u2a7e","\\geqslant");a(i,l,d,"\u2a96","\\eqslantgtr");a(i,l,d,"\u2273","\\gtrsim");a(i,l,d,"\u2a86","\\gtrapprox");a(i,l,u,"\u22d7","\\gtrdot");a(i,l,d,"\u22d9","\\ggg");a(i,l,d,"\u2277","\\gtrless");a(i,l,d,"\u22db","\\gtreqless");a(i,l,d,"\u2a8c","\\gtreqqless");a(i,l,d,"\u2256","\\eqcirc");a(i,l,d,"\u2257","\\circeq");a(i,l,d,"\u225c","\\triangleq");a(i,l,d,"\u223c","\\thicksim");a(i,l,d,"\u2248","\\thickapprox");a(i,l,d,"\u2ac6","\\supseteqq");a(i,l,d,"\u22d1","\\Supset");a(i,l,d,"\u2290","\\sqsupset");a(i,l,d,"\u227d","\\succcurlyeq");a(i,l,d,"\u22df","\\curlyeqsucc");a(i,l,d,"\u227f","\\succsim");a(i,l,d,"\u2ab8","\\succapprox");a(i,l,d,"\u22b3","\\vartriangleright");a(i,l,d,"\u22b5","\\trianglerighteq");a(i,l,d,"\u22a9","\\Vdash");a(i,l,d,"\u2223","\\shortmid");a(i,l,d,"\u2225","\\shortparallel");a(i,l,d,"\u226c","\\between");a(i,l,d,"\u22d4","\\pitchfork");a(i,l,d,"\u221d","\\varpropto");a(i,l,d,"\u25c0","\\blacktriangleleft");a(i,l,d,"\u2234","\\therefore");a(i,l,d,"\u220d","\\backepsilon");a(i,l,d,"\u25b6","\\blacktriangleright");a(i,l,d,"\u2235","\\because");a(i,l,d,"\u22d8","\\llless");a(i,l,d,"\u22d9","\\gggtr");a(i,l,u,"\u22b2","\\lhd");a(i,l,u,"\u22b3","\\rhd");a(i,l,d,"\u2242","\\eqsim");a(i,s,d,"\u22c8","\\Join");a(i,l,d,"\u2251","\\Doteq");a(i,l,u,"\u2214","\\dotplus");a(i,l,u,"\u2216","\\smallsetminus");a(i,l,u,"\u22d2","\\Cap");a(i,l,u,"\u22d3","\\Cup");a(i,l,u,"\u2a5e","\\doublebarwedge");a(i,l,u,"\u229f","\\boxminus");a(i,l,u,"\u229e","\\boxplus");a(i,l,u,"\u22c7","\\divideontimes");a(i,l,u,"\u22c9","\\ltimes");a(i,l,u,"\u22ca","\\rtimes");a(i,l,u,"\u22cb","\\leftthreetimes");a(i,l,u,"\u22cc","\\rightthreetimes");a(i,l,u,"\u22cf","\\curlywedge");a(i,l,u,"\u22ce","\\curlyvee");a(i,l,u,"\u229d","\\circleddash");a(i,l,u,"\u229b","\\circledast");a(i,l,u,"\u22c5","\\centerdot");a(i,l,u,"\u22ba","\\intercal");a(i,l,u,"\u22d2","\\doublecap");a(i,l,u,"\u22d3","\\doublecup");a(i,l,u,"\u22a0","\\boxtimes");a(i,l,d,"\u21e2","\\dashrightarrow");a(i,l,d,"\u21e0","\\dashleftarrow");a(i,l,d,"\u21c7","\\leftleftarrows");a(i,l,d,"\u21c6","\\leftrightarrows");a(i,l,d,"\u21da","\\Lleftarrow");a(i,l,d,"\u219e","\\twoheadleftarrow");a(i,l,d,"\u21a2","\\leftarrowtail");a(i,l,d,"\u21ab","\\looparrowleft");a(i,l,d,"\u21cb","\\leftrightharpoons");a(i,l,d,"\u21b6","\\curvearrowleft");a(i,l,d,"\u21ba","\\circlearrowleft");a(i,l,d,"\u21b0","\\Lsh");a(i,l,d,"\u21c8","\\upuparrows");a(i,l,d,"\u21bf","\\upharpoonleft");a(i,l,d,"\u21c3","\\downharpoonleft");a(i,l,d,"\u22b8","\\multimap");a(i,l,d,"\u21ad","\\leftrightsquigarrow");a(i,l,d,"\u21c9","\\rightrightarrows");a(i,l,d,"\u21c4","\\rightleftarrows");a(i,l,d,"\u21a0","\\twoheadrightarrow");a(i,l,d,"\u21a3","\\rightarrowtail");a(i,l,d,"\u21ac","\\looparrowright");a(i,l,d,"\u21b7","\\curvearrowright");a(i,l,d,"\u21bb","\\circlearrowright");a(i,l,d,"\u21b1","\\Rsh");a(i,l,d,"\u21ca","\\downdownarrows");a(i,l,d,"\u21be","\\upharpoonright");a(i,l,d,"\u21c2","\\downharpoonright");a(i,l,d,"\u21dd","\\rightsquigarrow");a(i,l,d,"\u21dd","\\leadsto");a(i,l,d,"\u21db","\\Rrightarrow");a(i,l,d,"\u21be","\\restriction");a(i,s,y,"\u2018","`");a(i,s,y,"$","\\$");a(n,s,y,"$","\\$");a(i,s,y,"%","\\%");a(n,s,y,"%","\\%");a(i,s,y,"_","\\_");a(n,s,y,"_","\\_");a(i,s,y,"\u2220","\\angle");a(i,s,y,"\u221e","\\infty");a(i,s,y,"\u2032","\\prime");a(i,s,y,"\u25b3","\\triangle");a(i,s,y,"\u0393","\\Gamma");a(i,s,y,"\u0394","\\Delta");a(i,s,y,"\u0398","\\Theta");a(i,s,y,"\u039b","\\Lambda");a(i,s,y,"\u039e","\\Xi");a(i,s,y,"\u03a0","\\Pi");a(i,s,y,"\u03a3","\\Sigma");a(i,s,y,"\u03a5","\\Upsilon");a(i,s,y,"\u03a6","\\Phi");a(i,s,y,"\u03a8","\\Psi");a(i,s,y,"\u03a9","\\Omega");a(i,s,y,"\xac","\\neg");a(i,s,y,"\xac","\\lnot");a(i,s,y,"\u22a4","\\top");a(i,s,y,"\u22a5","\\bot");a(i,s,y,"\u2205","\\emptyset");a(i,l,y,"\u2205","\\varnothing");a(i,s,c,"\u03b1","\\alpha");a(i,s,c,"\u03b2","\\beta");a(i,s,c,"\u03b3","\\gamma");a(i,s,c,"\u03b4","\\delta");a(i,s,c,"\u03f5","\\epsilon");a(i,s,c,"\u03b6","\\zeta");a(i,s,c,"\u03b7","\\eta");a(i,s,c,"\u03b8","\\theta");a(i,s,c,"\u03b9","\\iota");a(i,s,c,"\u03ba","\\kappa");a(i,s,c,"\u03bb","\\lambda");a(i,s,c,"\u03bc","\\mu");a(i,s,c,"\u03bd","\\nu");a(i,s,c,"\u03be","\\xi");a(i,s,c,"o","\\omicron");a(i,s,c,"\u03c0","\\pi");a(i,s,c,"\u03c1","\\rho");a(i,s,c,"\u03c3","\\sigma");a(i,s,c,"\u03c4","\\tau");a(i,s,c,"\u03c5","\\upsilon");a(i,s,c,"\u03d5","\\phi");a(i,s,c,"\u03c7","\\chi");a(i,s,c,"\u03c8","\\psi");a(i,s,c,"\u03c9","\\omega");a(i,s,c,"\u03b5","\\varepsilon");a(i,s,c,"\u03d1","\\vartheta");a(i,s,c,"\u03d6","\\varpi");a(i,s,c,"\u03f1","\\varrho");a(i,s,c,"\u03c2","\\varsigma");a(i,s,c,"\u03c6","\\varphi");a(i,s,u,"\u2217","*");a(i,s,u,"+","+");a(i,s,u,"\u2212","-");a(i,s,u,"\u22c5","\\cdot");a(i,s,u,"\u2218","\\circ");a(i,s,u,"\xf7","\\div");a(i,s,u,"\xb1","\\pm");a(i,s,u,"\xd7","\\times");a(i,s,u,"\u2229","\\cap");a(i,s,u,"\u222a","\\cup");a(i,s,u,"\u2216","\\setminus");a(i,s,u,"\u2227","\\land");a(i,s,u,"\u2228","\\lor");a(i,s,u,"\u2227","\\wedge");a(i,s,u,"\u2228","\\vee");a(i,s,y,"\u221a","\\surd");a(i,s,f,"(","(");a(i,s,f,"[","[");a(i,s,f,"\u27e8","\\langle");a(i,s,f,"\u2223","\\lvert");a(i,s,f,"\u2225","\\lVert");a(i,s,p,")",")");a(i,s,p,"]","]");a(i,s,p,"?","?");a(i,s,p,"!","!");a(i,s,p,"\u27e9","\\rangle");a(i,s,p,"\u2223","\\rvert");a(i,s,p,"\u2225","\\rVert");a(i,s,d,"=","=");a(i,s,d,"<","<");a(i,s,d,">",">");a(i,s,d,":",":");a(i,s,d,"\u2248","\\approx");a(i,s,d,"\u2245","\\cong");a(i,s,d,"\u2265","\\ge");a(i,s,d,"\u2265","\\geq");a(i,s,d,"\u2190","\\gets");a(i,s,d,">","\\gt");a(i,s,d,"\u2208","\\in");a(i,s,d,"\u2209","\\notin");a(i,s,d,"\u2282","\\subset");a(i,s,d,"\u2283","\\supset");a(i,s,d,"\u2286","\\subseteq");a(i,s,d,"\u2287","\\supseteq");a(i,l,d,"\u2288","\\nsubseteq");a(i,l,d,"\u2289","\\nsupseteq");a(i,s,d,"\u22a8","\\models");a(i,s,d,"\u2190","\\leftarrow");a(i,s,d,"\u2264","\\le");a(i,s,d,"\u2264","\\leq");a(i,s,d,"<","\\lt");a(i,s,d,"\u2260","\\ne");a(i,s,d,"\u2260","\\neq");a(i,s,d,"\u2192","\\rightarrow");a(i,s,d,"\u2192","\\to");a(i,l,d,"\u2271","\\ngeq");a(i,l,d,"\u2270","\\nleq");a(i,s,g,null,"\\!");a(i,s,g,"\xa0","\\ ");a(i,s,g,"\xa0","~");a(i,s,g,null,"\\,");a(i,s,g,null,"\\:");a(i,s,g,null,"\\;");a(i,s,g,null,"\\enspace");a(i,s,g,null,"\\qquad");a(i,s,g,null,"\\quad");a(i,s,g,"\xa0","\\space");a(i,s,v,",",",");a(i,s,v,";",";");a(i,s,v,":","\\colon");a(i,l,u,"\u22bc","\\barwedge");a(i,l,u,"\u22bb","\\veebar");a(i,s,u,"\u2299","\\odot");a(i,s,u,"\u2295","\\oplus");a(i,s,u,"\u2297","\\otimes");a(i,s,y,"\u2202","\\partial");a(i,s,u,"\u2298","\\oslash");a(i,l,u,"\u229a","\\circledcirc");a(i,l,u,"\u22a1","\\boxdot");a(i,s,u,"\u25b3","\\bigtriangleup");a(i,s,u,"\u25bd","\\bigtriangledown");a(i,s,u,"\u2020","\\dagger");a(i,s,u,"\u22c4","\\diamond");a(i,s,u,"\u22c6","\\star");a(i,s,u,"\u25c3","\\triangleleft");a(i,s,u,"\u25b9","\\triangleright");a(i,s,f,"{","\\{");a(n,s,y,"{","\\{");a(i,s,p,"}","\\}");a(n,s,y,"}","\\}");a(i,s,f,"{","\\lbrace");a(i,s,p,"}","\\rbrace");a(i,s,f,"[","\\lbrack");a(i,s,p,"]","\\rbrack");a(i,s,f,"\u230a","\\lfloor");a(i,s,p,"\u230b","\\rfloor");a(i,s,f,"\u2308","\\lceil");a(i,s,p,"\u2309","\\rceil");a(i,s,y,"\\","\\backslash");a(i,s,y,"\u2223","|");a(i,s,y,"\u2223","\\vert");a(i,s,y,"\u2225","\\|");a(i,s,y,"\u2225","\\Vert");a(i,s,d,"\u2191","\\uparrow");a(i,s,d,"\u21d1","\\Uparrow");a(i,s,d,"\u2193","\\downarrow");a(i,s,d,"\u21d3","\\Downarrow");a(i,s,d,"\u2195","\\updownarrow");a(i,s,d,"\u21d5","\\Updownarrow");a(i,i,m,"\u2210","\\coprod");a(i,i,m,"\u22c1","\\bigvee");a(i,i,m,"\u22c0","\\bigwedge");a(i,i,m,"\u2a04","\\biguplus");a(i,i,m,"\u22c2","\\bigcap");a(i,i,m,"\u22c3","\\bigcup");a(i,i,m,"\u222b","\\int");a(i,i,m,"\u222b","\\intop");a(i,i,m,"\u222c","\\iint");a(i,i,m,"\u222d","\\iiint");a(i,i,m,"\u220f","\\prod");a(i,i,m,"\u2211","\\sum");a(i,i,m,"\u2a02","\\bigotimes");a(i,i,m,"\u2a01","\\bigoplus");a(i,i,m,"\u2a00","\\bigodot");a(i,i,m,"\u222e","\\oint");a(i,i,m,"\u2a06","\\bigsqcup");a(i,i,m,"\u222b","\\smallint");a(n,s,h,"\u2026","\\textellipsis");a(i,s,h,"\u2026","\\mathellipsis");a(n,s,h,"\u2026","\\ldots");a(i,s,h,"\u2026","\\ldots");a(i,s,h,"\u22ef","\\cdots");a(i,s,h,"\u22f1","\\ddots");a(i,s,y,"\u22ee","\\vdots");a(i,s,o,"\xb4","\\acute");a(i,s,o,"`","\\grave");a(i,s,o,"\xa8","\\ddot");a(i,s,o,"~","\\tilde");a(i,s,o,"\xaf","\\bar");a(i,s,o,"\u02d8","\\breve");a(i,s,o,"\u02c7","\\check");a(i,s,o,"^","\\hat");a(i,s,o,"\u20d7","\\vec");a(i,s,o,"\u02d9","\\dot");a(i,s,c,"\u0131","\\imath");a(i,s,c,"\u0237","\\jmath");a(n,s,y,"\u2013","--");a(n,s,y,"\u2014","---");a(n,s,y,"\u2018","`");a(n,s,y,"\u2019","'");a(n,s,y,"\u201c","``");a(n,s,y,"\u201d","''");a(i,s,y,"\xb0","\\degree");a(n,s,y,"\xb0","\\degree");a(i,s,c,"\xa3","\\pounds");a(i,l,y,"\u2720","\\maltese");a(n,l,y,"\u2720","\\maltese");a(n,s,g,"\xa0","\\ ");a(n,s,g,"\xa0"," ");a(n,s,g,"\xa0","~");var x;var b;var w='0123456789/@."';for(x=0;x":">","<":"<",'"':""","'":"'"};var p=/[&><"']/g;function h(e){return u[e]}function c(e){return(""+e).replace(p,h)}var m;if(typeof document!=="undefined"){var f=document.createElement("span");if("textContent"in f){m=function(e,t){e.textContent=t}}else{m=function(e,t){e.innerText=t}}}function v(e){m(e,"")}t.exports={contains:n,deflt:s,escape:c,hyphenate:o,indexOf:i,setTextContent:m,clearNode:v}},{}]},{},[1])(1)}); diff --git a/Wino.Mail/JS/Quill/monokai-sublime.min.css b/Wino.Mail/JS/Quill/monokai-sublime.min.css new file mode 100644 index 00000000..589eff91 --- /dev/null +++ b/Wino.Mail/JS/Quill/monokai-sublime.min.css @@ -0,0 +1 @@ +.hljs{display:block;overflow-x:auto;padding:0.5em;background:#23241f}.hljs,.hljs-tag,.hljs-subst{color:#f8f8f2}.hljs-strong,.hljs-emphasis{color:#a8a8a2}.hljs-bullet,.hljs-quote,.hljs-number,.hljs-regexp,.hljs-literal,.hljs-link{color:#ae81ff}.hljs-code,.hljs-title,.hljs-section,.hljs-selector-class{color:#a6e22e}.hljs-strong{font-weight:bold}.hljs-emphasis{font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-name,.hljs-attr{color:#f92672}.hljs-symbol,.hljs-attribute{color:#66d9ef}.hljs-params,.hljs-class .hljs-title{color:#f8f8f2}.hljs-string,.hljs-type,.hljs-built_in,.hljs-builtin-name,.hljs-selector-id,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-addition,.hljs-variable,.hljs-template-variable{color:#e6db74}.hljs-comment,.hljs-deletion,.hljs-meta{color:#75715e} \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/quill.core.css b/Wino.Mail/JS/Quill/quill.core.css new file mode 100644 index 00000000..4217e4e5 --- /dev/null +++ b/Wino.Mail/JS/Quill/quill.core.css @@ -0,0 +1,397 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} diff --git a/Wino.Mail/JS/Quill/quill.core.js b/Wino.Mail/JS/Quill/quill.core.js new file mode 100644 index 00000000..a51d15c8 --- /dev/null +++ b/Wino.Mail/JS/Quill/quill.core.js @@ -0,0 +1,8522 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Quill"] = factory(); + else + root["Quill"] = factory(); +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 110); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var container_1 = __webpack_require__(17); +var format_1 = __webpack_require__(18); +var leaf_1 = __webpack_require__(19); +var scroll_1 = __webpack_require__(45); +var inline_1 = __webpack_require__(46); +var block_1 = __webpack_require__(47); +var embed_1 = __webpack_require__(48); +var text_1 = __webpack_require__(49); +var attributor_1 = __webpack_require__(12); +var class_1 = __webpack_require__(32); +var style_1 = __webpack_require__(33); +var store_1 = __webpack_require__(31); +var Registry = __webpack_require__(1); +var Parchment = { + Scope: Registry.Scope, + create: Registry.create, + find: Registry.find, + query: Registry.query, + register: Registry.register, + Container: container_1.default, + Format: format_1.default, + Leaf: leaf_1.default, + Embed: embed_1.default, + Scroll: scroll_1.default, + Block: block_1.default, + Inline: inline_1.default, + Text: text_1.default, + Attributor: { + Attribute: attributor_1.default, + Class: class_1.default, + Style: style_1.default, + Store: store_1.default, + }, +}; +exports.default = Parchment; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var ParchmentError = /** @class */ (function (_super) { + __extends(ParchmentError, _super); + function ParchmentError(message) { + var _this = this; + message = '[Parchment] ' + message; + _this = _super.call(this, message) || this; + _this.message = message; + _this.name = _this.constructor.name; + return _this; + } + return ParchmentError; +}(Error)); +exports.ParchmentError = ParchmentError; +var attributes = {}; +var classes = {}; +var tags = {}; +var types = {}; +exports.DATA_KEY = '__blot'; +var Scope; +(function (Scope) { + Scope[Scope["TYPE"] = 3] = "TYPE"; + Scope[Scope["LEVEL"] = 12] = "LEVEL"; + Scope[Scope["ATTRIBUTE"] = 13] = "ATTRIBUTE"; + Scope[Scope["BLOT"] = 14] = "BLOT"; + Scope[Scope["INLINE"] = 7] = "INLINE"; + Scope[Scope["BLOCK"] = 11] = "BLOCK"; + Scope[Scope["BLOCK_BLOT"] = 10] = "BLOCK_BLOT"; + Scope[Scope["INLINE_BLOT"] = 6] = "INLINE_BLOT"; + Scope[Scope["BLOCK_ATTRIBUTE"] = 9] = "BLOCK_ATTRIBUTE"; + Scope[Scope["INLINE_ATTRIBUTE"] = 5] = "INLINE_ATTRIBUTE"; + Scope[Scope["ANY"] = 15] = "ANY"; +})(Scope = exports.Scope || (exports.Scope = {})); +function create(input, value) { + var match = query(input); + if (match == null) { + throw new ParchmentError("Unable to create " + input + " blot"); + } + var BlotClass = match; + var node = + // @ts-ignore + input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value); + return new BlotClass(node, value); +} +exports.create = create; +function find(node, bubble) { + if (bubble === void 0) { bubble = false; } + if (node == null) + return null; + // @ts-ignore + if (node[exports.DATA_KEY] != null) + return node[exports.DATA_KEY].blot; + if (bubble) + return find(node.parentNode, bubble); + return null; +} +exports.find = find; +function query(query, scope) { + if (scope === void 0) { scope = Scope.ANY; } + var match; + if (typeof query === 'string') { + match = types[query] || attributes[query]; + // @ts-ignore + } + else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) { + match = types['text']; + } + else if (typeof query === 'number') { + if (query & Scope.LEVEL & Scope.BLOCK) { + match = types['block']; + } + else if (query & Scope.LEVEL & Scope.INLINE) { + match = types['inline']; + } + } + else if (query instanceof HTMLElement) { + var names = (query.getAttribute('class') || '').split(/\s+/); + for (var i in names) { + match = classes[names[i]]; + if (match) + break; + } + match = match || tags[query.tagName]; + } + if (match == null) + return null; + // @ts-ignore + if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope) + return match; + return null; +} +exports.query = query; +function register() { + var Definitions = []; + for (var _i = 0; _i < arguments.length; _i++) { + Definitions[_i] = arguments[_i]; + } + if (Definitions.length > 1) { + return Definitions.map(function (d) { + return register(d); + }); + } + var Definition = Definitions[0]; + if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') { + throw new ParchmentError('Invalid definition'); + } + else if (Definition.blotName === 'abstract') { + throw new ParchmentError('Cannot register abstract class'); + } + types[Definition.blotName || Definition.attrName] = Definition; + if (typeof Definition.keyName === 'string') { + attributes[Definition.keyName] = Definition; + } + else { + if (Definition.className != null) { + classes[Definition.className] = Definition; + } + if (Definition.tagName != null) { + if (Array.isArray(Definition.tagName)) { + Definition.tagName = Definition.tagName.map(function (tagName) { + return tagName.toUpperCase(); + }); + } + else { + Definition.tagName = Definition.tagName.toUpperCase(); + } + var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName]; + tagNames.forEach(function (tag) { + if (tags[tag] == null || Definition.className == null) { + tags[tag] = Definition; + } + }); + } + } + return Definition; +} +exports.register = register; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +var diff = __webpack_require__(51); +var equal = __webpack_require__(11); +var extend = __webpack_require__(3); +var op = __webpack_require__(20); + + +var NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff() + + +var Delta = function (ops) { + // Assume we are given a well formed ops + if (Array.isArray(ops)) { + this.ops = ops; + } else if (ops != null && Array.isArray(ops.ops)) { + this.ops = ops.ops; + } else { + this.ops = []; + } +}; + + +Delta.prototype.insert = function (text, attributes) { + var newOp = {}; + if (text.length === 0) return this; + newOp.insert = text; + if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) { + newOp.attributes = attributes; + } + return this.push(newOp); +}; + +Delta.prototype['delete'] = function (length) { + if (length <= 0) return this; + return this.push({ 'delete': length }); +}; + +Delta.prototype.retain = function (length, attributes) { + if (length <= 0) return this; + var newOp = { retain: length }; + if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) { + newOp.attributes = attributes; + } + return this.push(newOp); +}; + +Delta.prototype.push = function (newOp) { + var index = this.ops.length; + var lastOp = this.ops[index - 1]; + newOp = extend(true, {}, newOp); + if (typeof lastOp === 'object') { + if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') { + this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] }; + return this; + } + // Since it does not matter if we insert before or after deleting at the same index, + // always prefer to insert first + if (typeof lastOp['delete'] === 'number' && newOp.insert != null) { + index -= 1; + lastOp = this.ops[index - 1]; + if (typeof lastOp !== 'object') { + this.ops.unshift(newOp); + return this; + } + } + if (equal(newOp.attributes, lastOp.attributes)) { + if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') { + this.ops[index - 1] = { insert: lastOp.insert + newOp.insert }; + if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes + return this; + } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') { + this.ops[index - 1] = { retain: lastOp.retain + newOp.retain }; + if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes + return this; + } + } + } + if (index === this.ops.length) { + this.ops.push(newOp); + } else { + this.ops.splice(index, 0, newOp); + } + return this; +}; + +Delta.prototype.chop = function () { + var lastOp = this.ops[this.ops.length - 1]; + if (lastOp && lastOp.retain && !lastOp.attributes) { + this.ops.pop(); + } + return this; +}; + +Delta.prototype.filter = function (predicate) { + return this.ops.filter(predicate); +}; + +Delta.prototype.forEach = function (predicate) { + this.ops.forEach(predicate); +}; + +Delta.prototype.map = function (predicate) { + return this.ops.map(predicate); +}; + +Delta.prototype.partition = function (predicate) { + var passed = [], failed = []; + this.forEach(function(op) { + var target = predicate(op) ? passed : failed; + target.push(op); + }); + return [passed, failed]; +}; + +Delta.prototype.reduce = function (predicate, initial) { + return this.ops.reduce(predicate, initial); +}; + +Delta.prototype.changeLength = function () { + return this.reduce(function (length, elem) { + if (elem.insert) { + return length + op.length(elem); + } else if (elem.delete) { + return length - elem.delete; + } + return length; + }, 0); +}; + +Delta.prototype.length = function () { + return this.reduce(function (length, elem) { + return length + op.length(elem); + }, 0); +}; + +Delta.prototype.slice = function (start, end) { + start = start || 0; + if (typeof end !== 'number') end = Infinity; + var ops = []; + var iter = op.iterator(this.ops); + var index = 0; + while (index < end && iter.hasNext()) { + var nextOp; + if (index < start) { + nextOp = iter.next(start - index); + } else { + nextOp = iter.next(end - index); + ops.push(nextOp); + } + index += op.length(nextOp); + } + return new Delta(ops); +}; + + +Delta.prototype.compose = function (other) { + var thisIter = op.iterator(this.ops); + var otherIter = op.iterator(other.ops); + var delta = new Delta(); + while (thisIter.hasNext() || otherIter.hasNext()) { + if (otherIter.peekType() === 'insert') { + delta.push(otherIter.next()); + } else if (thisIter.peekType() === 'delete') { + delta.push(thisIter.next()); + } else { + var length = Math.min(thisIter.peekLength(), otherIter.peekLength()); + var thisOp = thisIter.next(length); + var otherOp = otherIter.next(length); + if (typeof otherOp.retain === 'number') { + var newOp = {}; + if (typeof thisOp.retain === 'number') { + newOp.retain = length; + } else { + newOp.insert = thisOp.insert; + } + // Preserve null when composing with a retain, otherwise remove it for inserts + var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number'); + if (attributes) newOp.attributes = attributes; + delta.push(newOp); + // Other op should be delete, we could be an insert or retain + // Insert + delete cancels out + } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') { + delta.push(otherOp); + } + } + } + return delta.chop(); +}; + +Delta.prototype.concat = function (other) { + var delta = new Delta(this.ops.slice()); + if (other.ops.length > 0) { + delta.push(other.ops[0]); + delta.ops = delta.ops.concat(other.ops.slice(1)); + } + return delta; +}; + +Delta.prototype.diff = function (other, index) { + if (this.ops === other.ops) { + return new Delta(); + } + var strings = [this, other].map(function (delta) { + return delta.map(function (op) { + if (op.insert != null) { + return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER; + } + var prep = (delta === other) ? 'on' : 'with'; + throw new Error('diff() called ' + prep + ' non-document'); + }).join(''); + }); + var delta = new Delta(); + var diffResult = diff(strings[0], strings[1], index); + var thisIter = op.iterator(this.ops); + var otherIter = op.iterator(other.ops); + diffResult.forEach(function (component) { + var length = component[1].length; + while (length > 0) { + var opLength = 0; + switch (component[0]) { + case diff.INSERT: + opLength = Math.min(otherIter.peekLength(), length); + delta.push(otherIter.next(opLength)); + break; + case diff.DELETE: + opLength = Math.min(length, thisIter.peekLength()); + thisIter.next(opLength); + delta['delete'](opLength); + break; + case diff.EQUAL: + opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length); + var thisOp = thisIter.next(opLength); + var otherOp = otherIter.next(opLength); + if (equal(thisOp.insert, otherOp.insert)) { + delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes)); + } else { + delta.push(otherOp)['delete'](opLength); + } + break; + } + length -= opLength; + } + }); + return delta.chop(); +}; + +Delta.prototype.eachLine = function (predicate, newline) { + newline = newline || '\n'; + var iter = op.iterator(this.ops); + var line = new Delta(); + var i = 0; + while (iter.hasNext()) { + if (iter.peekType() !== 'insert') return; + var thisOp = iter.peek(); + var start = op.length(thisOp) - iter.peekLength(); + var index = typeof thisOp.insert === 'string' ? + thisOp.insert.indexOf(newline, start) - start : -1; + if (index < 0) { + line.push(iter.next()); + } else if (index > 0) { + line.push(iter.next(index)); + } else { + if (predicate(line, iter.next(1).attributes || {}, i) === false) { + return; + } + i += 1; + line = new Delta(); + } + } + if (line.length() > 0) { + predicate(line, {}, i); + } +}; + +Delta.prototype.transform = function (other, priority) { + priority = !!priority; + if (typeof other === 'number') { + return this.transformPosition(other, priority); + } + var thisIter = op.iterator(this.ops); + var otherIter = op.iterator(other.ops); + var delta = new Delta(); + while (thisIter.hasNext() || otherIter.hasNext()) { + if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) { + delta.retain(op.length(thisIter.next())); + } else if (otherIter.peekType() === 'insert') { + delta.push(otherIter.next()); + } else { + var length = Math.min(thisIter.peekLength(), otherIter.peekLength()); + var thisOp = thisIter.next(length); + var otherOp = otherIter.next(length); + if (thisOp['delete']) { + // Our delete either makes their delete redundant or removes their retain + continue; + } else if (otherOp['delete']) { + delta.push(otherOp); + } else { + // We retain either their retain or insert + delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority)); + } + } + } + return delta.chop(); +}; + +Delta.prototype.transformPosition = function (index, priority) { + priority = !!priority; + var thisIter = op.iterator(this.ops); + var offset = 0; + while (thisIter.hasNext() && offset <= index) { + var length = thisIter.peekLength(); + var nextType = thisIter.peekType(); + thisIter.next(); + if (nextType === 'delete') { + index -= Math.min(length, index - offset); + continue; + } else if (nextType === 'insert' && (offset < index || !priority)) { + index += length; + } + offset += length; + } + return index; +}; + + +module.exports = Delta; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +'use strict'; + +var hasOwn = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; + +var isArray = function isArray(arr) { + if (typeof Array.isArray === 'function') { + return Array.isArray(arr); + } + + return toStr.call(arr) === '[object Array]'; +}; + +var isPlainObject = function isPlainObject(obj) { + if (!obj || toStr.call(obj) !== '[object Object]') { + return false; + } + + var hasOwnConstructor = hasOwn.call(obj, 'constructor'); + var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); + // Not own constructor property must be Object + if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + var key; + for (key in obj) { /**/ } + + return typeof key === 'undefined' || hasOwn.call(obj, key); +}; + +module.exports = function extend() { + var options, name, src, copy, copyIsArray, clone; + var target = arguments[0]; + var i = 1; + var length = arguments.length; + var deep = false; + + // Handle a deep copy situation + if (typeof target === 'boolean') { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { + target = {}; + } + + for (; i < length; ++i) { + options = arguments[i]; + // Only deal with non-null/undefined values + if (options != null) { + // Extend the base object + for (name in options) { + src = target[name]; + copy = options[name]; + + // Prevent never-ending loop + if (target !== copy) { + // Recurse if we're merging plain objects or arrays + if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false; + clone = src && isArray(src) ? src : []; + } else { + clone = src && isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[name] = extend(deep, clone, copy); + + // Don't bring in undefined values + } else if (typeof copy !== 'undefined') { + target[name] = copy; + } + } + } + } + } + + // Return the modified object + return target; +}; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.BlockEmbed = exports.bubbleFormats = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var NEWLINE_LENGTH = 1; + +var BlockEmbed = function (_Parchment$Embed) { + _inherits(BlockEmbed, _Parchment$Embed); + + function BlockEmbed() { + _classCallCheck(this, BlockEmbed); + + return _possibleConstructorReturn(this, (BlockEmbed.__proto__ || Object.getPrototypeOf(BlockEmbed)).apply(this, arguments)); + } + + _createClass(BlockEmbed, [{ + key: 'attach', + value: function attach() { + _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'attach', this).call(this); + this.attributes = new _parchment2.default.Attributor.Store(this.domNode); + } + }, { + key: 'delta', + value: function delta() { + return new _quillDelta2.default().insert(this.value(), (0, _extend2.default)(this.formats(), this.attributes.values())); + } + }, { + key: 'format', + value: function format(name, value) { + var attribute = _parchment2.default.query(name, _parchment2.default.Scope.BLOCK_ATTRIBUTE); + if (attribute != null) { + this.attributes.attribute(attribute, value); + } + } + }, { + key: 'formatAt', + value: function formatAt(index, length, name, value) { + this.format(name, value); + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (typeof value === 'string' && value.endsWith('\n')) { + var block = _parchment2.default.create(Block.blotName); + this.parent.insertBefore(block, index === 0 ? this : this.next); + block.insertAt(0, value.slice(0, -1)); + } else { + _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'insertAt', this).call(this, index, value, def); + } + } + }]); + + return BlockEmbed; +}(_parchment2.default.Embed); + +BlockEmbed.scope = _parchment2.default.Scope.BLOCK_BLOT; +// It is important for cursor behavior BlockEmbeds use tags that are block level elements + + +var Block = function (_Parchment$Block) { + _inherits(Block, _Parchment$Block); + + function Block(domNode) { + _classCallCheck(this, Block); + + var _this2 = _possibleConstructorReturn(this, (Block.__proto__ || Object.getPrototypeOf(Block)).call(this, domNode)); + + _this2.cache = {}; + return _this2; + } + + _createClass(Block, [{ + key: 'delta', + value: function delta() { + if (this.cache.delta == null) { + this.cache.delta = this.descendants(_parchment2.default.Leaf).reduce(function (delta, leaf) { + if (leaf.length() === 0) { + return delta; + } else { + return delta.insert(leaf.value(), bubbleFormats(leaf)); + } + }, new _quillDelta2.default()).insert('\n', bubbleFormats(this)); + } + return this.cache.delta; + } + }, { + key: 'deleteAt', + value: function deleteAt(index, length) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'deleteAt', this).call(this, index, length); + this.cache = {}; + } + }, { + key: 'formatAt', + value: function formatAt(index, length, name, value) { + if (length <= 0) return; + if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) { + if (index + length === this.length()) { + this.format(name, value); + } + } else { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'formatAt', this).call(this, index, Math.min(length, this.length() - index - 1), name, value); + } + this.cache = {}; + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (def != null) return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, index, value, def); + if (value.length === 0) return; + var lines = value.split('\n'); + var text = lines.shift(); + if (text.length > 0) { + if (index < this.length() - 1 || this.children.tail == null) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, Math.min(index, this.length() - 1), text); + } else { + this.children.tail.insertAt(this.children.tail.length(), text); + } + this.cache = {}; + } + var block = this; + lines.reduce(function (index, line) { + block = block.split(index, true); + block.insertAt(0, line); + return line.length; + }, index + text.length); + } + }, { + key: 'insertBefore', + value: function insertBefore(blot, ref) { + var head = this.children.head; + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertBefore', this).call(this, blot, ref); + if (head instanceof _break2.default) { + head.remove(); + } + this.cache = {}; + } + }, { + key: 'length', + value: function length() { + if (this.cache.length == null) { + this.cache.length = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'length', this).call(this) + NEWLINE_LENGTH; + } + return this.cache.length; + } + }, { + key: 'moveChildren', + value: function moveChildren(target, ref) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'moveChildren', this).call(this, target, ref); + this.cache = {}; + } + }, { + key: 'optimize', + value: function optimize(context) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'optimize', this).call(this, context); + this.cache = {}; + } + }, { + key: 'path', + value: function path(index) { + return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'path', this).call(this, index, true); + } + }, { + key: 'removeChild', + value: function removeChild(child) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'removeChild', this).call(this, child); + this.cache = {}; + } + }, { + key: 'split', + value: function split(index) { + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) { + var clone = this.clone(); + if (index === 0) { + this.parent.insertBefore(clone, this); + return this; + } else { + this.parent.insertBefore(clone, this.next); + return clone; + } + } else { + var next = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'split', this).call(this, index, force); + this.cache = {}; + return next; + } + } + }]); + + return Block; +}(_parchment2.default.Block); + +Block.blotName = 'block'; +Block.tagName = 'P'; +Block.defaultChild = 'break'; +Block.allowedChildren = [_inline2.default, _parchment2.default.Embed, _text2.default]; + +function bubbleFormats(blot) { + var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (blot == null) return formats; + if (typeof blot.formats === 'function') { + formats = (0, _extend2.default)(formats, blot.formats()); + } + if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) { + return formats; + } + return bubbleFormats(blot.parent, formats); +} + +exports.bubbleFormats = bubbleFormats; +exports.BlockEmbed = BlockEmbed; +exports.default = Block; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.overload = exports.expandConfig = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +__webpack_require__(50); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _editor = __webpack_require__(14); + +var _editor2 = _interopRequireDefault(_editor); + +var _emitter3 = __webpack_require__(8); + +var _emitter4 = _interopRequireDefault(_emitter3); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _selection = __webpack_require__(15); + +var _selection2 = _interopRequireDefault(_selection); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _theme = __webpack_require__(34); + +var _theme2 = _interopRequireDefault(_theme); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var debug = (0, _logger2.default)('quill'); + +var Quill = function () { + _createClass(Quill, null, [{ + key: 'debug', + value: function debug(limit) { + if (limit === true) { + limit = 'log'; + } + _logger2.default.level(limit); + } + }, { + key: 'find', + value: function find(node) { + return node.__quill || _parchment2.default.find(node); + } + }, { + key: 'import', + value: function _import(name) { + if (this.imports[name] == null) { + debug.error('Cannot import ' + name + '. Are you sure it was registered?'); + } + return this.imports[name]; + } + }, { + key: 'register', + value: function register(path, target) { + var _this = this; + + var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (typeof path !== 'string') { + var name = path.attrName || path.blotName; + if (typeof name === 'string') { + // register(Blot | Attributor, overwrite) + this.register('formats/' + name, path, target); + } else { + Object.keys(path).forEach(function (key) { + _this.register(key, path[key], target); + }); + } + } else { + if (this.imports[path] != null && !overwrite) { + debug.warn('Overwriting ' + path + ' with', target); + } + this.imports[path] = target; + if ((path.startsWith('blots/') || path.startsWith('formats/')) && target.blotName !== 'abstract') { + _parchment2.default.register(target); + } else if (path.startsWith('modules') && typeof target.register === 'function') { + target.register(); + } + } + } + }]); + + function Quill(container) { + var _this2 = this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Quill); + + this.options = expandConfig(container, options); + this.container = this.options.container; + if (this.container == null) { + return debug.error('Invalid Quill container', container); + } + if (this.options.debug) { + Quill.debug(this.options.debug); + } + var html = this.container.innerHTML.trim(); + this.container.classList.add('ql-container'); + this.container.innerHTML = ''; + this.container.__quill = this; + this.root = this.addContainer('ql-editor'); + this.root.classList.add('ql-blank'); + this.root.setAttribute('data-gramm', false); + this.scrollingContainer = this.options.scrollingContainer || this.root; + this.emitter = new _emitter4.default(); + this.scroll = _parchment2.default.create(this.root, { + emitter: this.emitter, + whitelist: this.options.formats + }); + this.editor = new _editor2.default(this.scroll); + this.selection = new _selection2.default(this.scroll, this.emitter); + this.theme = new this.options.theme(this, this.options); + this.keyboard = this.theme.addModule('keyboard'); + this.clipboard = this.theme.addModule('clipboard'); + this.history = this.theme.addModule('history'); + this.theme.init(); + this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type) { + if (type === _emitter4.default.events.TEXT_CHANGE) { + _this2.root.classList.toggle('ql-blank', _this2.editor.isBlank()); + } + }); + this.emitter.on(_emitter4.default.events.SCROLL_UPDATE, function (source, mutations) { + var range = _this2.selection.lastRange; + var index = range && range.length === 0 ? range.index : undefined; + modify.call(_this2, function () { + return _this2.editor.update(null, mutations, index); + }, source); + }); + var contents = this.clipboard.convert('
' + html + '


'); + this.setContents(contents); + this.history.clear(); + if (this.options.placeholder) { + this.root.setAttribute('data-placeholder', this.options.placeholder); + } + if (this.options.readOnly) { + this.disable(); + } + } + + _createClass(Quill, [{ + key: 'addContainer', + value: function addContainer(container) { + var refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + if (typeof container === 'string') { + var className = container; + container = document.createElement('div'); + container.classList.add(className); + } + this.container.insertBefore(container, refNode); + return container; + } + }, { + key: 'blur', + value: function blur() { + this.selection.setRange(null); + } + }, { + key: 'deleteText', + value: function deleteText(index, length, source) { + var _this3 = this; + + var _overload = overload(index, length, source); + + var _overload2 = _slicedToArray(_overload, 4); + + index = _overload2[0]; + length = _overload2[1]; + source = _overload2[3]; + + return modify.call(this, function () { + return _this3.editor.deleteText(index, length); + }, source, index, -1 * length); + } + }, { + key: 'disable', + value: function disable() { + this.enable(false); + } + }, { + key: 'enable', + value: function enable() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.scroll.enable(enabled); + this.container.classList.toggle('ql-disabled', !enabled); + } + }, { + key: 'focus', + value: function focus() { + var scrollTop = this.scrollingContainer.scrollTop; + this.selection.focus(); + this.scrollingContainer.scrollTop = scrollTop; + this.scrollIntoView(); + } + }, { + key: 'format', + value: function format(name, value) { + var _this4 = this; + + var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API; + + return modify.call(this, function () { + var range = _this4.getSelection(true); + var change = new _quillDelta2.default(); + if (range == null) { + return change; + } else if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) { + change = _this4.editor.formatLine(range.index, range.length, _defineProperty({}, name, value)); + } else if (range.length === 0) { + _this4.selection.format(name, value); + return change; + } else { + change = _this4.editor.formatText(range.index, range.length, _defineProperty({}, name, value)); + } + _this4.setSelection(range, _emitter4.default.sources.SILENT); + return change; + }, source); + } + }, { + key: 'formatLine', + value: function formatLine(index, length, name, value, source) { + var _this5 = this; + + var formats = void 0; + + var _overload3 = overload(index, length, name, value, source); + + var _overload4 = _slicedToArray(_overload3, 4); + + index = _overload4[0]; + length = _overload4[1]; + formats = _overload4[2]; + source = _overload4[3]; + + return modify.call(this, function () { + return _this5.editor.formatLine(index, length, formats); + }, source, index, 0); + } + }, { + key: 'formatText', + value: function formatText(index, length, name, value, source) { + var _this6 = this; + + var formats = void 0; + + var _overload5 = overload(index, length, name, value, source); + + var _overload6 = _slicedToArray(_overload5, 4); + + index = _overload6[0]; + length = _overload6[1]; + formats = _overload6[2]; + source = _overload6[3]; + + return modify.call(this, function () { + return _this6.editor.formatText(index, length, formats); + }, source, index, 0); + } + }, { + key: 'getBounds', + value: function getBounds(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var bounds = void 0; + if (typeof index === 'number') { + bounds = this.selection.getBounds(index, length); + } else { + bounds = this.selection.getBounds(index.index, index.length); + } + var containerBounds = this.container.getBoundingClientRect(); + return { + bottom: bounds.bottom - containerBounds.top, + height: bounds.height, + left: bounds.left - containerBounds.left, + right: bounds.right - containerBounds.left, + top: bounds.top - containerBounds.top, + width: bounds.width + }; + } + }, { + key: 'getContents', + value: function getContents() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; + + var _overload7 = overload(index, length); + + var _overload8 = _slicedToArray(_overload7, 2); + + index = _overload8[0]; + length = _overload8[1]; + + return this.editor.getContents(index, length); + } + }, { + key: 'getFormat', + value: function getFormat() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection(true); + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + if (typeof index === 'number') { + return this.editor.getFormat(index, length); + } else { + return this.editor.getFormat(index.index, index.length); + } + } + }, { + key: 'getIndex', + value: function getIndex(blot) { + return blot.offset(this.scroll); + } + }, { + key: 'getLength', + value: function getLength() { + return this.scroll.length(); + } + }, { + key: 'getLeaf', + value: function getLeaf(index) { + return this.scroll.leaf(index); + } + }, { + key: 'getLine', + value: function getLine(index) { + return this.scroll.line(index); + } + }, { + key: 'getLines', + value: function getLines() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; + + if (typeof index !== 'number') { + return this.scroll.lines(index.index, index.length); + } else { + return this.scroll.lines(index, length); + } + } + }, { + key: 'getModule', + value: function getModule(name) { + return this.theme.modules[name]; + } + }, { + key: 'getSelection', + value: function getSelection() { + var focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (focus) this.focus(); + this.update(); // Make sure we access getRange with editor in consistent state + return this.selection.getRange()[0]; + } + }, { + key: 'getText', + value: function getText() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; + + var _overload9 = overload(index, length); + + var _overload10 = _slicedToArray(_overload9, 2); + + index = _overload10[0]; + length = _overload10[1]; + + return this.editor.getText(index, length); + } + }, { + key: 'hasFocus', + value: function hasFocus() { + return this.selection.hasFocus(); + } + }, { + key: 'insertEmbed', + value: function insertEmbed(index, embed, value) { + var _this7 = this; + + var source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API; + + return modify.call(this, function () { + return _this7.editor.insertEmbed(index, embed, value); + }, source, index); + } + }, { + key: 'insertText', + value: function insertText(index, text, name, value, source) { + var _this8 = this; + + var formats = void 0; + + var _overload11 = overload(index, 0, name, value, source); + + var _overload12 = _slicedToArray(_overload11, 4); + + index = _overload12[0]; + formats = _overload12[2]; + source = _overload12[3]; + + return modify.call(this, function () { + return _this8.editor.insertText(index, text, formats); + }, source, index, text.length); + } + }, { + key: 'isEnabled', + value: function isEnabled() { + return !this.container.classList.contains('ql-disabled'); + } + }, { + key: 'off', + value: function off() { + return this.emitter.off.apply(this.emitter, arguments); + } + }, { + key: 'on', + value: function on() { + return this.emitter.on.apply(this.emitter, arguments); + } + }, { + key: 'once', + value: function once() { + return this.emitter.once.apply(this.emitter, arguments); + } + }, { + key: 'pasteHTML', + value: function pasteHTML(index, html, source) { + this.clipboard.dangerouslyPasteHTML(index, html, source); + } + }, { + key: 'removeFormat', + value: function removeFormat(index, length, source) { + var _this9 = this; + + var _overload13 = overload(index, length, source); + + var _overload14 = _slicedToArray(_overload13, 4); + + index = _overload14[0]; + length = _overload14[1]; + source = _overload14[3]; + + return modify.call(this, function () { + return _this9.editor.removeFormat(index, length); + }, source, index); + } + }, { + key: 'scrollIntoView', + value: function scrollIntoView() { + this.selection.scrollIntoView(this.scrollingContainer); + } + }, { + key: 'setContents', + value: function setContents(delta) { + var _this10 = this; + + var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; + + return modify.call(this, function () { + delta = new _quillDelta2.default(delta); + var length = _this10.getLength(); + var deleted = _this10.editor.deleteText(0, length); + var applied = _this10.editor.applyDelta(delta); + var lastOp = applied.ops[applied.ops.length - 1]; + if (lastOp != null && typeof lastOp.insert === 'string' && lastOp.insert[lastOp.insert.length - 1] === '\n') { + _this10.editor.deleteText(_this10.getLength() - 1, 1); + applied.delete(1); + } + var ret = deleted.compose(applied); + return ret; + }, source); + } + }, { + key: 'setSelection', + value: function setSelection(index, length, source) { + if (index == null) { + this.selection.setRange(null, length || Quill.sources.API); + } else { + var _overload15 = overload(index, length, source); + + var _overload16 = _slicedToArray(_overload15, 4); + + index = _overload16[0]; + length = _overload16[1]; + source = _overload16[3]; + + this.selection.setRange(new _selection.Range(index, length), source); + if (source !== _emitter4.default.sources.SILENT) { + this.selection.scrollIntoView(this.scrollingContainer); + } + } + } + }, { + key: 'setText', + value: function setText(text) { + var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; + + var delta = new _quillDelta2.default().insert(text); + return this.setContents(delta, source); + } + }, { + key: 'update', + value: function update() { + var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER; + + var change = this.scroll.update(source); // Will update selection before selection.update() does if text changes + this.selection.update(source); + return change; + } + }, { + key: 'updateContents', + value: function updateContents(delta) { + var _this11 = this; + + var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; + + return modify.call(this, function () { + delta = new _quillDelta2.default(delta); + return _this11.editor.applyDelta(delta, source); + }, source, true); + } + }]); + + return Quill; +}(); + +Quill.DEFAULTS = { + bounds: null, + formats: null, + modules: {}, + placeholder: '', + readOnly: false, + scrollingContainer: null, + strict: true, + theme: 'default' +}; +Quill.events = _emitter4.default.events; +Quill.sources = _emitter4.default.sources; +// eslint-disable-next-line no-undef +Quill.version = false ? 'dev' : "1.3.6"; + +Quill.imports = { + 'delta': _quillDelta2.default, + 'parchment': _parchment2.default, + 'core/module': _module2.default, + 'core/theme': _theme2.default +}; + +function expandConfig(container, userConfig) { + userConfig = (0, _extend2.default)(true, { + container: container, + modules: { + clipboard: true, + keyboard: true, + history: true + } + }, userConfig); + if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) { + userConfig.theme = _theme2.default; + } else { + userConfig.theme = Quill.import('themes/' + userConfig.theme); + if (userConfig.theme == null) { + throw new Error('Invalid theme ' + userConfig.theme + '. Did you register it?'); + } + } + var themeConfig = (0, _extend2.default)(true, {}, userConfig.theme.DEFAULTS); + [themeConfig, userConfig].forEach(function (config) { + config.modules = config.modules || {}; + Object.keys(config.modules).forEach(function (module) { + if (config.modules[module] === true) { + config.modules[module] = {}; + } + }); + }); + var moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules)); + var moduleConfig = moduleNames.reduce(function (config, name) { + var moduleClass = Quill.import('modules/' + name); + if (moduleClass == null) { + debug.error('Cannot load ' + name + ' module. Are you sure you registered it?'); + } else { + config[name] = moduleClass.DEFAULTS || {}; + } + return config; + }, {}); + // Special case toolbar shorthand + if (userConfig.modules != null && userConfig.modules.toolbar && userConfig.modules.toolbar.constructor !== Object) { + userConfig.modules.toolbar = { + container: userConfig.modules.toolbar + }; + } + userConfig = (0, _extend2.default)(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig); + ['bounds', 'container', 'scrollingContainer'].forEach(function (key) { + if (typeof userConfig[key] === 'string') { + userConfig[key] = document.querySelector(userConfig[key]); + } + }); + userConfig.modules = Object.keys(userConfig.modules).reduce(function (config, name) { + if (userConfig.modules[name]) { + config[name] = userConfig.modules[name]; + } + return config; + }, {}); + return userConfig; +} + +// Handle selection preservation and TEXT_CHANGE emission +// common to modification APIs +function modify(modifier, source, index, shift) { + if (this.options.strict && !this.isEnabled() && source === _emitter4.default.sources.USER) { + return new _quillDelta2.default(); + } + var range = index == null ? null : this.getSelection(); + var oldDelta = this.editor.delta; + var change = modifier(); + if (range != null) { + if (index === true) index = range.index; + if (shift == null) { + range = shiftRange(range, change, source); + } else if (shift !== 0) { + range = shiftRange(range, index, shift, source); + } + this.setSelection(range, _emitter4.default.sources.SILENT); + } + if (change.length() > 0) { + var _emitter; + + var args = [_emitter4.default.events.TEXT_CHANGE, change, oldDelta, source]; + (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args)); + if (source !== _emitter4.default.sources.SILENT) { + var _emitter2; + + (_emitter2 = this.emitter).emit.apply(_emitter2, args); + } + } + return change; +} + +function overload(index, length, name, value, source) { + var formats = {}; + if (typeof index.index === 'number' && typeof index.length === 'number') { + // Allow for throwaway end (used by insertText/insertEmbed) + if (typeof length !== 'number') { + source = value, value = name, name = length, length = index.length, index = index.index; + } else { + length = index.length, index = index.index; + } + } else if (typeof length !== 'number') { + source = value, value = name, name = length, length = 0; + } + // Handle format being object, two format name/value strings or excluded + if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') { + formats = name; + source = value; + } else if (typeof name === 'string') { + if (value != null) { + formats[name] = value; + } else { + source = name; + } + } + // Handle optional source + source = source || _emitter4.default.sources.API; + return [index, length, formats, source]; +} + +function shiftRange(range, index, length, source) { + if (range == null) return null; + var start = void 0, + end = void 0; + if (index instanceof _quillDelta2.default) { + var _map = [range.index, range.index + range.length].map(function (pos) { + return index.transformPosition(pos, source !== _emitter4.default.sources.USER); + }); + + var _map2 = _slicedToArray(_map, 2); + + start = _map2[0]; + end = _map2[1]; + } else { + var _map3 = [range.index, range.index + range.length].map(function (pos) { + if (pos < index || pos === index && source === _emitter4.default.sources.USER) return pos; + if (length >= 0) { + return pos + length; + } else { + return Math.max(index, pos + length); + } + }); + + var _map4 = _slicedToArray(_map3, 2); + + start = _map4[0]; + end = _map4[1]; + } + return new _selection.Range(start, end - start); +} + +exports.expandConfig = expandConfig; +exports.overload = overload; +exports.default = Quill; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Inline = function (_Parchment$Inline) { + _inherits(Inline, _Parchment$Inline); + + function Inline() { + _classCallCheck(this, Inline); + + return _possibleConstructorReturn(this, (Inline.__proto__ || Object.getPrototypeOf(Inline)).apply(this, arguments)); + } + + _createClass(Inline, [{ + key: 'formatAt', + value: function formatAt(index, length, name, value) { + if (Inline.compare(this.statics.blotName, name) < 0 && _parchment2.default.query(name, _parchment2.default.Scope.BLOT)) { + var blot = this.isolate(index, length); + if (value) { + blot.wrap(name, value); + } + } else { + _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'formatAt', this).call(this, index, length, name, value); + } + } + }, { + key: 'optimize', + value: function optimize(context) { + _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'optimize', this).call(this, context); + if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { + var parent = this.parent.isolate(this.offset(), this.length()); + this.moveChildren(parent); + parent.wrap(this); + } + } + }], [{ + key: 'compare', + value: function compare(self, other) { + var selfIndex = Inline.order.indexOf(self); + var otherIndex = Inline.order.indexOf(other); + if (selfIndex >= 0 || otherIndex >= 0) { + return selfIndex - otherIndex; + } else if (self === other) { + return 0; + } else if (self < other) { + return -1; + } else { + return 1; + } + } + }]); + + return Inline; +}(_parchment2.default.Inline); + +Inline.allowedChildren = [Inline, _parchment2.default.Embed, _text2.default]; +// Lower index means deeper in the DOM tree, since not found (-1) is for embeds +Inline.order = ['cursor', 'inline', // Must be lower +'underline', 'strike', 'italic', 'bold', 'script', 'link', 'code' // Must be higher +]; + +exports.default = Inline; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TextBlot = function (_Parchment$Text) { + _inherits(TextBlot, _Parchment$Text); + + function TextBlot() { + _classCallCheck(this, TextBlot); + + return _possibleConstructorReturn(this, (TextBlot.__proto__ || Object.getPrototypeOf(TextBlot)).apply(this, arguments)); + } + + return TextBlot; +}(_parchment2.default.Text); + +exports.default = TextBlot; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _eventemitter = __webpack_require__(54); + +var _eventemitter2 = _interopRequireDefault(_eventemitter); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:events'); + +var EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click']; + +EVENTS.forEach(function (eventName) { + document.addEventListener(eventName, function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + [].slice.call(document.querySelectorAll('.ql-container')).forEach(function (node) { + // TODO use WeakMap + if (node.__quill && node.__quill.emitter) { + var _node$__quill$emitter; + + (_node$__quill$emitter = node.__quill.emitter).handleDOM.apply(_node$__quill$emitter, args); + } + }); + }); +}); + +var Emitter = function (_EventEmitter) { + _inherits(Emitter, _EventEmitter); + + function Emitter() { + _classCallCheck(this, Emitter); + + var _this = _possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this)); + + _this.listeners = {}; + _this.on('error', debug.error); + return _this; + } + + _createClass(Emitter, [{ + key: 'emit', + value: function emit() { + debug.log.apply(debug, arguments); + _get(Emitter.prototype.__proto__ || Object.getPrototypeOf(Emitter.prototype), 'emit', this).apply(this, arguments); + } + }, { + key: 'handleDOM', + value: function handleDOM(event) { + for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + (this.listeners[event.type] || []).forEach(function (_ref) { + var node = _ref.node, + handler = _ref.handler; + + if (event.target === node || node.contains(event.target)) { + handler.apply(undefined, [event].concat(args)); + } + }); + } + }, { + key: 'listenDOM', + value: function listenDOM(eventName, node, handler) { + if (!this.listeners[eventName]) { + this.listeners[eventName] = []; + } + this.listeners[eventName].push({ node: node, handler: handler }); + } + }]); + + return Emitter; +}(_eventemitter2.default); + +Emitter.events = { + EDITOR_CHANGE: 'editor-change', + SCROLL_BEFORE_UPDATE: 'scroll-before-update', + SCROLL_OPTIMIZE: 'scroll-optimize', + SCROLL_UPDATE: 'scroll-update', + SELECTION_CHANGE: 'selection-change', + TEXT_CHANGE: 'text-change' +}; +Emitter.sources = { + API: 'api', + SILENT: 'silent', + USER: 'user' +}; + +exports.default = Emitter; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Module = function Module(quill) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Module); + + this.quill = quill; + this.options = options; +}; + +Module.DEFAULTS = {}; + +exports.default = Module; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var levels = ['error', 'warn', 'log', 'info']; +var level = 'warn'; + +function debug(method) { + if (levels.indexOf(method) <= levels.indexOf(level)) { + var _console; + + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + (_console = console)[method].apply(_console, args); // eslint-disable-line no-console + } +} + +function namespace(ns) { + return levels.reduce(function (logger, method) { + logger[method] = debug.bind(console, method, ns); + return logger; + }, {}); +} + +debug.level = namespace.level = function (newLevel) { + level = newLevel; +}; + +exports.default = namespace; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +var pSlice = Array.prototype.slice; +var objectKeys = __webpack_require__(52); +var isArguments = __webpack_require__(53); + +var deepEqual = module.exports = function (actual, expected, opts) { + if (!opts) opts = {}; + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (actual instanceof Date && expected instanceof Date) { + return actual.getTime() === expected.getTime(); + + // 7.3. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') { + return opts.strict ? actual === expected : actual == expected; + + // 7.4. For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected, opts); + } +} + +function isUndefinedOrNull(value) { + return value === null || value === undefined; +} + +function isBuffer (x) { + if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; + if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { + return false; + } + if (x.length > 0 && typeof x[0] !== 'number') return false; + return true; +} + +function objEquiv(a, b, opts) { + var i, key; + if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return deepEqual(a, b, opts); + } + if (isBuffer(a)) { + if (!isBuffer(b)) { + return false; + } + if (a.length !== b.length) return false; + for (i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + return true; + } + try { + var ka = objectKeys(a), + kb = objectKeys(b); + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!deepEqual(a[key], b[key], opts)) return false; + } + return typeof a === typeof b; +} + + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Registry = __webpack_require__(1); +var Attributor = /** @class */ (function () { + function Attributor(attrName, keyName, options) { + if (options === void 0) { options = {}; } + this.attrName = attrName; + this.keyName = keyName; + var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE; + if (options.scope != null) { + // Ignore type bits, force attribute bit + this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit; + } + else { + this.scope = Registry.Scope.ATTRIBUTE; + } + if (options.whitelist != null) + this.whitelist = options.whitelist; + } + Attributor.keys = function (node) { + return [].map.call(node.attributes, function (item) { + return item.name; + }); + }; + Attributor.prototype.add = function (node, value) { + if (!this.canAdd(node, value)) + return false; + node.setAttribute(this.keyName, value); + return true; + }; + Attributor.prototype.canAdd = function (node, value) { + var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE)); + if (match == null) + return false; + if (this.whitelist == null) + return true; + if (typeof value === 'string') { + return this.whitelist.indexOf(value.replace(/["']/g, '')) > -1; + } + else { + return this.whitelist.indexOf(value) > -1; + } + }; + Attributor.prototype.remove = function (node) { + node.removeAttribute(this.keyName); + }; + Attributor.prototype.value = function (node) { + var value = node.getAttribute(this.keyName); + if (this.canAdd(node, value) && value) { + return value; + } + return ''; + }; + return Attributor; +}()); +exports.default = Attributor; + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.Code = undefined; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Code = function (_Inline) { + _inherits(Code, _Inline); + + function Code() { + _classCallCheck(this, Code); + + return _possibleConstructorReturn(this, (Code.__proto__ || Object.getPrototypeOf(Code)).apply(this, arguments)); + } + + return Code; +}(_inline2.default); + +Code.blotName = 'code'; +Code.tagName = 'CODE'; + +var CodeBlock = function (_Block) { + _inherits(CodeBlock, _Block); + + function CodeBlock() { + _classCallCheck(this, CodeBlock); + + return _possibleConstructorReturn(this, (CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock)).apply(this, arguments)); + } + + _createClass(CodeBlock, [{ + key: 'delta', + value: function delta() { + var _this3 = this; + + var text = this.domNode.textContent; + if (text.endsWith('\n')) { + // Should always be true + text = text.slice(0, -1); + } + return text.split('\n').reduce(function (delta, frag) { + return delta.insert(frag).insert('\n', _this3.formats()); + }, new _quillDelta2.default()); + } + }, { + key: 'format', + value: function format(name, value) { + if (name === this.statics.blotName && value) return; + + var _descendant = this.descendant(_text2.default, this.length() - 1), + _descendant2 = _slicedToArray(_descendant, 1), + text = _descendant2[0]; + + if (text != null) { + text.deleteAt(text.length() - 1, 1); + } + _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'format', this).call(this, name, value); + } + }, { + key: 'formatAt', + value: function formatAt(index, length, name, value) { + if (length === 0) return; + if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK) == null || name === this.statics.blotName && value === this.statics.formats(this.domNode)) { + return; + } + var nextNewline = this.newlineIndex(index); + if (nextNewline < 0 || nextNewline >= index + length) return; + var prevNewline = this.newlineIndex(index, true) + 1; + var isolateLength = nextNewline - prevNewline + 1; + var blot = this.isolate(prevNewline, isolateLength); + var next = blot.next; + blot.format(name, value); + if (next instanceof CodeBlock) { + next.formatAt(0, index - prevNewline + length - isolateLength, name, value); + } + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (def != null) return; + + var _descendant3 = this.descendant(_text2.default, index), + _descendant4 = _slicedToArray(_descendant3, 2), + text = _descendant4[0], + offset = _descendant4[1]; + + text.insertAt(offset, value); + } + }, { + key: 'length', + value: function length() { + var length = this.domNode.textContent.length; + if (!this.domNode.textContent.endsWith('\n')) { + return length + 1; + } + return length; + } + }, { + key: 'newlineIndex', + value: function newlineIndex(searchIndex) { + var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!reverse) { + var offset = this.domNode.textContent.slice(searchIndex).indexOf('\n'); + return offset > -1 ? searchIndex + offset : -1; + } else { + return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\n'); + } + } + }, { + key: 'optimize', + value: function optimize(context) { + if (!this.domNode.textContent.endsWith('\n')) { + this.appendChild(_parchment2.default.create('text', '\n')); + } + _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'optimize', this).call(this, context); + var next = this.next; + if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) { + next.optimize(context); + next.moveChildren(this); + next.remove(); + } + } + }, { + key: 'replace', + value: function replace(target) { + _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'replace', this).call(this, target); + [].slice.call(this.domNode.querySelectorAll('*')).forEach(function (node) { + var blot = _parchment2.default.find(node); + if (blot == null) { + node.parentNode.removeChild(node); + } else if (blot instanceof _parchment2.default.Embed) { + blot.remove(); + } else { + blot.unwrap(); + } + }); + } + }], [{ + key: 'create', + value: function create(value) { + var domNode = _get(CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock), 'create', this).call(this, value); + domNode.setAttribute('spellcheck', false); + return domNode; + } + }, { + key: 'formats', + value: function formats() { + return true; + } + }]); + + return CodeBlock; +}(_block2.default); + +CodeBlock.blotName = 'code-block'; +CodeBlock.tagName = 'PRE'; +CodeBlock.TAB = ' '; + +exports.Code = Code; +exports.default = CodeBlock; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _op = __webpack_require__(20); + +var _op2 = _interopRequireDefault(_op); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _cursor = __webpack_require__(24); + +var _cursor2 = _interopRequireDefault(_cursor); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _clone = __webpack_require__(21); + +var _clone2 = _interopRequireDefault(_clone); + +var _deepEqual = __webpack_require__(11); + +var _deepEqual2 = _interopRequireDefault(_deepEqual); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ASCII = /^[ -~]*$/; + +var Editor = function () { + function Editor(scroll) { + _classCallCheck(this, Editor); + + this.scroll = scroll; + this.delta = this.getDelta(); + } + + _createClass(Editor, [{ + key: 'applyDelta', + value: function applyDelta(delta) { + var _this = this; + + var consumeNextNewline = false; + this.scroll.update(); + var scrollLength = this.scroll.length(); + this.scroll.batchStart(); + delta = normalizeDelta(delta); + delta.reduce(function (index, op) { + var length = op.retain || op.delete || op.insert.length || 1; + var attributes = op.attributes || {}; + if (op.insert != null) { + if (typeof op.insert === 'string') { + var text = op.insert; + if (text.endsWith('\n') && consumeNextNewline) { + consumeNextNewline = false; + text = text.slice(0, -1); + } + if (index >= scrollLength && !text.endsWith('\n')) { + consumeNextNewline = true; + } + _this.scroll.insertAt(index, text); + + var _scroll$line = _this.scroll.line(index), + _scroll$line2 = _slicedToArray(_scroll$line, 2), + line = _scroll$line2[0], + offset = _scroll$line2[1]; + + var formats = (0, _extend2.default)({}, (0, _block.bubbleFormats)(line)); + if (line instanceof _block2.default) { + var _line$descendant = line.descendant(_parchment2.default.Leaf, offset), + _line$descendant2 = _slicedToArray(_line$descendant, 1), + leaf = _line$descendant2[0]; + + formats = (0, _extend2.default)(formats, (0, _block.bubbleFormats)(leaf)); + } + attributes = _op2.default.attributes.diff(formats, attributes) || {}; + } else if (_typeof(op.insert) === 'object') { + var key = Object.keys(op.insert)[0]; // There should only be one key + if (key == null) return index; + _this.scroll.insertAt(index, key, op.insert[key]); + } + scrollLength += length; + } + Object.keys(attributes).forEach(function (name) { + _this.scroll.formatAt(index, length, name, attributes[name]); + }); + return index + length; + }, 0); + delta.reduce(function (index, op) { + if (typeof op.delete === 'number') { + _this.scroll.deleteAt(index, op.delete); + return index; + } + return index + (op.retain || op.insert.length || 1); + }, 0); + this.scroll.batchEnd(); + return this.update(delta); + } + }, { + key: 'deleteText', + value: function deleteText(index, length) { + this.scroll.deleteAt(index, length); + return this.update(new _quillDelta2.default().retain(index).delete(length)); + } + }, { + key: 'formatLine', + value: function formatLine(index, length) { + var _this2 = this; + + var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + this.scroll.update(); + Object.keys(formats).forEach(function (format) { + if (_this2.scroll.whitelist != null && !_this2.scroll.whitelist[format]) return; + var lines = _this2.scroll.lines(index, Math.max(length, 1)); + var lengthRemaining = length; + lines.forEach(function (line) { + var lineLength = line.length(); + if (!(line instanceof _code2.default)) { + line.format(format, formats[format]); + } else { + var codeIndex = index - line.offset(_this2.scroll); + var codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1; + line.formatAt(codeIndex, codeLength, format, formats[format]); + } + lengthRemaining -= lineLength; + }); + }); + this.scroll.optimize(); + return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats))); + } + }, { + key: 'formatText', + value: function formatText(index, length) { + var _this3 = this; + + var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + Object.keys(formats).forEach(function (format) { + _this3.scroll.formatAt(index, length, format, formats[format]); + }); + return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats))); + } + }, { + key: 'getContents', + value: function getContents(index, length) { + return this.delta.slice(index, index + length); + } + }, { + key: 'getDelta', + value: function getDelta() { + return this.scroll.lines().reduce(function (delta, line) { + return delta.concat(line.delta()); + }, new _quillDelta2.default()); + } + }, { + key: 'getFormat', + value: function getFormat(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var lines = [], + leaves = []; + if (length === 0) { + this.scroll.path(index).forEach(function (path) { + var _path = _slicedToArray(path, 1), + blot = _path[0]; + + if (blot instanceof _block2.default) { + lines.push(blot); + } else if (blot instanceof _parchment2.default.Leaf) { + leaves.push(blot); + } + }); + } else { + lines = this.scroll.lines(index, length); + leaves = this.scroll.descendants(_parchment2.default.Leaf, index, length); + } + var formatsArr = [lines, leaves].map(function (blots) { + if (blots.length === 0) return {}; + var formats = (0, _block.bubbleFormats)(blots.shift()); + while (Object.keys(formats).length > 0) { + var blot = blots.shift(); + if (blot == null) return formats; + formats = combineFormats((0, _block.bubbleFormats)(blot), formats); + } + return formats; + }); + return _extend2.default.apply(_extend2.default, formatsArr); + } + }, { + key: 'getText', + value: function getText(index, length) { + return this.getContents(index, length).filter(function (op) { + return typeof op.insert === 'string'; + }).map(function (op) { + return op.insert; + }).join(''); + } + }, { + key: 'insertEmbed', + value: function insertEmbed(index, embed, value) { + this.scroll.insertAt(index, embed, value); + return this.update(new _quillDelta2.default().retain(index).insert(_defineProperty({}, embed, value))); + } + }, { + key: 'insertText', + value: function insertText(index, text) { + var _this4 = this; + + var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + this.scroll.insertAt(index, text); + Object.keys(formats).forEach(function (format) { + _this4.scroll.formatAt(index, text.length, format, formats[format]); + }); + return this.update(new _quillDelta2.default().retain(index).insert(text, (0, _clone2.default)(formats))); + } + }, { + key: 'isBlank', + value: function isBlank() { + if (this.scroll.children.length == 0) return true; + if (this.scroll.children.length > 1) return false; + var block = this.scroll.children.head; + if (block.statics.blotName !== _block2.default.blotName) return false; + if (block.children.length > 1) return false; + return block.children.head instanceof _break2.default; + } + }, { + key: 'removeFormat', + value: function removeFormat(index, length) { + var text = this.getText(index, length); + + var _scroll$line3 = this.scroll.line(index + length), + _scroll$line4 = _slicedToArray(_scroll$line3, 2), + line = _scroll$line4[0], + offset = _scroll$line4[1]; + + var suffixLength = 0, + suffix = new _quillDelta2.default(); + if (line != null) { + if (!(line instanceof _code2.default)) { + suffixLength = line.length() - offset; + } else { + suffixLength = line.newlineIndex(offset) - offset + 1; + } + suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\n'); + } + var contents = this.getContents(index, length + suffixLength); + var diff = contents.diff(new _quillDelta2.default().insert(text).concat(suffix)); + var delta = new _quillDelta2.default().retain(index).concat(diff); + return this.applyDelta(delta); + } + }, { + key: 'update', + value: function update(change) { + var mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var cursorIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + + var oldDelta = this.delta; + if (mutations.length === 1 && mutations[0].type === 'characterData' && mutations[0].target.data.match(ASCII) && _parchment2.default.find(mutations[0].target)) { + // Optimization for character changes + var textBlot = _parchment2.default.find(mutations[0].target); + var formats = (0, _block.bubbleFormats)(textBlot); + var index = textBlot.offset(this.scroll); + var oldValue = mutations[0].oldValue.replace(_cursor2.default.CONTENTS, ''); + var oldText = new _quillDelta2.default().insert(oldValue); + var newText = new _quillDelta2.default().insert(textBlot.value()); + var diffDelta = new _quillDelta2.default().retain(index).concat(oldText.diff(newText, cursorIndex)); + change = diffDelta.reduce(function (delta, op) { + if (op.insert) { + return delta.insert(op.insert, formats); + } else { + return delta.push(op); + } + }, new _quillDelta2.default()); + this.delta = oldDelta.compose(change); + } else { + this.delta = this.getDelta(); + if (!change || !(0, _deepEqual2.default)(oldDelta.compose(change), this.delta)) { + change = oldDelta.diff(this.delta, cursorIndex); + } + } + return change; + } + }]); + + return Editor; +}(); + +function combineFormats(formats, combined) { + return Object.keys(combined).reduce(function (merged, name) { + if (formats[name] == null) return merged; + if (combined[name] === formats[name]) { + merged[name] = combined[name]; + } else if (Array.isArray(combined[name])) { + if (combined[name].indexOf(formats[name]) < 0) { + merged[name] = combined[name].concat([formats[name]]); + } + } else { + merged[name] = [combined[name], formats[name]]; + } + return merged; + }, {}); +} + +function normalizeDelta(delta) { + return delta.reduce(function (delta, op) { + if (op.insert === 1) { + var attributes = (0, _clone2.default)(op.attributes); + delete attributes['image']; + return delta.insert({ image: op.attributes.image }, attributes); + } + if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) { + op = (0, _clone2.default)(op); + if (op.attributes.list) { + op.attributes.list = 'ordered'; + } else { + op.attributes.list = 'bullet'; + delete op.attributes.bullet; + } + } + if (typeof op.insert === 'string') { + var text = op.insert.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + return delta.insert(text, op.attributes); + } + return delta.push(op); + }, new _quillDelta2.default()); +} + +exports.default = Editor; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.Range = undefined; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _clone = __webpack_require__(21); + +var _clone2 = _interopRequireDefault(_clone); + +var _deepEqual = __webpack_require__(11); + +var _deepEqual2 = _interopRequireDefault(_deepEqual); + +var _emitter3 = __webpack_require__(8); + +var _emitter4 = _interopRequireDefault(_emitter3); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var debug = (0, _logger2.default)('quill:selection'); + +var Range = function Range(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + _classCallCheck(this, Range); + + this.index = index; + this.length = length; +}; + +var Selection = function () { + function Selection(scroll, emitter) { + var _this = this; + + _classCallCheck(this, Selection); + + this.emitter = emitter; + this.scroll = scroll; + this.composing = false; + this.mouseDown = false; + this.root = this.scroll.domNode; + this.cursor = _parchment2.default.create('cursor', this); + // savedRange is last non-null range + this.lastRange = this.savedRange = new Range(0, 0); + this.handleComposition(); + this.handleDragging(); + this.emitter.listenDOM('selectionchange', document, function () { + if (!_this.mouseDown) { + setTimeout(_this.update.bind(_this, _emitter4.default.sources.USER), 1); + } + }); + this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type, delta) { + if (type === _emitter4.default.events.TEXT_CHANGE && delta.length() > 0) { + _this.update(_emitter4.default.sources.SILENT); + } + }); + this.emitter.on(_emitter4.default.events.SCROLL_BEFORE_UPDATE, function () { + if (!_this.hasFocus()) return; + var native = _this.getNativeRange(); + if (native == null) return; + if (native.start.node === _this.cursor.textNode) return; // cursor.restore() will handle + // TODO unclear if this has negative side effects + _this.emitter.once(_emitter4.default.events.SCROLL_UPDATE, function () { + try { + _this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset); + } catch (ignored) {} + }); + }); + this.emitter.on(_emitter4.default.events.SCROLL_OPTIMIZE, function (mutations, context) { + if (context.range) { + var _context$range = context.range, + startNode = _context$range.startNode, + startOffset = _context$range.startOffset, + endNode = _context$range.endNode, + endOffset = _context$range.endOffset; + + _this.setNativeRange(startNode, startOffset, endNode, endOffset); + } + }); + this.update(_emitter4.default.sources.SILENT); + } + + _createClass(Selection, [{ + key: 'handleComposition', + value: function handleComposition() { + var _this2 = this; + + this.root.addEventListener('compositionstart', function () { + _this2.composing = true; + }); + this.root.addEventListener('compositionend', function () { + _this2.composing = false; + if (_this2.cursor.parent) { + var range = _this2.cursor.restore(); + if (!range) return; + setTimeout(function () { + _this2.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset); + }, 1); + } + }); + } + }, { + key: 'handleDragging', + value: function handleDragging() { + var _this3 = this; + + this.emitter.listenDOM('mousedown', document.body, function () { + _this3.mouseDown = true; + }); + this.emitter.listenDOM('mouseup', document.body, function () { + _this3.mouseDown = false; + _this3.update(_emitter4.default.sources.USER); + }); + } + }, { + key: 'focus', + value: function focus() { + if (this.hasFocus()) return; + this.root.focus(); + this.setRange(this.savedRange); + } + }, { + key: 'format', + value: function format(_format, value) { + if (this.scroll.whitelist != null && !this.scroll.whitelist[_format]) return; + this.scroll.update(); + var nativeRange = this.getNativeRange(); + if (nativeRange == null || !nativeRange.native.collapsed || _parchment2.default.query(_format, _parchment2.default.Scope.BLOCK)) return; + if (nativeRange.start.node !== this.cursor.textNode) { + var blot = _parchment2.default.find(nativeRange.start.node, false); + if (blot == null) return; + // TODO Give blot ability to not split + if (blot instanceof _parchment2.default.Leaf) { + var after = blot.split(nativeRange.start.offset); + blot.parent.insertBefore(this.cursor, after); + } else { + blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen + } + this.cursor.attach(); + } + this.cursor.format(_format, value); + this.scroll.optimize(); + this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length); + this.update(); + } + }, { + key: 'getBounds', + value: function getBounds(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var scrollLength = this.scroll.length(); + index = Math.min(index, scrollLength - 1); + length = Math.min(index + length, scrollLength - 1) - index; + var node = void 0, + _scroll$leaf = this.scroll.leaf(index), + _scroll$leaf2 = _slicedToArray(_scroll$leaf, 2), + leaf = _scroll$leaf2[0], + offset = _scroll$leaf2[1]; + if (leaf == null) return null; + + var _leaf$position = leaf.position(offset, true); + + var _leaf$position2 = _slicedToArray(_leaf$position, 2); + + node = _leaf$position2[0]; + offset = _leaf$position2[1]; + + var range = document.createRange(); + if (length > 0) { + range.setStart(node, offset); + + var _scroll$leaf3 = this.scroll.leaf(index + length); + + var _scroll$leaf4 = _slicedToArray(_scroll$leaf3, 2); + + leaf = _scroll$leaf4[0]; + offset = _scroll$leaf4[1]; + + if (leaf == null) return null; + + var _leaf$position3 = leaf.position(offset, true); + + var _leaf$position4 = _slicedToArray(_leaf$position3, 2); + + node = _leaf$position4[0]; + offset = _leaf$position4[1]; + + range.setEnd(node, offset); + return range.getBoundingClientRect(); + } else { + var side = 'left'; + var rect = void 0; + if (node instanceof Text) { + if (offset < node.data.length) { + range.setStart(node, offset); + range.setEnd(node, offset + 1); + } else { + range.setStart(node, offset - 1); + range.setEnd(node, offset); + side = 'right'; + } + rect = range.getBoundingClientRect(); + } else { + rect = leaf.domNode.getBoundingClientRect(); + if (offset > 0) side = 'right'; + } + return { + bottom: rect.top + rect.height, + height: rect.height, + left: rect[side], + right: rect[side], + top: rect.top, + width: 0 + }; + } + } + }, { + key: 'getNativeRange', + value: function getNativeRange() { + var selection = document.getSelection(); + if (selection == null || selection.rangeCount <= 0) return null; + var nativeRange = selection.getRangeAt(0); + if (nativeRange == null) return null; + var range = this.normalizeNative(nativeRange); + debug.info('getNativeRange', range); + return range; + } + }, { + key: 'getRange', + value: function getRange() { + var normalized = this.getNativeRange(); + if (normalized == null) return [null, null]; + var range = this.normalizedToRange(normalized); + return [range, normalized]; + } + }, { + key: 'hasFocus', + value: function hasFocus() { + return document.activeElement === this.root; + } + }, { + key: 'normalizedToRange', + value: function normalizedToRange(range) { + var _this4 = this; + + var positions = [[range.start.node, range.start.offset]]; + if (!range.native.collapsed) { + positions.push([range.end.node, range.end.offset]); + } + var indexes = positions.map(function (position) { + var _position = _slicedToArray(position, 2), + node = _position[0], + offset = _position[1]; + + var blot = _parchment2.default.find(node, true); + var index = blot.offset(_this4.scroll); + if (offset === 0) { + return index; + } else if (blot instanceof _parchment2.default.Container) { + return index + blot.length(); + } else { + return index + blot.index(node, offset); + } + }); + var end = Math.min(Math.max.apply(Math, _toConsumableArray(indexes)), this.scroll.length() - 1); + var start = Math.min.apply(Math, [end].concat(_toConsumableArray(indexes))); + return new Range(start, end - start); + } + }, { + key: 'normalizeNative', + value: function normalizeNative(nativeRange) { + if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) { + return null; + } + var range = { + start: { node: nativeRange.startContainer, offset: nativeRange.startOffset }, + end: { node: nativeRange.endContainer, offset: nativeRange.endOffset }, + native: nativeRange + }; + [range.start, range.end].forEach(function (position) { + var node = position.node, + offset = position.offset; + while (!(node instanceof Text) && node.childNodes.length > 0) { + if (node.childNodes.length > offset) { + node = node.childNodes[offset]; + offset = 0; + } else if (node.childNodes.length === offset) { + node = node.lastChild; + offset = node instanceof Text ? node.data.length : node.childNodes.length + 1; + } else { + break; + } + } + position.node = node, position.offset = offset; + }); + return range; + } + }, { + key: 'rangeToNative', + value: function rangeToNative(range) { + var _this5 = this; + + var indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length]; + var args = []; + var scrollLength = this.scroll.length(); + indexes.forEach(function (index, i) { + index = Math.min(scrollLength - 1, index); + var node = void 0, + _scroll$leaf5 = _this5.scroll.leaf(index), + _scroll$leaf6 = _slicedToArray(_scroll$leaf5, 2), + leaf = _scroll$leaf6[0], + offset = _scroll$leaf6[1]; + var _leaf$position5 = leaf.position(offset, i !== 0); + + var _leaf$position6 = _slicedToArray(_leaf$position5, 2); + + node = _leaf$position6[0]; + offset = _leaf$position6[1]; + + args.push(node, offset); + }); + if (args.length < 2) { + args = args.concat(args); + } + return args; + } + }, { + key: 'scrollIntoView', + value: function scrollIntoView(scrollingContainer) { + var range = this.lastRange; + if (range == null) return; + var bounds = this.getBounds(range.index, range.length); + if (bounds == null) return; + var limit = this.scroll.length() - 1; + + var _scroll$line = this.scroll.line(Math.min(range.index, limit)), + _scroll$line2 = _slicedToArray(_scroll$line, 1), + first = _scroll$line2[0]; + + var last = first; + if (range.length > 0) { + var _scroll$line3 = this.scroll.line(Math.min(range.index + range.length, limit)); + + var _scroll$line4 = _slicedToArray(_scroll$line3, 1); + + last = _scroll$line4[0]; + } + if (first == null || last == null) return; + var scrollBounds = scrollingContainer.getBoundingClientRect(); + if (bounds.top < scrollBounds.top) { + scrollingContainer.scrollTop -= scrollBounds.top - bounds.top; + } else if (bounds.bottom > scrollBounds.bottom) { + scrollingContainer.scrollTop += bounds.bottom - scrollBounds.bottom; + } + } + }, { + key: 'setNativeRange', + value: function setNativeRange(startNode, startOffset) { + var endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode; + var endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset; + var force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + debug.info('setNativeRange', startNode, startOffset, endNode, endOffset); + if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) { + return; + } + var selection = document.getSelection(); + if (selection == null) return; + if (startNode != null) { + if (!this.hasFocus()) this.root.focus(); + var native = (this.getNativeRange() || {}).native; + if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) { + + if (startNode.tagName == "BR") { + startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode); + startNode = startNode.parentNode; + } + if (endNode.tagName == "BR") { + endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode); + endNode = endNode.parentNode; + } + var range = document.createRange(); + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); + selection.removeAllRanges(); + selection.addRange(range); + } + } else { + selection.removeAllRanges(); + this.root.blur(); + document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs) + } + } + }, { + key: 'setRange', + value: function setRange(range) { + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API; + + if (typeof force === 'string') { + source = force; + force = false; + } + debug.info('setRange', range); + if (range != null) { + var args = this.rangeToNative(range); + this.setNativeRange.apply(this, _toConsumableArray(args).concat([force])); + } else { + this.setNativeRange(null); + } + this.update(source); + } + }, { + key: 'update', + value: function update() { + var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER; + + var oldRange = this.lastRange; + + var _getRange = this.getRange(), + _getRange2 = _slicedToArray(_getRange, 2), + lastRange = _getRange2[0], + nativeRange = _getRange2[1]; + + this.lastRange = lastRange; + if (this.lastRange != null) { + this.savedRange = this.lastRange; + } + if (!(0, _deepEqual2.default)(oldRange, this.lastRange)) { + var _emitter; + + if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) { + this.cursor.restore(); + } + var args = [_emitter4.default.events.SELECTION_CHANGE, (0, _clone2.default)(this.lastRange), (0, _clone2.default)(oldRange), source]; + (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args)); + if (source !== _emitter4.default.sources.SILENT) { + var _emitter2; + + (_emitter2 = this.emitter).emit.apply(_emitter2, args); + } + } + } + }]); + + return Selection; +}(); + +function contains(parent, descendant) { + try { + // Firefox inserts inaccessible nodes around video elements + descendant.parentNode; + } catch (e) { + return false; + } + // IE11 has bug with Text nodes + // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect + if (descendant instanceof Text) { + descendant = descendant.parentNode; + } + return parent.contains(descendant); +} + +exports.Range = Range; +exports.default = Selection; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Break = function (_Parchment$Embed) { + _inherits(Break, _Parchment$Embed); + + function Break() { + _classCallCheck(this, Break); + + return _possibleConstructorReturn(this, (Break.__proto__ || Object.getPrototypeOf(Break)).apply(this, arguments)); + } + + _createClass(Break, [{ + key: 'insertInto', + value: function insertInto(parent, ref) { + if (parent.children.length === 0) { + _get(Break.prototype.__proto__ || Object.getPrototypeOf(Break.prototype), 'insertInto', this).call(this, parent, ref); + } else { + this.remove(); + } + } + }, { + key: 'length', + value: function length() { + return 0; + } + }, { + key: 'value', + value: function value() { + return ''; + } + }], [{ + key: 'value', + value: function value() { + return undefined; + } + }]); + + return Break; +}(_parchment2.default.Embed); + +Break.blotName = 'break'; +Break.tagName = 'BR'; + +exports.default = Break; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var linked_list_1 = __webpack_require__(44); +var shadow_1 = __webpack_require__(30); +var Registry = __webpack_require__(1); +var ContainerBlot = /** @class */ (function (_super) { + __extends(ContainerBlot, _super); + function ContainerBlot(domNode) { + var _this = _super.call(this, domNode) || this; + _this.build(); + return _this; + } + ContainerBlot.prototype.appendChild = function (other) { + this.insertBefore(other); + }; + ContainerBlot.prototype.attach = function () { + _super.prototype.attach.call(this); + this.children.forEach(function (child) { + child.attach(); + }); + }; + ContainerBlot.prototype.build = function () { + var _this = this; + this.children = new linked_list_1.default(); + // Need to be reversed for if DOM nodes already in order + [].slice + .call(this.domNode.childNodes) + .reverse() + .forEach(function (node) { + try { + var child = makeBlot(node); + _this.insertBefore(child, _this.children.head || undefined); + } + catch (err) { + if (err instanceof Registry.ParchmentError) + return; + else + throw err; + } + }); + }; + ContainerBlot.prototype.deleteAt = function (index, length) { + if (index === 0 && length === this.length()) { + return this.remove(); + } + this.children.forEachAt(index, length, function (child, offset, length) { + child.deleteAt(offset, length); + }); + }; + ContainerBlot.prototype.descendant = function (criteria, index) { + var _a = this.children.find(index), child = _a[0], offset = _a[1]; + if ((criteria.blotName == null && criteria(child)) || + (criteria.blotName != null && child instanceof criteria)) { + return [child, offset]; + } + else if (child instanceof ContainerBlot) { + return child.descendant(criteria, offset); + } + else { + return [null, -1]; + } + }; + ContainerBlot.prototype.descendants = function (criteria, index, length) { + if (index === void 0) { index = 0; } + if (length === void 0) { length = Number.MAX_VALUE; } + var descendants = []; + var lengthLeft = length; + this.children.forEachAt(index, length, function (child, index, length) { + if ((criteria.blotName == null && criteria(child)) || + (criteria.blotName != null && child instanceof criteria)) { + descendants.push(child); + } + if (child instanceof ContainerBlot) { + descendants = descendants.concat(child.descendants(criteria, index, lengthLeft)); + } + lengthLeft -= length; + }); + return descendants; + }; + ContainerBlot.prototype.detach = function () { + this.children.forEach(function (child) { + child.detach(); + }); + _super.prototype.detach.call(this); + }; + ContainerBlot.prototype.formatAt = function (index, length, name, value) { + this.children.forEachAt(index, length, function (child, offset, length) { + child.formatAt(offset, length, name, value); + }); + }; + ContainerBlot.prototype.insertAt = function (index, value, def) { + var _a = this.children.find(index), child = _a[0], offset = _a[1]; + if (child) { + child.insertAt(offset, value, def); + } + else { + var blot = def == null ? Registry.create('text', value) : Registry.create(value, def); + this.appendChild(blot); + } + }; + ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) { + if (this.statics.allowedChildren != null && + !this.statics.allowedChildren.some(function (child) { + return childBlot instanceof child; + })) { + throw new Registry.ParchmentError("Cannot insert " + childBlot.statics.blotName + " into " + this.statics.blotName); + } + childBlot.insertInto(this, refBlot); + }; + ContainerBlot.prototype.length = function () { + return this.children.reduce(function (memo, child) { + return memo + child.length(); + }, 0); + }; + ContainerBlot.prototype.moveChildren = function (targetParent, refNode) { + this.children.forEach(function (child) { + targetParent.insertBefore(child, refNode); + }); + }; + ContainerBlot.prototype.optimize = function (context) { + _super.prototype.optimize.call(this, context); + if (this.children.length === 0) { + if (this.statics.defaultChild != null) { + var child = Registry.create(this.statics.defaultChild); + this.appendChild(child); + child.optimize(context); + } + else { + this.remove(); + } + } + }; + ContainerBlot.prototype.path = function (index, inclusive) { + if (inclusive === void 0) { inclusive = false; } + var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1]; + var position = [[this, index]]; + if (child instanceof ContainerBlot) { + return position.concat(child.path(offset, inclusive)); + } + else if (child != null) { + position.push([child, offset]); + } + return position; + }; + ContainerBlot.prototype.removeChild = function (child) { + this.children.remove(child); + }; + ContainerBlot.prototype.replace = function (target) { + if (target instanceof ContainerBlot) { + target.moveChildren(this); + } + _super.prototype.replace.call(this, target); + }; + ContainerBlot.prototype.split = function (index, force) { + if (force === void 0) { force = false; } + if (!force) { + if (index === 0) + return this; + if (index === this.length()) + return this.next; + } + var after = this.clone(); + this.parent.insertBefore(after, this.next); + this.children.forEachAt(index, this.length(), function (child, offset, length) { + child = child.split(offset, force); + after.appendChild(child); + }); + return after; + }; + ContainerBlot.prototype.unwrap = function () { + this.moveChildren(this.parent, this.next); + this.remove(); + }; + ContainerBlot.prototype.update = function (mutations, context) { + var _this = this; + var addedNodes = []; + var removedNodes = []; + mutations.forEach(function (mutation) { + if (mutation.target === _this.domNode && mutation.type === 'childList') { + addedNodes.push.apply(addedNodes, mutation.addedNodes); + removedNodes.push.apply(removedNodes, mutation.removedNodes); + } + }); + removedNodes.forEach(function (node) { + // Check node has actually been removed + // One exception is Chrome does not immediately remove IFRAMEs + // from DOM but MutationRecord is correct in its reported removal + if (node.parentNode != null && + // @ts-ignore + node.tagName !== 'IFRAME' && + document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) { + return; + } + var blot = Registry.find(node); + if (blot == null) + return; + if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) { + blot.detach(); + } + }); + addedNodes + .filter(function (node) { + return node.parentNode == _this.domNode; + }) + .sort(function (a, b) { + if (a === b) + return 0; + if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) { + return 1; + } + return -1; + }) + .forEach(function (node) { + var refBlot = null; + if (node.nextSibling != null) { + refBlot = Registry.find(node.nextSibling); + } + var blot = makeBlot(node); + if (blot.next != refBlot || blot.next == null) { + if (blot.parent != null) { + blot.parent.removeChild(_this); + } + _this.insertBefore(blot, refBlot || undefined); + } + }); + }; + return ContainerBlot; +}(shadow_1.default)); +function makeBlot(node) { + var blot = Registry.find(node); + if (blot == null) { + try { + blot = Registry.create(node); + } + catch (e) { + blot = Registry.create(Registry.Scope.INLINE); + [].slice.call(node.childNodes).forEach(function (child) { + // @ts-ignore + blot.domNode.appendChild(child); + }); + if (node.parentNode) { + node.parentNode.replaceChild(blot.domNode, node); + } + blot.attach(); + } + } + return blot; +} +exports.default = ContainerBlot; + + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +var store_1 = __webpack_require__(31); +var container_1 = __webpack_require__(17); +var Registry = __webpack_require__(1); +var FormatBlot = /** @class */ (function (_super) { + __extends(FormatBlot, _super); + function FormatBlot(domNode) { + var _this = _super.call(this, domNode) || this; + _this.attributes = new store_1.default(_this.domNode); + return _this; + } + FormatBlot.formats = function (domNode) { + if (typeof this.tagName === 'string') { + return true; + } + else if (Array.isArray(this.tagName)) { + return domNode.tagName.toLowerCase(); + } + return undefined; + }; + FormatBlot.prototype.format = function (name, value) { + var format = Registry.query(name); + if (format instanceof attributor_1.default) { + this.attributes.attribute(format, value); + } + else if (value) { + if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) { + this.replaceWith(name, value); + } + } + }; + FormatBlot.prototype.formats = function () { + var formats = this.attributes.values(); + var format = this.statics.formats(this.domNode); + if (format != null) { + formats[this.statics.blotName] = format; + } + return formats; + }; + FormatBlot.prototype.replaceWith = function (name, value) { + var replacement = _super.prototype.replaceWith.call(this, name, value); + this.attributes.copy(replacement); + return replacement; + }; + FormatBlot.prototype.update = function (mutations, context) { + var _this = this; + _super.prototype.update.call(this, mutations, context); + if (mutations.some(function (mutation) { + return mutation.target === _this.domNode && mutation.type === 'attributes'; + })) { + this.attributes.build(); + } + }; + FormatBlot.prototype.wrap = function (name, value) { + var wrapper = _super.prototype.wrap.call(this, name, value); + if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) { + this.attributes.move(wrapper); + } + return wrapper; + }; + return FormatBlot; +}(container_1.default)); +exports.default = FormatBlot; + + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var shadow_1 = __webpack_require__(30); +var Registry = __webpack_require__(1); +var LeafBlot = /** @class */ (function (_super) { + __extends(LeafBlot, _super); + function LeafBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + LeafBlot.value = function (domNode) { + return true; + }; + LeafBlot.prototype.index = function (node, offset) { + if (this.domNode === node || + this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) { + return Math.min(offset, 1); + } + return -1; + }; + LeafBlot.prototype.position = function (index, inclusive) { + var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode); + if (index > 0) + offset += 1; + return [this.parent.domNode, offset]; + }; + LeafBlot.prototype.value = function () { + return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a; + var _a; + }; + LeafBlot.scope = Registry.Scope.INLINE_BLOT; + return LeafBlot; +}(shadow_1.default)); +exports.default = LeafBlot; + + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +var equal = __webpack_require__(11); +var extend = __webpack_require__(3); + + +var lib = { + attributes: { + compose: function (a, b, keepNull) { + if (typeof a !== 'object') a = {}; + if (typeof b !== 'object') b = {}; + var attributes = extend(true, {}, b); + if (!keepNull) { + attributes = Object.keys(attributes).reduce(function (copy, key) { + if (attributes[key] != null) { + copy[key] = attributes[key]; + } + return copy; + }, {}); + } + for (var key in a) { + if (a[key] !== undefined && b[key] === undefined) { + attributes[key] = a[key]; + } + } + return Object.keys(attributes).length > 0 ? attributes : undefined; + }, + + diff: function(a, b) { + if (typeof a !== 'object') a = {}; + if (typeof b !== 'object') b = {}; + var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) { + if (!equal(a[key], b[key])) { + attributes[key] = b[key] === undefined ? null : b[key]; + } + return attributes; + }, {}); + return Object.keys(attributes).length > 0 ? attributes : undefined; + }, + + transform: function (a, b, priority) { + if (typeof a !== 'object') return b; + if (typeof b !== 'object') return undefined; + if (!priority) return b; // b simply overwrites us without priority + var attributes = Object.keys(b).reduce(function (attributes, key) { + if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value + return attributes; + }, {}); + return Object.keys(attributes).length > 0 ? attributes : undefined; + } + }, + + iterator: function (ops) { + return new Iterator(ops); + }, + + length: function (op) { + if (typeof op['delete'] === 'number') { + return op['delete']; + } else if (typeof op.retain === 'number') { + return op.retain; + } else { + return typeof op.insert === 'string' ? op.insert.length : 1; + } + } +}; + + +function Iterator(ops) { + this.ops = ops; + this.index = 0; + this.offset = 0; +}; + +Iterator.prototype.hasNext = function () { + return this.peekLength() < Infinity; +}; + +Iterator.prototype.next = function (length) { + if (!length) length = Infinity; + var nextOp = this.ops[this.index]; + if (nextOp) { + var offset = this.offset; + var opLength = lib.length(nextOp) + if (length >= opLength - offset) { + length = opLength - offset; + this.index += 1; + this.offset = 0; + } else { + this.offset += length; + } + if (typeof nextOp['delete'] === 'number') { + return { 'delete': length }; + } else { + var retOp = {}; + if (nextOp.attributes) { + retOp.attributes = nextOp.attributes; + } + if (typeof nextOp.retain === 'number') { + retOp.retain = length; + } else if (typeof nextOp.insert === 'string') { + retOp.insert = nextOp.insert.substr(offset, length); + } else { + // offset should === 0, length should === 1 + retOp.insert = nextOp.insert; + } + return retOp; + } + } else { + return { retain: Infinity }; + } +}; + +Iterator.prototype.peek = function () { + return this.ops[this.index]; +}; + +Iterator.prototype.peekLength = function () { + if (this.ops[this.index]) { + // Should never return 0 if our index is being managed correctly + return lib.length(this.ops[this.index]) - this.offset; + } else { + return Infinity; + } +}; + +Iterator.prototype.peekType = function () { + if (this.ops[this.index]) { + if (typeof this.ops[this.index]['delete'] === 'number') { + return 'delete'; + } else if (typeof this.ops[this.index].retain === 'number') { + return 'retain'; + } else { + return 'insert'; + } + } + return 'retain'; +}; + + +module.exports = lib; + + +/***/ }), +/* 21 */ +/***/ (function(module, exports) { + +var clone = (function() { +'use strict'; + +function _instanceof(obj, type) { + return type != null && obj instanceof type; +} + +var nativeMap; +try { + nativeMap = Map; +} catch(_) { + // maybe a reference error because no `Map`. Give it a dummy value that no + // value will ever be an instanceof. + nativeMap = function() {}; +} + +var nativeSet; +try { + nativeSet = Set; +} catch(_) { + nativeSet = function() {}; +} + +var nativePromise; +try { + nativePromise = Promise; +} catch(_) { + nativePromise = function() {}; +} + +/** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + * @param `includeNonEnumerable` - set to true if the non-enumerable properties + * should be cloned as well. Non-enumerable properties on the prototype + * chain will be ignored. (optional - false by default) +*/ +function clone(parent, circular, depth, prototype, includeNonEnumerable) { + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + includeNonEnumerable = circular.includeNonEnumerable; + circular = circular.circular; + } + // maintain two arrays for circular references, where corresponding parents + // and children have the same index + var allParents = []; + var allChildren = []; + + var useBuffer = typeof Buffer != 'undefined'; + + if (typeof circular == 'undefined') + circular = true; + + if (typeof depth == 'undefined') + depth = Infinity; + + // recurse this function so we don't reset allParents and allChildren + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) + return null; + + if (depth === 0) + return parent; + + var child; + var proto; + if (typeof parent != 'object') { + return parent; + } + + if (_instanceof(parent, nativeMap)) { + child = new nativeMap(); + } else if (_instanceof(parent, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent, nativePromise)) { + child = new nativePromise(function (resolve, reject) { + parent.then(function(value) { + resolve(_clone(value, depth - 1)); + }, function(err) { + reject(_clone(err, depth - 1)); + }); + }); + } else if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && Buffer.isBuffer(parent)) { + child = new Buffer(parent.length); + parent.copy(child); + return child; + } else if (_instanceof(parent, Error)) { + child = Object.create(parent); + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } + else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + allParents.push(parent); + allChildren.push(child); + } + + if (_instanceof(parent, nativeMap)) { + parent.forEach(function(value, key) { + var keyChild = _clone(key, depth - 1); + var valueChild = _clone(value, depth - 1); + child.set(keyChild, valueChild); + }); + } + if (_instanceof(parent, nativeSet)) { + parent.forEach(function(value) { + var entryChild = _clone(value, depth - 1); + child.add(entryChild); + }); + } + + for (var i in parent) { + var attrs; + if (proto) { + attrs = Object.getOwnPropertyDescriptor(proto, i); + } + + if (attrs && attrs.set == null) { + continue; + } + child[i] = _clone(parent[i], depth - 1); + } + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(parent); + for (var i = 0; i < symbols.length; i++) { + // Don't need to worry about cloning a symbol because it is a primitive, + // like a number or string. + var symbol = symbols[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); + if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { + continue; + } + child[symbol] = _clone(parent[symbol], depth - 1); + if (!descriptor.enumerable) { + Object.defineProperty(child, symbol, { + enumerable: false + }); + } + } + } + + if (includeNonEnumerable) { + var allPropertyNames = Object.getOwnPropertyNames(parent); + for (var i = 0; i < allPropertyNames.length; i++) { + var propertyName = allPropertyNames[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); + if (descriptor && descriptor.enumerable) { + continue; + } + child[propertyName] = _clone(parent[propertyName], depth - 1); + Object.defineProperty(child, propertyName, { + enumerable: false + }); + } + } + + return child; + } + + return _clone(parent, depth); +} + +/** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ +clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); +}; + +// private utility functions + +function __objToStr(o) { + return Object.prototype.toString.call(o); +} +clone.__objToStr = __objToStr; + +function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; +} +clone.__isDate = __isDate; + +function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; +} +clone.__isArray = __isArray; + +function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; +} +clone.__isRegExp = __isRegExp; + +function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; +} +clone.__getRegExpFlags = __getRegExpFlags; + +return clone; +})(); + +if (typeof module === 'object' && module.exports) { + module.exports = clone; +} + + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _emitter = __webpack_require__(8); + +var _emitter2 = _interopRequireDefault(_emitter); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _container = __webpack_require__(25); + +var _container2 = _interopRequireDefault(_container); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function isLine(blot) { + return blot instanceof _block2.default || blot instanceof _block.BlockEmbed; +} + +var Scroll = function (_Parchment$Scroll) { + _inherits(Scroll, _Parchment$Scroll); + + function Scroll(domNode, config) { + _classCallCheck(this, Scroll); + + var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, domNode)); + + _this.emitter = config.emitter; + if (Array.isArray(config.whitelist)) { + _this.whitelist = config.whitelist.reduce(function (whitelist, format) { + whitelist[format] = true; + return whitelist; + }, {}); + } + // Some reason fixes composition issues with character languages in Windows/Chrome, Safari + _this.domNode.addEventListener('DOMNodeInserted', function () {}); + _this.optimize(); + _this.enable(); + return _this; + } + + _createClass(Scroll, [{ + key: 'batchStart', + value: function batchStart() { + this.batch = true; + } + }, { + key: 'batchEnd', + value: function batchEnd() { + this.batch = false; + this.optimize(); + } + }, { + key: 'deleteAt', + value: function deleteAt(index, length) { + var _line = this.line(index), + _line2 = _slicedToArray(_line, 2), + first = _line2[0], + offset = _line2[1]; + + var _line3 = this.line(index + length), + _line4 = _slicedToArray(_line3, 1), + last = _line4[0]; + + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'deleteAt', this).call(this, index, length); + if (last != null && first !== last && offset > 0) { + if (first instanceof _block.BlockEmbed || last instanceof _block.BlockEmbed) { + this.optimize(); + return; + } + if (first instanceof _code2.default) { + var newlineIndex = first.newlineIndex(first.length(), true); + if (newlineIndex > -1) { + first = first.split(newlineIndex + 1); + if (first === last) { + this.optimize(); + return; + } + } + } else if (last instanceof _code2.default) { + var _newlineIndex = last.newlineIndex(0); + if (_newlineIndex > -1) { + last.split(_newlineIndex + 1); + } + } + var ref = last.children.head instanceof _break2.default ? null : last.children.head; + first.moveChildren(last, ref); + first.remove(); + } + this.optimize(); + } + }, { + key: 'enable', + value: function enable() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.domNode.setAttribute('contenteditable', enabled); + } + }, { + key: 'formatAt', + value: function formatAt(index, length, format, value) { + if (this.whitelist != null && !this.whitelist[format]) return; + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'formatAt', this).call(this, index, length, format, value); + this.optimize(); + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (def != null && this.whitelist != null && !this.whitelist[value]) return; + if (index >= this.length()) { + if (def == null || _parchment2.default.query(value, _parchment2.default.Scope.BLOCK) == null) { + var blot = _parchment2.default.create(this.statics.defaultChild); + this.appendChild(blot); + if (def == null && value.endsWith('\n')) { + value = value.slice(0, -1); + } + blot.insertAt(0, value, def); + } else { + var embed = _parchment2.default.create(value, def); + this.appendChild(embed); + } + } else { + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertAt', this).call(this, index, value, def); + } + this.optimize(); + } + }, { + key: 'insertBefore', + value: function insertBefore(blot, ref) { + if (blot.statics.scope === _parchment2.default.Scope.INLINE_BLOT) { + var wrapper = _parchment2.default.create(this.statics.defaultChild); + wrapper.appendChild(blot); + blot = wrapper; + } + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertBefore', this).call(this, blot, ref); + } + }, { + key: 'leaf', + value: function leaf(index) { + return this.path(index).pop() || [null, -1]; + } + }, { + key: 'line', + value: function line(index) { + if (index === this.length()) { + return this.line(index - 1); + } + return this.descendant(isLine, index); + } + }, { + key: 'lines', + value: function lines() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; + + var getLines = function getLines(blot, index, length) { + var lines = [], + lengthLeft = length; + blot.children.forEachAt(index, length, function (child, index, length) { + if (isLine(child)) { + lines.push(child); + } else if (child instanceof _parchment2.default.Container) { + lines = lines.concat(getLines(child, index, lengthLeft)); + } + lengthLeft -= length; + }); + return lines; + }; + return getLines(this, index, length); + } + }, { + key: 'optimize', + value: function optimize() { + var mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (this.batch === true) return; + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'optimize', this).call(this, mutations, context); + if (mutations.length > 0) { + this.emitter.emit(_emitter2.default.events.SCROLL_OPTIMIZE, mutations, context); + } + } + }, { + key: 'path', + value: function path(index) { + return _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'path', this).call(this, index).slice(1); // Exclude self + } + }, { + key: 'update', + value: function update(mutations) { + if (this.batch === true) return; + var source = _emitter2.default.sources.USER; + if (typeof mutations === 'string') { + source = mutations; + } + if (!Array.isArray(mutations)) { + mutations = this.observer.takeRecords(); + } + if (mutations.length > 0) { + this.emitter.emit(_emitter2.default.events.SCROLL_BEFORE_UPDATE, source, mutations); + } + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'update', this).call(this, mutations.concat([])); // pass copy + if (mutations.length > 0) { + this.emitter.emit(_emitter2.default.events.SCROLL_UPDATE, source, mutations); + } + } + }]); + + return Scroll; +}(_parchment2.default.Scroll); + +Scroll.blotName = 'scroll'; +Scroll.className = 'ql-editor'; +Scroll.tagName = 'DIV'; +Scroll.defaultChild = 'block'; +Scroll.allowedChildren = [_block2.default, _block.BlockEmbed, _container2.default]; + +exports.default = Scroll; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SHORTKEY = exports.default = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _clone = __webpack_require__(21); + +var _clone2 = _interopRequireDefault(_clone); + +var _deepEqual = __webpack_require__(11); + +var _deepEqual2 = _interopRequireDefault(_deepEqual); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _op = __webpack_require__(20); + +var _op2 = _interopRequireDefault(_op); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:keyboard'); + +var SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey'; + +var Keyboard = function (_Module) { + _inherits(Keyboard, _Module); + + _createClass(Keyboard, null, [{ + key: 'match', + value: function match(evt, binding) { + binding = normalize(binding); + if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) { + return !!binding[key] !== evt[key] && binding[key] !== null; + })) { + return false; + } + return binding.key === (evt.which || evt.keyCode); + } + }]); + + function Keyboard(quill, options) { + _classCallCheck(this, Keyboard); + + var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options)); + + _this.bindings = {}; + Object.keys(_this.options.bindings).forEach(function (name) { + if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) { + return; + } + if (_this.options.bindings[name]) { + _this.addBinding(_this.options.bindings[name]); + } + }); + _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter); + _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {}); + if (/Firefox/i.test(navigator.userAgent)) { + // Need to handle delete and backspace for Firefox in the general case #1171 + _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace); + _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete); + } else { + _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace); + _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete); + } + _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange); + _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange); + _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace); + _this.listen(); + return _this; + } + + _createClass(Keyboard, [{ + key: 'addBinding', + value: function addBinding(key) { + var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + var binding = normalize(key); + if (binding == null || binding.key == null) { + return debug.warn('Attempted to add invalid keyboard binding', binding); + } + if (typeof context === 'function') { + context = { handler: context }; + } + if (typeof handler === 'function') { + handler = { handler: handler }; + } + binding = (0, _extend2.default)(binding, context, handler); + this.bindings[binding.key] = this.bindings[binding.key] || []; + this.bindings[binding.key].push(binding); + } + }, { + key: 'listen', + value: function listen() { + var _this2 = this; + + this.quill.root.addEventListener('keydown', function (evt) { + if (evt.defaultPrevented) return; + var which = evt.which || evt.keyCode; + var bindings = (_this2.bindings[which] || []).filter(function (binding) { + return Keyboard.match(evt, binding); + }); + if (bindings.length === 0) return; + var range = _this2.quill.getSelection(); + if (range == null || !_this2.quill.hasFocus()) return; + + var _quill$getLine = _this2.quill.getLine(range.index), + _quill$getLine2 = _slicedToArray(_quill$getLine, 2), + line = _quill$getLine2[0], + offset = _quill$getLine2[1]; + + var _quill$getLeaf = _this2.quill.getLeaf(range.index), + _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2), + leafStart = _quill$getLeaf2[0], + offsetStart = _quill$getLeaf2[1]; + + var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length), + _ref2 = _slicedToArray(_ref, 2), + leafEnd = _ref2[0], + offsetEnd = _ref2[1]; + + var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : ''; + var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : ''; + var curContext = { + collapsed: range.length === 0, + empty: range.length === 0 && line.length() <= 1, + format: _this2.quill.getFormat(range), + offset: offset, + prefix: prefixText, + suffix: suffixText + }; + var prevented = bindings.some(function (binding) { + if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false; + if (binding.empty != null && binding.empty !== curContext.empty) return false; + if (binding.offset != null && binding.offset !== curContext.offset) return false; + if (Array.isArray(binding.format)) { + // any format is present + if (binding.format.every(function (name) { + return curContext.format[name] == null; + })) { + return false; + } + } else if (_typeof(binding.format) === 'object') { + // all formats must match + if (!Object.keys(binding.format).every(function (name) { + if (binding.format[name] === true) return curContext.format[name] != null; + if (binding.format[name] === false) return curContext.format[name] == null; + return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]); + })) { + return false; + } + } + if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false; + if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false; + return binding.handler.call(_this2, range, curContext) !== true; + }); + if (prevented) { + evt.preventDefault(); + } + }); + } + }]); + + return Keyboard; +}(_module2.default); + +Keyboard.keys = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + ESCAPE: 27, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 +}; + +Keyboard.DEFAULTS = { + bindings: { + 'bold': makeFormatHandler('bold'), + 'italic': makeFormatHandler('italic'), + 'underline': makeFormatHandler('underline'), + 'indent': { + // highlight tab or tab at beginning of list, indent or blockquote + key: Keyboard.keys.TAB, + format: ['blockquote', 'indent', 'list'], + handler: function handler(range, context) { + if (context.collapsed && context.offset !== 0) return true; + this.quill.format('indent', '+1', _quill2.default.sources.USER); + } + }, + 'outdent': { + key: Keyboard.keys.TAB, + shiftKey: true, + format: ['blockquote', 'indent', 'list'], + // highlight tab or tab at beginning of list, indent or blockquote + handler: function handler(range, context) { + if (context.collapsed && context.offset !== 0) return true; + this.quill.format('indent', '-1', _quill2.default.sources.USER); + } + }, + 'outdent backspace': { + key: Keyboard.keys.BACKSPACE, + collapsed: true, + shiftKey: null, + metaKey: null, + ctrlKey: null, + altKey: null, + format: ['indent', 'list'], + offset: 0, + handler: function handler(range, context) { + if (context.format.indent != null) { + this.quill.format('indent', '-1', _quill2.default.sources.USER); + } else if (context.format.list != null) { + this.quill.format('list', false, _quill2.default.sources.USER); + } + } + }, + 'indent code-block': makeCodeBlockHandler(true), + 'outdent code-block': makeCodeBlockHandler(false), + 'remove tab': { + key: Keyboard.keys.TAB, + shiftKey: true, + collapsed: true, + prefix: /\t$/, + handler: function handler(range) { + this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER); + } + }, + 'tab': { + key: Keyboard.keys.TAB, + handler: function handler(range) { + this.quill.history.cutoff(); + var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\t'); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.history.cutoff(); + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + } + }, + 'list empty enter': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: ['list'], + empty: true, + handler: function handler(range, context) { + this.quill.format('list', false, _quill2.default.sources.USER); + if (context.format.indent) { + this.quill.format('indent', false, _quill2.default.sources.USER); + } + } + }, + 'checklist enter': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: { list: 'checked' }, + handler: function handler(range) { + var _quill$getLine3 = this.quill.getLine(range.index), + _quill$getLine4 = _slicedToArray(_quill$getLine3, 2), + line = _quill$getLine4[0], + offset = _quill$getLine4[1]; + + var formats = (0, _extend2.default)({}, line.formats(), { list: 'checked' }); + var delta = new _quillDelta2.default().retain(range.index).insert('\n', formats).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' }); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + this.quill.scrollIntoView(); + } + }, + 'header enter': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: ['header'], + suffix: /^$/, + handler: function handler(range, context) { + var _quill$getLine5 = this.quill.getLine(range.index), + _quill$getLine6 = _slicedToArray(_quill$getLine5, 2), + line = _quill$getLine6[0], + offset = _quill$getLine6[1]; + + var delta = new _quillDelta2.default().retain(range.index).insert('\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null }); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + this.quill.scrollIntoView(); + } + }, + 'list autofill': { + key: ' ', + collapsed: true, + format: { list: false }, + prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, + handler: function handler(range, context) { + var length = context.prefix.length; + + var _quill$getLine7 = this.quill.getLine(range.index), + _quill$getLine8 = _slicedToArray(_quill$getLine7, 2), + line = _quill$getLine8[0], + offset = _quill$getLine8[1]; + + if (offset > length) return true; + var value = void 0; + switch (context.prefix.trim()) { + case '[]':case '[ ]': + value = 'unchecked'; + break; + case '[x]': + value = 'checked'; + break; + case '-':case '*': + value = 'bullet'; + break; + default: + value = 'ordered'; + } + this.quill.insertText(range.index, ' ', _quill2.default.sources.USER); + this.quill.history.cutoff(); + var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value }); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.history.cutoff(); + this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT); + } + }, + 'code exit': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: ['code-block'], + prefix: /\n\n$/, + suffix: /^\s+$/, + handler: function handler(range) { + var _quill$getLine9 = this.quill.getLine(range.index), + _quill$getLine10 = _slicedToArray(_quill$getLine9, 2), + line = _quill$getLine10[0], + offset = _quill$getLine10[1]; + + var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1); + this.quill.updateContents(delta, _quill2.default.sources.USER); + } + }, + 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false), + 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true), + 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false), + 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true) + } +}; + +function makeEmbedArrowHandler(key, shiftKey) { + var _ref3; + + var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix'; + return _ref3 = { + key: key, + shiftKey: shiftKey, + altKey: null + }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) { + var index = range.index; + if (key === Keyboard.keys.RIGHT) { + index += range.length + 1; + } + + var _quill$getLeaf3 = this.quill.getLeaf(index), + _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1), + leaf = _quill$getLeaf4[0]; + + if (!(leaf instanceof _parchment2.default.Embed)) return true; + if (key === Keyboard.keys.LEFT) { + if (shiftKey) { + this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER); + } else { + this.quill.setSelection(range.index - 1, _quill2.default.sources.USER); + } + } else { + if (shiftKey) { + this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER); + } else { + this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER); + } + } + return false; + }), _ref3; +} + +function handleBackspace(range, context) { + if (range.index === 0 || this.quill.getLength() <= 1) return; + + var _quill$getLine11 = this.quill.getLine(range.index), + _quill$getLine12 = _slicedToArray(_quill$getLine11, 1), + line = _quill$getLine12[0]; + + var formats = {}; + if (context.offset === 0) { + var _quill$getLine13 = this.quill.getLine(range.index - 1), + _quill$getLine14 = _slicedToArray(_quill$getLine13, 1), + prev = _quill$getLine14[0]; + + if (prev != null && prev.length() > 1) { + var curFormats = line.formats(); + var prevFormats = this.quill.getFormat(range.index - 1, 1); + formats = _op2.default.attributes.diff(curFormats, prevFormats) || {}; + } + } + // Check for astral symbols + var length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1; + this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER); + if (Object.keys(formats).length > 0) { + this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER); + } + this.quill.focus(); +} + +function handleDelete(range, context) { + // Check for astral symbols + var length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1; + if (range.index >= this.quill.getLength() - length) return; + var formats = {}, + nextLength = 0; + + var _quill$getLine15 = this.quill.getLine(range.index), + _quill$getLine16 = _slicedToArray(_quill$getLine15, 1), + line = _quill$getLine16[0]; + + if (context.offset >= line.length() - 1) { + var _quill$getLine17 = this.quill.getLine(range.index + 1), + _quill$getLine18 = _slicedToArray(_quill$getLine17, 1), + next = _quill$getLine18[0]; + + if (next) { + var curFormats = line.formats(); + var nextFormats = this.quill.getFormat(range.index, 1); + formats = _op2.default.attributes.diff(curFormats, nextFormats) || {}; + nextLength = next.length(); + } + } + this.quill.deleteText(range.index, length, _quill2.default.sources.USER); + if (Object.keys(formats).length > 0) { + this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER); + } +} + +function handleDeleteRange(range) { + var lines = this.quill.getLines(range); + var formats = {}; + if (lines.length > 1) { + var firstFormats = lines[0].formats(); + var lastFormats = lines[lines.length - 1].formats(); + formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {}; + } + this.quill.deleteText(range, _quill2.default.sources.USER); + if (Object.keys(formats).length > 0) { + this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER); + } + this.quill.setSelection(range.index, _quill2.default.sources.SILENT); + this.quill.focus(); +} + +function handleEnter(range, context) { + var _this3 = this; + + if (range.length > 0) { + this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change + } + var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) { + if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) { + lineFormats[format] = context.format[format]; + } + return lineFormats; + }, {}); + this.quill.insertText(range.index, '\n', lineFormats, _quill2.default.sources.USER); + // Earlier scroll.deleteAt might have messed up our selection, + // so insertText's built in selection preservation is not reliable + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + this.quill.focus(); + Object.keys(context.format).forEach(function (name) { + if (lineFormats[name] != null) return; + if (Array.isArray(context.format[name])) return; + if (name === 'link') return; + _this3.quill.format(name, context.format[name], _quill2.default.sources.USER); + }); +} + +function makeCodeBlockHandler(indent) { + return { + key: Keyboard.keys.TAB, + shiftKey: !indent, + format: { 'code-block': true }, + handler: function handler(range) { + var CodeBlock = _parchment2.default.query('code-block'); + var index = range.index, + length = range.length; + + var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index), + _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2), + block = _quill$scroll$descend2[0], + offset = _quill$scroll$descend2[1]; + + if (block == null) return; + var scrollIndex = this.quill.getIndex(block); + var start = block.newlineIndex(offset, true) + 1; + var end = block.newlineIndex(scrollIndex + offset + length); + var lines = block.domNode.textContent.slice(start, end).split('\n'); + offset = 0; + lines.forEach(function (line, i) { + if (indent) { + block.insertAt(start + offset, CodeBlock.TAB); + offset += CodeBlock.TAB.length; + if (i === 0) { + index += CodeBlock.TAB.length; + } else { + length += CodeBlock.TAB.length; + } + } else if (line.startsWith(CodeBlock.TAB)) { + block.deleteAt(start + offset, CodeBlock.TAB.length); + offset -= CodeBlock.TAB.length; + if (i === 0) { + index -= CodeBlock.TAB.length; + } else { + length -= CodeBlock.TAB.length; + } + } + offset += line.length + 1; + }); + this.quill.update(_quill2.default.sources.USER); + this.quill.setSelection(index, length, _quill2.default.sources.SILENT); + } + }; +} + +function makeFormatHandler(format) { + return { + key: format[0].toUpperCase(), + shortKey: true, + handler: function handler(range, context) { + this.quill.format(format, !context.format[format], _quill2.default.sources.USER); + } + }; +} + +function normalize(binding) { + if (typeof binding === 'string' || typeof binding === 'number') { + return normalize({ key: binding }); + } + if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') { + binding = (0, _clone2.default)(binding, false); + } + if (typeof binding.key === 'string') { + if (Keyboard.keys[binding.key.toUpperCase()] != null) { + binding.key = Keyboard.keys[binding.key.toUpperCase()]; + } else if (binding.key.length === 1) { + binding.key = binding.key.toUpperCase().charCodeAt(0); + } else { + return null; + } + } + if (binding.shortKey) { + binding[SHORTKEY] = binding.shortKey; + delete binding.shortKey; + } + return binding; +} + +exports.default = Keyboard; +exports.SHORTKEY = SHORTKEY; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Cursor = function (_Parchment$Embed) { + _inherits(Cursor, _Parchment$Embed); + + _createClass(Cursor, null, [{ + key: 'value', + value: function value() { + return undefined; + } + }]); + + function Cursor(domNode, selection) { + _classCallCheck(this, Cursor); + + var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode)); + + _this.selection = selection; + _this.textNode = document.createTextNode(Cursor.CONTENTS); + _this.domNode.appendChild(_this.textNode); + _this._length = 0; + return _this; + } + + _createClass(Cursor, [{ + key: 'detach', + value: function detach() { + // super.detach() will also clear domNode.__blot + if (this.parent != null) this.parent.removeChild(this); + } + }, { + key: 'format', + value: function format(name, value) { + if (this._length !== 0) { + return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value); + } + var target = this, + index = 0; + while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) { + index += target.offset(target.parent); + target = target.parent; + } + if (target != null) { + this._length = Cursor.CONTENTS.length; + target.optimize(); + target.formatAt(index, Cursor.CONTENTS.length, name, value); + this._length = 0; + } + } + }, { + key: 'index', + value: function index(node, offset) { + if (node === this.textNode) return 0; + return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset); + } + }, { + key: 'length', + value: function length() { + return this._length; + } + }, { + key: 'position', + value: function position() { + return [this.textNode, this.textNode.data.length]; + } + }, { + key: 'remove', + value: function remove() { + _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this); + this.parent = null; + } + }, { + key: 'restore', + value: function restore() { + if (this.selection.composing || this.parent == null) return; + var textNode = this.textNode; + var range = this.selection.getNativeRange(); + var restoreText = void 0, + start = void 0, + end = void 0; + if (range != null && range.start.node === textNode && range.end.node === textNode) { + var _ref = [textNode, range.start.offset, range.end.offset]; + restoreText = _ref[0]; + start = _ref[1]; + end = _ref[2]; + } + // Link format will insert text outside of anchor tag + while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) { + this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); + } + if (this.textNode.data !== Cursor.CONTENTS) { + var text = this.textNode.data.split(Cursor.CONTENTS).join(''); + if (this.next instanceof _text2.default) { + restoreText = this.next.domNode; + this.next.insertAt(0, text); + this.textNode.data = Cursor.CONTENTS; + } else { + this.textNode.data = text; + this.parent.insertBefore(_parchment2.default.create(this.textNode), this); + this.textNode = document.createTextNode(Cursor.CONTENTS); + this.domNode.appendChild(this.textNode); + } + } + this.remove(); + if (start != null) { + var _map = [start, end].map(function (offset) { + return Math.max(0, Math.min(restoreText.data.length, offset - 1)); + }); + + var _map2 = _slicedToArray(_map, 2); + + start = _map2[0]; + end = _map2[1]; + + return { + startNode: restoreText, + startOffset: start, + endNode: restoreText, + endOffset: end + }; + } + } + }, { + key: 'update', + value: function update(mutations, context) { + var _this2 = this; + + if (mutations.some(function (mutation) { + return mutation.type === 'characterData' && mutation.target === _this2.textNode; + })) { + var range = this.restore(); + if (range) context.range = range; + } + } + }, { + key: 'value', + value: function value() { + return ''; + } + }]); + + return Cursor; +}(_parchment2.default.Embed); + +Cursor.blotName = 'cursor'; +Cursor.className = 'ql-cursor'; +Cursor.tagName = 'span'; +Cursor.CONTENTS = '\uFEFF'; // Zero width no break space + + +exports.default = Cursor; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Container = function (_Parchment$Container) { + _inherits(Container, _Parchment$Container); + + function Container() { + _classCallCheck(this, Container); + + return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).apply(this, arguments)); + } + + return Container; +}(_parchment2.default.Container); + +Container.allowedChildren = [_block2.default, _block.BlockEmbed, Container]; + +exports.default = Container; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ColorStyle = exports.ColorClass = exports.ColorAttributor = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ColorAttributor = function (_Parchment$Attributor) { + _inherits(ColorAttributor, _Parchment$Attributor); + + function ColorAttributor() { + _classCallCheck(this, ColorAttributor); + + return _possibleConstructorReturn(this, (ColorAttributor.__proto__ || Object.getPrototypeOf(ColorAttributor)).apply(this, arguments)); + } + + _createClass(ColorAttributor, [{ + key: 'value', + value: function value(domNode) { + var value = _get(ColorAttributor.prototype.__proto__ || Object.getPrototypeOf(ColorAttributor.prototype), 'value', this).call(this, domNode); + if (!value.startsWith('rgb(')) return value; + value = value.replace(/^[^\d]+/, '').replace(/[^\d]+$/, ''); + return '#' + value.split(',').map(function (component) { + return ('00' + parseInt(component).toString(16)).slice(-2); + }).join(''); + } + }]); + + return ColorAttributor; +}(_parchment2.default.Attributor.Style); + +var ColorClass = new _parchment2.default.Attributor.Class('color', 'ql-color', { + scope: _parchment2.default.Scope.INLINE +}); +var ColorStyle = new ColorAttributor('color', 'color', { + scope: _parchment2.default.Scope.INLINE +}); + +exports.ColorAttributor = ColorAttributor; +exports.ColorClass = ColorClass; +exports.ColorStyle = ColorStyle; + +/***/ }), +/* 27 */, +/* 28 */, +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _container = __webpack_require__(25); + +var _container2 = _interopRequireDefault(_container); + +var _cursor = __webpack_require__(24); + +var _cursor2 = _interopRequireDefault(_cursor); + +var _embed = __webpack_require__(35); + +var _embed2 = _interopRequireDefault(_embed); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +var _scroll = __webpack_require__(22); + +var _scroll2 = _interopRequireDefault(_scroll); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +var _clipboard = __webpack_require__(55); + +var _clipboard2 = _interopRequireDefault(_clipboard); + +var _history = __webpack_require__(42); + +var _history2 = _interopRequireDefault(_history); + +var _keyboard = __webpack_require__(23); + +var _keyboard2 = _interopRequireDefault(_keyboard); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_quill2.default.register({ + 'blots/block': _block2.default, + 'blots/block/embed': _block.BlockEmbed, + 'blots/break': _break2.default, + 'blots/container': _container2.default, + 'blots/cursor': _cursor2.default, + 'blots/embed': _embed2.default, + 'blots/inline': _inline2.default, + 'blots/scroll': _scroll2.default, + 'blots/text': _text2.default, + + 'modules/clipboard': _clipboard2.default, + 'modules/history': _history2.default, + 'modules/keyboard': _keyboard2.default +}); + +_parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default); + +exports.default = _quill2.default; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Registry = __webpack_require__(1); +var ShadowBlot = /** @class */ (function () { + function ShadowBlot(domNode) { + this.domNode = domNode; + // @ts-ignore + this.domNode[Registry.DATA_KEY] = { blot: this }; + } + Object.defineProperty(ShadowBlot.prototype, "statics", { + // Hack for accessing inherited static methods + get: function () { + return this.constructor; + }, + enumerable: true, + configurable: true + }); + ShadowBlot.create = function (value) { + if (this.tagName == null) { + throw new Registry.ParchmentError('Blot definition missing tagName'); + } + var node; + if (Array.isArray(this.tagName)) { + if (typeof value === 'string') { + value = value.toUpperCase(); + if (parseInt(value).toString() === value) { + value = parseInt(value); + } + } + if (typeof value === 'number') { + node = document.createElement(this.tagName[value - 1]); + } + else if (this.tagName.indexOf(value) > -1) { + node = document.createElement(value); + } + else { + node = document.createElement(this.tagName[0]); + } + } + else { + node = document.createElement(this.tagName); + } + if (this.className) { + node.classList.add(this.className); + } + return node; + }; + ShadowBlot.prototype.attach = function () { + if (this.parent != null) { + this.scroll = this.parent.scroll; + } + }; + ShadowBlot.prototype.clone = function () { + var domNode = this.domNode.cloneNode(false); + return Registry.create(domNode); + }; + ShadowBlot.prototype.detach = function () { + if (this.parent != null) + this.parent.removeChild(this); + // @ts-ignore + delete this.domNode[Registry.DATA_KEY]; + }; + ShadowBlot.prototype.deleteAt = function (index, length) { + var blot = this.isolate(index, length); + blot.remove(); + }; + ShadowBlot.prototype.formatAt = function (index, length, name, value) { + var blot = this.isolate(index, length); + if (Registry.query(name, Registry.Scope.BLOT) != null && value) { + blot.wrap(name, value); + } + else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) { + var parent = Registry.create(this.statics.scope); + blot.wrap(parent); + parent.format(name, value); + } + }; + ShadowBlot.prototype.insertAt = function (index, value, def) { + var blot = def == null ? Registry.create('text', value) : Registry.create(value, def); + var ref = this.split(index); + this.parent.insertBefore(blot, ref); + }; + ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) { + if (refBlot === void 0) { refBlot = null; } + if (this.parent != null) { + this.parent.children.remove(this); + } + var refDomNode = null; + parentBlot.children.insertBefore(this, refBlot); + if (refBlot != null) { + refDomNode = refBlot.domNode; + } + if (this.domNode.parentNode != parentBlot.domNode || + this.domNode.nextSibling != refDomNode) { + parentBlot.domNode.insertBefore(this.domNode, refDomNode); + } + this.parent = parentBlot; + this.attach(); + }; + ShadowBlot.prototype.isolate = function (index, length) { + var target = this.split(index); + target.split(length); + return target; + }; + ShadowBlot.prototype.length = function () { + return 1; + }; + ShadowBlot.prototype.offset = function (root) { + if (root === void 0) { root = this.parent; } + if (this.parent == null || this == root) + return 0; + return this.parent.children.offset(this) + this.parent.offset(root); + }; + ShadowBlot.prototype.optimize = function (context) { + // TODO clean up once we use WeakMap + // @ts-ignore + if (this.domNode[Registry.DATA_KEY] != null) { + // @ts-ignore + delete this.domNode[Registry.DATA_KEY].mutations; + } + }; + ShadowBlot.prototype.remove = function () { + if (this.domNode.parentNode != null) { + this.domNode.parentNode.removeChild(this.domNode); + } + this.detach(); + }; + ShadowBlot.prototype.replace = function (target) { + if (target.parent == null) + return; + target.parent.insertBefore(this, target.next); + target.remove(); + }; + ShadowBlot.prototype.replaceWith = function (name, value) { + var replacement = typeof name === 'string' ? Registry.create(name, value) : name; + replacement.replace(this); + return replacement; + }; + ShadowBlot.prototype.split = function (index, force) { + return index === 0 ? this : this.next; + }; + ShadowBlot.prototype.update = function (mutations, context) { + // Nothing to do by default + }; + ShadowBlot.prototype.wrap = function (name, value) { + var wrapper = typeof name === 'string' ? Registry.create(name, value) : name; + if (this.parent != null) { + this.parent.insertBefore(wrapper, this.next); + } + wrapper.appendChild(this); + return wrapper; + }; + ShadowBlot.blotName = 'abstract'; + return ShadowBlot; +}()); +exports.default = ShadowBlot; + + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +var class_1 = __webpack_require__(32); +var style_1 = __webpack_require__(33); +var Registry = __webpack_require__(1); +var AttributorStore = /** @class */ (function () { + function AttributorStore(domNode) { + this.attributes = {}; + this.domNode = domNode; + this.build(); + } + AttributorStore.prototype.attribute = function (attribute, value) { + // verb + if (value) { + if (attribute.add(this.domNode, value)) { + if (attribute.value(this.domNode) != null) { + this.attributes[attribute.attrName] = attribute; + } + else { + delete this.attributes[attribute.attrName]; + } + } + } + else { + attribute.remove(this.domNode); + delete this.attributes[attribute.attrName]; + } + }; + AttributorStore.prototype.build = function () { + var _this = this; + this.attributes = {}; + var attributes = attributor_1.default.keys(this.domNode); + var classes = class_1.default.keys(this.domNode); + var styles = style_1.default.keys(this.domNode); + attributes + .concat(classes) + .concat(styles) + .forEach(function (name) { + var attr = Registry.query(name, Registry.Scope.ATTRIBUTE); + if (attr instanceof attributor_1.default) { + _this.attributes[attr.attrName] = attr; + } + }); + }; + AttributorStore.prototype.copy = function (target) { + var _this = this; + Object.keys(this.attributes).forEach(function (key) { + var value = _this.attributes[key].value(_this.domNode); + target.format(key, value); + }); + }; + AttributorStore.prototype.move = function (target) { + var _this = this; + this.copy(target); + Object.keys(this.attributes).forEach(function (key) { + _this.attributes[key].remove(_this.domNode); + }); + this.attributes = {}; + }; + AttributorStore.prototype.values = function () { + var _this = this; + return Object.keys(this.attributes).reduce(function (attributes, name) { + attributes[name] = _this.attributes[name].value(_this.domNode); + return attributes; + }, {}); + }; + return AttributorStore; +}()); +exports.default = AttributorStore; + + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +function match(node, prefix) { + var className = node.getAttribute('class') || ''; + return className.split(/\s+/).filter(function (name) { + return name.indexOf(prefix + "-") === 0; + }); +} +var ClassAttributor = /** @class */ (function (_super) { + __extends(ClassAttributor, _super); + function ClassAttributor() { + return _super !== null && _super.apply(this, arguments) || this; + } + ClassAttributor.keys = function (node) { + return (node.getAttribute('class') || '').split(/\s+/).map(function (name) { + return name + .split('-') + .slice(0, -1) + .join('-'); + }); + }; + ClassAttributor.prototype.add = function (node, value) { + if (!this.canAdd(node, value)) + return false; + this.remove(node); + node.classList.add(this.keyName + "-" + value); + return true; + }; + ClassAttributor.prototype.remove = function (node) { + var matches = match(node, this.keyName); + matches.forEach(function (name) { + node.classList.remove(name); + }); + if (node.classList.length === 0) { + node.removeAttribute('class'); + } + }; + ClassAttributor.prototype.value = function (node) { + var result = match(node, this.keyName)[0] || ''; + var value = result.slice(this.keyName.length + 1); // +1 for hyphen + return this.canAdd(node, value) ? value : ''; + }; + return ClassAttributor; +}(attributor_1.default)); +exports.default = ClassAttributor; + + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +function camelize(name) { + var parts = name.split('-'); + var rest = parts + .slice(1) + .map(function (part) { + return part[0].toUpperCase() + part.slice(1); + }) + .join(''); + return parts[0] + rest; +} +var StyleAttributor = /** @class */ (function (_super) { + __extends(StyleAttributor, _super); + function StyleAttributor() { + return _super !== null && _super.apply(this, arguments) || this; + } + StyleAttributor.keys = function (node) { + return (node.getAttribute('style') || '').split(';').map(function (value) { + var arr = value.split(':'); + return arr[0].trim(); + }); + }; + StyleAttributor.prototype.add = function (node, value) { + if (!this.canAdd(node, value)) + return false; + // @ts-ignore + node.style[camelize(this.keyName)] = value; + return true; + }; + StyleAttributor.prototype.remove = function (node) { + // @ts-ignore + node.style[camelize(this.keyName)] = ''; + if (!node.getAttribute('style')) { + node.removeAttribute('style'); + } + }; + StyleAttributor.prototype.value = function (node) { + // @ts-ignore + var value = node.style[camelize(this.keyName)]; + return this.canAdd(node, value) ? value : ''; + }; + return StyleAttributor; +}(attributor_1.default)); +exports.default = StyleAttributor; + + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Theme = function () { + function Theme(quill, options) { + _classCallCheck(this, Theme); + + this.quill = quill; + this.options = options; + this.modules = {}; + } + + _createClass(Theme, [{ + key: 'init', + value: function init() { + var _this = this; + + Object.keys(this.options.modules).forEach(function (name) { + if (_this.modules[name] == null) { + _this.addModule(name); + } + }); + } + }, { + key: 'addModule', + value: function addModule(name) { + var moduleClass = this.quill.constructor.import('modules/' + name); + this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {}); + return this.modules[name]; + } + }]); + + return Theme; +}(); + +Theme.DEFAULTS = { + modules: {} +}; +Theme.themes = { + 'default': Theme +}; + +exports.default = Theme; + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var GUARD_TEXT = '\uFEFF'; + +var Embed = function (_Parchment$Embed) { + _inherits(Embed, _Parchment$Embed); + + function Embed(node) { + _classCallCheck(this, Embed); + + var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node)); + + _this.contentNode = document.createElement('span'); + _this.contentNode.setAttribute('contenteditable', false); + [].slice.call(_this.domNode.childNodes).forEach(function (childNode) { + _this.contentNode.appendChild(childNode); + }); + _this.leftGuard = document.createTextNode(GUARD_TEXT); + _this.rightGuard = document.createTextNode(GUARD_TEXT); + _this.domNode.appendChild(_this.leftGuard); + _this.domNode.appendChild(_this.contentNode); + _this.domNode.appendChild(_this.rightGuard); + return _this; + } + + _createClass(Embed, [{ + key: 'index', + value: function index(node, offset) { + if (node === this.leftGuard) return 0; + if (node === this.rightGuard) return 1; + return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset); + } + }, { + key: 'restore', + value: function restore(node) { + var range = void 0, + textNode = void 0; + var text = node.data.split(GUARD_TEXT).join(''); + if (node === this.leftGuard) { + if (this.prev instanceof _text2.default) { + var prevLength = this.prev.length(); + this.prev.insertAt(prevLength, text); + range = { + startNode: this.prev.domNode, + startOffset: prevLength + text.length + }; + } else { + textNode = document.createTextNode(text); + this.parent.insertBefore(_parchment2.default.create(textNode), this); + range = { + startNode: textNode, + startOffset: text.length + }; + } + } else if (node === this.rightGuard) { + if (this.next instanceof _text2.default) { + this.next.insertAt(0, text); + range = { + startNode: this.next.domNode, + startOffset: text.length + }; + } else { + textNode = document.createTextNode(text); + this.parent.insertBefore(_parchment2.default.create(textNode), this.next); + range = { + startNode: textNode, + startOffset: text.length + }; + } + } + node.data = GUARD_TEXT; + return range; + } + }, { + key: 'update', + value: function update(mutations, context) { + var _this2 = this; + + mutations.forEach(function (mutation) { + if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) { + var range = _this2.restore(mutation.target); + if (range) context.range = range; + } + }); + } + }]); + + return Embed; +}(_parchment2.default.Embed); + +exports.default = Embed; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.AlignStyle = exports.AlignClass = exports.AlignAttribute = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var config = { + scope: _parchment2.default.Scope.BLOCK, + whitelist: ['right', 'center', 'justify'] +}; + +var AlignAttribute = new _parchment2.default.Attributor.Attribute('align', 'align', config); +var AlignClass = new _parchment2.default.Attributor.Class('align', 'ql-align', config); +var AlignStyle = new _parchment2.default.Attributor.Style('align', 'text-align', config); + +exports.AlignAttribute = AlignAttribute; +exports.AlignClass = AlignClass; +exports.AlignStyle = AlignStyle; + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.BackgroundStyle = exports.BackgroundClass = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _color = __webpack_require__(26); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var BackgroundClass = new _parchment2.default.Attributor.Class('background', 'ql-bg', { + scope: _parchment2.default.Scope.INLINE +}); +var BackgroundStyle = new _color.ColorAttributor('background', 'background-color', { + scope: _parchment2.default.Scope.INLINE +}); + +exports.BackgroundClass = BackgroundClass; +exports.BackgroundStyle = BackgroundStyle; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DirectionStyle = exports.DirectionClass = exports.DirectionAttribute = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var config = { + scope: _parchment2.default.Scope.BLOCK, + whitelist: ['rtl'] +}; + +var DirectionAttribute = new _parchment2.default.Attributor.Attribute('direction', 'dir', config); +var DirectionClass = new _parchment2.default.Attributor.Class('direction', 'ql-direction', config); +var DirectionStyle = new _parchment2.default.Attributor.Style('direction', 'direction', config); + +exports.DirectionAttribute = DirectionAttribute; +exports.DirectionClass = DirectionClass; +exports.DirectionStyle = DirectionStyle; + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.FontClass = exports.FontStyle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var config = { + scope: _parchment2.default.Scope.INLINE, + whitelist: ['serif', 'monospace'] +}; + +var FontClass = new _parchment2.default.Attributor.Class('font', 'ql-font', config); + +var FontStyleAttributor = function (_Parchment$Attributor) { + _inherits(FontStyleAttributor, _Parchment$Attributor); + + function FontStyleAttributor() { + _classCallCheck(this, FontStyleAttributor); + + return _possibleConstructorReturn(this, (FontStyleAttributor.__proto__ || Object.getPrototypeOf(FontStyleAttributor)).apply(this, arguments)); + } + + _createClass(FontStyleAttributor, [{ + key: 'value', + value: function value(node) { + return _get(FontStyleAttributor.prototype.__proto__ || Object.getPrototypeOf(FontStyleAttributor.prototype), 'value', this).call(this, node).replace(/["']/g, ''); + } + }]); + + return FontStyleAttributor; +}(_parchment2.default.Attributor.Style); + +var FontStyle = new FontStyleAttributor('font', 'font-family', config); + +exports.FontStyle = FontStyle; +exports.FontClass = FontClass; + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SizeStyle = exports.SizeClass = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var SizeClass = new _parchment2.default.Attributor.Class('size', 'ql-size', { + scope: _parchment2.default.Scope.INLINE, + whitelist: ['small', 'large', 'huge'] +}); +var SizeStyle = new _parchment2.default.Attributor.Style('size', 'font-size', { + scope: _parchment2.default.Scope.INLINE, + whitelist: ['10px', '18px', '32px'] +}); + +exports.SizeClass = SizeClass; +exports.SizeStyle = SizeStyle; + +/***/ }), +/* 41 */, +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getLastChangeIndex = exports.default = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var History = function (_Module) { + _inherits(History, _Module); + + function History(quill, options) { + _classCallCheck(this, History); + + var _this = _possibleConstructorReturn(this, (History.__proto__ || Object.getPrototypeOf(History)).call(this, quill, options)); + + _this.lastRecorded = 0; + _this.ignoreChange = false; + _this.clear(); + _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (eventName, delta, oldDelta, source) { + if (eventName !== _quill2.default.events.TEXT_CHANGE || _this.ignoreChange) return; + if (!_this.options.userOnly || source === _quill2.default.sources.USER) { + _this.record(delta, oldDelta); + } else { + _this.transform(delta); + } + }); + _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, _this.undo.bind(_this)); + _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, _this.redo.bind(_this)); + if (/Win/i.test(navigator.platform)) { + _this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, _this.redo.bind(_this)); + } + return _this; + } + + _createClass(History, [{ + key: 'change', + value: function change(source, dest) { + if (this.stack[source].length === 0) return; + var delta = this.stack[source].pop(); + this.stack[dest].push(delta); + this.lastRecorded = 0; + this.ignoreChange = true; + this.quill.updateContents(delta[source], _quill2.default.sources.USER); + this.ignoreChange = false; + var index = getLastChangeIndex(delta[source]); + this.quill.setSelection(index); + } + }, { + key: 'clear', + value: function clear() { + this.stack = { undo: [], redo: [] }; + } + }, { + key: 'cutoff', + value: function cutoff() { + this.lastRecorded = 0; + } + }, { + key: 'record', + value: function record(changeDelta, oldDelta) { + if (changeDelta.ops.length === 0) return; + this.stack.redo = []; + var undoDelta = this.quill.getContents().diff(oldDelta); + var timestamp = Date.now(); + if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) { + var delta = this.stack.undo.pop(); + undoDelta = undoDelta.compose(delta.undo); + changeDelta = delta.redo.compose(changeDelta); + } else { + this.lastRecorded = timestamp; + } + this.stack.undo.push({ + redo: changeDelta, + undo: undoDelta + }); + if (this.stack.undo.length > this.options.maxStack) { + this.stack.undo.shift(); + } + } + }, { + key: 'redo', + value: function redo() { + this.change('redo', 'undo'); + } + }, { + key: 'transform', + value: function transform(delta) { + this.stack.undo.forEach(function (change) { + change.undo = delta.transform(change.undo, true); + change.redo = delta.transform(change.redo, true); + }); + this.stack.redo.forEach(function (change) { + change.undo = delta.transform(change.undo, true); + change.redo = delta.transform(change.redo, true); + }); + } + }, { + key: 'undo', + value: function undo() { + this.change('undo', 'redo'); + } + }]); + + return History; +}(_module2.default); + +History.DEFAULTS = { + delay: 1000, + maxStack: 100, + userOnly: false +}; + +function endsWithNewlineChange(delta) { + var lastOp = delta.ops[delta.ops.length - 1]; + if (lastOp == null) return false; + if (lastOp.insert != null) { + return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\n'); + } + if (lastOp.attributes != null) { + return Object.keys(lastOp.attributes).some(function (attr) { + return _parchment2.default.query(attr, _parchment2.default.Scope.BLOCK) != null; + }); + } + return false; +} + +function getLastChangeIndex(delta) { + var deleteLength = delta.reduce(function (length, op) { + length += op.delete || 0; + return length; + }, 0); + var changeIndex = delta.length() - deleteLength; + if (endsWithNewlineChange(delta)) { + changeIndex -= 1; + } + return changeIndex; +} + +exports.default = History; +exports.getLastChangeIndex = getLastChangeIndex; + +/***/ }), +/* 43 */, +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var LinkedList = /** @class */ (function () { + function LinkedList() { + this.head = this.tail = null; + this.length = 0; + } + LinkedList.prototype.append = function () { + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + this.insertBefore(nodes[0], null); + if (nodes.length > 1) { + this.append.apply(this, nodes.slice(1)); + } + }; + LinkedList.prototype.contains = function (node) { + var cur, next = this.iterator(); + while ((cur = next())) { + if (cur === node) + return true; + } + return false; + }; + LinkedList.prototype.insertBefore = function (node, refNode) { + if (!node) + return; + node.next = refNode; + if (refNode != null) { + node.prev = refNode.prev; + if (refNode.prev != null) { + refNode.prev.next = node; + } + refNode.prev = node; + if (refNode === this.head) { + this.head = node; + } + } + else if (this.tail != null) { + this.tail.next = node; + node.prev = this.tail; + this.tail = node; + } + else { + node.prev = null; + this.head = this.tail = node; + } + this.length += 1; + }; + LinkedList.prototype.offset = function (target) { + var index = 0, cur = this.head; + while (cur != null) { + if (cur === target) + return index; + index += cur.length(); + cur = cur.next; + } + return -1; + }; + LinkedList.prototype.remove = function (node) { + if (!this.contains(node)) + return; + if (node.prev != null) + node.prev.next = node.next; + if (node.next != null) + node.next.prev = node.prev; + if (node === this.head) + this.head = node.next; + if (node === this.tail) + this.tail = node.prev; + this.length -= 1; + }; + LinkedList.prototype.iterator = function (curNode) { + if (curNode === void 0) { curNode = this.head; } + // TODO use yield when we can + return function () { + var ret = curNode; + if (curNode != null) + curNode = curNode.next; + return ret; + }; + }; + LinkedList.prototype.find = function (index, inclusive) { + if (inclusive === void 0) { inclusive = false; } + var cur, next = this.iterator(); + while ((cur = next())) { + var length = cur.length(); + if (index < length || + (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) { + return [cur, index]; + } + index -= length; + } + return [null, 0]; + }; + LinkedList.prototype.forEach = function (callback) { + var cur, next = this.iterator(); + while ((cur = next())) { + callback(cur); + } + }; + LinkedList.prototype.forEachAt = function (index, length, callback) { + if (length <= 0) + return; + var _a = this.find(index), startNode = _a[0], offset = _a[1]; + var cur, curIndex = index - offset, next = this.iterator(startNode); + while ((cur = next()) && curIndex < index + length) { + var curLength = cur.length(); + if (index > curIndex) { + callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index)); + } + else { + callback(cur, 0, Math.min(curLength, index + length - curIndex)); + } + curIndex += curLength; + } + }; + LinkedList.prototype.map = function (callback) { + return this.reduce(function (memo, cur) { + memo.push(callback(cur)); + return memo; + }, []); + }; + LinkedList.prototype.reduce = function (callback, memo) { + var cur, next = this.iterator(); + while ((cur = next())) { + memo = callback(memo, cur); + } + return memo; + }; + return LinkedList; +}()); +exports.default = LinkedList; + + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var container_1 = __webpack_require__(17); +var Registry = __webpack_require__(1); +var OBSERVER_CONFIG = { + attributes: true, + characterData: true, + characterDataOldValue: true, + childList: true, + subtree: true, +}; +var MAX_OPTIMIZE_ITERATIONS = 100; +var ScrollBlot = /** @class */ (function (_super) { + __extends(ScrollBlot, _super); + function ScrollBlot(node) { + var _this = _super.call(this, node) || this; + _this.scroll = _this; + _this.observer = new MutationObserver(function (mutations) { + _this.update(mutations); + }); + _this.observer.observe(_this.domNode, OBSERVER_CONFIG); + _this.attach(); + return _this; + } + ScrollBlot.prototype.detach = function () { + _super.prototype.detach.call(this); + this.observer.disconnect(); + }; + ScrollBlot.prototype.deleteAt = function (index, length) { + this.update(); + if (index === 0 && length === this.length()) { + this.children.forEach(function (child) { + child.remove(); + }); + } + else { + _super.prototype.deleteAt.call(this, index, length); + } + }; + ScrollBlot.prototype.formatAt = function (index, length, name, value) { + this.update(); + _super.prototype.formatAt.call(this, index, length, name, value); + }; + ScrollBlot.prototype.insertAt = function (index, value, def) { + this.update(); + _super.prototype.insertAt.call(this, index, value, def); + }; + ScrollBlot.prototype.optimize = function (mutations, context) { + var _this = this; + if (mutations === void 0) { mutations = []; } + if (context === void 0) { context = {}; } + _super.prototype.optimize.call(this, context); + // We must modify mutations directly, cannot make copy and then modify + var records = [].slice.call(this.observer.takeRecords()); + // Array.push currently seems to be implemented by a non-tail recursive function + // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords()); + while (records.length > 0) + mutations.push(records.pop()); + // TODO use WeakMap + var mark = function (blot, markParent) { + if (markParent === void 0) { markParent = true; } + if (blot == null || blot === _this) + return; + if (blot.domNode.parentNode == null) + return; + // @ts-ignore + if (blot.domNode[Registry.DATA_KEY].mutations == null) { + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations = []; + } + if (markParent) + mark(blot.parent); + }; + var optimize = function (blot) { + // Post-order traversal + if ( + // @ts-ignore + blot.domNode[Registry.DATA_KEY] == null || + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations == null) { + return; + } + if (blot instanceof container_1.default) { + blot.children.forEach(optimize); + } + blot.optimize(context); + }; + var remaining = mutations; + for (var i = 0; remaining.length > 0; i += 1) { + if (i >= MAX_OPTIMIZE_ITERATIONS) { + throw new Error('[Parchment] Maximum optimize iterations reached'); + } + remaining.forEach(function (mutation) { + var blot = Registry.find(mutation.target, true); + if (blot == null) + return; + if (blot.domNode === mutation.target) { + if (mutation.type === 'childList') { + mark(Registry.find(mutation.previousSibling, false)); + [].forEach.call(mutation.addedNodes, function (node) { + var child = Registry.find(node, false); + mark(child, false); + if (child instanceof container_1.default) { + child.children.forEach(function (grandChild) { + mark(grandChild, false); + }); + } + }); + } + else if (mutation.type === 'attributes') { + mark(blot.prev); + } + } + mark(blot); + }); + this.children.forEach(optimize); + remaining = [].slice.call(this.observer.takeRecords()); + records = remaining.slice(); + while (records.length > 0) + mutations.push(records.pop()); + } + }; + ScrollBlot.prototype.update = function (mutations, context) { + var _this = this; + if (context === void 0) { context = {}; } + mutations = mutations || this.observer.takeRecords(); + // TODO use WeakMap + mutations + .map(function (mutation) { + var blot = Registry.find(mutation.target, true); + if (blot == null) + return null; + // @ts-ignore + if (blot.domNode[Registry.DATA_KEY].mutations == null) { + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations = [mutation]; + return blot; + } + else { + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations.push(mutation); + return null; + } + }) + .forEach(function (blot) { + if (blot == null || + blot === _this || + //@ts-ignore + blot.domNode[Registry.DATA_KEY] == null) + return; + // @ts-ignore + blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context); + }); + // @ts-ignore + if (this.domNode[Registry.DATA_KEY].mutations != null) { + // @ts-ignore + _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context); + } + this.optimize(mutations, context); + }; + ScrollBlot.blotName = 'scroll'; + ScrollBlot.defaultChild = 'block'; + ScrollBlot.scope = Registry.Scope.BLOCK_BLOT; + ScrollBlot.tagName = 'DIV'; + return ScrollBlot; +}(container_1.default)); +exports.default = ScrollBlot; + + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var format_1 = __webpack_require__(18); +var Registry = __webpack_require__(1); +// Shallow object comparison +function isEqual(obj1, obj2) { + if (Object.keys(obj1).length !== Object.keys(obj2).length) + return false; + // @ts-ignore + for (var prop in obj1) { + // @ts-ignore + if (obj1[prop] !== obj2[prop]) + return false; + } + return true; +} +var InlineBlot = /** @class */ (function (_super) { + __extends(InlineBlot, _super); + function InlineBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + InlineBlot.formats = function (domNode) { + if (domNode.tagName === InlineBlot.tagName) + return undefined; + return _super.formats.call(this, domNode); + }; + InlineBlot.prototype.format = function (name, value) { + var _this = this; + if (name === this.statics.blotName && !value) { + this.children.forEach(function (child) { + if (!(child instanceof format_1.default)) { + child = child.wrap(InlineBlot.blotName, true); + } + _this.attributes.copy(child); + }); + this.unwrap(); + } + else { + _super.prototype.format.call(this, name, value); + } + }; + InlineBlot.prototype.formatAt = function (index, length, name, value) { + if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) { + var blot = this.isolate(index, length); + blot.format(name, value); + } + else { + _super.prototype.formatAt.call(this, index, length, name, value); + } + }; + InlineBlot.prototype.optimize = function (context) { + _super.prototype.optimize.call(this, context); + var formats = this.formats(); + if (Object.keys(formats).length === 0) { + return this.unwrap(); // unformatted span + } + var next = this.next; + if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) { + next.moveChildren(this); + next.remove(); + } + }; + InlineBlot.blotName = 'inline'; + InlineBlot.scope = Registry.Scope.INLINE_BLOT; + InlineBlot.tagName = 'SPAN'; + return InlineBlot; +}(format_1.default)); +exports.default = InlineBlot; + + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var format_1 = __webpack_require__(18); +var Registry = __webpack_require__(1); +var BlockBlot = /** @class */ (function (_super) { + __extends(BlockBlot, _super); + function BlockBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + BlockBlot.formats = function (domNode) { + var tagName = Registry.query(BlockBlot.blotName).tagName; + if (domNode.tagName === tagName) + return undefined; + return _super.formats.call(this, domNode); + }; + BlockBlot.prototype.format = function (name, value) { + if (Registry.query(name, Registry.Scope.BLOCK) == null) { + return; + } + else if (name === this.statics.blotName && !value) { + this.replaceWith(BlockBlot.blotName); + } + else { + _super.prototype.format.call(this, name, value); + } + }; + BlockBlot.prototype.formatAt = function (index, length, name, value) { + if (Registry.query(name, Registry.Scope.BLOCK) != null) { + this.format(name, value); + } + else { + _super.prototype.formatAt.call(this, index, length, name, value); + } + }; + BlockBlot.prototype.insertAt = function (index, value, def) { + if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) { + // Insert text or inline + _super.prototype.insertAt.call(this, index, value, def); + } + else { + var after = this.split(index); + var blot = Registry.create(value, def); + after.parent.insertBefore(blot, after); + } + }; + BlockBlot.prototype.update = function (mutations, context) { + if (navigator.userAgent.match(/Trident/)) { + this.build(); + } + else { + _super.prototype.update.call(this, mutations, context); + } + }; + BlockBlot.blotName = 'block'; + BlockBlot.scope = Registry.Scope.BLOCK_BLOT; + BlockBlot.tagName = 'P'; + return BlockBlot; +}(format_1.default)); +exports.default = BlockBlot; + + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var leaf_1 = __webpack_require__(19); +var EmbedBlot = /** @class */ (function (_super) { + __extends(EmbedBlot, _super); + function EmbedBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + EmbedBlot.formats = function (domNode) { + return undefined; + }; + EmbedBlot.prototype.format = function (name, value) { + // super.formatAt wraps, which is what we want in general, + // but this allows subclasses to overwrite for formats + // that just apply to particular embeds + _super.prototype.formatAt.call(this, 0, this.length(), name, value); + }; + EmbedBlot.prototype.formatAt = function (index, length, name, value) { + if (index === 0 && length === this.length()) { + this.format(name, value); + } + else { + _super.prototype.formatAt.call(this, index, length, name, value); + } + }; + EmbedBlot.prototype.formats = function () { + return this.statics.formats(this.domNode); + }; + return EmbedBlot; +}(leaf_1.default)); +exports.default = EmbedBlot; + + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var leaf_1 = __webpack_require__(19); +var Registry = __webpack_require__(1); +var TextBlot = /** @class */ (function (_super) { + __extends(TextBlot, _super); + function TextBlot(node) { + var _this = _super.call(this, node) || this; + _this.text = _this.statics.value(_this.domNode); + return _this; + } + TextBlot.create = function (value) { + return document.createTextNode(value); + }; + TextBlot.value = function (domNode) { + var text = domNode.data; + // @ts-ignore + if (text['normalize']) + text = text['normalize'](); + return text; + }; + TextBlot.prototype.deleteAt = function (index, length) { + this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length); + }; + TextBlot.prototype.index = function (node, offset) { + if (this.domNode === node) { + return offset; + } + return -1; + }; + TextBlot.prototype.insertAt = function (index, value, def) { + if (def == null) { + this.text = this.text.slice(0, index) + value + this.text.slice(index); + this.domNode.data = this.text; + } + else { + _super.prototype.insertAt.call(this, index, value, def); + } + }; + TextBlot.prototype.length = function () { + return this.text.length; + }; + TextBlot.prototype.optimize = function (context) { + _super.prototype.optimize.call(this, context); + this.text = this.statics.value(this.domNode); + if (this.text.length === 0) { + this.remove(); + } + else if (this.next instanceof TextBlot && this.next.prev === this) { + this.insertAt(this.length(), this.next.value()); + this.next.remove(); + } + }; + TextBlot.prototype.position = function (index, inclusive) { + if (inclusive === void 0) { inclusive = false; } + return [this.domNode, index]; + }; + TextBlot.prototype.split = function (index, force) { + if (force === void 0) { force = false; } + if (!force) { + if (index === 0) + return this; + if (index === this.length()) + return this.next; + } + var after = Registry.create(this.domNode.splitText(index)); + this.parent.insertBefore(after, this.next); + this.text = this.statics.value(this.domNode); + return after; + }; + TextBlot.prototype.update = function (mutations, context) { + var _this = this; + if (mutations.some(function (mutation) { + return mutation.type === 'characterData' && mutation.target === _this.domNode; + })) { + this.text = this.statics.value(this.domNode); + } + }; + TextBlot.prototype.value = function () { + return this.text; + }; + TextBlot.blotName = 'text'; + TextBlot.scope = Registry.Scope.INLINE_BLOT; + return TextBlot; +}(leaf_1.default)); +exports.default = TextBlot; + + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var elem = document.createElement('div'); +elem.classList.toggle('test-class', false); +if (elem.classList.contains('test-class')) { + var _toggle = DOMTokenList.prototype.toggle; + DOMTokenList.prototype.toggle = function (token, force) { + if (arguments.length > 1 && !this.contains(token) === !force) { + return force; + } else { + return _toggle.call(this, token); + } + }; +} + +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; +} + +if (!String.prototype.endsWith) { + String.prototype.endsWith = function (searchString, position) { + var subjectString = this.toString(); + if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; +} + +if (!Array.prototype.find) { + Object.defineProperty(Array.prototype, "find", { + value: function value(predicate) { + if (this === null) { + throw new TypeError('Array.prototype.find called on null or undefined'); + } + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + var list = Object(this); + var length = list.length >>> 0; + var thisArg = arguments[1]; + var value; + + for (var i = 0; i < length; i++) { + value = list[i]; + if (predicate.call(thisArg, value, i, list)) { + return value; + } + } + return undefined; + } + }); +} + +document.addEventListener("DOMContentLoaded", function () { + // Disable resizing in Firefox + document.execCommand("enableObjectResizing", false, false); + // Disable automatic linkifying in IE11 + document.execCommand("autoUrlDetect", false, false); +}); + +/***/ }), +/* 51 */ +/***/ (function(module, exports) { + +/** + * This library modifies the diff-patch-match library by Neil Fraser + * by removing the patch and match functionality and certain advanced + * options in the diff function. The original license is as follows: + * + * === + * + * Diff Match and Patch + * + * Copyright 2006 Google Inc. + * http://code.google.com/p/google-diff-match-patch/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * The data structure representing a diff is an array of tuples: + * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']] + * which means: delete 'Hello', add 'Goodbye' and keep ' world.' + */ +var DIFF_DELETE = -1; +var DIFF_INSERT = 1; +var DIFF_EQUAL = 0; + + +/** + * Find the differences between two texts. Simplifies the problem by stripping + * any common prefix or suffix off the texts before diffing. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {Int} cursor_pos Expected edit position in text1 (optional) + * @return {Array} Array of diff tuples. + */ +function diff_main(text1, text2, cursor_pos) { + // Check for equality (speedup). + if (text1 == text2) { + if (text1) { + return [[DIFF_EQUAL, text1]]; + } + return []; + } + + // Check cursor_pos within bounds + if (cursor_pos < 0 || text1.length < cursor_pos) { + cursor_pos = null; + } + + // Trim off common prefix (speedup). + var commonlength = diff_commonPrefix(text1, text2); + var commonprefix = text1.substring(0, commonlength); + text1 = text1.substring(commonlength); + text2 = text2.substring(commonlength); + + // Trim off common suffix (speedup). + commonlength = diff_commonSuffix(text1, text2); + var commonsuffix = text1.substring(text1.length - commonlength); + text1 = text1.substring(0, text1.length - commonlength); + text2 = text2.substring(0, text2.length - commonlength); + + // Compute the diff on the middle block. + var diffs = diff_compute_(text1, text2); + + // Restore the prefix and suffix. + if (commonprefix) { + diffs.unshift([DIFF_EQUAL, commonprefix]); + } + if (commonsuffix) { + diffs.push([DIFF_EQUAL, commonsuffix]); + } + diff_cleanupMerge(diffs); + if (cursor_pos != null) { + diffs = fix_cursor(diffs, cursor_pos); + } + diffs = fix_emoji(diffs); + return diffs; +}; + + +/** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @return {Array} Array of diff tuples. + */ +function diff_compute_(text1, text2) { + var diffs; + + if (!text1) { + // Just add some text (speedup). + return [[DIFF_INSERT, text2]]; + } + + if (!text2) { + // Just delete some text (speedup). + return [[DIFF_DELETE, text1]]; + } + + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + var i = longtext.indexOf(shorttext); + if (i != -1) { + // Shorter text is inside the longer text (speedup). + diffs = [[DIFF_INSERT, longtext.substring(0, i)], + [DIFF_EQUAL, shorttext], + [DIFF_INSERT, longtext.substring(i + shorttext.length)]]; + // Swap insertions for deletions if diff is reversed. + if (text1.length > text2.length) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if (shorttext.length == 1) { + // Single character string. + // After the previous speedup, the character can't be an equality. + return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; + } + + // Check to see if the problem can be split in two. + var hm = diff_halfMatch_(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + var text1_a = hm[0]; + var text1_b = hm[1]; + var text2_a = hm[2]; + var text2_b = hm[3]; + var mid_common = hm[4]; + // Send both pairs off for separate processing. + var diffs_a = diff_main(text1_a, text2_a); + var diffs_b = diff_main(text1_b, text2_b); + // Merge the results. + return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b); + } + + return diff_bisect_(text1, text2); +}; + + +/** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @return {Array} Array of diff tuples. + * @private + */ +function diff_bisect_(text1, text2) { + // Cache the text lengths to prevent multiple calls. + var text1_length = text1.length; + var text2_length = text2.length; + var max_d = Math.ceil((text1_length + text2_length) / 2); + var v_offset = max_d; + var v_length = 2 * max_d; + var v1 = new Array(v_length); + var v2 = new Array(v_length); + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (var x = 0; x < v_length; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[v_offset + 1] = 0; + v2[v_offset + 1] = 0; + var delta = text1_length - text2_length; + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + var front = (delta % 2 != 0); + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + var k1start = 0; + var k1end = 0; + var k2start = 0; + var k2end = 0; + for (var d = 0; d < max_d; d++) { + // Walk the front path one step. + for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + var k1_offset = v_offset + k1; + var x1; + if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) { + x1 = v1[k1_offset + 1]; + } else { + x1 = v1[k1_offset - 1] + 1; + } + var y1 = x1 - k1; + while (x1 < text1_length && y1 < text2_length && + text1.charAt(x1) == text2.charAt(y1)) { + x1++; + y1++; + } + v1[k1_offset] = x1; + if (x1 > text1_length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2_length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + var k2_offset = v_offset + delta - k1; + if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) { + // Mirror x2 onto top-left coordinate system. + var x2 = text1_length - v2[k2_offset]; + if (x1 >= x2) { + // Overlap detected. + return diff_bisectSplit_(text1, text2, x1, y1); + } + } + } + } + + // Walk the reverse path one step. + for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + var k2_offset = v_offset + k2; + var x2; + if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) { + x2 = v2[k2_offset + 1]; + } else { + x2 = v2[k2_offset - 1] + 1; + } + var y2 = x2 - k2; + while (x2 < text1_length && y2 < text2_length && + text1.charAt(text1_length - x2 - 1) == + text2.charAt(text2_length - y2 - 1)) { + x2++; + y2++; + } + v2[k2_offset] = x2; + if (x2 > text1_length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2_length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + var k1_offset = v_offset + delta - k2; + if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) { + var x1 = v1[k1_offset]; + var y1 = v_offset + x1 - k1_offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1_length - x2; + if (x1 >= x2) { + // Overlap detected. + return diff_bisectSplit_(text1, text2, x1, y1); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; +}; + + +/** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @return {Array} Array of diff tuples. + */ +function diff_bisectSplit_(text1, text2, x, y) { + var text1a = text1.substring(0, x); + var text2a = text2.substring(0, y); + var text1b = text1.substring(x); + var text2b = text2.substring(y); + + // Compute both diffs serially. + var diffs = diff_main(text1a, text2a); + var diffsb = diff_main(text1b, text2b); + + return diffs.concat(diffsb); +}; + + +/** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ +function diff_commonPrefix(text1, text2) { + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + var pointerstart = 0; + while (pointermin < pointermid) { + if (text1.substring(pointerstart, pointermid) == + text2.substring(pointerstart, pointermid)) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; +}; + + +/** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ +function diff_commonSuffix(text1, text2) { + // Quick check for common null cases. + if (!text1 || !text2 || + text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + var pointerend = 0; + while (pointermin < pointermid) { + if (text1.substring(text1.length - pointermid, text1.length - pointerend) == + text2.substring(text2.length - pointermid, text2.length - pointerend)) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; +}; + + +/** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + */ +function diff_halfMatch_(text1, text2) { + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diff_halfMatchI_(longtext, shorttext, i) { + // Start with a 1/4 length substring at position i as a seed. + var seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + var j = -1; + var best_common = ''; + var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; + while ((j = shorttext.indexOf(seed, j + 1)) != -1) { + var prefixLength = diff_commonPrefix(longtext.substring(i), + shorttext.substring(j)); + var suffixLength = diff_commonSuffix(longtext.substring(0, i), + shorttext.substring(0, j)); + if (best_common.length < suffixLength + prefixLength) { + best_common = shorttext.substring(j - suffixLength, j) + + shorttext.substring(j, j + prefixLength); + best_longtext_a = longtext.substring(0, i - suffixLength); + best_longtext_b = longtext.substring(i + prefixLength); + best_shorttext_a = shorttext.substring(0, j - suffixLength); + best_shorttext_b = shorttext.substring(j + prefixLength); + } + } + if (best_common.length * 2 >= longtext.length) { + return [best_longtext_a, best_longtext_b, + best_shorttext_a, best_shorttext_b, best_common]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + var hm1 = diff_halfMatchI_(longtext, shorttext, + Math.ceil(longtext.length / 4)); + // Check again based on the third quarter. + var hm2 = diff_halfMatchI_(longtext, shorttext, + Math.ceil(longtext.length / 2)); + var hm; + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + var text1_a, text1_b, text2_a, text2_b; + if (text1.length > text2.length) { + text1_a = hm[0]; + text1_b = hm[1]; + text2_a = hm[2]; + text2_b = hm[3]; + } else { + text2_a = hm[0]; + text2_b = hm[1]; + text1_a = hm[2]; + text1_b = hm[3]; + } + var mid_common = hm[4]; + return [text1_a, text1_b, text2_a, text2_b, mid_common]; +}; + + +/** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {Array} diffs Array of diff tuples. + */ +function diff_cleanupMerge(diffs) { + diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end. + var pointer = 0; + var count_delete = 0; + var count_insert = 0; + var text_delete = ''; + var text_insert = ''; + var commonlength; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + count_insert++; + text_insert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + count_delete++; + text_delete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (count_delete + count_insert > 1) { + if (count_delete !== 0 && count_insert !== 0) { + // Factor out any common prefixies. + commonlength = diff_commonPrefix(text_insert, text_delete); + if (commonlength !== 0) { + if ((pointer - count_delete - count_insert) > 0 && + diffs[pointer - count_delete - count_insert - 1][0] == + DIFF_EQUAL) { + diffs[pointer - count_delete - count_insert - 1][1] += + text_insert.substring(0, commonlength); + } else { + diffs.splice(0, 0, [DIFF_EQUAL, + text_insert.substring(0, commonlength)]); + pointer++; + } + text_insert = text_insert.substring(commonlength); + text_delete = text_delete.substring(commonlength); + } + // Factor out any common suffixies. + commonlength = diff_commonSuffix(text_insert, text_delete); + if (commonlength !== 0) { + diffs[pointer][1] = text_insert.substring(text_insert.length - + commonlength) + diffs[pointer][1]; + text_insert = text_insert.substring(0, text_insert.length - + commonlength); + text_delete = text_delete.substring(0, text_delete.length - + commonlength); + } + } + // Delete the offending records and add the merged ones. + if (count_delete === 0) { + diffs.splice(pointer - count_insert, + count_delete + count_insert, [DIFF_INSERT, text_insert]); + } else if (count_insert === 0) { + diffs.splice(pointer - count_delete, + count_delete + count_insert, [DIFF_DELETE, text_delete]); + } else { + diffs.splice(pointer - count_delete - count_insert, + count_delete + count_insert, [DIFF_DELETE, text_delete], + [DIFF_INSERT, text_insert]); + } + pointer = pointer - count_delete - count_insert + + (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1; + } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) { + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + count_insert = 0; + count_delete = 0; + text_delete = ''; + text_insert = ''; + break; + } + } + if (diffs[diffs.length - 1][1] === '') { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + var changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] == DIFF_EQUAL && + diffs[pointer + 1][0] == DIFF_EQUAL) { + // This is a single edit surrounded by equalities. + if (diffs[pointer][1].substring(diffs[pointer][1].length - + diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) { + // Shift the edit over the previous equality. + diffs[pointer][1] = diffs[pointer - 1][1] + + diffs[pointer][1].substring(0, diffs[pointer][1].length - + diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == + diffs[pointer + 1][1]) { + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = + diffs[pointer][1].substring(diffs[pointer + 1][1].length) + + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + diff_cleanupMerge(diffs); + } +}; + + +var diff = diff_main; +diff.INSERT = DIFF_INSERT; +diff.DELETE = DIFF_DELETE; +diff.EQUAL = DIFF_EQUAL; + +module.exports = diff; + +/* + * Modify a diff such that the cursor position points to the start of a change: + * E.g. + * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1) + * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]] + * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2) + * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]] + * + * @param {Array} diffs Array of diff tuples + * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds! + * @return {Array} A tuple [cursor location in the modified diff, modified diff] + */ +function cursor_normalize_diff (diffs, cursor_pos) { + if (cursor_pos === 0) { + return [DIFF_EQUAL, diffs]; + } + for (var current_pos = 0, i = 0; i < diffs.length; i++) { + var d = diffs[i]; + if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) { + var next_pos = current_pos + d[1].length; + if (cursor_pos === next_pos) { + return [i + 1, diffs]; + } else if (cursor_pos < next_pos) { + // copy to prevent side effects + diffs = diffs.slice(); + // split d into two diff changes + var split_pos = cursor_pos - current_pos; + var d_left = [d[0], d[1].slice(0, split_pos)]; + var d_right = [d[0], d[1].slice(split_pos)]; + diffs.splice(i, 1, d_left, d_right); + return [i + 1, diffs]; + } else { + current_pos = next_pos; + } + } + } + throw new Error('cursor_pos is out of bounds!') +} + +/* + * Modify a diff such that the edit position is "shifted" to the proposed edit location (cursor_position). + * + * Case 1) + * Check if a naive shift is possible: + * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X) + * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result + * Case 2) + * Check if the following shifts are possible: + * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix'] + * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix'] + * ^ ^ + * d d_next + * + * @param {Array} diffs Array of diff tuples + * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds! + * @return {Array} Array of diff tuples + */ +function fix_cursor (diffs, cursor_pos) { + var norm = cursor_normalize_diff(diffs, cursor_pos); + var ndiffs = norm[1]; + var cursor_pointer = norm[0]; + var d = ndiffs[cursor_pointer]; + var d_next = ndiffs[cursor_pointer + 1]; + + if (d == null) { + // Text was deleted from end of original string, + // cursor is now out of bounds in new string + return diffs; + } else if (d[0] !== DIFF_EQUAL) { + // A modification happened at the cursor location. + // This is the expected outcome, so we can return the original diff. + return diffs; + } else { + if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) { + // Case 1) + // It is possible to perform a naive shift + ndiffs.splice(cursor_pointer, 2, d_next, d) + return merge_tuples(ndiffs, cursor_pointer, 2) + } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) { + // Case 2) + // d[1] is a prefix of d_next[1] + // We can assume that d_next[0] !== 0, since d[0] === 0 + // Shift edit locations.. + ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]); + var suffix = d_next[1].slice(d[1].length); + if (suffix.length > 0) { + ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]); + } + return merge_tuples(ndiffs, cursor_pointer, 3) + } else { + // Not possible to perform any modification + return diffs; + } + } +} + +/* + * Check diff did not split surrogate pairs. + * Ex. [0, '\uD83D'], [-1, '\uDC36'], [1, '\uDC2F'] -> [-1, '\uD83D\uDC36'], [1, '\uD83D\uDC2F'] + * '\uD83D\uDC36' === '🐶', '\uD83D\uDC2F' === '🐯' + * + * @param {Array} diffs Array of diff tuples + * @return {Array} Array of diff tuples + */ +function fix_emoji (diffs) { + var compact = false; + var starts_with_pair_end = function(str) { + return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF; + } + var ends_with_pair_start = function(str) { + return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF; + } + for (var i = 2; i < diffs.length; i += 1) { + if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) && + diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) && + diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) { + compact = true; + + diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1]; + diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1]; + + diffs[i-2][1] = diffs[i-2][1].slice(0, -1); + } + } + if (!compact) { + return diffs; + } + var fixed_diffs = []; + for (var i = 0; i < diffs.length; i += 1) { + if (diffs[i][1].length > 0) { + fixed_diffs.push(diffs[i]); + } + } + return fixed_diffs; +} + +/* + * Try to merge tuples with their neigbors in a given range. + * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab'] + * + * @param {Array} diffs Array of diff tuples. + * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]). + * @param {Int} length Number of consecutive elements to check. + * @return {Array} Array of merged diff tuples. + */ +function merge_tuples (diffs, start, length) { + // Check from (start-1) to (start+length). + for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) { + if (i + 1 < diffs.length) { + var left_d = diffs[i]; + var right_d = diffs[i+1]; + if (left_d[0] === right_d[1]) { + diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]); + } + } + } + return diffs; +} + + +/***/ }), +/* 52 */ +/***/ (function(module, exports) { + +exports = module.exports = typeof Object.keys === 'function' + ? Object.keys : shim; + +exports.shim = shim; +function shim (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} + + +/***/ }), +/* 53 */ +/***/ (function(module, exports) { + +var supportsArgumentsClass = (function(){ + return Object.prototype.toString.call(arguments) +})() == '[object Arguments]'; + +exports = module.exports = supportsArgumentsClass ? supported : unsupported; + +exports.supported = supported; +function supported(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +}; + +exports.unsupported = unsupported; +function unsupported(object){ + return object && + typeof object == 'object' && + typeof object.length == 'number' && + Object.prototype.hasOwnProperty.call(object, 'callee') && + !Object.prototype.propertyIsEnumerable.call(object, 'callee') || + false; +}; + + +/***/ }), +/* 54 */ +/***/ (function(module, exports) { + +'use strict'; + +var has = Object.prototype.hasOwnProperty + , prefix = '~'; + +/** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @api private + */ +function Events() {} + +// +// We try to not inherit from `Object.prototype`. In some engines creating an +// instance in this way is faster than calling `Object.create(null)` directly. +// If `Object.create(null)` is not supported we prefix the event names with a +// character to make sure that the built-in object properties are not +// overridden or used as an attack vector. +// +if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; +} + +/** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {Mixed} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @api private + */ +function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; +} + +/** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @api public + */ +function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; +} + +/** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @api public + */ +EventEmitter.prototype.eventNames = function eventNames() { + var names = [] + , events + , name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; +}; + +/** + * Return the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Boolean} exists Only check if there are listeners. + * @returns {Array|Boolean} + * @api public + */ +EventEmitter.prototype.listeners = function listeners(event, exists) { + var evt = prefix ? prefix + event : event + , available = this._events[evt]; + + if (exists) return !!available; + if (!available) return []; + if (available.fn) return [available.fn]; + + for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { + ee[i] = available[i].fn; + } + + return ee; +}; + +/** + * Calls each of the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @api public + */ +EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt] + , len = arguments.length + , args + , i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: return listeners.fn.call(listeners.context), true; + case 2: return listeners.fn.call(listeners.context, a1), true; + case 3: return listeners.fn.call(listeners.context, a1, a2), true; + case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len -1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length + , j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: listeners[i].fn.call(listeners[i].context); break; + case 2: listeners[i].fn.call(listeners[i].context, a1); break; + case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; + case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; + default: + if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; +}; + +/** + * Add a listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.on = function on(event, fn, context) { + var listener = new EE(fn, context || this) + , evt = prefix ? prefix + event : event; + + if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; +}; + +/** + * Add a one-time listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.once = function once(event, fn, context) { + var listener = new EE(fn, context || this, true) + , evt = prefix ? prefix + event : event; + + if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; +}; + +/** + * Remove the listeners of a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {Mixed} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn + && (!once || listeners.once) + && (!context || listeners.context === context) + ) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn + || (once && !listeners[i].once) + || (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + + return this; +}; + +/** + * Remove all listeners, or those of the specified event. + * + * @param {String|Symbol} [event] The event name. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; +}; + +// +// Alias methods names because people roll like that. +// +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +// +// This function doesn't apply anymore. +// +EventEmitter.prototype.setMaxListeners = function setMaxListeners() { + return this; +}; + +// +// Expose the prefix. +// +EventEmitter.prefixed = prefix; + +// +// Allow `EventEmitter` to be imported as module namespace. +// +EventEmitter.EventEmitter = EventEmitter; + +// +// Expose the module. +// +if ('undefined' !== typeof module) { + module.exports = EventEmitter; +} + + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.matchText = exports.matchSpacing = exports.matchNewline = exports.matchBlot = exports.matchAttributor = exports.default = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _extend2 = __webpack_require__(3); + +var _extend3 = _interopRequireDefault(_extend2); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +var _align = __webpack_require__(36); + +var _background = __webpack_require__(37); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _color = __webpack_require__(26); + +var _direction = __webpack_require__(38); + +var _font = __webpack_require__(39); + +var _size = __webpack_require__(40); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:clipboard'); + +var DOM_KEY = '__ql-matcher'; + +var CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], [Node.TEXT_NODE, matchNewline], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchSpacing], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['li', matchIndent], ['b', matchAlias.bind(matchAlias, 'bold')], ['i', matchAlias.bind(matchAlias, 'italic')], ['style', matchIgnore]]; + +var ATTRIBUTE_ATTRIBUTORS = [_align.AlignAttribute, _direction.DirectionAttribute].reduce(function (memo, attr) { + memo[attr.keyName] = attr; + return memo; +}, {}); + +var STYLE_ATTRIBUTORS = [_align.AlignStyle, _background.BackgroundStyle, _color.ColorStyle, _direction.DirectionStyle, _font.FontStyle, _size.SizeStyle].reduce(function (memo, attr) { + memo[attr.keyName] = attr; + return memo; +}, {}); + +var Clipboard = function (_Module) { + _inherits(Clipboard, _Module); + + function Clipboard(quill, options) { + _classCallCheck(this, Clipboard); + + var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this, quill, options)); + + _this.quill.root.addEventListener('paste', _this.onPaste.bind(_this)); + _this.container = _this.quill.addContainer('ql-clipboard'); + _this.container.setAttribute('contenteditable', true); + _this.container.setAttribute('tabindex', -1); + _this.matchers = []; + CLIPBOARD_CONFIG.concat(_this.options.matchers).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + selector = _ref2[0], + matcher = _ref2[1]; + + if (!options.matchVisual && matcher === matchSpacing) return; + _this.addMatcher(selector, matcher); + }); + return _this; + } + + _createClass(Clipboard, [{ + key: 'addMatcher', + value: function addMatcher(selector, matcher) { + this.matchers.push([selector, matcher]); + } + }, { + key: 'convert', + value: function convert(html) { + if (typeof html === 'string') { + this.container.innerHTML = html.replace(/\>\r?\n +\<'); // Remove spaces between tags + return this.convert(); + } + var formats = this.quill.getFormat(this.quill.selection.savedRange.index); + if (formats[_code2.default.blotName]) { + var text = this.container.innerText; + this.container.innerHTML = ''; + return new _quillDelta2.default().insert(text, _defineProperty({}, _code2.default.blotName, formats[_code2.default.blotName])); + } + + var _prepareMatching = this.prepareMatching(), + _prepareMatching2 = _slicedToArray(_prepareMatching, 2), + elementMatchers = _prepareMatching2[0], + textMatchers = _prepareMatching2[1]; + + var delta = traverse(this.container, elementMatchers, textMatchers); + // Remove trailing newline + if (deltaEndsWith(delta, '\n') && delta.ops[delta.ops.length - 1].attributes == null) { + delta = delta.compose(new _quillDelta2.default().retain(delta.length() - 1).delete(1)); + } + debug.log('convert', this.container.innerHTML, delta); + this.container.innerHTML = ''; + return delta; + } + }, { + key: 'dangerouslyPasteHTML', + value: function dangerouslyPasteHTML(index, html) { + var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API; + + if (typeof index === 'string') { + this.quill.setContents(this.convert(index), html); + this.quill.setSelection(0, _quill2.default.sources.SILENT); + } else { + var paste = this.convert(html); + this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source); + this.quill.setSelection(index + paste.length(), _quill2.default.sources.SILENT); + } + } + }, { + key: 'onPaste', + value: function onPaste(e) { + var _this2 = this; + + if (e.defaultPrevented || !this.quill.isEnabled()) return; + var range = this.quill.getSelection(); + var delta = new _quillDelta2.default().retain(range.index); + var scrollTop = this.quill.scrollingContainer.scrollTop; + this.container.focus(); + this.quill.selection.update(_quill2.default.sources.SILENT); + setTimeout(function () { + delta = delta.concat(_this2.convert()).delete(range.length); + _this2.quill.updateContents(delta, _quill2.default.sources.USER); + // range.length contributes to delta.length() + _this2.quill.setSelection(delta.length() - range.length, _quill2.default.sources.SILENT); + _this2.quill.scrollingContainer.scrollTop = scrollTop; + _this2.quill.focus(); + }, 1); + } + }, { + key: 'prepareMatching', + value: function prepareMatching() { + var _this3 = this; + + var elementMatchers = [], + textMatchers = []; + this.matchers.forEach(function (pair) { + var _pair = _slicedToArray(pair, 2), + selector = _pair[0], + matcher = _pair[1]; + + switch (selector) { + case Node.TEXT_NODE: + textMatchers.push(matcher); + break; + case Node.ELEMENT_NODE: + elementMatchers.push(matcher); + break; + default: + [].forEach.call(_this3.container.querySelectorAll(selector), function (node) { + // TODO use weakmap + node[DOM_KEY] = node[DOM_KEY] || []; + node[DOM_KEY].push(matcher); + }); + break; + } + }); + return [elementMatchers, textMatchers]; + } + }]); + + return Clipboard; +}(_module2.default); + +Clipboard.DEFAULTS = { + matchers: [], + matchVisual: true +}; + +function applyFormat(delta, format, value) { + if ((typeof format === 'undefined' ? 'undefined' : _typeof(format)) === 'object') { + return Object.keys(format).reduce(function (delta, key) { + return applyFormat(delta, key, format[key]); + }, delta); + } else { + return delta.reduce(function (delta, op) { + if (op.attributes && op.attributes[format]) { + return delta.push(op); + } else { + return delta.insert(op.insert, (0, _extend3.default)({}, _defineProperty({}, format, value), op.attributes)); + } + }, new _quillDelta2.default()); + } +} + +function computeStyle(node) { + if (node.nodeType !== Node.ELEMENT_NODE) return {}; + var DOM_KEY = '__ql-computed-style'; + return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node)); +} + +function deltaEndsWith(delta, text) { + var endText = ""; + for (var i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) { + var op = delta.ops[i]; + if (typeof op.insert !== 'string') break; + endText = op.insert + endText; + } + return endText.slice(-1 * text.length) === text; +} + +function isLine(node) { + if (node.childNodes.length === 0) return false; // Exclude embed blocks + var style = computeStyle(node); + return ['block', 'list-item'].indexOf(style.display) > -1; +} + +function traverse(node, elementMatchers, textMatchers) { + // Post-order + if (node.nodeType === node.TEXT_NODE) { + return textMatchers.reduce(function (delta, matcher) { + return matcher(node, delta); + }, new _quillDelta2.default()); + } else if (node.nodeType === node.ELEMENT_NODE) { + return [].reduce.call(node.childNodes || [], function (delta, childNode) { + var childrenDelta = traverse(childNode, elementMatchers, textMatchers); + if (childNode.nodeType === node.ELEMENT_NODE) { + childrenDelta = elementMatchers.reduce(function (childrenDelta, matcher) { + return matcher(childNode, childrenDelta); + }, childrenDelta); + childrenDelta = (childNode[DOM_KEY] || []).reduce(function (childrenDelta, matcher) { + return matcher(childNode, childrenDelta); + }, childrenDelta); + } + return delta.concat(childrenDelta); + }, new _quillDelta2.default()); + } else { + return new _quillDelta2.default(); + } +} + +function matchAlias(format, node, delta) { + return applyFormat(delta, format, true); +} + +function matchAttributor(node, delta) { + var attributes = _parchment2.default.Attributor.Attribute.keys(node); + var classes = _parchment2.default.Attributor.Class.keys(node); + var styles = _parchment2.default.Attributor.Style.keys(node); + var formats = {}; + attributes.concat(classes).concat(styles).forEach(function (name) { + var attr = _parchment2.default.query(name, _parchment2.default.Scope.ATTRIBUTE); + if (attr != null) { + formats[attr.attrName] = attr.value(node); + if (formats[attr.attrName]) return; + } + attr = ATTRIBUTE_ATTRIBUTORS[name]; + if (attr != null && (attr.attrName === name || attr.keyName === name)) { + formats[attr.attrName] = attr.value(node) || undefined; + } + attr = STYLE_ATTRIBUTORS[name]; + if (attr != null && (attr.attrName === name || attr.keyName === name)) { + attr = STYLE_ATTRIBUTORS[name]; + formats[attr.attrName] = attr.value(node) || undefined; + } + }); + if (Object.keys(formats).length > 0) { + delta = applyFormat(delta, formats); + } + return delta; +} + +function matchBlot(node, delta) { + var match = _parchment2.default.query(node); + if (match == null) return delta; + if (match.prototype instanceof _parchment2.default.Embed) { + var embed = {}; + var value = match.value(node); + if (value != null) { + embed[match.blotName] = value; + delta = new _quillDelta2.default().insert(embed, match.formats(node)); + } + } else if (typeof match.formats === 'function') { + delta = applyFormat(delta, match.blotName, match.formats(node)); + } + return delta; +} + +function matchBreak(node, delta) { + if (!deltaEndsWith(delta, '\n')) { + delta.insert('\n'); + } + return delta; +} + +function matchIgnore() { + return new _quillDelta2.default(); +} + +function matchIndent(node, delta) { + var match = _parchment2.default.query(node); + if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\n')) { + return delta; + } + var indent = -1, + parent = node.parentNode; + while (!parent.classList.contains('ql-clipboard')) { + if ((_parchment2.default.query(parent) || {}).blotName === 'list') { + indent += 1; + } + parent = parent.parentNode; + } + if (indent <= 0) return delta; + return delta.compose(new _quillDelta2.default().retain(delta.length() - 1).retain(1, { indent: indent })); +} + +function matchNewline(node, delta) { + if (!deltaEndsWith(delta, '\n')) { + if (isLine(node) || delta.length() > 0 && node.nextSibling && isLine(node.nextSibling)) { + delta.insert('\n'); + } + } + return delta; +} + +function matchSpacing(node, delta) { + if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\n\n')) { + var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom); + if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) { + delta.insert('\n'); + } + } + return delta; +} + +function matchStyles(node, delta) { + var formats = {}; + var style = node.style || {}; + if (style.fontStyle && computeStyle(node).fontStyle === 'italic') { + formats.italic = true; + } + if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') || parseInt(computeStyle(node).fontWeight) >= 700)) { + formats.bold = true; + } + if (Object.keys(formats).length > 0) { + delta = applyFormat(delta, formats); + } + if (parseFloat(style.textIndent || 0) > 0) { + // Could be 0.5in + delta = new _quillDelta2.default().insert('\t').concat(delta); + } + return delta; +} + +function matchText(node, delta) { + var text = node.data; + // Word represents empty line with   + if (node.parentNode.tagName === 'O:P') { + return delta.insert(text.trim()); + } + if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) { + return delta; + } + if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) { + // eslint-disable-next-line func-style + var replacer = function replacer(collapse, match) { + match = match.replace(/[^\u00a0]/g, ''); // \u00a0 is nbsp; + return match.length < 1 && collapse ? ' ' : match; + }; + text = text.replace(/\r\n/g, ' ').replace(/\n/g, ' '); + text = text.replace(/\s\s+/g, replacer.bind(replacer, true)); // collapse whitespace + if (node.previousSibling == null && isLine(node.parentNode) || node.previousSibling != null && isLine(node.previousSibling)) { + text = text.replace(/^\s+/, replacer.bind(replacer, false)); + } + if (node.nextSibling == null && isLine(node.parentNode) || node.nextSibling != null && isLine(node.nextSibling)) { + text = text.replace(/\s+$/, replacer.bind(replacer, false)); + } + } + return delta.insert(text); +} + +exports.default = Clipboard; +exports.matchAttributor = matchAttributor; +exports.matchBlot = matchBlot; +exports.matchNewline = matchNewline; +exports.matchSpacing = matchSpacing; +exports.matchText = matchText; + +/***/ }), +/* 56 */, +/* 57 */, +/* 58 */, +/* 59 */, +/* 60 */, +/* 61 */, +/* 62 */, +/* 63 */, +/* 64 */, +/* 65 */, +/* 66 */, +/* 67 */, +/* 68 */, +/* 69 */, +/* 70 */, +/* 71 */, +/* 72 */, +/* 73 */, +/* 74 */, +/* 75 */, +/* 76 */, +/* 77 */, +/* 78 */, +/* 79 */, +/* 80 */, +/* 81 */, +/* 82 */, +/* 83 */, +/* 84 */, +/* 85 */, +/* 86 */, +/* 87 */, +/* 88 */, +/* 89 */, +/* 90 */, +/* 91 */, +/* 92 */, +/* 93 */, +/* 94 */, +/* 95 */, +/* 96 */, +/* 97 */, +/* 98 */, +/* 99 */, +/* 100 */, +/* 101 */, +/* 102 */, +/* 103 */, +/* 104 */, +/* 105 */, +/* 106 */, +/* 107 */, +/* 108 */, +/* 109 */, +/* 110 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(29); + + +/***/ }) +/******/ ])["default"]; +}); \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/quill.js b/Wino.Mail/JS/Quill/quill.js new file mode 100644 index 00000000..5dc8fbe3 --- /dev/null +++ b/Wino.Mail/JS/Quill/quill.js @@ -0,0 +1,11489 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Quill"] = factory(); + else + root["Quill"] = factory(); +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 109); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var container_1 = __webpack_require__(17); +var format_1 = __webpack_require__(18); +var leaf_1 = __webpack_require__(19); +var scroll_1 = __webpack_require__(45); +var inline_1 = __webpack_require__(46); +var block_1 = __webpack_require__(47); +var embed_1 = __webpack_require__(48); +var text_1 = __webpack_require__(49); +var attributor_1 = __webpack_require__(12); +var class_1 = __webpack_require__(32); +var style_1 = __webpack_require__(33); +var store_1 = __webpack_require__(31); +var Registry = __webpack_require__(1); +var Parchment = { + Scope: Registry.Scope, + create: Registry.create, + find: Registry.find, + query: Registry.query, + register: Registry.register, + Container: container_1.default, + Format: format_1.default, + Leaf: leaf_1.default, + Embed: embed_1.default, + Scroll: scroll_1.default, + Block: block_1.default, + Inline: inline_1.default, + Text: text_1.default, + Attributor: { + Attribute: attributor_1.default, + Class: class_1.default, + Style: style_1.default, + Store: store_1.default, + }, +}; +exports.default = Parchment; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var ParchmentError = /** @class */ (function (_super) { + __extends(ParchmentError, _super); + function ParchmentError(message) { + var _this = this; + message = '[Parchment] ' + message; + _this = _super.call(this, message) || this; + _this.message = message; + _this.name = _this.constructor.name; + return _this; + } + return ParchmentError; +}(Error)); +exports.ParchmentError = ParchmentError; +var attributes = {}; +var classes = {}; +var tags = {}; +var types = {}; +exports.DATA_KEY = '__blot'; +var Scope; +(function (Scope) { + Scope[Scope["TYPE"] = 3] = "TYPE"; + Scope[Scope["LEVEL"] = 12] = "LEVEL"; + Scope[Scope["ATTRIBUTE"] = 13] = "ATTRIBUTE"; + Scope[Scope["BLOT"] = 14] = "BLOT"; + Scope[Scope["INLINE"] = 7] = "INLINE"; + Scope[Scope["BLOCK"] = 11] = "BLOCK"; + Scope[Scope["BLOCK_BLOT"] = 10] = "BLOCK_BLOT"; + Scope[Scope["INLINE_BLOT"] = 6] = "INLINE_BLOT"; + Scope[Scope["BLOCK_ATTRIBUTE"] = 9] = "BLOCK_ATTRIBUTE"; + Scope[Scope["INLINE_ATTRIBUTE"] = 5] = "INLINE_ATTRIBUTE"; + Scope[Scope["ANY"] = 15] = "ANY"; +})(Scope = exports.Scope || (exports.Scope = {})); +function create(input, value) { + var match = query(input); + if (match == null) { + throw new ParchmentError("Unable to create " + input + " blot"); + } + var BlotClass = match; + var node = + // @ts-ignore + input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value); + return new BlotClass(node, value); +} +exports.create = create; +function find(node, bubble) { + if (bubble === void 0) { bubble = false; } + if (node == null) + return null; + // @ts-ignore + if (node[exports.DATA_KEY] != null) + return node[exports.DATA_KEY].blot; + if (bubble) + return find(node.parentNode, bubble); + return null; +} +exports.find = find; +function query(query, scope) { + if (scope === void 0) { scope = Scope.ANY; } + var match; + if (typeof query === 'string') { + match = types[query] || attributes[query]; + // @ts-ignore + } + else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) { + match = types['text']; + } + else if (typeof query === 'number') { + if (query & Scope.LEVEL & Scope.BLOCK) { + match = types['block']; + } + else if (query & Scope.LEVEL & Scope.INLINE) { + match = types['inline']; + } + } + else if (query instanceof HTMLElement) { + var names = (query.getAttribute('class') || '').split(/\s+/); + for (var i in names) { + match = classes[names[i]]; + if (match) + break; + } + match = match || tags[query.tagName]; + } + if (match == null) + return null; + // @ts-ignore + if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope) + return match; + return null; +} +exports.query = query; +function register() { + var Definitions = []; + for (var _i = 0; _i < arguments.length; _i++) { + Definitions[_i] = arguments[_i]; + } + if (Definitions.length > 1) { + return Definitions.map(function (d) { + return register(d); + }); + } + var Definition = Definitions[0]; + if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') { + throw new ParchmentError('Invalid definition'); + } + else if (Definition.blotName === 'abstract') { + throw new ParchmentError('Cannot register abstract class'); + } + types[Definition.blotName || Definition.attrName] = Definition; + if (typeof Definition.keyName === 'string') { + attributes[Definition.keyName] = Definition; + } + else { + if (Definition.className != null) { + classes[Definition.className] = Definition; + } + if (Definition.tagName != null) { + if (Array.isArray(Definition.tagName)) { + Definition.tagName = Definition.tagName.map(function (tagName) { + return tagName.toUpperCase(); + }); + } + else { + Definition.tagName = Definition.tagName.toUpperCase(); + } + var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName]; + tagNames.forEach(function (tag) { + if (tags[tag] == null || Definition.className == null) { + tags[tag] = Definition; + } + }); + } + } + return Definition; +} +exports.register = register; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +var diff = __webpack_require__(51); +var equal = __webpack_require__(11); +var extend = __webpack_require__(3); +var op = __webpack_require__(20); + + +var NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff() + + +var Delta = function (ops) { + // Assume we are given a well formed ops + if (Array.isArray(ops)) { + this.ops = ops; + } else if (ops != null && Array.isArray(ops.ops)) { + this.ops = ops.ops; + } else { + this.ops = []; + } +}; + + +Delta.prototype.insert = function (text, attributes) { + var newOp = {}; + if (text.length === 0) return this; + newOp.insert = text; + if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) { + newOp.attributes = attributes; + } + return this.push(newOp); +}; + +Delta.prototype['delete'] = function (length) { + if (length <= 0) return this; + return this.push({ 'delete': length }); +}; + +Delta.prototype.retain = function (length, attributes) { + if (length <= 0) return this; + var newOp = { retain: length }; + if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) { + newOp.attributes = attributes; + } + return this.push(newOp); +}; + +Delta.prototype.push = function (newOp) { + var index = this.ops.length; + var lastOp = this.ops[index - 1]; + newOp = extend(true, {}, newOp); + if (typeof lastOp === 'object') { + if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') { + this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] }; + return this; + } + // Since it does not matter if we insert before or after deleting at the same index, + // always prefer to insert first + if (typeof lastOp['delete'] === 'number' && newOp.insert != null) { + index -= 1; + lastOp = this.ops[index - 1]; + if (typeof lastOp !== 'object') { + this.ops.unshift(newOp); + return this; + } + } + if (equal(newOp.attributes, lastOp.attributes)) { + if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') { + this.ops[index - 1] = { insert: lastOp.insert + newOp.insert }; + if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes + return this; + } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') { + this.ops[index - 1] = { retain: lastOp.retain + newOp.retain }; + if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes + return this; + } + } + } + if (index === this.ops.length) { + this.ops.push(newOp); + } else { + this.ops.splice(index, 0, newOp); + } + return this; +}; + +Delta.prototype.chop = function () { + var lastOp = this.ops[this.ops.length - 1]; + if (lastOp && lastOp.retain && !lastOp.attributes) { + this.ops.pop(); + } + return this; +}; + +Delta.prototype.filter = function (predicate) { + return this.ops.filter(predicate); +}; + +Delta.prototype.forEach = function (predicate) { + this.ops.forEach(predicate); +}; + +Delta.prototype.map = function (predicate) { + return this.ops.map(predicate); +}; + +Delta.prototype.partition = function (predicate) { + var passed = [], failed = []; + this.forEach(function(op) { + var target = predicate(op) ? passed : failed; + target.push(op); + }); + return [passed, failed]; +}; + +Delta.prototype.reduce = function (predicate, initial) { + return this.ops.reduce(predicate, initial); +}; + +Delta.prototype.changeLength = function () { + return this.reduce(function (length, elem) { + if (elem.insert) { + return length + op.length(elem); + } else if (elem.delete) { + return length - elem.delete; + } + return length; + }, 0); +}; + +Delta.prototype.length = function () { + return this.reduce(function (length, elem) { + return length + op.length(elem); + }, 0); +}; + +Delta.prototype.slice = function (start, end) { + start = start || 0; + if (typeof end !== 'number') end = Infinity; + var ops = []; + var iter = op.iterator(this.ops); + var index = 0; + while (index < end && iter.hasNext()) { + var nextOp; + if (index < start) { + nextOp = iter.next(start - index); + } else { + nextOp = iter.next(end - index); + ops.push(nextOp); + } + index += op.length(nextOp); + } + return new Delta(ops); +}; + + +Delta.prototype.compose = function (other) { + var thisIter = op.iterator(this.ops); + var otherIter = op.iterator(other.ops); + var delta = new Delta(); + while (thisIter.hasNext() || otherIter.hasNext()) { + if (otherIter.peekType() === 'insert') { + delta.push(otherIter.next()); + } else if (thisIter.peekType() === 'delete') { + delta.push(thisIter.next()); + } else { + var length = Math.min(thisIter.peekLength(), otherIter.peekLength()); + var thisOp = thisIter.next(length); + var otherOp = otherIter.next(length); + if (typeof otherOp.retain === 'number') { + var newOp = {}; + if (typeof thisOp.retain === 'number') { + newOp.retain = length; + } else { + newOp.insert = thisOp.insert; + } + // Preserve null when composing with a retain, otherwise remove it for inserts + var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number'); + if (attributes) newOp.attributes = attributes; + delta.push(newOp); + // Other op should be delete, we could be an insert or retain + // Insert + delete cancels out + } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') { + delta.push(otherOp); + } + } + } + return delta.chop(); +}; + +Delta.prototype.concat = function (other) { + var delta = new Delta(this.ops.slice()); + if (other.ops.length > 0) { + delta.push(other.ops[0]); + delta.ops = delta.ops.concat(other.ops.slice(1)); + } + return delta; +}; + +Delta.prototype.diff = function (other, index) { + if (this.ops === other.ops) { + return new Delta(); + } + var strings = [this, other].map(function (delta) { + return delta.map(function (op) { + if (op.insert != null) { + return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER; + } + var prep = (delta === other) ? 'on' : 'with'; + throw new Error('diff() called ' + prep + ' non-document'); + }).join(''); + }); + var delta = new Delta(); + var diffResult = diff(strings[0], strings[1], index); + var thisIter = op.iterator(this.ops); + var otherIter = op.iterator(other.ops); + diffResult.forEach(function (component) { + var length = component[1].length; + while (length > 0) { + var opLength = 0; + switch (component[0]) { + case diff.INSERT: + opLength = Math.min(otherIter.peekLength(), length); + delta.push(otherIter.next(opLength)); + break; + case diff.DELETE: + opLength = Math.min(length, thisIter.peekLength()); + thisIter.next(opLength); + delta['delete'](opLength); + break; + case diff.EQUAL: + opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length); + var thisOp = thisIter.next(opLength); + var otherOp = otherIter.next(opLength); + if (equal(thisOp.insert, otherOp.insert)) { + delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes)); + } else { + delta.push(otherOp)['delete'](opLength); + } + break; + } + length -= opLength; + } + }); + return delta.chop(); +}; + +Delta.prototype.eachLine = function (predicate, newline) { + newline = newline || '\n'; + var iter = op.iterator(this.ops); + var line = new Delta(); + var i = 0; + while (iter.hasNext()) { + if (iter.peekType() !== 'insert') return; + var thisOp = iter.peek(); + var start = op.length(thisOp) - iter.peekLength(); + var index = typeof thisOp.insert === 'string' ? + thisOp.insert.indexOf(newline, start) - start : -1; + if (index < 0) { + line.push(iter.next()); + } else if (index > 0) { + line.push(iter.next(index)); + } else { + if (predicate(line, iter.next(1).attributes || {}, i) === false) { + return; + } + i += 1; + line = new Delta(); + } + } + if (line.length() > 0) { + predicate(line, {}, i); + } +}; + +Delta.prototype.transform = function (other, priority) { + priority = !!priority; + if (typeof other === 'number') { + return this.transformPosition(other, priority); + } + var thisIter = op.iterator(this.ops); + var otherIter = op.iterator(other.ops); + var delta = new Delta(); + while (thisIter.hasNext() || otherIter.hasNext()) { + if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) { + delta.retain(op.length(thisIter.next())); + } else if (otherIter.peekType() === 'insert') { + delta.push(otherIter.next()); + } else { + var length = Math.min(thisIter.peekLength(), otherIter.peekLength()); + var thisOp = thisIter.next(length); + var otherOp = otherIter.next(length); + if (thisOp['delete']) { + // Our delete either makes their delete redundant or removes their retain + continue; + } else if (otherOp['delete']) { + delta.push(otherOp); + } else { + // We retain either their retain or insert + delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority)); + } + } + } + return delta.chop(); +}; + +Delta.prototype.transformPosition = function (index, priority) { + priority = !!priority; + var thisIter = op.iterator(this.ops); + var offset = 0; + while (thisIter.hasNext() && offset <= index) { + var length = thisIter.peekLength(); + var nextType = thisIter.peekType(); + thisIter.next(); + if (nextType === 'delete') { + index -= Math.min(length, index - offset); + continue; + } else if (nextType === 'insert' && (offset < index || !priority)) { + index += length; + } + offset += length; + } + return index; +}; + + +module.exports = Delta; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +'use strict'; + +var hasOwn = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; + +var isArray = function isArray(arr) { + if (typeof Array.isArray === 'function') { + return Array.isArray(arr); + } + + return toStr.call(arr) === '[object Array]'; +}; + +var isPlainObject = function isPlainObject(obj) { + if (!obj || toStr.call(obj) !== '[object Object]') { + return false; + } + + var hasOwnConstructor = hasOwn.call(obj, 'constructor'); + var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); + // Not own constructor property must be Object + if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + var key; + for (key in obj) { /**/ } + + return typeof key === 'undefined' || hasOwn.call(obj, key); +}; + +module.exports = function extend() { + var options, name, src, copy, copyIsArray, clone; + var target = arguments[0]; + var i = 1; + var length = arguments.length; + var deep = false; + + // Handle a deep copy situation + if (typeof target === 'boolean') { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { + target = {}; + } + + for (; i < length; ++i) { + options = arguments[i]; + // Only deal with non-null/undefined values + if (options != null) { + // Extend the base object + for (name in options) { + src = target[name]; + copy = options[name]; + + // Prevent never-ending loop + if (target !== copy) { + // Recurse if we're merging plain objects or arrays + if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false; + clone = src && isArray(src) ? src : []; + } else { + clone = src && isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[name] = extend(deep, clone, copy); + + // Don't bring in undefined values + } else if (typeof copy !== 'undefined') { + target[name] = copy; + } + } + } + } + } + + // Return the modified object + return target; +}; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.BlockEmbed = exports.bubbleFormats = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var NEWLINE_LENGTH = 1; + +var BlockEmbed = function (_Parchment$Embed) { + _inherits(BlockEmbed, _Parchment$Embed); + + function BlockEmbed() { + _classCallCheck(this, BlockEmbed); + + return _possibleConstructorReturn(this, (BlockEmbed.__proto__ || Object.getPrototypeOf(BlockEmbed)).apply(this, arguments)); + } + + _createClass(BlockEmbed, [{ + key: 'attach', + value: function attach() { + _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'attach', this).call(this); + this.attributes = new _parchment2.default.Attributor.Store(this.domNode); + } + }, { + key: 'delta', + value: function delta() { + return new _quillDelta2.default().insert(this.value(), (0, _extend2.default)(this.formats(), this.attributes.values())); + } + }, { + key: 'format', + value: function format(name, value) { + var attribute = _parchment2.default.query(name, _parchment2.default.Scope.BLOCK_ATTRIBUTE); + if (attribute != null) { + this.attributes.attribute(attribute, value); + } + } + }, { + key: 'formatAt', + value: function formatAt(index, length, name, value) { + this.format(name, value); + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (typeof value === 'string' && value.endsWith('\n')) { + var block = _parchment2.default.create(Block.blotName); + this.parent.insertBefore(block, index === 0 ? this : this.next); + block.insertAt(0, value.slice(0, -1)); + } else { + _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'insertAt', this).call(this, index, value, def); + } + } + }]); + + return BlockEmbed; +}(_parchment2.default.Embed); + +BlockEmbed.scope = _parchment2.default.Scope.BLOCK_BLOT; +// It is important for cursor behavior BlockEmbeds use tags that are block level elements + + +var Block = function (_Parchment$Block) { + _inherits(Block, _Parchment$Block); + + function Block(domNode) { + _classCallCheck(this, Block); + + var _this2 = _possibleConstructorReturn(this, (Block.__proto__ || Object.getPrototypeOf(Block)).call(this, domNode)); + + _this2.cache = {}; + return _this2; + } + + _createClass(Block, [{ + key: 'delta', + value: function delta() { + if (this.cache.delta == null) { + this.cache.delta = this.descendants(_parchment2.default.Leaf).reduce(function (delta, leaf) { + if (leaf.length() === 0) { + return delta; + } else { + return delta.insert(leaf.value(), bubbleFormats(leaf)); + } + }, new _quillDelta2.default()).insert('\n', bubbleFormats(this)); + } + return this.cache.delta; + } + }, { + key: 'deleteAt', + value: function deleteAt(index, length) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'deleteAt', this).call(this, index, length); + this.cache = {}; + } + }, { + key: 'formatAt', + value: function formatAt(index, length, name, value) { + if (length <= 0) return; + if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) { + if (index + length === this.length()) { + this.format(name, value); + } + } else { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'formatAt', this).call(this, index, Math.min(length, this.length() - index - 1), name, value); + } + this.cache = {}; + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (def != null) return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, index, value, def); + if (value.length === 0) return; + var lines = value.split('\n'); + var text = lines.shift(); + if (text.length > 0) { + if (index < this.length() - 1 || this.children.tail == null) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, Math.min(index, this.length() - 1), text); + } else { + this.children.tail.insertAt(this.children.tail.length(), text); + } + this.cache = {}; + } + var block = this; + lines.reduce(function (index, line) { + block = block.split(index, true); + block.insertAt(0, line); + return line.length; + }, index + text.length); + } + }, { + key: 'insertBefore', + value: function insertBefore(blot, ref) { + var head = this.children.head; + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertBefore', this).call(this, blot, ref); + if (head instanceof _break2.default) { + head.remove(); + } + this.cache = {}; + } + }, { + key: 'length', + value: function length() { + if (this.cache.length == null) { + this.cache.length = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'length', this).call(this) + NEWLINE_LENGTH; + } + return this.cache.length; + } + }, { + key: 'moveChildren', + value: function moveChildren(target, ref) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'moveChildren', this).call(this, target, ref); + this.cache = {}; + } + }, { + key: 'optimize', + value: function optimize(context) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'optimize', this).call(this, context); + this.cache = {}; + } + }, { + key: 'path', + value: function path(index) { + return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'path', this).call(this, index, true); + } + }, { + key: 'removeChild', + value: function removeChild(child) { + _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'removeChild', this).call(this, child); + this.cache = {}; + } + }, { + key: 'split', + value: function split(index) { + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) { + var clone = this.clone(); + if (index === 0) { + this.parent.insertBefore(clone, this); + return this; + } else { + this.parent.insertBefore(clone, this.next); + return clone; + } + } else { + var next = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'split', this).call(this, index, force); + this.cache = {}; + return next; + } + } + }]); + + return Block; +}(_parchment2.default.Block); + +Block.blotName = 'block'; +Block.tagName = 'P'; +Block.defaultChild = 'break'; +Block.allowedChildren = [_inline2.default, _parchment2.default.Embed, _text2.default]; + +function bubbleFormats(blot) { + var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (blot == null) return formats; + if (typeof blot.formats === 'function') { + formats = (0, _extend2.default)(formats, blot.formats()); + } + if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) { + return formats; + } + return bubbleFormats(blot.parent, formats); +} + +exports.bubbleFormats = bubbleFormats; +exports.BlockEmbed = BlockEmbed; +exports.default = Block; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.overload = exports.expandConfig = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +__webpack_require__(50); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _editor = __webpack_require__(14); + +var _editor2 = _interopRequireDefault(_editor); + +var _emitter3 = __webpack_require__(8); + +var _emitter4 = _interopRequireDefault(_emitter3); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _selection = __webpack_require__(15); + +var _selection2 = _interopRequireDefault(_selection); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _theme = __webpack_require__(34); + +var _theme2 = _interopRequireDefault(_theme); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var debug = (0, _logger2.default)('quill'); + +var Quill = function () { + _createClass(Quill, null, [{ + key: 'debug', + value: function debug(limit) { + if (limit === true) { + limit = 'log'; + } + _logger2.default.level(limit); + } + }, { + key: 'find', + value: function find(node) { + return node.__quill || _parchment2.default.find(node); + } + }, { + key: 'import', + value: function _import(name) { + if (this.imports[name] == null) { + debug.error('Cannot import ' + name + '. Are you sure it was registered?'); + } + return this.imports[name]; + } + }, { + key: 'register', + value: function register(path, target) { + var _this = this; + + var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (typeof path !== 'string') { + var name = path.attrName || path.blotName; + if (typeof name === 'string') { + // register(Blot | Attributor, overwrite) + this.register('formats/' + name, path, target); + } else { + Object.keys(path).forEach(function (key) { + _this.register(key, path[key], target); + }); + } + } else { + if (this.imports[path] != null && !overwrite) { + debug.warn('Overwriting ' + path + ' with', target); + } + this.imports[path] = target; + if ((path.startsWith('blots/') || path.startsWith('formats/')) && target.blotName !== 'abstract') { + _parchment2.default.register(target); + } else if (path.startsWith('modules') && typeof target.register === 'function') { + target.register(); + } + } + } + }]); + + function Quill(container) { + var _this2 = this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Quill); + + this.options = expandConfig(container, options); + this.container = this.options.container; + if (this.container == null) { + return debug.error('Invalid Quill container', container); + } + if (this.options.debug) { + Quill.debug(this.options.debug); + } + var html = this.container.innerHTML.trim(); + this.container.classList.add('ql-container'); + this.container.innerHTML = ''; + this.container.__quill = this; + this.root = this.addContainer('ql-editor'); + this.root.classList.add('ql-blank'); + this.root.setAttribute('data-gramm', false); + this.scrollingContainer = this.options.scrollingContainer || this.root; + this.emitter = new _emitter4.default(); + this.scroll = _parchment2.default.create(this.root, { + emitter: this.emitter, + whitelist: this.options.formats + }); + this.editor = new _editor2.default(this.scroll); + this.selection = new _selection2.default(this.scroll, this.emitter); + this.theme = new this.options.theme(this, this.options); + this.keyboard = this.theme.addModule('keyboard'); + this.clipboard = this.theme.addModule('clipboard'); + this.history = this.theme.addModule('history'); + this.theme.init(); + this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type) { + if (type === _emitter4.default.events.TEXT_CHANGE) { + _this2.root.classList.toggle('ql-blank', _this2.editor.isBlank()); + } + }); + this.emitter.on(_emitter4.default.events.SCROLL_UPDATE, function (source, mutations) { + var range = _this2.selection.lastRange; + var index = range && range.length === 0 ? range.index : undefined; + modify.call(_this2, function () { + return _this2.editor.update(null, mutations, index); + }, source); + }); + var contents = this.clipboard.convert('
' + html + '


'); + this.setContents(contents); + this.history.clear(); + if (this.options.placeholder) { + this.root.setAttribute('data-placeholder', this.options.placeholder); + } + if (this.options.readOnly) { + this.disable(); + } + } + + _createClass(Quill, [{ + key: 'addContainer', + value: function addContainer(container) { + var refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + if (typeof container === 'string') { + var className = container; + container = document.createElement('div'); + container.classList.add(className); + } + this.container.insertBefore(container, refNode); + return container; + } + }, { + key: 'blur', + value: function blur() { + this.selection.setRange(null); + } + }, { + key: 'deleteText', + value: function deleteText(index, length, source) { + var _this3 = this; + + var _overload = overload(index, length, source); + + var _overload2 = _slicedToArray(_overload, 4); + + index = _overload2[0]; + length = _overload2[1]; + source = _overload2[3]; + + return modify.call(this, function () { + return _this3.editor.deleteText(index, length); + }, source, index, -1 * length); + } + }, { + key: 'disable', + value: function disable() { + this.enable(false); + } + }, { + key: 'enable', + value: function enable() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.scroll.enable(enabled); + this.container.classList.toggle('ql-disabled', !enabled); + } + }, { + key: 'focus', + value: function focus() { + var scrollTop = this.scrollingContainer.scrollTop; + this.selection.focus(); + this.scrollingContainer.scrollTop = scrollTop; + this.scrollIntoView(); + } + }, { + key: 'format', + value: function format(name, value) { + var _this4 = this; + + var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API; + + return modify.call(this, function () { + var range = _this4.getSelection(true); + var change = new _quillDelta2.default(); + if (range == null) { + return change; + } else if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) { + change = _this4.editor.formatLine(range.index, range.length, _defineProperty({}, name, value)); + } else if (range.length === 0) { + _this4.selection.format(name, value); + return change; + } else { + change = _this4.editor.formatText(range.index, range.length, _defineProperty({}, name, value)); + } + _this4.setSelection(range, _emitter4.default.sources.SILENT); + return change; + }, source); + } + }, { + key: 'formatLine', + value: function formatLine(index, length, name, value, source) { + var _this5 = this; + + var formats = void 0; + + var _overload3 = overload(index, length, name, value, source); + + var _overload4 = _slicedToArray(_overload3, 4); + + index = _overload4[0]; + length = _overload4[1]; + formats = _overload4[2]; + source = _overload4[3]; + + return modify.call(this, function () { + return _this5.editor.formatLine(index, length, formats); + }, source, index, 0); + } + }, { + key: 'formatText', + value: function formatText(index, length, name, value, source) { + var _this6 = this; + + var formats = void 0; + + var _overload5 = overload(index, length, name, value, source); + + var _overload6 = _slicedToArray(_overload5, 4); + + index = _overload6[0]; + length = _overload6[1]; + formats = _overload6[2]; + source = _overload6[3]; + + return modify.call(this, function () { + return _this6.editor.formatText(index, length, formats); + }, source, index, 0); + } + }, { + key: 'getBounds', + value: function getBounds(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var bounds = void 0; + if (typeof index === 'number') { + bounds = this.selection.getBounds(index, length); + } else { + bounds = this.selection.getBounds(index.index, index.length); + } + var containerBounds = this.container.getBoundingClientRect(); + return { + bottom: bounds.bottom - containerBounds.top, + height: bounds.height, + left: bounds.left - containerBounds.left, + right: bounds.right - containerBounds.left, + top: bounds.top - containerBounds.top, + width: bounds.width + }; + } + }, { + key: 'getContents', + value: function getContents() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; + + var _overload7 = overload(index, length); + + var _overload8 = _slicedToArray(_overload7, 2); + + index = _overload8[0]; + length = _overload8[1]; + + return this.editor.getContents(index, length); + } + }, { + key: 'getFormat', + value: function getFormat() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection(true); + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + if (typeof index === 'number') { + return this.editor.getFormat(index, length); + } else { + return this.editor.getFormat(index.index, index.length); + } + } + }, { + key: 'getIndex', + value: function getIndex(blot) { + return blot.offset(this.scroll); + } + }, { + key: 'getLength', + value: function getLength() { + return this.scroll.length(); + } + }, { + key: 'getLeaf', + value: function getLeaf(index) { + return this.scroll.leaf(index); + } + }, { + key: 'getLine', + value: function getLine(index) { + return this.scroll.line(index); + } + }, { + key: 'getLines', + value: function getLines() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; + + if (typeof index !== 'number') { + return this.scroll.lines(index.index, index.length); + } else { + return this.scroll.lines(index, length); + } + } + }, { + key: 'getModule', + value: function getModule(name) { + return this.theme.modules[name]; + } + }, { + key: 'getSelection', + value: function getSelection() { + var focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (focus) this.focus(); + this.update(); // Make sure we access getRange with editor in consistent state + return this.selection.getRange()[0]; + } + }, { + key: 'getText', + value: function getText() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; + + var _overload9 = overload(index, length); + + var _overload10 = _slicedToArray(_overload9, 2); + + index = _overload10[0]; + length = _overload10[1]; + + return this.editor.getText(index, length); + } + }, { + key: 'hasFocus', + value: function hasFocus() { + return this.selection.hasFocus(); + } + }, { + key: 'insertEmbed', + value: function insertEmbed(index, embed, value) { + var _this7 = this; + + var source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API; + + return modify.call(this, function () { + return _this7.editor.insertEmbed(index, embed, value); + }, source, index); + } + }, { + key: 'insertText', + value: function insertText(index, text, name, value, source) { + var _this8 = this; + + var formats = void 0; + + var _overload11 = overload(index, 0, name, value, source); + + var _overload12 = _slicedToArray(_overload11, 4); + + index = _overload12[0]; + formats = _overload12[2]; + source = _overload12[3]; + + return modify.call(this, function () { + return _this8.editor.insertText(index, text, formats); + }, source, index, text.length); + } + }, { + key: 'isEnabled', + value: function isEnabled() { + return !this.container.classList.contains('ql-disabled'); + } + }, { + key: 'off', + value: function off() { + return this.emitter.off.apply(this.emitter, arguments); + } + }, { + key: 'on', + value: function on() { + return this.emitter.on.apply(this.emitter, arguments); + } + }, { + key: 'once', + value: function once() { + return this.emitter.once.apply(this.emitter, arguments); + } + }, { + key: 'pasteHTML', + value: function pasteHTML(index, html, source) { + this.clipboard.dangerouslyPasteHTML(index, html, source); + } + }, { + key: 'removeFormat', + value: function removeFormat(index, length, source) { + var _this9 = this; + + var _overload13 = overload(index, length, source); + + var _overload14 = _slicedToArray(_overload13, 4); + + index = _overload14[0]; + length = _overload14[1]; + source = _overload14[3]; + + return modify.call(this, function () { + return _this9.editor.removeFormat(index, length); + }, source, index); + } + }, { + key: 'scrollIntoView', + value: function scrollIntoView() { + this.selection.scrollIntoView(this.scrollingContainer); + } + }, { + key: 'setContents', + value: function setContents(delta) { + var _this10 = this; + + var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; + + return modify.call(this, function () { + delta = new _quillDelta2.default(delta); + var length = _this10.getLength(); + var deleted = _this10.editor.deleteText(0, length); + var applied = _this10.editor.applyDelta(delta); + var lastOp = applied.ops[applied.ops.length - 1]; + if (lastOp != null && typeof lastOp.insert === 'string' && lastOp.insert[lastOp.insert.length - 1] === '\n') { + _this10.editor.deleteText(_this10.getLength() - 1, 1); + applied.delete(1); + } + var ret = deleted.compose(applied); + return ret; + }, source); + } + }, { + key: 'setSelection', + value: function setSelection(index, length, source) { + if (index == null) { + this.selection.setRange(null, length || Quill.sources.API); + } else { + var _overload15 = overload(index, length, source); + + var _overload16 = _slicedToArray(_overload15, 4); + + index = _overload16[0]; + length = _overload16[1]; + source = _overload16[3]; + + this.selection.setRange(new _selection.Range(index, length), source); + if (source !== _emitter4.default.sources.SILENT) { + this.selection.scrollIntoView(this.scrollingContainer); + } + } + } + }, { + key: 'setText', + value: function setText(text) { + var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; + + var delta = new _quillDelta2.default().insert(text); + return this.setContents(delta, source); + } + }, { + key: 'update', + value: function update() { + var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER; + + var change = this.scroll.update(source); // Will update selection before selection.update() does if text changes + this.selection.update(source); + return change; + } + }, { + key: 'updateContents', + value: function updateContents(delta) { + var _this11 = this; + + var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; + + return modify.call(this, function () { + delta = new _quillDelta2.default(delta); + return _this11.editor.applyDelta(delta, source); + }, source, true); + } + }]); + + return Quill; +}(); + +Quill.DEFAULTS = { + bounds: null, + formats: null, + modules: {}, + placeholder: '', + readOnly: false, + scrollingContainer: null, + strict: true, + theme: 'default' +}; +Quill.events = _emitter4.default.events; +Quill.sources = _emitter4.default.sources; +// eslint-disable-next-line no-undef +Quill.version = false ? 'dev' : "1.3.6"; + +Quill.imports = { + 'delta': _quillDelta2.default, + 'parchment': _parchment2.default, + 'core/module': _module2.default, + 'core/theme': _theme2.default +}; + +function expandConfig(container, userConfig) { + userConfig = (0, _extend2.default)(true, { + container: container, + modules: { + clipboard: true, + keyboard: true, + history: true + } + }, userConfig); + if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) { + userConfig.theme = _theme2.default; + } else { + userConfig.theme = Quill.import('themes/' + userConfig.theme); + if (userConfig.theme == null) { + throw new Error('Invalid theme ' + userConfig.theme + '. Did you register it?'); + } + } + var themeConfig = (0, _extend2.default)(true, {}, userConfig.theme.DEFAULTS); + [themeConfig, userConfig].forEach(function (config) { + config.modules = config.modules || {}; + Object.keys(config.modules).forEach(function (module) { + if (config.modules[module] === true) { + config.modules[module] = {}; + } + }); + }); + var moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules)); + var moduleConfig = moduleNames.reduce(function (config, name) { + var moduleClass = Quill.import('modules/' + name); + if (moduleClass == null) { + debug.error('Cannot load ' + name + ' module. Are you sure you registered it?'); + } else { + config[name] = moduleClass.DEFAULTS || {}; + } + return config; + }, {}); + // Special case toolbar shorthand + if (userConfig.modules != null && userConfig.modules.toolbar && userConfig.modules.toolbar.constructor !== Object) { + userConfig.modules.toolbar = { + container: userConfig.modules.toolbar + }; + } + userConfig = (0, _extend2.default)(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig); + ['bounds', 'container', 'scrollingContainer'].forEach(function (key) { + if (typeof userConfig[key] === 'string') { + userConfig[key] = document.querySelector(userConfig[key]); + } + }); + userConfig.modules = Object.keys(userConfig.modules).reduce(function (config, name) { + if (userConfig.modules[name]) { + config[name] = userConfig.modules[name]; + } + return config; + }, {}); + return userConfig; +} + +// Handle selection preservation and TEXT_CHANGE emission +// common to modification APIs +function modify(modifier, source, index, shift) { + if (this.options.strict && !this.isEnabled() && source === _emitter4.default.sources.USER) { + return new _quillDelta2.default(); + } + var range = index == null ? null : this.getSelection(); + var oldDelta = this.editor.delta; + var change = modifier(); + if (range != null) { + if (index === true) index = range.index; + if (shift == null) { + range = shiftRange(range, change, source); + } else if (shift !== 0) { + range = shiftRange(range, index, shift, source); + } + this.setSelection(range, _emitter4.default.sources.SILENT); + } + if (change.length() > 0) { + var _emitter; + + var args = [_emitter4.default.events.TEXT_CHANGE, change, oldDelta, source]; + (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args)); + if (source !== _emitter4.default.sources.SILENT) { + var _emitter2; + + (_emitter2 = this.emitter).emit.apply(_emitter2, args); + } + } + return change; +} + +function overload(index, length, name, value, source) { + var formats = {}; + if (typeof index.index === 'number' && typeof index.length === 'number') { + // Allow for throwaway end (used by insertText/insertEmbed) + if (typeof length !== 'number') { + source = value, value = name, name = length, length = index.length, index = index.index; + } else { + length = index.length, index = index.index; + } + } else if (typeof length !== 'number') { + source = value, value = name, name = length, length = 0; + } + // Handle format being object, two format name/value strings or excluded + if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') { + formats = name; + source = value; + } else if (typeof name === 'string') { + if (value != null) { + formats[name] = value; + } else { + source = name; + } + } + // Handle optional source + source = source || _emitter4.default.sources.API; + return [index, length, formats, source]; +} + +function shiftRange(range, index, length, source) { + if (range == null) return null; + var start = void 0, + end = void 0; + if (index instanceof _quillDelta2.default) { + var _map = [range.index, range.index + range.length].map(function (pos) { + return index.transformPosition(pos, source !== _emitter4.default.sources.USER); + }); + + var _map2 = _slicedToArray(_map, 2); + + start = _map2[0]; + end = _map2[1]; + } else { + var _map3 = [range.index, range.index + range.length].map(function (pos) { + if (pos < index || pos === index && source === _emitter4.default.sources.USER) return pos; + if (length >= 0) { + return pos + length; + } else { + return Math.max(index, pos + length); + } + }); + + var _map4 = _slicedToArray(_map3, 2); + + start = _map4[0]; + end = _map4[1]; + } + return new _selection.Range(start, end - start); +} + +exports.expandConfig = expandConfig; +exports.overload = overload; +exports.default = Quill; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Inline = function (_Parchment$Inline) { + _inherits(Inline, _Parchment$Inline); + + function Inline() { + _classCallCheck(this, Inline); + + return _possibleConstructorReturn(this, (Inline.__proto__ || Object.getPrototypeOf(Inline)).apply(this, arguments)); + } + + _createClass(Inline, [{ + key: 'formatAt', + value: function formatAt(index, length, name, value) { + if (Inline.compare(this.statics.blotName, name) < 0 && _parchment2.default.query(name, _parchment2.default.Scope.BLOT)) { + var blot = this.isolate(index, length); + if (value) { + blot.wrap(name, value); + } + } else { + _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'formatAt', this).call(this, index, length, name, value); + } + } + }, { + key: 'optimize', + value: function optimize(context) { + _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'optimize', this).call(this, context); + if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { + var parent = this.parent.isolate(this.offset(), this.length()); + this.moveChildren(parent); + parent.wrap(this); + } + } + }], [{ + key: 'compare', + value: function compare(self, other) { + var selfIndex = Inline.order.indexOf(self); + var otherIndex = Inline.order.indexOf(other); + if (selfIndex >= 0 || otherIndex >= 0) { + return selfIndex - otherIndex; + } else if (self === other) { + return 0; + } else if (self < other) { + return -1; + } else { + return 1; + } + } + }]); + + return Inline; +}(_parchment2.default.Inline); + +Inline.allowedChildren = [Inline, _parchment2.default.Embed, _text2.default]; +// Lower index means deeper in the DOM tree, since not found (-1) is for embeds +Inline.order = ['cursor', 'inline', // Must be lower +'underline', 'strike', 'italic', 'bold', 'script', 'link', 'code' // Must be higher +]; + +exports.default = Inline; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TextBlot = function (_Parchment$Text) { + _inherits(TextBlot, _Parchment$Text); + + function TextBlot() { + _classCallCheck(this, TextBlot); + + return _possibleConstructorReturn(this, (TextBlot.__proto__ || Object.getPrototypeOf(TextBlot)).apply(this, arguments)); + } + + return TextBlot; +}(_parchment2.default.Text); + +exports.default = TextBlot; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _eventemitter = __webpack_require__(54); + +var _eventemitter2 = _interopRequireDefault(_eventemitter); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:events'); + +var EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click']; + +EVENTS.forEach(function (eventName) { + document.addEventListener(eventName, function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + [].slice.call(document.querySelectorAll('.ql-container')).forEach(function (node) { + // TODO use WeakMap + if (node.__quill && node.__quill.emitter) { + var _node$__quill$emitter; + + (_node$__quill$emitter = node.__quill.emitter).handleDOM.apply(_node$__quill$emitter, args); + } + }); + }); +}); + +var Emitter = function (_EventEmitter) { + _inherits(Emitter, _EventEmitter); + + function Emitter() { + _classCallCheck(this, Emitter); + + var _this = _possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this)); + + _this.listeners = {}; + _this.on('error', debug.error); + return _this; + } + + _createClass(Emitter, [{ + key: 'emit', + value: function emit() { + debug.log.apply(debug, arguments); + _get(Emitter.prototype.__proto__ || Object.getPrototypeOf(Emitter.prototype), 'emit', this).apply(this, arguments); + } + }, { + key: 'handleDOM', + value: function handleDOM(event) { + for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + (this.listeners[event.type] || []).forEach(function (_ref) { + var node = _ref.node, + handler = _ref.handler; + + if (event.target === node || node.contains(event.target)) { + handler.apply(undefined, [event].concat(args)); + } + }); + } + }, { + key: 'listenDOM', + value: function listenDOM(eventName, node, handler) { + if (!this.listeners[eventName]) { + this.listeners[eventName] = []; + } + this.listeners[eventName].push({ node: node, handler: handler }); + } + }]); + + return Emitter; +}(_eventemitter2.default); + +Emitter.events = { + EDITOR_CHANGE: 'editor-change', + SCROLL_BEFORE_UPDATE: 'scroll-before-update', + SCROLL_OPTIMIZE: 'scroll-optimize', + SCROLL_UPDATE: 'scroll-update', + SELECTION_CHANGE: 'selection-change', + TEXT_CHANGE: 'text-change' +}; +Emitter.sources = { + API: 'api', + SILENT: 'silent', + USER: 'user' +}; + +exports.default = Emitter; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Module = function Module(quill) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Module); + + this.quill = quill; + this.options = options; +}; + +Module.DEFAULTS = {}; + +exports.default = Module; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var levels = ['error', 'warn', 'log', 'info']; +var level = 'warn'; + +function debug(method) { + if (levels.indexOf(method) <= levels.indexOf(level)) { + var _console; + + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + (_console = console)[method].apply(_console, args); // eslint-disable-line no-console + } +} + +function namespace(ns) { + return levels.reduce(function (logger, method) { + logger[method] = debug.bind(console, method, ns); + return logger; + }, {}); +} + +debug.level = namespace.level = function (newLevel) { + level = newLevel; +}; + +exports.default = namespace; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +var pSlice = Array.prototype.slice; +var objectKeys = __webpack_require__(52); +var isArguments = __webpack_require__(53); + +var deepEqual = module.exports = function (actual, expected, opts) { + if (!opts) opts = {}; + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (actual instanceof Date && expected instanceof Date) { + return actual.getTime() === expected.getTime(); + + // 7.3. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') { + return opts.strict ? actual === expected : actual == expected; + + // 7.4. For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected, opts); + } +} + +function isUndefinedOrNull(value) { + return value === null || value === undefined; +} + +function isBuffer (x) { + if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; + if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { + return false; + } + if (x.length > 0 && typeof x[0] !== 'number') return false; + return true; +} + +function objEquiv(a, b, opts) { + var i, key; + if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return deepEqual(a, b, opts); + } + if (isBuffer(a)) { + if (!isBuffer(b)) { + return false; + } + if (a.length !== b.length) return false; + for (i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + return true; + } + try { + var ka = objectKeys(a), + kb = objectKeys(b); + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!deepEqual(a[key], b[key], opts)) return false; + } + return typeof a === typeof b; +} + + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Registry = __webpack_require__(1); +var Attributor = /** @class */ (function () { + function Attributor(attrName, keyName, options) { + if (options === void 0) { options = {}; } + this.attrName = attrName; + this.keyName = keyName; + var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE; + if (options.scope != null) { + // Ignore type bits, force attribute bit + this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit; + } + else { + this.scope = Registry.Scope.ATTRIBUTE; + } + if (options.whitelist != null) + this.whitelist = options.whitelist; + } + Attributor.keys = function (node) { + return [].map.call(node.attributes, function (item) { + return item.name; + }); + }; + Attributor.prototype.add = function (node, value) { + if (!this.canAdd(node, value)) + return false; + node.setAttribute(this.keyName, value); + return true; + }; + Attributor.prototype.canAdd = function (node, value) { + var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE)); + if (match == null) + return false; + if (this.whitelist == null) + return true; + if (typeof value === 'string') { + return this.whitelist.indexOf(value.replace(/["']/g, '')) > -1; + } + else { + return this.whitelist.indexOf(value) > -1; + } + }; + Attributor.prototype.remove = function (node) { + node.removeAttribute(this.keyName); + }; + Attributor.prototype.value = function (node) { + var value = node.getAttribute(this.keyName); + if (this.canAdd(node, value) && value) { + return value; + } + return ''; + }; + return Attributor; +}()); +exports.default = Attributor; + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.Code = undefined; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Code = function (_Inline) { + _inherits(Code, _Inline); + + function Code() { + _classCallCheck(this, Code); + + return _possibleConstructorReturn(this, (Code.__proto__ || Object.getPrototypeOf(Code)).apply(this, arguments)); + } + + return Code; +}(_inline2.default); + +Code.blotName = 'code'; +Code.tagName = 'CODE'; + +var CodeBlock = function (_Block) { + _inherits(CodeBlock, _Block); + + function CodeBlock() { + _classCallCheck(this, CodeBlock); + + return _possibleConstructorReturn(this, (CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock)).apply(this, arguments)); + } + + _createClass(CodeBlock, [{ + key: 'delta', + value: function delta() { + var _this3 = this; + + var text = this.domNode.textContent; + if (text.endsWith('\n')) { + // Should always be true + text = text.slice(0, -1); + } + return text.split('\n').reduce(function (delta, frag) { + return delta.insert(frag).insert('\n', _this3.formats()); + }, new _quillDelta2.default()); + } + }, { + key: 'format', + value: function format(name, value) { + if (name === this.statics.blotName && value) return; + + var _descendant = this.descendant(_text2.default, this.length() - 1), + _descendant2 = _slicedToArray(_descendant, 1), + text = _descendant2[0]; + + if (text != null) { + text.deleteAt(text.length() - 1, 1); + } + _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'format', this).call(this, name, value); + } + }, { + key: 'formatAt', + value: function formatAt(index, length, name, value) { + if (length === 0) return; + if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK) == null || name === this.statics.blotName && value === this.statics.formats(this.domNode)) { + return; + } + var nextNewline = this.newlineIndex(index); + if (nextNewline < 0 || nextNewline >= index + length) return; + var prevNewline = this.newlineIndex(index, true) + 1; + var isolateLength = nextNewline - prevNewline + 1; + var blot = this.isolate(prevNewline, isolateLength); + var next = blot.next; + blot.format(name, value); + if (next instanceof CodeBlock) { + next.formatAt(0, index - prevNewline + length - isolateLength, name, value); + } + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (def != null) return; + + var _descendant3 = this.descendant(_text2.default, index), + _descendant4 = _slicedToArray(_descendant3, 2), + text = _descendant4[0], + offset = _descendant4[1]; + + text.insertAt(offset, value); + } + }, { + key: 'length', + value: function length() { + var length = this.domNode.textContent.length; + if (!this.domNode.textContent.endsWith('\n')) { + return length + 1; + } + return length; + } + }, { + key: 'newlineIndex', + value: function newlineIndex(searchIndex) { + var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!reverse) { + var offset = this.domNode.textContent.slice(searchIndex).indexOf('\n'); + return offset > -1 ? searchIndex + offset : -1; + } else { + return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\n'); + } + } + }, { + key: 'optimize', + value: function optimize(context) { + if (!this.domNode.textContent.endsWith('\n')) { + this.appendChild(_parchment2.default.create('text', '\n')); + } + _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'optimize', this).call(this, context); + var next = this.next; + if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) { + next.optimize(context); + next.moveChildren(this); + next.remove(); + } + } + }, { + key: 'replace', + value: function replace(target) { + _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'replace', this).call(this, target); + [].slice.call(this.domNode.querySelectorAll('*')).forEach(function (node) { + var blot = _parchment2.default.find(node); + if (blot == null) { + node.parentNode.removeChild(node); + } else if (blot instanceof _parchment2.default.Embed) { + blot.remove(); + } else { + blot.unwrap(); + } + }); + } + }], [{ + key: 'create', + value: function create(value) { + var domNode = _get(CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock), 'create', this).call(this, value); + domNode.setAttribute('spellcheck', false); + return domNode; + } + }, { + key: 'formats', + value: function formats() { + return true; + } + }]); + + return CodeBlock; +}(_block2.default); + +CodeBlock.blotName = 'code-block'; +CodeBlock.tagName = 'PRE'; +CodeBlock.TAB = ' '; + +exports.Code = Code; +exports.default = CodeBlock; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _op = __webpack_require__(20); + +var _op2 = _interopRequireDefault(_op); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _cursor = __webpack_require__(24); + +var _cursor2 = _interopRequireDefault(_cursor); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _clone = __webpack_require__(21); + +var _clone2 = _interopRequireDefault(_clone); + +var _deepEqual = __webpack_require__(11); + +var _deepEqual2 = _interopRequireDefault(_deepEqual); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ASCII = /^[ -~]*$/; + +var Editor = function () { + function Editor(scroll) { + _classCallCheck(this, Editor); + + this.scroll = scroll; + this.delta = this.getDelta(); + } + + _createClass(Editor, [{ + key: 'applyDelta', + value: function applyDelta(delta) { + var _this = this; + + var consumeNextNewline = false; + this.scroll.update(); + var scrollLength = this.scroll.length(); + this.scroll.batchStart(); + delta = normalizeDelta(delta); + delta.reduce(function (index, op) { + var length = op.retain || op.delete || op.insert.length || 1; + var attributes = op.attributes || {}; + if (op.insert != null) { + if (typeof op.insert === 'string') { + var text = op.insert; + if (text.endsWith('\n') && consumeNextNewline) { + consumeNextNewline = false; + text = text.slice(0, -1); + } + if (index >= scrollLength && !text.endsWith('\n')) { + consumeNextNewline = true; + } + _this.scroll.insertAt(index, text); + + var _scroll$line = _this.scroll.line(index), + _scroll$line2 = _slicedToArray(_scroll$line, 2), + line = _scroll$line2[0], + offset = _scroll$line2[1]; + + var formats = (0, _extend2.default)({}, (0, _block.bubbleFormats)(line)); + if (line instanceof _block2.default) { + var _line$descendant = line.descendant(_parchment2.default.Leaf, offset), + _line$descendant2 = _slicedToArray(_line$descendant, 1), + leaf = _line$descendant2[0]; + + formats = (0, _extend2.default)(formats, (0, _block.bubbleFormats)(leaf)); + } + attributes = _op2.default.attributes.diff(formats, attributes) || {}; + } else if (_typeof(op.insert) === 'object') { + var key = Object.keys(op.insert)[0]; // There should only be one key + if (key == null) return index; + _this.scroll.insertAt(index, key, op.insert[key]); + } + scrollLength += length; + } + Object.keys(attributes).forEach(function (name) { + _this.scroll.formatAt(index, length, name, attributes[name]); + }); + return index + length; + }, 0); + delta.reduce(function (index, op) { + if (typeof op.delete === 'number') { + _this.scroll.deleteAt(index, op.delete); + return index; + } + return index + (op.retain || op.insert.length || 1); + }, 0); + this.scroll.batchEnd(); + return this.update(delta); + } + }, { + key: 'deleteText', + value: function deleteText(index, length) { + this.scroll.deleteAt(index, length); + return this.update(new _quillDelta2.default().retain(index).delete(length)); + } + }, { + key: 'formatLine', + value: function formatLine(index, length) { + var _this2 = this; + + var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + this.scroll.update(); + Object.keys(formats).forEach(function (format) { + if (_this2.scroll.whitelist != null && !_this2.scroll.whitelist[format]) return; + var lines = _this2.scroll.lines(index, Math.max(length, 1)); + var lengthRemaining = length; + lines.forEach(function (line) { + var lineLength = line.length(); + if (!(line instanceof _code2.default)) { + line.format(format, formats[format]); + } else { + var codeIndex = index - line.offset(_this2.scroll); + var codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1; + line.formatAt(codeIndex, codeLength, format, formats[format]); + } + lengthRemaining -= lineLength; + }); + }); + this.scroll.optimize(); + return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats))); + } + }, { + key: 'formatText', + value: function formatText(index, length) { + var _this3 = this; + + var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + Object.keys(formats).forEach(function (format) { + _this3.scroll.formatAt(index, length, format, formats[format]); + }); + return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats))); + } + }, { + key: 'getContents', + value: function getContents(index, length) { + return this.delta.slice(index, index + length); + } + }, { + key: 'getDelta', + value: function getDelta() { + return this.scroll.lines().reduce(function (delta, line) { + return delta.concat(line.delta()); + }, new _quillDelta2.default()); + } + }, { + key: 'getFormat', + value: function getFormat(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var lines = [], + leaves = []; + if (length === 0) { + this.scroll.path(index).forEach(function (path) { + var _path = _slicedToArray(path, 1), + blot = _path[0]; + + if (blot instanceof _block2.default) { + lines.push(blot); + } else if (blot instanceof _parchment2.default.Leaf) { + leaves.push(blot); + } + }); + } else { + lines = this.scroll.lines(index, length); + leaves = this.scroll.descendants(_parchment2.default.Leaf, index, length); + } + var formatsArr = [lines, leaves].map(function (blots) { + if (blots.length === 0) return {}; + var formats = (0, _block.bubbleFormats)(blots.shift()); + while (Object.keys(formats).length > 0) { + var blot = blots.shift(); + if (blot == null) return formats; + formats = combineFormats((0, _block.bubbleFormats)(blot), formats); + } + return formats; + }); + return _extend2.default.apply(_extend2.default, formatsArr); + } + }, { + key: 'getText', + value: function getText(index, length) { + return this.getContents(index, length).filter(function (op) { + return typeof op.insert === 'string'; + }).map(function (op) { + return op.insert; + }).join(''); + } + }, { + key: 'insertEmbed', + value: function insertEmbed(index, embed, value) { + this.scroll.insertAt(index, embed, value); + return this.update(new _quillDelta2.default().retain(index).insert(_defineProperty({}, embed, value))); + } + }, { + key: 'insertText', + value: function insertText(index, text) { + var _this4 = this; + + var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + this.scroll.insertAt(index, text); + Object.keys(formats).forEach(function (format) { + _this4.scroll.formatAt(index, text.length, format, formats[format]); + }); + return this.update(new _quillDelta2.default().retain(index).insert(text, (0, _clone2.default)(formats))); + } + }, { + key: 'isBlank', + value: function isBlank() { + if (this.scroll.children.length == 0) return true; + if (this.scroll.children.length > 1) return false; + var block = this.scroll.children.head; + if (block.statics.blotName !== _block2.default.blotName) return false; + if (block.children.length > 1) return false; + return block.children.head instanceof _break2.default; + } + }, { + key: 'removeFormat', + value: function removeFormat(index, length) { + var text = this.getText(index, length); + + var _scroll$line3 = this.scroll.line(index + length), + _scroll$line4 = _slicedToArray(_scroll$line3, 2), + line = _scroll$line4[0], + offset = _scroll$line4[1]; + + var suffixLength = 0, + suffix = new _quillDelta2.default(); + if (line != null) { + if (!(line instanceof _code2.default)) { + suffixLength = line.length() - offset; + } else { + suffixLength = line.newlineIndex(offset) - offset + 1; + } + suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\n'); + } + var contents = this.getContents(index, length + suffixLength); + var diff = contents.diff(new _quillDelta2.default().insert(text).concat(suffix)); + var delta = new _quillDelta2.default().retain(index).concat(diff); + return this.applyDelta(delta); + } + }, { + key: 'update', + value: function update(change) { + var mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var cursorIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + + var oldDelta = this.delta; + if (mutations.length === 1 && mutations[0].type === 'characterData' && mutations[0].target.data.match(ASCII) && _parchment2.default.find(mutations[0].target)) { + // Optimization for character changes + var textBlot = _parchment2.default.find(mutations[0].target); + var formats = (0, _block.bubbleFormats)(textBlot); + var index = textBlot.offset(this.scroll); + var oldValue = mutations[0].oldValue.replace(_cursor2.default.CONTENTS, ''); + var oldText = new _quillDelta2.default().insert(oldValue); + var newText = new _quillDelta2.default().insert(textBlot.value()); + var diffDelta = new _quillDelta2.default().retain(index).concat(oldText.diff(newText, cursorIndex)); + change = diffDelta.reduce(function (delta, op) { + if (op.insert) { + return delta.insert(op.insert, formats); + } else { + return delta.push(op); + } + }, new _quillDelta2.default()); + this.delta = oldDelta.compose(change); + } else { + this.delta = this.getDelta(); + if (!change || !(0, _deepEqual2.default)(oldDelta.compose(change), this.delta)) { + change = oldDelta.diff(this.delta, cursorIndex); + } + } + return change; + } + }]); + + return Editor; +}(); + +function combineFormats(formats, combined) { + return Object.keys(combined).reduce(function (merged, name) { + if (formats[name] == null) return merged; + if (combined[name] === formats[name]) { + merged[name] = combined[name]; + } else if (Array.isArray(combined[name])) { + if (combined[name].indexOf(formats[name]) < 0) { + merged[name] = combined[name].concat([formats[name]]); + } + } else { + merged[name] = [combined[name], formats[name]]; + } + return merged; + }, {}); +} + +function normalizeDelta(delta) { + return delta.reduce(function (delta, op) { + if (op.insert === 1) { + var attributes = (0, _clone2.default)(op.attributes); + delete attributes['image']; + return delta.insert({ image: op.attributes.image }, attributes); + } + if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) { + op = (0, _clone2.default)(op); + if (op.attributes.list) { + op.attributes.list = 'ordered'; + } else { + op.attributes.list = 'bullet'; + delete op.attributes.bullet; + } + } + if (typeof op.insert === 'string') { + var text = op.insert.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + return delta.insert(text, op.attributes); + } + return delta.push(op); + }, new _quillDelta2.default()); +} + +exports.default = Editor; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.Range = undefined; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _clone = __webpack_require__(21); + +var _clone2 = _interopRequireDefault(_clone); + +var _deepEqual = __webpack_require__(11); + +var _deepEqual2 = _interopRequireDefault(_deepEqual); + +var _emitter3 = __webpack_require__(8); + +var _emitter4 = _interopRequireDefault(_emitter3); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var debug = (0, _logger2.default)('quill:selection'); + +var Range = function Range(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + _classCallCheck(this, Range); + + this.index = index; + this.length = length; +}; + +var Selection = function () { + function Selection(scroll, emitter) { + var _this = this; + + _classCallCheck(this, Selection); + + this.emitter = emitter; + this.scroll = scroll; + this.composing = false; + this.mouseDown = false; + this.root = this.scroll.domNode; + this.cursor = _parchment2.default.create('cursor', this); + // savedRange is last non-null range + this.lastRange = this.savedRange = new Range(0, 0); + this.handleComposition(); + this.handleDragging(); + this.emitter.listenDOM('selectionchange', document, function () { + if (!_this.mouseDown) { + setTimeout(_this.update.bind(_this, _emitter4.default.sources.USER), 1); + } + }); + this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type, delta) { + if (type === _emitter4.default.events.TEXT_CHANGE && delta.length() > 0) { + _this.update(_emitter4.default.sources.SILENT); + } + }); + this.emitter.on(_emitter4.default.events.SCROLL_BEFORE_UPDATE, function () { + if (!_this.hasFocus()) return; + var native = _this.getNativeRange(); + if (native == null) return; + if (native.start.node === _this.cursor.textNode) return; // cursor.restore() will handle + // TODO unclear if this has negative side effects + _this.emitter.once(_emitter4.default.events.SCROLL_UPDATE, function () { + try { + _this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset); + } catch (ignored) {} + }); + }); + this.emitter.on(_emitter4.default.events.SCROLL_OPTIMIZE, function (mutations, context) { + if (context.range) { + var _context$range = context.range, + startNode = _context$range.startNode, + startOffset = _context$range.startOffset, + endNode = _context$range.endNode, + endOffset = _context$range.endOffset; + + _this.setNativeRange(startNode, startOffset, endNode, endOffset); + } + }); + this.update(_emitter4.default.sources.SILENT); + } + + _createClass(Selection, [{ + key: 'handleComposition', + value: function handleComposition() { + var _this2 = this; + + this.root.addEventListener('compositionstart', function () { + _this2.composing = true; + }); + this.root.addEventListener('compositionend', function () { + _this2.composing = false; + if (_this2.cursor.parent) { + var range = _this2.cursor.restore(); + if (!range) return; + setTimeout(function () { + _this2.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset); + }, 1); + } + }); + } + }, { + key: 'handleDragging', + value: function handleDragging() { + var _this3 = this; + + this.emitter.listenDOM('mousedown', document.body, function () { + _this3.mouseDown = true; + }); + this.emitter.listenDOM('mouseup', document.body, function () { + _this3.mouseDown = false; + _this3.update(_emitter4.default.sources.USER); + }); + } + }, { + key: 'focus', + value: function focus() { + if (this.hasFocus()) return; + this.root.focus(); + this.setRange(this.savedRange); + } + }, { + key: 'format', + value: function format(_format, value) { + if (this.scroll.whitelist != null && !this.scroll.whitelist[_format]) return; + this.scroll.update(); + var nativeRange = this.getNativeRange(); + if (nativeRange == null || !nativeRange.native.collapsed || _parchment2.default.query(_format, _parchment2.default.Scope.BLOCK)) return; + if (nativeRange.start.node !== this.cursor.textNode) { + var blot = _parchment2.default.find(nativeRange.start.node, false); + if (blot == null) return; + // TODO Give blot ability to not split + if (blot instanceof _parchment2.default.Leaf) { + var after = blot.split(nativeRange.start.offset); + blot.parent.insertBefore(this.cursor, after); + } else { + blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen + } + this.cursor.attach(); + } + this.cursor.format(_format, value); + this.scroll.optimize(); + this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length); + this.update(); + } + }, { + key: 'getBounds', + value: function getBounds(index) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var scrollLength = this.scroll.length(); + index = Math.min(index, scrollLength - 1); + length = Math.min(index + length, scrollLength - 1) - index; + var node = void 0, + _scroll$leaf = this.scroll.leaf(index), + _scroll$leaf2 = _slicedToArray(_scroll$leaf, 2), + leaf = _scroll$leaf2[0], + offset = _scroll$leaf2[1]; + if (leaf == null) return null; + + var _leaf$position = leaf.position(offset, true); + + var _leaf$position2 = _slicedToArray(_leaf$position, 2); + + node = _leaf$position2[0]; + offset = _leaf$position2[1]; + + var range = document.createRange(); + if (length > 0) { + range.setStart(node, offset); + + var _scroll$leaf3 = this.scroll.leaf(index + length); + + var _scroll$leaf4 = _slicedToArray(_scroll$leaf3, 2); + + leaf = _scroll$leaf4[0]; + offset = _scroll$leaf4[1]; + + if (leaf == null) return null; + + var _leaf$position3 = leaf.position(offset, true); + + var _leaf$position4 = _slicedToArray(_leaf$position3, 2); + + node = _leaf$position4[0]; + offset = _leaf$position4[1]; + + range.setEnd(node, offset); + return range.getBoundingClientRect(); + } else { + var side = 'left'; + var rect = void 0; + if (node instanceof Text) { + if (offset < node.data.length) { + range.setStart(node, offset); + range.setEnd(node, offset + 1); + } else { + range.setStart(node, offset - 1); + range.setEnd(node, offset); + side = 'right'; + } + rect = range.getBoundingClientRect(); + } else { + rect = leaf.domNode.getBoundingClientRect(); + if (offset > 0) side = 'right'; + } + return { + bottom: rect.top + rect.height, + height: rect.height, + left: rect[side], + right: rect[side], + top: rect.top, + width: 0 + }; + } + } + }, { + key: 'getNativeRange', + value: function getNativeRange() { + var selection = document.getSelection(); + if (selection == null || selection.rangeCount <= 0) return null; + var nativeRange = selection.getRangeAt(0); + if (nativeRange == null) return null; + var range = this.normalizeNative(nativeRange); + debug.info('getNativeRange', range); + return range; + } + }, { + key: 'getRange', + value: function getRange() { + var normalized = this.getNativeRange(); + if (normalized == null) return [null, null]; + var range = this.normalizedToRange(normalized); + return [range, normalized]; + } + }, { + key: 'hasFocus', + value: function hasFocus() { + return document.activeElement === this.root; + } + }, { + key: 'normalizedToRange', + value: function normalizedToRange(range) { + var _this4 = this; + + var positions = [[range.start.node, range.start.offset]]; + if (!range.native.collapsed) { + positions.push([range.end.node, range.end.offset]); + } + var indexes = positions.map(function (position) { + var _position = _slicedToArray(position, 2), + node = _position[0], + offset = _position[1]; + + var blot = _parchment2.default.find(node, true); + var index = blot.offset(_this4.scroll); + if (offset === 0) { + return index; + } else if (blot instanceof _parchment2.default.Container) { + return index + blot.length(); + } else { + return index + blot.index(node, offset); + } + }); + var end = Math.min(Math.max.apply(Math, _toConsumableArray(indexes)), this.scroll.length() - 1); + var start = Math.min.apply(Math, [end].concat(_toConsumableArray(indexes))); + return new Range(start, end - start); + } + }, { + key: 'normalizeNative', + value: function normalizeNative(nativeRange) { + if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) { + return null; + } + var range = { + start: { node: nativeRange.startContainer, offset: nativeRange.startOffset }, + end: { node: nativeRange.endContainer, offset: nativeRange.endOffset }, + native: nativeRange + }; + [range.start, range.end].forEach(function (position) { + var node = position.node, + offset = position.offset; + while (!(node instanceof Text) && node.childNodes.length > 0) { + if (node.childNodes.length > offset) { + node = node.childNodes[offset]; + offset = 0; + } else if (node.childNodes.length === offset) { + node = node.lastChild; + offset = node instanceof Text ? node.data.length : node.childNodes.length + 1; + } else { + break; + } + } + position.node = node, position.offset = offset; + }); + return range; + } + }, { + key: 'rangeToNative', + value: function rangeToNative(range) { + var _this5 = this; + + var indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length]; + var args = []; + var scrollLength = this.scroll.length(); + indexes.forEach(function (index, i) { + index = Math.min(scrollLength - 1, index); + var node = void 0, + _scroll$leaf5 = _this5.scroll.leaf(index), + _scroll$leaf6 = _slicedToArray(_scroll$leaf5, 2), + leaf = _scroll$leaf6[0], + offset = _scroll$leaf6[1]; + var _leaf$position5 = leaf.position(offset, i !== 0); + + var _leaf$position6 = _slicedToArray(_leaf$position5, 2); + + node = _leaf$position6[0]; + offset = _leaf$position6[1]; + + args.push(node, offset); + }); + if (args.length < 2) { + args = args.concat(args); + } + return args; + } + }, { + key: 'scrollIntoView', + value: function scrollIntoView(scrollingContainer) { + var range = this.lastRange; + if (range == null) return; + var bounds = this.getBounds(range.index, range.length); + if (bounds == null) return; + var limit = this.scroll.length() - 1; + + var _scroll$line = this.scroll.line(Math.min(range.index, limit)), + _scroll$line2 = _slicedToArray(_scroll$line, 1), + first = _scroll$line2[0]; + + var last = first; + if (range.length > 0) { + var _scroll$line3 = this.scroll.line(Math.min(range.index + range.length, limit)); + + var _scroll$line4 = _slicedToArray(_scroll$line3, 1); + + last = _scroll$line4[0]; + } + if (first == null || last == null) return; + var scrollBounds = scrollingContainer.getBoundingClientRect(); + if (bounds.top < scrollBounds.top) { + scrollingContainer.scrollTop -= scrollBounds.top - bounds.top; + } else if (bounds.bottom > scrollBounds.bottom) { + scrollingContainer.scrollTop += bounds.bottom - scrollBounds.bottom; + } + } + }, { + key: 'setNativeRange', + value: function setNativeRange(startNode, startOffset) { + var endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode; + var endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset; + var force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + debug.info('setNativeRange', startNode, startOffset, endNode, endOffset); + if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) { + return; + } + var selection = document.getSelection(); + if (selection == null) return; + if (startNode != null) { + if (!this.hasFocus()) this.root.focus(); + var native = (this.getNativeRange() || {}).native; + if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) { + + if (startNode.tagName == "BR") { + startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode); + startNode = startNode.parentNode; + } + if (endNode.tagName == "BR") { + endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode); + endNode = endNode.parentNode; + } + var range = document.createRange(); + range.setStart(startNode, startOffset); + range.setEnd(endNode, endOffset); + selection.removeAllRanges(); + selection.addRange(range); + } + } else { + selection.removeAllRanges(); + this.root.blur(); + document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs) + } + } + }, { + key: 'setRange', + value: function setRange(range) { + var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API; + + if (typeof force === 'string') { + source = force; + force = false; + } + debug.info('setRange', range); + if (range != null) { + var args = this.rangeToNative(range); + this.setNativeRange.apply(this, _toConsumableArray(args).concat([force])); + } else { + this.setNativeRange(null); + } + this.update(source); + } + }, { + key: 'update', + value: function update() { + var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER; + + var oldRange = this.lastRange; + + var _getRange = this.getRange(), + _getRange2 = _slicedToArray(_getRange, 2), + lastRange = _getRange2[0], + nativeRange = _getRange2[1]; + + this.lastRange = lastRange; + if (this.lastRange != null) { + this.savedRange = this.lastRange; + } + if (!(0, _deepEqual2.default)(oldRange, this.lastRange)) { + var _emitter; + + if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) { + this.cursor.restore(); + } + var args = [_emitter4.default.events.SELECTION_CHANGE, (0, _clone2.default)(this.lastRange), (0, _clone2.default)(oldRange), source]; + (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args)); + if (source !== _emitter4.default.sources.SILENT) { + var _emitter2; + + (_emitter2 = this.emitter).emit.apply(_emitter2, args); + } + } + } + }]); + + return Selection; +}(); + +function contains(parent, descendant) { + try { + // Firefox inserts inaccessible nodes around video elements + descendant.parentNode; + } catch (e) { + return false; + } + // IE11 has bug with Text nodes + // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect + if (descendant instanceof Text) { + descendant = descendant.parentNode; + } + return parent.contains(descendant); +} + +exports.Range = Range; +exports.default = Selection; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Break = function (_Parchment$Embed) { + _inherits(Break, _Parchment$Embed); + + function Break() { + _classCallCheck(this, Break); + + return _possibleConstructorReturn(this, (Break.__proto__ || Object.getPrototypeOf(Break)).apply(this, arguments)); + } + + _createClass(Break, [{ + key: 'insertInto', + value: function insertInto(parent, ref) { + if (parent.children.length === 0) { + _get(Break.prototype.__proto__ || Object.getPrototypeOf(Break.prototype), 'insertInto', this).call(this, parent, ref); + } else { + this.remove(); + } + } + }, { + key: 'length', + value: function length() { + return 0; + } + }, { + key: 'value', + value: function value() { + return ''; + } + }], [{ + key: 'value', + value: function value() { + return undefined; + } + }]); + + return Break; +}(_parchment2.default.Embed); + +Break.blotName = 'break'; +Break.tagName = 'BR'; + +exports.default = Break; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var linked_list_1 = __webpack_require__(44); +var shadow_1 = __webpack_require__(30); +var Registry = __webpack_require__(1); +var ContainerBlot = /** @class */ (function (_super) { + __extends(ContainerBlot, _super); + function ContainerBlot(domNode) { + var _this = _super.call(this, domNode) || this; + _this.build(); + return _this; + } + ContainerBlot.prototype.appendChild = function (other) { + this.insertBefore(other); + }; + ContainerBlot.prototype.attach = function () { + _super.prototype.attach.call(this); + this.children.forEach(function (child) { + child.attach(); + }); + }; + ContainerBlot.prototype.build = function () { + var _this = this; + this.children = new linked_list_1.default(); + // Need to be reversed for if DOM nodes already in order + [].slice + .call(this.domNode.childNodes) + .reverse() + .forEach(function (node) { + try { + var child = makeBlot(node); + _this.insertBefore(child, _this.children.head || undefined); + } + catch (err) { + if (err instanceof Registry.ParchmentError) + return; + else + throw err; + } + }); + }; + ContainerBlot.prototype.deleteAt = function (index, length) { + if (index === 0 && length === this.length()) { + return this.remove(); + } + this.children.forEachAt(index, length, function (child, offset, length) { + child.deleteAt(offset, length); + }); + }; + ContainerBlot.prototype.descendant = function (criteria, index) { + var _a = this.children.find(index), child = _a[0], offset = _a[1]; + if ((criteria.blotName == null && criteria(child)) || + (criteria.blotName != null && child instanceof criteria)) { + return [child, offset]; + } + else if (child instanceof ContainerBlot) { + return child.descendant(criteria, offset); + } + else { + return [null, -1]; + } + }; + ContainerBlot.prototype.descendants = function (criteria, index, length) { + if (index === void 0) { index = 0; } + if (length === void 0) { length = Number.MAX_VALUE; } + var descendants = []; + var lengthLeft = length; + this.children.forEachAt(index, length, function (child, index, length) { + if ((criteria.blotName == null && criteria(child)) || + (criteria.blotName != null && child instanceof criteria)) { + descendants.push(child); + } + if (child instanceof ContainerBlot) { + descendants = descendants.concat(child.descendants(criteria, index, lengthLeft)); + } + lengthLeft -= length; + }); + return descendants; + }; + ContainerBlot.prototype.detach = function () { + this.children.forEach(function (child) { + child.detach(); + }); + _super.prototype.detach.call(this); + }; + ContainerBlot.prototype.formatAt = function (index, length, name, value) { + this.children.forEachAt(index, length, function (child, offset, length) { + child.formatAt(offset, length, name, value); + }); + }; + ContainerBlot.prototype.insertAt = function (index, value, def) { + var _a = this.children.find(index), child = _a[0], offset = _a[1]; + if (child) { + child.insertAt(offset, value, def); + } + else { + var blot = def == null ? Registry.create('text', value) : Registry.create(value, def); + this.appendChild(blot); + } + }; + ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) { + if (this.statics.allowedChildren != null && + !this.statics.allowedChildren.some(function (child) { + return childBlot instanceof child; + })) { + throw new Registry.ParchmentError("Cannot insert " + childBlot.statics.blotName + " into " + this.statics.blotName); + } + childBlot.insertInto(this, refBlot); + }; + ContainerBlot.prototype.length = function () { + return this.children.reduce(function (memo, child) { + return memo + child.length(); + }, 0); + }; + ContainerBlot.prototype.moveChildren = function (targetParent, refNode) { + this.children.forEach(function (child) { + targetParent.insertBefore(child, refNode); + }); + }; + ContainerBlot.prototype.optimize = function (context) { + _super.prototype.optimize.call(this, context); + if (this.children.length === 0) { + if (this.statics.defaultChild != null) { + var child = Registry.create(this.statics.defaultChild); + this.appendChild(child); + child.optimize(context); + } + else { + this.remove(); + } + } + }; + ContainerBlot.prototype.path = function (index, inclusive) { + if (inclusive === void 0) { inclusive = false; } + var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1]; + var position = [[this, index]]; + if (child instanceof ContainerBlot) { + return position.concat(child.path(offset, inclusive)); + } + else if (child != null) { + position.push([child, offset]); + } + return position; + }; + ContainerBlot.prototype.removeChild = function (child) { + this.children.remove(child); + }; + ContainerBlot.prototype.replace = function (target) { + if (target instanceof ContainerBlot) { + target.moveChildren(this); + } + _super.prototype.replace.call(this, target); + }; + ContainerBlot.prototype.split = function (index, force) { + if (force === void 0) { force = false; } + if (!force) { + if (index === 0) + return this; + if (index === this.length()) + return this.next; + } + var after = this.clone(); + this.parent.insertBefore(after, this.next); + this.children.forEachAt(index, this.length(), function (child, offset, length) { + child = child.split(offset, force); + after.appendChild(child); + }); + return after; + }; + ContainerBlot.prototype.unwrap = function () { + this.moveChildren(this.parent, this.next); + this.remove(); + }; + ContainerBlot.prototype.update = function (mutations, context) { + var _this = this; + var addedNodes = []; + var removedNodes = []; + mutations.forEach(function (mutation) { + if (mutation.target === _this.domNode && mutation.type === 'childList') { + addedNodes.push.apply(addedNodes, mutation.addedNodes); + removedNodes.push.apply(removedNodes, mutation.removedNodes); + } + }); + removedNodes.forEach(function (node) { + // Check node has actually been removed + // One exception is Chrome does not immediately remove IFRAMEs + // from DOM but MutationRecord is correct in its reported removal + if (node.parentNode != null && + // @ts-ignore + node.tagName !== 'IFRAME' && + document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) { + return; + } + var blot = Registry.find(node); + if (blot == null) + return; + if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) { + blot.detach(); + } + }); + addedNodes + .filter(function (node) { + return node.parentNode == _this.domNode; + }) + .sort(function (a, b) { + if (a === b) + return 0; + if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) { + return 1; + } + return -1; + }) + .forEach(function (node) { + var refBlot = null; + if (node.nextSibling != null) { + refBlot = Registry.find(node.nextSibling); + } + var blot = makeBlot(node); + if (blot.next != refBlot || blot.next == null) { + if (blot.parent != null) { + blot.parent.removeChild(_this); + } + _this.insertBefore(blot, refBlot || undefined); + } + }); + }; + return ContainerBlot; +}(shadow_1.default)); +function makeBlot(node) { + var blot = Registry.find(node); + if (blot == null) { + try { + blot = Registry.create(node); + } + catch (e) { + blot = Registry.create(Registry.Scope.INLINE); + [].slice.call(node.childNodes).forEach(function (child) { + // @ts-ignore + blot.domNode.appendChild(child); + }); + if (node.parentNode) { + node.parentNode.replaceChild(blot.domNode, node); + } + blot.attach(); + } + } + return blot; +} +exports.default = ContainerBlot; + + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +var store_1 = __webpack_require__(31); +var container_1 = __webpack_require__(17); +var Registry = __webpack_require__(1); +var FormatBlot = /** @class */ (function (_super) { + __extends(FormatBlot, _super); + function FormatBlot(domNode) { + var _this = _super.call(this, domNode) || this; + _this.attributes = new store_1.default(_this.domNode); + return _this; + } + FormatBlot.formats = function (domNode) { + if (typeof this.tagName === 'string') { + return true; + } + else if (Array.isArray(this.tagName)) { + return domNode.tagName.toLowerCase(); + } + return undefined; + }; + FormatBlot.prototype.format = function (name, value) { + var format = Registry.query(name); + if (format instanceof attributor_1.default) { + this.attributes.attribute(format, value); + } + else if (value) { + if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) { + this.replaceWith(name, value); + } + } + }; + FormatBlot.prototype.formats = function () { + var formats = this.attributes.values(); + var format = this.statics.formats(this.domNode); + if (format != null) { + formats[this.statics.blotName] = format; + } + return formats; + }; + FormatBlot.prototype.replaceWith = function (name, value) { + var replacement = _super.prototype.replaceWith.call(this, name, value); + this.attributes.copy(replacement); + return replacement; + }; + FormatBlot.prototype.update = function (mutations, context) { + var _this = this; + _super.prototype.update.call(this, mutations, context); + if (mutations.some(function (mutation) { + return mutation.target === _this.domNode && mutation.type === 'attributes'; + })) { + this.attributes.build(); + } + }; + FormatBlot.prototype.wrap = function (name, value) { + var wrapper = _super.prototype.wrap.call(this, name, value); + if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) { + this.attributes.move(wrapper); + } + return wrapper; + }; + return FormatBlot; +}(container_1.default)); +exports.default = FormatBlot; + + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var shadow_1 = __webpack_require__(30); +var Registry = __webpack_require__(1); +var LeafBlot = /** @class */ (function (_super) { + __extends(LeafBlot, _super); + function LeafBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + LeafBlot.value = function (domNode) { + return true; + }; + LeafBlot.prototype.index = function (node, offset) { + if (this.domNode === node || + this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) { + return Math.min(offset, 1); + } + return -1; + }; + LeafBlot.prototype.position = function (index, inclusive) { + var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode); + if (index > 0) + offset += 1; + return [this.parent.domNode, offset]; + }; + LeafBlot.prototype.value = function () { + return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a; + var _a; + }; + LeafBlot.scope = Registry.Scope.INLINE_BLOT; + return LeafBlot; +}(shadow_1.default)); +exports.default = LeafBlot; + + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +var equal = __webpack_require__(11); +var extend = __webpack_require__(3); + + +var lib = { + attributes: { + compose: function (a, b, keepNull) { + if (typeof a !== 'object') a = {}; + if (typeof b !== 'object') b = {}; + var attributes = extend(true, {}, b); + if (!keepNull) { + attributes = Object.keys(attributes).reduce(function (copy, key) { + if (attributes[key] != null) { + copy[key] = attributes[key]; + } + return copy; + }, {}); + } + for (var key in a) { + if (a[key] !== undefined && b[key] === undefined) { + attributes[key] = a[key]; + } + } + return Object.keys(attributes).length > 0 ? attributes : undefined; + }, + + diff: function(a, b) { + if (typeof a !== 'object') a = {}; + if (typeof b !== 'object') b = {}; + var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) { + if (!equal(a[key], b[key])) { + attributes[key] = b[key] === undefined ? null : b[key]; + } + return attributes; + }, {}); + return Object.keys(attributes).length > 0 ? attributes : undefined; + }, + + transform: function (a, b, priority) { + if (typeof a !== 'object') return b; + if (typeof b !== 'object') return undefined; + if (!priority) return b; // b simply overwrites us without priority + var attributes = Object.keys(b).reduce(function (attributes, key) { + if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value + return attributes; + }, {}); + return Object.keys(attributes).length > 0 ? attributes : undefined; + } + }, + + iterator: function (ops) { + return new Iterator(ops); + }, + + length: function (op) { + if (typeof op['delete'] === 'number') { + return op['delete']; + } else if (typeof op.retain === 'number') { + return op.retain; + } else { + return typeof op.insert === 'string' ? op.insert.length : 1; + } + } +}; + + +function Iterator(ops) { + this.ops = ops; + this.index = 0; + this.offset = 0; +}; + +Iterator.prototype.hasNext = function () { + return this.peekLength() < Infinity; +}; + +Iterator.prototype.next = function (length) { + if (!length) length = Infinity; + var nextOp = this.ops[this.index]; + if (nextOp) { + var offset = this.offset; + var opLength = lib.length(nextOp) + if (length >= opLength - offset) { + length = opLength - offset; + this.index += 1; + this.offset = 0; + } else { + this.offset += length; + } + if (typeof nextOp['delete'] === 'number') { + return { 'delete': length }; + } else { + var retOp = {}; + if (nextOp.attributes) { + retOp.attributes = nextOp.attributes; + } + if (typeof nextOp.retain === 'number') { + retOp.retain = length; + } else if (typeof nextOp.insert === 'string') { + retOp.insert = nextOp.insert.substr(offset, length); + } else { + // offset should === 0, length should === 1 + retOp.insert = nextOp.insert; + } + return retOp; + } + } else { + return { retain: Infinity }; + } +}; + +Iterator.prototype.peek = function () { + return this.ops[this.index]; +}; + +Iterator.prototype.peekLength = function () { + if (this.ops[this.index]) { + // Should never return 0 if our index is being managed correctly + return lib.length(this.ops[this.index]) - this.offset; + } else { + return Infinity; + } +}; + +Iterator.prototype.peekType = function () { + if (this.ops[this.index]) { + if (typeof this.ops[this.index]['delete'] === 'number') { + return 'delete'; + } else if (typeof this.ops[this.index].retain === 'number') { + return 'retain'; + } else { + return 'insert'; + } + } + return 'retain'; +}; + + +module.exports = lib; + + +/***/ }), +/* 21 */ +/***/ (function(module, exports) { + +var clone = (function() { +'use strict'; + +function _instanceof(obj, type) { + return type != null && obj instanceof type; +} + +var nativeMap; +try { + nativeMap = Map; +} catch(_) { + // maybe a reference error because no `Map`. Give it a dummy value that no + // value will ever be an instanceof. + nativeMap = function() {}; +} + +var nativeSet; +try { + nativeSet = Set; +} catch(_) { + nativeSet = function() {}; +} + +var nativePromise; +try { + nativePromise = Promise; +} catch(_) { + nativePromise = function() {}; +} + +/** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + * @param `includeNonEnumerable` - set to true if the non-enumerable properties + * should be cloned as well. Non-enumerable properties on the prototype + * chain will be ignored. (optional - false by default) +*/ +function clone(parent, circular, depth, prototype, includeNonEnumerable) { + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + includeNonEnumerable = circular.includeNonEnumerable; + circular = circular.circular; + } + // maintain two arrays for circular references, where corresponding parents + // and children have the same index + var allParents = []; + var allChildren = []; + + var useBuffer = typeof Buffer != 'undefined'; + + if (typeof circular == 'undefined') + circular = true; + + if (typeof depth == 'undefined') + depth = Infinity; + + // recurse this function so we don't reset allParents and allChildren + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) + return null; + + if (depth === 0) + return parent; + + var child; + var proto; + if (typeof parent != 'object') { + return parent; + } + + if (_instanceof(parent, nativeMap)) { + child = new nativeMap(); + } else if (_instanceof(parent, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent, nativePromise)) { + child = new nativePromise(function (resolve, reject) { + parent.then(function(value) { + resolve(_clone(value, depth - 1)); + }, function(err) { + reject(_clone(err, depth - 1)); + }); + }); + } else if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && Buffer.isBuffer(parent)) { + child = new Buffer(parent.length); + parent.copy(child); + return child; + } else if (_instanceof(parent, Error)) { + child = Object.create(parent); + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } + else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + allParents.push(parent); + allChildren.push(child); + } + + if (_instanceof(parent, nativeMap)) { + parent.forEach(function(value, key) { + var keyChild = _clone(key, depth - 1); + var valueChild = _clone(value, depth - 1); + child.set(keyChild, valueChild); + }); + } + if (_instanceof(parent, nativeSet)) { + parent.forEach(function(value) { + var entryChild = _clone(value, depth - 1); + child.add(entryChild); + }); + } + + for (var i in parent) { + var attrs; + if (proto) { + attrs = Object.getOwnPropertyDescriptor(proto, i); + } + + if (attrs && attrs.set == null) { + continue; + } + child[i] = _clone(parent[i], depth - 1); + } + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(parent); + for (var i = 0; i < symbols.length; i++) { + // Don't need to worry about cloning a symbol because it is a primitive, + // like a number or string. + var symbol = symbols[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); + if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { + continue; + } + child[symbol] = _clone(parent[symbol], depth - 1); + if (!descriptor.enumerable) { + Object.defineProperty(child, symbol, { + enumerable: false + }); + } + } + } + + if (includeNonEnumerable) { + var allPropertyNames = Object.getOwnPropertyNames(parent); + for (var i = 0; i < allPropertyNames.length; i++) { + var propertyName = allPropertyNames[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); + if (descriptor && descriptor.enumerable) { + continue; + } + child[propertyName] = _clone(parent[propertyName], depth - 1); + Object.defineProperty(child, propertyName, { + enumerable: false + }); + } + } + + return child; + } + + return _clone(parent, depth); +} + +/** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ +clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); +}; + +// private utility functions + +function __objToStr(o) { + return Object.prototype.toString.call(o); +} +clone.__objToStr = __objToStr; + +function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; +} +clone.__isDate = __isDate; + +function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; +} +clone.__isArray = __isArray; + +function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; +} +clone.__isRegExp = __isRegExp; + +function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; +} +clone.__getRegExpFlags = __getRegExpFlags; + +return clone; +})(); + +if (typeof module === 'object' && module.exports) { + module.exports = clone; +} + + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _emitter = __webpack_require__(8); + +var _emitter2 = _interopRequireDefault(_emitter); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _container = __webpack_require__(25); + +var _container2 = _interopRequireDefault(_container); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function isLine(blot) { + return blot instanceof _block2.default || blot instanceof _block.BlockEmbed; +} + +var Scroll = function (_Parchment$Scroll) { + _inherits(Scroll, _Parchment$Scroll); + + function Scroll(domNode, config) { + _classCallCheck(this, Scroll); + + var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, domNode)); + + _this.emitter = config.emitter; + if (Array.isArray(config.whitelist)) { + _this.whitelist = config.whitelist.reduce(function (whitelist, format) { + whitelist[format] = true; + return whitelist; + }, {}); + } + // Some reason fixes composition issues with character languages in Windows/Chrome, Safari + _this.domNode.addEventListener('DOMNodeInserted', function () {}); + _this.optimize(); + _this.enable(); + return _this; + } + + _createClass(Scroll, [{ + key: 'batchStart', + value: function batchStart() { + this.batch = true; + } + }, { + key: 'batchEnd', + value: function batchEnd() { + this.batch = false; + this.optimize(); + } + }, { + key: 'deleteAt', + value: function deleteAt(index, length) { + var _line = this.line(index), + _line2 = _slicedToArray(_line, 2), + first = _line2[0], + offset = _line2[1]; + + var _line3 = this.line(index + length), + _line4 = _slicedToArray(_line3, 1), + last = _line4[0]; + + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'deleteAt', this).call(this, index, length); + if (last != null && first !== last && offset > 0) { + if (first instanceof _block.BlockEmbed || last instanceof _block.BlockEmbed) { + this.optimize(); + return; + } + if (first instanceof _code2.default) { + var newlineIndex = first.newlineIndex(first.length(), true); + if (newlineIndex > -1) { + first = first.split(newlineIndex + 1); + if (first === last) { + this.optimize(); + return; + } + } + } else if (last instanceof _code2.default) { + var _newlineIndex = last.newlineIndex(0); + if (_newlineIndex > -1) { + last.split(_newlineIndex + 1); + } + } + var ref = last.children.head instanceof _break2.default ? null : last.children.head; + first.moveChildren(last, ref); + first.remove(); + } + this.optimize(); + } + }, { + key: 'enable', + value: function enable() { + var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.domNode.setAttribute('contenteditable', enabled); + } + }, { + key: 'formatAt', + value: function formatAt(index, length, format, value) { + if (this.whitelist != null && !this.whitelist[format]) return; + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'formatAt', this).call(this, index, length, format, value); + this.optimize(); + } + }, { + key: 'insertAt', + value: function insertAt(index, value, def) { + if (def != null && this.whitelist != null && !this.whitelist[value]) return; + if (index >= this.length()) { + if (def == null || _parchment2.default.query(value, _parchment2.default.Scope.BLOCK) == null) { + var blot = _parchment2.default.create(this.statics.defaultChild); + this.appendChild(blot); + if (def == null && value.endsWith('\n')) { + value = value.slice(0, -1); + } + blot.insertAt(0, value, def); + } else { + var embed = _parchment2.default.create(value, def); + this.appendChild(embed); + } + } else { + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertAt', this).call(this, index, value, def); + } + this.optimize(); + } + }, { + key: 'insertBefore', + value: function insertBefore(blot, ref) { + if (blot.statics.scope === _parchment2.default.Scope.INLINE_BLOT) { + var wrapper = _parchment2.default.create(this.statics.defaultChild); + wrapper.appendChild(blot); + blot = wrapper; + } + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertBefore', this).call(this, blot, ref); + } + }, { + key: 'leaf', + value: function leaf(index) { + return this.path(index).pop() || [null, -1]; + } + }, { + key: 'line', + value: function line(index) { + if (index === this.length()) { + return this.line(index - 1); + } + return this.descendant(isLine, index); + } + }, { + key: 'lines', + value: function lines() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; + + var getLines = function getLines(blot, index, length) { + var lines = [], + lengthLeft = length; + blot.children.forEachAt(index, length, function (child, index, length) { + if (isLine(child)) { + lines.push(child); + } else if (child instanceof _parchment2.default.Container) { + lines = lines.concat(getLines(child, index, lengthLeft)); + } + lengthLeft -= length; + }); + return lines; + }; + return getLines(this, index, length); + } + }, { + key: 'optimize', + value: function optimize() { + var mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (this.batch === true) return; + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'optimize', this).call(this, mutations, context); + if (mutations.length > 0) { + this.emitter.emit(_emitter2.default.events.SCROLL_OPTIMIZE, mutations, context); + } + } + }, { + key: 'path', + value: function path(index) { + return _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'path', this).call(this, index).slice(1); // Exclude self + } + }, { + key: 'update', + value: function update(mutations) { + if (this.batch === true) return; + var source = _emitter2.default.sources.USER; + if (typeof mutations === 'string') { + source = mutations; + } + if (!Array.isArray(mutations)) { + mutations = this.observer.takeRecords(); + } + if (mutations.length > 0) { + this.emitter.emit(_emitter2.default.events.SCROLL_BEFORE_UPDATE, source, mutations); + } + _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'update', this).call(this, mutations.concat([])); // pass copy + if (mutations.length > 0) { + this.emitter.emit(_emitter2.default.events.SCROLL_UPDATE, source, mutations); + } + } + }]); + + return Scroll; +}(_parchment2.default.Scroll); + +Scroll.blotName = 'scroll'; +Scroll.className = 'ql-editor'; +Scroll.tagName = 'DIV'; +Scroll.defaultChild = 'block'; +Scroll.allowedChildren = [_block2.default, _block.BlockEmbed, _container2.default]; + +exports.default = Scroll; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SHORTKEY = exports.default = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _clone = __webpack_require__(21); + +var _clone2 = _interopRequireDefault(_clone); + +var _deepEqual = __webpack_require__(11); + +var _deepEqual2 = _interopRequireDefault(_deepEqual); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _op = __webpack_require__(20); + +var _op2 = _interopRequireDefault(_op); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:keyboard'); + +var SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey'; + +var Keyboard = function (_Module) { + _inherits(Keyboard, _Module); + + _createClass(Keyboard, null, [{ + key: 'match', + value: function match(evt, binding) { + binding = normalize(binding); + if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) { + return !!binding[key] !== evt[key] && binding[key] !== null; + })) { + return false; + } + return binding.key === (evt.which || evt.keyCode); + } + }]); + + function Keyboard(quill, options) { + _classCallCheck(this, Keyboard); + + var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options)); + + _this.bindings = {}; + Object.keys(_this.options.bindings).forEach(function (name) { + if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) { + return; + } + if (_this.options.bindings[name]) { + _this.addBinding(_this.options.bindings[name]); + } + }); + _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter); + _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {}); + if (/Firefox/i.test(navigator.userAgent)) { + // Need to handle delete and backspace for Firefox in the general case #1171 + _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace); + _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete); + } else { + _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace); + _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete); + } + _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange); + _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange); + _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace); + _this.listen(); + return _this; + } + + _createClass(Keyboard, [{ + key: 'addBinding', + value: function addBinding(key) { + var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + var binding = normalize(key); + if (binding == null || binding.key == null) { + return debug.warn('Attempted to add invalid keyboard binding', binding); + } + if (typeof context === 'function') { + context = { handler: context }; + } + if (typeof handler === 'function') { + handler = { handler: handler }; + } + binding = (0, _extend2.default)(binding, context, handler); + this.bindings[binding.key] = this.bindings[binding.key] || []; + this.bindings[binding.key].push(binding); + } + }, { + key: 'listen', + value: function listen() { + var _this2 = this; + + this.quill.root.addEventListener('keydown', function (evt) { + if (evt.defaultPrevented) return; + var which = evt.which || evt.keyCode; + var bindings = (_this2.bindings[which] || []).filter(function (binding) { + return Keyboard.match(evt, binding); + }); + if (bindings.length === 0) return; + var range = _this2.quill.getSelection(); + if (range == null || !_this2.quill.hasFocus()) return; + + var _quill$getLine = _this2.quill.getLine(range.index), + _quill$getLine2 = _slicedToArray(_quill$getLine, 2), + line = _quill$getLine2[0], + offset = _quill$getLine2[1]; + + var _quill$getLeaf = _this2.quill.getLeaf(range.index), + _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2), + leafStart = _quill$getLeaf2[0], + offsetStart = _quill$getLeaf2[1]; + + var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length), + _ref2 = _slicedToArray(_ref, 2), + leafEnd = _ref2[0], + offsetEnd = _ref2[1]; + + var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : ''; + var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : ''; + var curContext = { + collapsed: range.length === 0, + empty: range.length === 0 && line.length() <= 1, + format: _this2.quill.getFormat(range), + offset: offset, + prefix: prefixText, + suffix: suffixText + }; + var prevented = bindings.some(function (binding) { + if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false; + if (binding.empty != null && binding.empty !== curContext.empty) return false; + if (binding.offset != null && binding.offset !== curContext.offset) return false; + if (Array.isArray(binding.format)) { + // any format is present + if (binding.format.every(function (name) { + return curContext.format[name] == null; + })) { + return false; + } + } else if (_typeof(binding.format) === 'object') { + // all formats must match + if (!Object.keys(binding.format).every(function (name) { + if (binding.format[name] === true) return curContext.format[name] != null; + if (binding.format[name] === false) return curContext.format[name] == null; + return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]); + })) { + return false; + } + } + if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false; + if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false; + return binding.handler.call(_this2, range, curContext) !== true; + }); + if (prevented) { + evt.preventDefault(); + } + }); + } + }]); + + return Keyboard; +}(_module2.default); + +Keyboard.keys = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + ESCAPE: 27, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 +}; + +Keyboard.DEFAULTS = { + bindings: { + 'bold': makeFormatHandler('bold'), + 'italic': makeFormatHandler('italic'), + 'underline': makeFormatHandler('underline'), + 'indent': { + // highlight tab or tab at beginning of list, indent or blockquote + key: Keyboard.keys.TAB, + format: ['blockquote', 'indent', 'list'], + handler: function handler(range, context) { + if (context.collapsed && context.offset !== 0) return true; + this.quill.format('indent', '+1', _quill2.default.sources.USER); + } + }, + 'outdent': { + key: Keyboard.keys.TAB, + shiftKey: true, + format: ['blockquote', 'indent', 'list'], + // highlight tab or tab at beginning of list, indent or blockquote + handler: function handler(range, context) { + if (context.collapsed && context.offset !== 0) return true; + this.quill.format('indent', '-1', _quill2.default.sources.USER); + } + }, + 'outdent backspace': { + key: Keyboard.keys.BACKSPACE, + collapsed: true, + shiftKey: null, + metaKey: null, + ctrlKey: null, + altKey: null, + format: ['indent', 'list'], + offset: 0, + handler: function handler(range, context) { + if (context.format.indent != null) { + this.quill.format('indent', '-1', _quill2.default.sources.USER); + } else if (context.format.list != null) { + this.quill.format('list', false, _quill2.default.sources.USER); + } + } + }, + 'indent code-block': makeCodeBlockHandler(true), + 'outdent code-block': makeCodeBlockHandler(false), + 'remove tab': { + key: Keyboard.keys.TAB, + shiftKey: true, + collapsed: true, + prefix: /\t$/, + handler: function handler(range) { + this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER); + } + }, + 'tab': { + key: Keyboard.keys.TAB, + handler: function handler(range) { + this.quill.history.cutoff(); + var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\t'); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.history.cutoff(); + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + } + }, + 'list empty enter': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: ['list'], + empty: true, + handler: function handler(range, context) { + this.quill.format('list', false, _quill2.default.sources.USER); + if (context.format.indent) { + this.quill.format('indent', false, _quill2.default.sources.USER); + } + } + }, + 'checklist enter': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: { list: 'checked' }, + handler: function handler(range) { + var _quill$getLine3 = this.quill.getLine(range.index), + _quill$getLine4 = _slicedToArray(_quill$getLine3, 2), + line = _quill$getLine4[0], + offset = _quill$getLine4[1]; + + var formats = (0, _extend2.default)({}, line.formats(), { list: 'checked' }); + var delta = new _quillDelta2.default().retain(range.index).insert('\n', formats).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' }); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + this.quill.scrollIntoView(); + } + }, + 'header enter': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: ['header'], + suffix: /^$/, + handler: function handler(range, context) { + var _quill$getLine5 = this.quill.getLine(range.index), + _quill$getLine6 = _slicedToArray(_quill$getLine5, 2), + line = _quill$getLine6[0], + offset = _quill$getLine6[1]; + + var delta = new _quillDelta2.default().retain(range.index).insert('\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null }); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + this.quill.scrollIntoView(); + } + }, + 'list autofill': { + key: ' ', + collapsed: true, + format: { list: false }, + prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, + handler: function handler(range, context) { + var length = context.prefix.length; + + var _quill$getLine7 = this.quill.getLine(range.index), + _quill$getLine8 = _slicedToArray(_quill$getLine7, 2), + line = _quill$getLine8[0], + offset = _quill$getLine8[1]; + + if (offset > length) return true; + var value = void 0; + switch (context.prefix.trim()) { + case '[]':case '[ ]': + value = 'unchecked'; + break; + case '[x]': + value = 'checked'; + break; + case '-':case '*': + value = 'bullet'; + break; + default: + value = 'ordered'; + } + this.quill.insertText(range.index, ' ', _quill2.default.sources.USER); + this.quill.history.cutoff(); + var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value }); + this.quill.updateContents(delta, _quill2.default.sources.USER); + this.quill.history.cutoff(); + this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT); + } + }, + 'code exit': { + key: Keyboard.keys.ENTER, + collapsed: true, + format: ['code-block'], + prefix: /\n\n$/, + suffix: /^\s+$/, + handler: function handler(range) { + var _quill$getLine9 = this.quill.getLine(range.index), + _quill$getLine10 = _slicedToArray(_quill$getLine9, 2), + line = _quill$getLine10[0], + offset = _quill$getLine10[1]; + + var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1); + this.quill.updateContents(delta, _quill2.default.sources.USER); + } + }, + 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false), + 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true), + 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false), + 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true) + } +}; + +function makeEmbedArrowHandler(key, shiftKey) { + var _ref3; + + var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix'; + return _ref3 = { + key: key, + shiftKey: shiftKey, + altKey: null + }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) { + var index = range.index; + if (key === Keyboard.keys.RIGHT) { + index += range.length + 1; + } + + var _quill$getLeaf3 = this.quill.getLeaf(index), + _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1), + leaf = _quill$getLeaf4[0]; + + if (!(leaf instanceof _parchment2.default.Embed)) return true; + if (key === Keyboard.keys.LEFT) { + if (shiftKey) { + this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER); + } else { + this.quill.setSelection(range.index - 1, _quill2.default.sources.USER); + } + } else { + if (shiftKey) { + this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER); + } else { + this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER); + } + } + return false; + }), _ref3; +} + +function handleBackspace(range, context) { + if (range.index === 0 || this.quill.getLength() <= 1) return; + + var _quill$getLine11 = this.quill.getLine(range.index), + _quill$getLine12 = _slicedToArray(_quill$getLine11, 1), + line = _quill$getLine12[0]; + + var formats = {}; + if (context.offset === 0) { + var _quill$getLine13 = this.quill.getLine(range.index - 1), + _quill$getLine14 = _slicedToArray(_quill$getLine13, 1), + prev = _quill$getLine14[0]; + + if (prev != null && prev.length() > 1) { + var curFormats = line.formats(); + var prevFormats = this.quill.getFormat(range.index - 1, 1); + formats = _op2.default.attributes.diff(curFormats, prevFormats) || {}; + } + } + // Check for astral symbols + var length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1; + this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER); + if (Object.keys(formats).length > 0) { + this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER); + } + this.quill.focus(); +} + +function handleDelete(range, context) { + // Check for astral symbols + var length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1; + if (range.index >= this.quill.getLength() - length) return; + var formats = {}, + nextLength = 0; + + var _quill$getLine15 = this.quill.getLine(range.index), + _quill$getLine16 = _slicedToArray(_quill$getLine15, 1), + line = _quill$getLine16[0]; + + if (context.offset >= line.length() - 1) { + var _quill$getLine17 = this.quill.getLine(range.index + 1), + _quill$getLine18 = _slicedToArray(_quill$getLine17, 1), + next = _quill$getLine18[0]; + + if (next) { + var curFormats = line.formats(); + var nextFormats = this.quill.getFormat(range.index, 1); + formats = _op2.default.attributes.diff(curFormats, nextFormats) || {}; + nextLength = next.length(); + } + } + this.quill.deleteText(range.index, length, _quill2.default.sources.USER); + if (Object.keys(formats).length > 0) { + this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER); + } +} + +function handleDeleteRange(range) { + var lines = this.quill.getLines(range); + var formats = {}; + if (lines.length > 1) { + var firstFormats = lines[0].formats(); + var lastFormats = lines[lines.length - 1].formats(); + formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {}; + } + this.quill.deleteText(range, _quill2.default.sources.USER); + if (Object.keys(formats).length > 0) { + this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER); + } + this.quill.setSelection(range.index, _quill2.default.sources.SILENT); + this.quill.focus(); +} + +function handleEnter(range, context) { + var _this3 = this; + + if (range.length > 0) { + this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change + } + var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) { + if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) { + lineFormats[format] = context.format[format]; + } + return lineFormats; + }, {}); + this.quill.insertText(range.index, '\n', lineFormats, _quill2.default.sources.USER); + // Earlier scroll.deleteAt might have messed up our selection, + // so insertText's built in selection preservation is not reliable + this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); + this.quill.focus(); + Object.keys(context.format).forEach(function (name) { + if (lineFormats[name] != null) return; + if (Array.isArray(context.format[name])) return; + if (name === 'link') return; + _this3.quill.format(name, context.format[name], _quill2.default.sources.USER); + }); +} + +function makeCodeBlockHandler(indent) { + return { + key: Keyboard.keys.TAB, + shiftKey: !indent, + format: { 'code-block': true }, + handler: function handler(range) { + var CodeBlock = _parchment2.default.query('code-block'); + var index = range.index, + length = range.length; + + var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index), + _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2), + block = _quill$scroll$descend2[0], + offset = _quill$scroll$descend2[1]; + + if (block == null) return; + var scrollIndex = this.quill.getIndex(block); + var start = block.newlineIndex(offset, true) + 1; + var end = block.newlineIndex(scrollIndex + offset + length); + var lines = block.domNode.textContent.slice(start, end).split('\n'); + offset = 0; + lines.forEach(function (line, i) { + if (indent) { + block.insertAt(start + offset, CodeBlock.TAB); + offset += CodeBlock.TAB.length; + if (i === 0) { + index += CodeBlock.TAB.length; + } else { + length += CodeBlock.TAB.length; + } + } else if (line.startsWith(CodeBlock.TAB)) { + block.deleteAt(start + offset, CodeBlock.TAB.length); + offset -= CodeBlock.TAB.length; + if (i === 0) { + index -= CodeBlock.TAB.length; + } else { + length -= CodeBlock.TAB.length; + } + } + offset += line.length + 1; + }); + this.quill.update(_quill2.default.sources.USER); + this.quill.setSelection(index, length, _quill2.default.sources.SILENT); + } + }; +} + +function makeFormatHandler(format) { + return { + key: format[0].toUpperCase(), + shortKey: true, + handler: function handler(range, context) { + this.quill.format(format, !context.format[format], _quill2.default.sources.USER); + } + }; +} + +function normalize(binding) { + if (typeof binding === 'string' || typeof binding === 'number') { + return normalize({ key: binding }); + } + if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') { + binding = (0, _clone2.default)(binding, false); + } + if (typeof binding.key === 'string') { + if (Keyboard.keys[binding.key.toUpperCase()] != null) { + binding.key = Keyboard.keys[binding.key.toUpperCase()]; + } else if (binding.key.length === 1) { + binding.key = binding.key.toUpperCase().charCodeAt(0); + } else { + return null; + } + } + if (binding.shortKey) { + binding[SHORTKEY] = binding.shortKey; + delete binding.shortKey; + } + return binding; +} + +exports.default = Keyboard; +exports.SHORTKEY = SHORTKEY; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Cursor = function (_Parchment$Embed) { + _inherits(Cursor, _Parchment$Embed); + + _createClass(Cursor, null, [{ + key: 'value', + value: function value() { + return undefined; + } + }]); + + function Cursor(domNode, selection) { + _classCallCheck(this, Cursor); + + var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode)); + + _this.selection = selection; + _this.textNode = document.createTextNode(Cursor.CONTENTS); + _this.domNode.appendChild(_this.textNode); + _this._length = 0; + return _this; + } + + _createClass(Cursor, [{ + key: 'detach', + value: function detach() { + // super.detach() will also clear domNode.__blot + if (this.parent != null) this.parent.removeChild(this); + } + }, { + key: 'format', + value: function format(name, value) { + if (this._length !== 0) { + return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value); + } + var target = this, + index = 0; + while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) { + index += target.offset(target.parent); + target = target.parent; + } + if (target != null) { + this._length = Cursor.CONTENTS.length; + target.optimize(); + target.formatAt(index, Cursor.CONTENTS.length, name, value); + this._length = 0; + } + } + }, { + key: 'index', + value: function index(node, offset) { + if (node === this.textNode) return 0; + return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset); + } + }, { + key: 'length', + value: function length() { + return this._length; + } + }, { + key: 'position', + value: function position() { + return [this.textNode, this.textNode.data.length]; + } + }, { + key: 'remove', + value: function remove() { + _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this); + this.parent = null; + } + }, { + key: 'restore', + value: function restore() { + if (this.selection.composing || this.parent == null) return; + var textNode = this.textNode; + var range = this.selection.getNativeRange(); + var restoreText = void 0, + start = void 0, + end = void 0; + if (range != null && range.start.node === textNode && range.end.node === textNode) { + var _ref = [textNode, range.start.offset, range.end.offset]; + restoreText = _ref[0]; + start = _ref[1]; + end = _ref[2]; + } + // Link format will insert text outside of anchor tag + while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) { + this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); + } + if (this.textNode.data !== Cursor.CONTENTS) { + var text = this.textNode.data.split(Cursor.CONTENTS).join(''); + if (this.next instanceof _text2.default) { + restoreText = this.next.domNode; + this.next.insertAt(0, text); + this.textNode.data = Cursor.CONTENTS; + } else { + this.textNode.data = text; + this.parent.insertBefore(_parchment2.default.create(this.textNode), this); + this.textNode = document.createTextNode(Cursor.CONTENTS); + this.domNode.appendChild(this.textNode); + } + } + this.remove(); + if (start != null) { + var _map = [start, end].map(function (offset) { + return Math.max(0, Math.min(restoreText.data.length, offset - 1)); + }); + + var _map2 = _slicedToArray(_map, 2); + + start = _map2[0]; + end = _map2[1]; + + return { + startNode: restoreText, + startOffset: start, + endNode: restoreText, + endOffset: end + }; + } + } + }, { + key: 'update', + value: function update(mutations, context) { + var _this2 = this; + + if (mutations.some(function (mutation) { + return mutation.type === 'characterData' && mutation.target === _this2.textNode; + })) { + var range = this.restore(); + if (range) context.range = range; + } + } + }, { + key: 'value', + value: function value() { + return ''; + } + }]); + + return Cursor; +}(_parchment2.default.Embed); + +Cursor.blotName = 'cursor'; +Cursor.className = 'ql-cursor'; +Cursor.tagName = 'span'; +Cursor.CONTENTS = '\uFEFF'; // Zero width no break space + + +exports.default = Cursor; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Container = function (_Parchment$Container) { + _inherits(Container, _Parchment$Container); + + function Container() { + _classCallCheck(this, Container); + + return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).apply(this, arguments)); + } + + return Container; +}(_parchment2.default.Container); + +Container.allowedChildren = [_block2.default, _block.BlockEmbed, Container]; + +exports.default = Container; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ColorStyle = exports.ColorClass = exports.ColorAttributor = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ColorAttributor = function (_Parchment$Attributor) { + _inherits(ColorAttributor, _Parchment$Attributor); + + function ColorAttributor() { + _classCallCheck(this, ColorAttributor); + + return _possibleConstructorReturn(this, (ColorAttributor.__proto__ || Object.getPrototypeOf(ColorAttributor)).apply(this, arguments)); + } + + _createClass(ColorAttributor, [{ + key: 'value', + value: function value(domNode) { + var value = _get(ColorAttributor.prototype.__proto__ || Object.getPrototypeOf(ColorAttributor.prototype), 'value', this).call(this, domNode); + if (!value.startsWith('rgb(')) return value; + value = value.replace(/^[^\d]+/, '').replace(/[^\d]+$/, ''); + return '#' + value.split(',').map(function (component) { + return ('00' + parseInt(component).toString(16)).slice(-2); + }).join(''); + } + }]); + + return ColorAttributor; +}(_parchment2.default.Attributor.Style); + +var ColorClass = new _parchment2.default.Attributor.Class('color', 'ql-color', { + scope: _parchment2.default.Scope.INLINE +}); +var ColorStyle = new ColorAttributor('color', 'color', { + scope: _parchment2.default.Scope.INLINE +}); + +exports.ColorAttributor = ColorAttributor; +exports.ColorClass = ColorClass; +exports.ColorStyle = ColorStyle; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.sanitize = exports.default = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Link = function (_Inline) { + _inherits(Link, _Inline); + + function Link() { + _classCallCheck(this, Link); + + return _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).apply(this, arguments)); + } + + _createClass(Link, [{ + key: 'format', + value: function format(name, value) { + if (name !== this.statics.blotName || !value) return _get(Link.prototype.__proto__ || Object.getPrototypeOf(Link.prototype), 'format', this).call(this, name, value); + value = this.constructor.sanitize(value); + this.domNode.setAttribute('href', value); + } + }], [{ + key: 'create', + value: function create(value) { + var node = _get(Link.__proto__ || Object.getPrototypeOf(Link), 'create', this).call(this, value); + value = this.sanitize(value); + node.setAttribute('href', value); + node.setAttribute('target', '_blank'); + return node; + } + }, { + key: 'formats', + value: function formats(domNode) { + return domNode.getAttribute('href'); + } + }, { + key: 'sanitize', + value: function sanitize(url) { + return _sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL; + } + }]); + + return Link; +}(_inline2.default); + +Link.blotName = 'link'; +Link.tagName = 'A'; +Link.SANITIZED_URL = 'about:blank'; +Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']; + +function _sanitize(url, protocols) { + var anchor = document.createElement('a'); + anchor.href = url; + var protocol = anchor.href.slice(0, anchor.href.indexOf(':')); + return protocols.indexOf(protocol) > -1; +} + +exports.default = Link; +exports.sanitize = _sanitize; + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _keyboard = __webpack_require__(23); + +var _keyboard2 = _interopRequireDefault(_keyboard); + +var _dropdown = __webpack_require__(107); + +var _dropdown2 = _interopRequireDefault(_dropdown); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var optionsCounter = 0; + +function toggleAriaAttribute(element, attribute) { + element.setAttribute(attribute, !(element.getAttribute(attribute) === 'true')); +} + +var Picker = function () { + function Picker(select) { + var _this = this; + + _classCallCheck(this, Picker); + + this.select = select; + this.container = document.createElement('span'); + this.buildPicker(); + this.select.style.display = 'none'; + this.select.parentNode.insertBefore(this.container, this.select); + + this.label.addEventListener('mousedown', function () { + _this.togglePicker(); + }); + this.label.addEventListener('keydown', function (event) { + switch (event.keyCode) { + // Allows the "Enter" key to open the picker + case _keyboard2.default.keys.ENTER: + _this.togglePicker(); + break; + + // Allows the "Escape" key to close the picker + case _keyboard2.default.keys.ESCAPE: + _this.escape(); + event.preventDefault(); + break; + default: + } + }); + this.select.addEventListener('change', this.update.bind(this)); + } + + _createClass(Picker, [{ + key: 'togglePicker', + value: function togglePicker() { + this.container.classList.toggle('ql-expanded'); + // Toggle aria-expanded and aria-hidden to make the picker accessible + toggleAriaAttribute(this.label, 'aria-expanded'); + toggleAriaAttribute(this.options, 'aria-hidden'); + } + }, { + key: 'buildItem', + value: function buildItem(option) { + var _this2 = this; + + var item = document.createElement('span'); + item.tabIndex = '0'; + item.setAttribute('role', 'button'); + + item.classList.add('ql-picker-item'); + if (option.hasAttribute('value')) { + item.setAttribute('data-value', option.getAttribute('value')); + } + if (option.textContent) { + item.setAttribute('data-label', option.textContent); + } + item.addEventListener('click', function () { + _this2.selectItem(item, true); + }); + item.addEventListener('keydown', function (event) { + switch (event.keyCode) { + // Allows the "Enter" key to select an item + case _keyboard2.default.keys.ENTER: + _this2.selectItem(item, true); + event.preventDefault(); + break; + + // Allows the "Escape" key to close the picker + case _keyboard2.default.keys.ESCAPE: + _this2.escape(); + event.preventDefault(); + break; + default: + } + }); + + return item; + } + }, { + key: 'buildLabel', + value: function buildLabel() { + var label = document.createElement('span'); + label.classList.add('ql-picker-label'); + label.innerHTML = _dropdown2.default; + label.tabIndex = '0'; + label.setAttribute('role', 'button'); + label.setAttribute('aria-expanded', 'false'); + this.container.appendChild(label); + return label; + } + }, { + key: 'buildOptions', + value: function buildOptions() { + var _this3 = this; + + var options = document.createElement('span'); + options.classList.add('ql-picker-options'); + + // Don't want screen readers to read this until options are visible + options.setAttribute('aria-hidden', 'true'); + options.tabIndex = '-1'; + + // Need a unique id for aria-controls + options.id = 'ql-picker-options-' + optionsCounter; + optionsCounter += 1; + this.label.setAttribute('aria-controls', options.id); + + this.options = options; + + [].slice.call(this.select.options).forEach(function (option) { + var item = _this3.buildItem(option); + options.appendChild(item); + if (option.selected === true) { + _this3.selectItem(item); + } + }); + this.container.appendChild(options); + } + }, { + key: 'buildPicker', + value: function buildPicker() { + var _this4 = this; + + [].slice.call(this.select.attributes).forEach(function (item) { + _this4.container.setAttribute(item.name, item.value); + }); + this.container.classList.add('ql-picker'); + this.label = this.buildLabel(); + this.buildOptions(); + } + }, { + key: 'escape', + value: function escape() { + var _this5 = this; + + // Close menu and return focus to trigger label + this.close(); + // Need setTimeout for accessibility to ensure that the browser executes + // focus on the next process thread and after any DOM content changes + setTimeout(function () { + return _this5.label.focus(); + }, 1); + } + }, { + key: 'close', + value: function close() { + this.container.classList.remove('ql-expanded'); + this.label.setAttribute('aria-expanded', 'false'); + this.options.setAttribute('aria-hidden', 'true'); + } + }, { + key: 'selectItem', + value: function selectItem(item) { + var trigger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var selected = this.container.querySelector('.ql-selected'); + if (item === selected) return; + if (selected != null) { + selected.classList.remove('ql-selected'); + } + if (item == null) return; + item.classList.add('ql-selected'); + this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item); + if (item.hasAttribute('data-value')) { + this.label.setAttribute('data-value', item.getAttribute('data-value')); + } else { + this.label.removeAttribute('data-value'); + } + if (item.hasAttribute('data-label')) { + this.label.setAttribute('data-label', item.getAttribute('data-label')); + } else { + this.label.removeAttribute('data-label'); + } + if (trigger) { + if (typeof Event === 'function') { + this.select.dispatchEvent(new Event('change')); + } else if ((typeof Event === 'undefined' ? 'undefined' : _typeof(Event)) === 'object') { + // IE11 + var event = document.createEvent('Event'); + event.initEvent('change', true, true); + this.select.dispatchEvent(event); + } + this.close(); + } + } + }, { + key: 'update', + value: function update() { + var option = void 0; + if (this.select.selectedIndex > -1) { + var item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex]; + option = this.select.options[this.select.selectedIndex]; + this.selectItem(item); + } else { + this.selectItem(null); + } + var isActive = option != null && option !== this.select.querySelector('option[selected]'); + this.label.classList.toggle('ql-active', isActive); + } + }]); + + return Picker; +}(); + +exports.default = Picker; + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _break = __webpack_require__(16); + +var _break2 = _interopRequireDefault(_break); + +var _container = __webpack_require__(25); + +var _container2 = _interopRequireDefault(_container); + +var _cursor = __webpack_require__(24); + +var _cursor2 = _interopRequireDefault(_cursor); + +var _embed = __webpack_require__(35); + +var _embed2 = _interopRequireDefault(_embed); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +var _scroll = __webpack_require__(22); + +var _scroll2 = _interopRequireDefault(_scroll); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +var _clipboard = __webpack_require__(55); + +var _clipboard2 = _interopRequireDefault(_clipboard); + +var _history = __webpack_require__(42); + +var _history2 = _interopRequireDefault(_history); + +var _keyboard = __webpack_require__(23); + +var _keyboard2 = _interopRequireDefault(_keyboard); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_quill2.default.register({ + 'blots/block': _block2.default, + 'blots/block/embed': _block.BlockEmbed, + 'blots/break': _break2.default, + 'blots/container': _container2.default, + 'blots/cursor': _cursor2.default, + 'blots/embed': _embed2.default, + 'blots/inline': _inline2.default, + 'blots/scroll': _scroll2.default, + 'blots/text': _text2.default, + + 'modules/clipboard': _clipboard2.default, + 'modules/history': _history2.default, + 'modules/keyboard': _keyboard2.default +}); + +_parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default); + +exports.default = _quill2.default; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Registry = __webpack_require__(1); +var ShadowBlot = /** @class */ (function () { + function ShadowBlot(domNode) { + this.domNode = domNode; + // @ts-ignore + this.domNode[Registry.DATA_KEY] = { blot: this }; + } + Object.defineProperty(ShadowBlot.prototype, "statics", { + // Hack for accessing inherited static methods + get: function () { + return this.constructor; + }, + enumerable: true, + configurable: true + }); + ShadowBlot.create = function (value) { + if (this.tagName == null) { + throw new Registry.ParchmentError('Blot definition missing tagName'); + } + var node; + if (Array.isArray(this.tagName)) { + if (typeof value === 'string') { + value = value.toUpperCase(); + if (parseInt(value).toString() === value) { + value = parseInt(value); + } + } + if (typeof value === 'number') { + node = document.createElement(this.tagName[value - 1]); + } + else if (this.tagName.indexOf(value) > -1) { + node = document.createElement(value); + } + else { + node = document.createElement(this.tagName[0]); + } + } + else { + node = document.createElement(this.tagName); + } + if (this.className) { + node.classList.add(this.className); + } + return node; + }; + ShadowBlot.prototype.attach = function () { + if (this.parent != null) { + this.scroll = this.parent.scroll; + } + }; + ShadowBlot.prototype.clone = function () { + var domNode = this.domNode.cloneNode(false); + return Registry.create(domNode); + }; + ShadowBlot.prototype.detach = function () { + if (this.parent != null) + this.parent.removeChild(this); + // @ts-ignore + delete this.domNode[Registry.DATA_KEY]; + }; + ShadowBlot.prototype.deleteAt = function (index, length) { + var blot = this.isolate(index, length); + blot.remove(); + }; + ShadowBlot.prototype.formatAt = function (index, length, name, value) { + var blot = this.isolate(index, length); + if (Registry.query(name, Registry.Scope.BLOT) != null && value) { + blot.wrap(name, value); + } + else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) { + var parent = Registry.create(this.statics.scope); + blot.wrap(parent); + parent.format(name, value); + } + }; + ShadowBlot.prototype.insertAt = function (index, value, def) { + var blot = def == null ? Registry.create('text', value) : Registry.create(value, def); + var ref = this.split(index); + this.parent.insertBefore(blot, ref); + }; + ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) { + if (refBlot === void 0) { refBlot = null; } + if (this.parent != null) { + this.parent.children.remove(this); + } + var refDomNode = null; + parentBlot.children.insertBefore(this, refBlot); + if (refBlot != null) { + refDomNode = refBlot.domNode; + } + if (this.domNode.parentNode != parentBlot.domNode || + this.domNode.nextSibling != refDomNode) { + parentBlot.domNode.insertBefore(this.domNode, refDomNode); + } + this.parent = parentBlot; + this.attach(); + }; + ShadowBlot.prototype.isolate = function (index, length) { + var target = this.split(index); + target.split(length); + return target; + }; + ShadowBlot.prototype.length = function () { + return 1; + }; + ShadowBlot.prototype.offset = function (root) { + if (root === void 0) { root = this.parent; } + if (this.parent == null || this == root) + return 0; + return this.parent.children.offset(this) + this.parent.offset(root); + }; + ShadowBlot.prototype.optimize = function (context) { + // TODO clean up once we use WeakMap + // @ts-ignore + if (this.domNode[Registry.DATA_KEY] != null) { + // @ts-ignore + delete this.domNode[Registry.DATA_KEY].mutations; + } + }; + ShadowBlot.prototype.remove = function () { + if (this.domNode.parentNode != null) { + this.domNode.parentNode.removeChild(this.domNode); + } + this.detach(); + }; + ShadowBlot.prototype.replace = function (target) { + if (target.parent == null) + return; + target.parent.insertBefore(this, target.next); + target.remove(); + }; + ShadowBlot.prototype.replaceWith = function (name, value) { + var replacement = typeof name === 'string' ? Registry.create(name, value) : name; + replacement.replace(this); + return replacement; + }; + ShadowBlot.prototype.split = function (index, force) { + return index === 0 ? this : this.next; + }; + ShadowBlot.prototype.update = function (mutations, context) { + // Nothing to do by default + }; + ShadowBlot.prototype.wrap = function (name, value) { + var wrapper = typeof name === 'string' ? Registry.create(name, value) : name; + if (this.parent != null) { + this.parent.insertBefore(wrapper, this.next); + } + wrapper.appendChild(this); + return wrapper; + }; + ShadowBlot.blotName = 'abstract'; + return ShadowBlot; +}()); +exports.default = ShadowBlot; + + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +var class_1 = __webpack_require__(32); +var style_1 = __webpack_require__(33); +var Registry = __webpack_require__(1); +var AttributorStore = /** @class */ (function () { + function AttributorStore(domNode) { + this.attributes = {}; + this.domNode = domNode; + this.build(); + } + AttributorStore.prototype.attribute = function (attribute, value) { + // verb + if (value) { + if (attribute.add(this.domNode, value)) { + if (attribute.value(this.domNode) != null) { + this.attributes[attribute.attrName] = attribute; + } + else { + delete this.attributes[attribute.attrName]; + } + } + } + else { + attribute.remove(this.domNode); + delete this.attributes[attribute.attrName]; + } + }; + AttributorStore.prototype.build = function () { + var _this = this; + this.attributes = {}; + var attributes = attributor_1.default.keys(this.domNode); + var classes = class_1.default.keys(this.domNode); + var styles = style_1.default.keys(this.domNode); + attributes + .concat(classes) + .concat(styles) + .forEach(function (name) { + var attr = Registry.query(name, Registry.Scope.ATTRIBUTE); + if (attr instanceof attributor_1.default) { + _this.attributes[attr.attrName] = attr; + } + }); + }; + AttributorStore.prototype.copy = function (target) { + var _this = this; + Object.keys(this.attributes).forEach(function (key) { + var value = _this.attributes[key].value(_this.domNode); + target.format(key, value); + }); + }; + AttributorStore.prototype.move = function (target) { + var _this = this; + this.copy(target); + Object.keys(this.attributes).forEach(function (key) { + _this.attributes[key].remove(_this.domNode); + }); + this.attributes = {}; + }; + AttributorStore.prototype.values = function () { + var _this = this; + return Object.keys(this.attributes).reduce(function (attributes, name) { + attributes[name] = _this.attributes[name].value(_this.domNode); + return attributes; + }, {}); + }; + return AttributorStore; +}()); +exports.default = AttributorStore; + + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +function match(node, prefix) { + var className = node.getAttribute('class') || ''; + return className.split(/\s+/).filter(function (name) { + return name.indexOf(prefix + "-") === 0; + }); +} +var ClassAttributor = /** @class */ (function (_super) { + __extends(ClassAttributor, _super); + function ClassAttributor() { + return _super !== null && _super.apply(this, arguments) || this; + } + ClassAttributor.keys = function (node) { + return (node.getAttribute('class') || '').split(/\s+/).map(function (name) { + return name + .split('-') + .slice(0, -1) + .join('-'); + }); + }; + ClassAttributor.prototype.add = function (node, value) { + if (!this.canAdd(node, value)) + return false; + this.remove(node); + node.classList.add(this.keyName + "-" + value); + return true; + }; + ClassAttributor.prototype.remove = function (node) { + var matches = match(node, this.keyName); + matches.forEach(function (name) { + node.classList.remove(name); + }); + if (node.classList.length === 0) { + node.removeAttribute('class'); + } + }; + ClassAttributor.prototype.value = function (node) { + var result = match(node, this.keyName)[0] || ''; + var value = result.slice(this.keyName.length + 1); // +1 for hyphen + return this.canAdd(node, value) ? value : ''; + }; + return ClassAttributor; +}(attributor_1.default)); +exports.default = ClassAttributor; + + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var attributor_1 = __webpack_require__(12); +function camelize(name) { + var parts = name.split('-'); + var rest = parts + .slice(1) + .map(function (part) { + return part[0].toUpperCase() + part.slice(1); + }) + .join(''); + return parts[0] + rest; +} +var StyleAttributor = /** @class */ (function (_super) { + __extends(StyleAttributor, _super); + function StyleAttributor() { + return _super !== null && _super.apply(this, arguments) || this; + } + StyleAttributor.keys = function (node) { + return (node.getAttribute('style') || '').split(';').map(function (value) { + var arr = value.split(':'); + return arr[0].trim(); + }); + }; + StyleAttributor.prototype.add = function (node, value) { + if (!this.canAdd(node, value)) + return false; + // @ts-ignore + node.style[camelize(this.keyName)] = value; + return true; + }; + StyleAttributor.prototype.remove = function (node) { + // @ts-ignore + node.style[camelize(this.keyName)] = ''; + if (!node.getAttribute('style')) { + node.removeAttribute('style'); + } + }; + StyleAttributor.prototype.value = function (node) { + // @ts-ignore + var value = node.style[camelize(this.keyName)]; + return this.canAdd(node, value) ? value : ''; + }; + return StyleAttributor; +}(attributor_1.default)); +exports.default = StyleAttributor; + + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Theme = function () { + function Theme(quill, options) { + _classCallCheck(this, Theme); + + this.quill = quill; + this.options = options; + this.modules = {}; + } + + _createClass(Theme, [{ + key: 'init', + value: function init() { + var _this = this; + + Object.keys(this.options.modules).forEach(function (name) { + if (_this.modules[name] == null) { + _this.addModule(name); + } + }); + } + }, { + key: 'addModule', + value: function addModule(name) { + var moduleClass = this.quill.constructor.import('modules/' + name); + this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {}); + return this.modules[name]; + } + }]); + + return Theme; +}(); + +Theme.DEFAULTS = { + modules: {} +}; +Theme.themes = { + 'default': Theme +}; + +exports.default = Theme; + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _text = __webpack_require__(7); + +var _text2 = _interopRequireDefault(_text); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var GUARD_TEXT = '\uFEFF'; + +var Embed = function (_Parchment$Embed) { + _inherits(Embed, _Parchment$Embed); + + function Embed(node) { + _classCallCheck(this, Embed); + + var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node)); + + _this.contentNode = document.createElement('span'); + _this.contentNode.setAttribute('contenteditable', false); + [].slice.call(_this.domNode.childNodes).forEach(function (childNode) { + _this.contentNode.appendChild(childNode); + }); + _this.leftGuard = document.createTextNode(GUARD_TEXT); + _this.rightGuard = document.createTextNode(GUARD_TEXT); + _this.domNode.appendChild(_this.leftGuard); + _this.domNode.appendChild(_this.contentNode); + _this.domNode.appendChild(_this.rightGuard); + return _this; + } + + _createClass(Embed, [{ + key: 'index', + value: function index(node, offset) { + if (node === this.leftGuard) return 0; + if (node === this.rightGuard) return 1; + return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset); + } + }, { + key: 'restore', + value: function restore(node) { + var range = void 0, + textNode = void 0; + var text = node.data.split(GUARD_TEXT).join(''); + if (node === this.leftGuard) { + if (this.prev instanceof _text2.default) { + var prevLength = this.prev.length(); + this.prev.insertAt(prevLength, text); + range = { + startNode: this.prev.domNode, + startOffset: prevLength + text.length + }; + } else { + textNode = document.createTextNode(text); + this.parent.insertBefore(_parchment2.default.create(textNode), this); + range = { + startNode: textNode, + startOffset: text.length + }; + } + } else if (node === this.rightGuard) { + if (this.next instanceof _text2.default) { + this.next.insertAt(0, text); + range = { + startNode: this.next.domNode, + startOffset: text.length + }; + } else { + textNode = document.createTextNode(text); + this.parent.insertBefore(_parchment2.default.create(textNode), this.next); + range = { + startNode: textNode, + startOffset: text.length + }; + } + } + node.data = GUARD_TEXT; + return range; + } + }, { + key: 'update', + value: function update(mutations, context) { + var _this2 = this; + + mutations.forEach(function (mutation) { + if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) { + var range = _this2.restore(mutation.target); + if (range) context.range = range; + } + }); + } + }]); + + return Embed; +}(_parchment2.default.Embed); + +exports.default = Embed; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.AlignStyle = exports.AlignClass = exports.AlignAttribute = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var config = { + scope: _parchment2.default.Scope.BLOCK, + whitelist: ['right', 'center', 'justify'] +}; + +var AlignAttribute = new _parchment2.default.Attributor.Attribute('align', 'align', config); +var AlignClass = new _parchment2.default.Attributor.Class('align', 'ql-align', config); +var AlignStyle = new _parchment2.default.Attributor.Style('align', 'text-align', config); + +exports.AlignAttribute = AlignAttribute; +exports.AlignClass = AlignClass; +exports.AlignStyle = AlignStyle; + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.BackgroundStyle = exports.BackgroundClass = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _color = __webpack_require__(26); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var BackgroundClass = new _parchment2.default.Attributor.Class('background', 'ql-bg', { + scope: _parchment2.default.Scope.INLINE +}); +var BackgroundStyle = new _color.ColorAttributor('background', 'background-color', { + scope: _parchment2.default.Scope.INLINE +}); + +exports.BackgroundClass = BackgroundClass; +exports.BackgroundStyle = BackgroundStyle; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DirectionStyle = exports.DirectionClass = exports.DirectionAttribute = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var config = { + scope: _parchment2.default.Scope.BLOCK, + whitelist: ['rtl'] +}; + +var DirectionAttribute = new _parchment2.default.Attributor.Attribute('direction', 'dir', config); +var DirectionClass = new _parchment2.default.Attributor.Class('direction', 'ql-direction', config); +var DirectionStyle = new _parchment2.default.Attributor.Style('direction', 'direction', config); + +exports.DirectionAttribute = DirectionAttribute; +exports.DirectionClass = DirectionClass; +exports.DirectionStyle = DirectionStyle; + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.FontClass = exports.FontStyle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var config = { + scope: _parchment2.default.Scope.INLINE, + whitelist: ['serif', 'monospace'] +}; + +var FontClass = new _parchment2.default.Attributor.Class('font', 'ql-font', config); + +var FontStyleAttributor = function (_Parchment$Attributor) { + _inherits(FontStyleAttributor, _Parchment$Attributor); + + function FontStyleAttributor() { + _classCallCheck(this, FontStyleAttributor); + + return _possibleConstructorReturn(this, (FontStyleAttributor.__proto__ || Object.getPrototypeOf(FontStyleAttributor)).apply(this, arguments)); + } + + _createClass(FontStyleAttributor, [{ + key: 'value', + value: function value(node) { + return _get(FontStyleAttributor.prototype.__proto__ || Object.getPrototypeOf(FontStyleAttributor.prototype), 'value', this).call(this, node).replace(/["']/g, ''); + } + }]); + + return FontStyleAttributor; +}(_parchment2.default.Attributor.Style); + +var FontStyle = new FontStyleAttributor('font', 'font-family', config); + +exports.FontStyle = FontStyle; +exports.FontClass = FontClass; + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SizeStyle = exports.SizeClass = undefined; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var SizeClass = new _parchment2.default.Attributor.Class('size', 'ql-size', { + scope: _parchment2.default.Scope.INLINE, + whitelist: ['small', 'large', 'huge'] +}); +var SizeStyle = new _parchment2.default.Attributor.Style('size', 'font-size', { + scope: _parchment2.default.Scope.INLINE, + whitelist: ['10px', '18px', '32px'] +}); + +exports.SizeClass = SizeClass; +exports.SizeStyle = SizeStyle; + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = { + 'align': { + '': __webpack_require__(76), + 'center': __webpack_require__(77), + 'right': __webpack_require__(78), + 'justify': __webpack_require__(79) + }, + 'background': __webpack_require__(80), + 'blockquote': __webpack_require__(81), + 'bold': __webpack_require__(82), + 'clean': __webpack_require__(83), + 'code': __webpack_require__(58), + 'code-block': __webpack_require__(58), + 'color': __webpack_require__(84), + 'direction': { + '': __webpack_require__(85), + 'rtl': __webpack_require__(86) + }, + 'float': { + 'center': __webpack_require__(87), + 'full': __webpack_require__(88), + 'left': __webpack_require__(89), + 'right': __webpack_require__(90) + }, + 'formula': __webpack_require__(91), + 'header': { + '1': __webpack_require__(92), + '2': __webpack_require__(93) + }, + 'italic': __webpack_require__(94), + 'image': __webpack_require__(95), + 'indent': { + '+1': __webpack_require__(96), + '-1': __webpack_require__(97) + }, + 'link': __webpack_require__(98), + 'list': { + 'ordered': __webpack_require__(99), + 'bullet': __webpack_require__(100), + 'check': __webpack_require__(101) + }, + 'script': { + 'sub': __webpack_require__(102), + 'super': __webpack_require__(103) + }, + 'strike': __webpack_require__(104), + 'underline': __webpack_require__(105), + 'video': __webpack_require__(106) +}; + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getLastChangeIndex = exports.default = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var History = function (_Module) { + _inherits(History, _Module); + + function History(quill, options) { + _classCallCheck(this, History); + + var _this = _possibleConstructorReturn(this, (History.__proto__ || Object.getPrototypeOf(History)).call(this, quill, options)); + + _this.lastRecorded = 0; + _this.ignoreChange = false; + _this.clear(); + _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (eventName, delta, oldDelta, source) { + if (eventName !== _quill2.default.events.TEXT_CHANGE || _this.ignoreChange) return; + if (!_this.options.userOnly || source === _quill2.default.sources.USER) { + _this.record(delta, oldDelta); + } else { + _this.transform(delta); + } + }); + _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, _this.undo.bind(_this)); + _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, _this.redo.bind(_this)); + if (/Win/i.test(navigator.platform)) { + _this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, _this.redo.bind(_this)); + } + return _this; + } + + _createClass(History, [{ + key: 'change', + value: function change(source, dest) { + if (this.stack[source].length === 0) return; + var delta = this.stack[source].pop(); + this.stack[dest].push(delta); + this.lastRecorded = 0; + this.ignoreChange = true; + this.quill.updateContents(delta[source], _quill2.default.sources.USER); + this.ignoreChange = false; + var index = getLastChangeIndex(delta[source]); + this.quill.setSelection(index); + } + }, { + key: 'clear', + value: function clear() { + this.stack = { undo: [], redo: [] }; + } + }, { + key: 'cutoff', + value: function cutoff() { + this.lastRecorded = 0; + } + }, { + key: 'record', + value: function record(changeDelta, oldDelta) { + if (changeDelta.ops.length === 0) return; + this.stack.redo = []; + var undoDelta = this.quill.getContents().diff(oldDelta); + var timestamp = Date.now(); + if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) { + var delta = this.stack.undo.pop(); + undoDelta = undoDelta.compose(delta.undo); + changeDelta = delta.redo.compose(changeDelta); + } else { + this.lastRecorded = timestamp; + } + this.stack.undo.push({ + redo: changeDelta, + undo: undoDelta + }); + if (this.stack.undo.length > this.options.maxStack) { + this.stack.undo.shift(); + } + } + }, { + key: 'redo', + value: function redo() { + this.change('redo', 'undo'); + } + }, { + key: 'transform', + value: function transform(delta) { + this.stack.undo.forEach(function (change) { + change.undo = delta.transform(change.undo, true); + change.redo = delta.transform(change.redo, true); + }); + this.stack.redo.forEach(function (change) { + change.undo = delta.transform(change.undo, true); + change.redo = delta.transform(change.redo, true); + }); + } + }, { + key: 'undo', + value: function undo() { + this.change('undo', 'redo'); + } + }]); + + return History; +}(_module2.default); + +History.DEFAULTS = { + delay: 1000, + maxStack: 100, + userOnly: false +}; + +function endsWithNewlineChange(delta) { + var lastOp = delta.ops[delta.ops.length - 1]; + if (lastOp == null) return false; + if (lastOp.insert != null) { + return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\n'); + } + if (lastOp.attributes != null) { + return Object.keys(lastOp.attributes).some(function (attr) { + return _parchment2.default.query(attr, _parchment2.default.Scope.BLOCK) != null; + }); + } + return false; +} + +function getLastChangeIndex(delta) { + var deleteLength = delta.reduce(function (length, op) { + length += op.delete || 0; + return length; + }, 0); + var changeIndex = delta.length() - deleteLength; + if (endsWithNewlineChange(delta)) { + changeIndex -= 1; + } + return changeIndex; +} + +exports.default = History; +exports.getLastChangeIndex = getLastChangeIndex; + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.BaseTooltip = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _emitter = __webpack_require__(8); + +var _emitter2 = _interopRequireDefault(_emitter); + +var _keyboard = __webpack_require__(23); + +var _keyboard2 = _interopRequireDefault(_keyboard); + +var _theme = __webpack_require__(34); + +var _theme2 = _interopRequireDefault(_theme); + +var _colorPicker = __webpack_require__(59); + +var _colorPicker2 = _interopRequireDefault(_colorPicker); + +var _iconPicker = __webpack_require__(60); + +var _iconPicker2 = _interopRequireDefault(_iconPicker); + +var _picker = __webpack_require__(28); + +var _picker2 = _interopRequireDefault(_picker); + +var _tooltip = __webpack_require__(61); + +var _tooltip2 = _interopRequireDefault(_tooltip); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ALIGNS = [false, 'center', 'right', 'justify']; + +var COLORS = ["#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff", "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff", "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff", "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2", "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"]; + +var FONTS = [false, 'serif', 'monospace']; + +var HEADERS = ['1', '2', '3', false]; + +var SIZES = ['small', false, 'large', 'huge']; + +var BaseTheme = function (_Theme) { + _inherits(BaseTheme, _Theme); + + function BaseTheme(quill, options) { + _classCallCheck(this, BaseTheme); + + var _this = _possibleConstructorReturn(this, (BaseTheme.__proto__ || Object.getPrototypeOf(BaseTheme)).call(this, quill, options)); + + var listener = function listener(e) { + if (!document.body.contains(quill.root)) { + return document.body.removeEventListener('click', listener); + } + if (_this.tooltip != null && !_this.tooltip.root.contains(e.target) && document.activeElement !== _this.tooltip.textbox && !_this.quill.hasFocus()) { + _this.tooltip.hide(); + } + if (_this.pickers != null) { + _this.pickers.forEach(function (picker) { + if (!picker.container.contains(e.target)) { + picker.close(); + } + }); + } + }; + quill.emitter.listenDOM('click', document.body, listener); + return _this; + } + + _createClass(BaseTheme, [{ + key: 'addModule', + value: function addModule(name) { + var module = _get(BaseTheme.prototype.__proto__ || Object.getPrototypeOf(BaseTheme.prototype), 'addModule', this).call(this, name); + if (name === 'toolbar') { + this.extendToolbar(module); + } + return module; + } + }, { + key: 'buildButtons', + value: function buildButtons(buttons, icons) { + buttons.forEach(function (button) { + var className = button.getAttribute('class') || ''; + className.split(/\s+/).forEach(function (name) { + if (!name.startsWith('ql-')) return; + name = name.slice('ql-'.length); + if (icons[name] == null) return; + if (name === 'direction') { + button.innerHTML = icons[name][''] + icons[name]['rtl']; + } else if (typeof icons[name] === 'string') { + button.innerHTML = icons[name]; + } else { + var value = button.value || ''; + if (value != null && icons[name][value]) { + button.innerHTML = icons[name][value]; + } + } + }); + }); + } + }, { + key: 'buildPickers', + value: function buildPickers(selects, icons) { + var _this2 = this; + + this.pickers = selects.map(function (select) { + if (select.classList.contains('ql-align')) { + if (select.querySelector('option') == null) { + fillSelect(select, ALIGNS); + } + return new _iconPicker2.default(select, icons.align); + } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) { + var format = select.classList.contains('ql-background') ? 'background' : 'color'; + if (select.querySelector('option') == null) { + fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000'); + } + return new _colorPicker2.default(select, icons[format]); + } else { + if (select.querySelector('option') == null) { + if (select.classList.contains('ql-font')) { + fillSelect(select, FONTS); + } else if (select.classList.contains('ql-header')) { + fillSelect(select, HEADERS); + } else if (select.classList.contains('ql-size')) { + fillSelect(select, SIZES); + } + } + return new _picker2.default(select); + } + }); + var update = function update() { + _this2.pickers.forEach(function (picker) { + picker.update(); + }); + }; + this.quill.on(_emitter2.default.events.EDITOR_CHANGE, update); + } + }]); + + return BaseTheme; +}(_theme2.default); + +BaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, { + modules: { + toolbar: { + handlers: { + formula: function formula() { + this.quill.theme.tooltip.edit('formula'); + }, + image: function image() { + var _this3 = this; + + var fileInput = this.container.querySelector('input.ql-image[type=file]'); + if (fileInput == null) { + fileInput = document.createElement('input'); + fileInput.setAttribute('type', 'file'); + fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon'); + fileInput.classList.add('ql-image'); + fileInput.addEventListener('change', function () { + if (fileInput.files != null && fileInput.files[0] != null) { + var reader = new FileReader(); + reader.onload = function (e) { + var range = _this3.quill.getSelection(true); + _this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER); + _this3.quill.setSelection(range.index + 1, _emitter2.default.sources.SILENT); + fileInput.value = ""; + }; + reader.readAsDataURL(fileInput.files[0]); + } + }); + this.container.appendChild(fileInput); + } + fileInput.click(); + }, + video: function video() { + this.quill.theme.tooltip.edit('video'); + } + } + } + } +}); + +var BaseTooltip = function (_Tooltip) { + _inherits(BaseTooltip, _Tooltip); + + function BaseTooltip(quill, boundsContainer) { + _classCallCheck(this, BaseTooltip); + + var _this4 = _possibleConstructorReturn(this, (BaseTooltip.__proto__ || Object.getPrototypeOf(BaseTooltip)).call(this, quill, boundsContainer)); + + _this4.textbox = _this4.root.querySelector('input[type="text"]'); + _this4.listen(); + return _this4; + } + + _createClass(BaseTooltip, [{ + key: 'listen', + value: function listen() { + var _this5 = this; + + this.textbox.addEventListener('keydown', function (event) { + if (_keyboard2.default.match(event, 'enter')) { + _this5.save(); + event.preventDefault(); + } else if (_keyboard2.default.match(event, 'escape')) { + _this5.cancel(); + event.preventDefault(); + } + }); + } + }, { + key: 'cancel', + value: function cancel() { + this.hide(); + } + }, { + key: 'edit', + value: function edit() { + var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'link'; + var preview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + this.root.classList.remove('ql-hidden'); + this.root.classList.add('ql-editing'); + if (preview != null) { + this.textbox.value = preview; + } else if (mode !== this.root.getAttribute('data-mode')) { + this.textbox.value = ''; + } + this.position(this.quill.getBounds(this.quill.selection.savedRange)); + this.textbox.select(); + this.textbox.setAttribute('placeholder', this.textbox.getAttribute('data-' + mode) || ''); + this.root.setAttribute('data-mode', mode); + } + }, { + key: 'restoreFocus', + value: function restoreFocus() { + var scrollTop = this.quill.scrollingContainer.scrollTop; + this.quill.focus(); + this.quill.scrollingContainer.scrollTop = scrollTop; + } + }, { + key: 'save', + value: function save() { + var value = this.textbox.value; + switch (this.root.getAttribute('data-mode')) { + case 'link': + { + var scrollTop = this.quill.root.scrollTop; + if (this.linkRange) { + this.quill.formatText(this.linkRange, 'link', value, _emitter2.default.sources.USER); + delete this.linkRange; + } else { + this.restoreFocus(); + this.quill.format('link', value, _emitter2.default.sources.USER); + } + this.quill.root.scrollTop = scrollTop; + break; + } + case 'video': + { + value = extractVideoUrl(value); + } // eslint-disable-next-line no-fallthrough + case 'formula': + { + if (!value) break; + var range = this.quill.getSelection(true); + if (range != null) { + var index = range.index + range.length; + this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, _emitter2.default.sources.USER); + if (this.root.getAttribute('data-mode') === 'formula') { + this.quill.insertText(index + 1, ' ', _emitter2.default.sources.USER); + } + this.quill.setSelection(index + 2, _emitter2.default.sources.USER); + } + break; + } + default: + } + this.textbox.value = ''; + this.hide(); + } + }]); + + return BaseTooltip; +}(_tooltip2.default); + +function extractVideoUrl(url) { + var match = url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/); + if (match) { + return (match[1] || 'https') + '://www.youtube.com/embed/' + match[2] + '?showinfo=0'; + } + if (match = url.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) { + // eslint-disable-line no-cond-assign + return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/'; + } + return url; +} + +function fillSelect(select, values) { + var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + values.forEach(function (value) { + var option = document.createElement('option'); + if (value === defaultValue) { + option.setAttribute('selected', 'selected'); + } else { + option.setAttribute('value', value); + } + select.appendChild(option); + }); +} + +exports.BaseTooltip = BaseTooltip; +exports.default = BaseTheme; + +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var LinkedList = /** @class */ (function () { + function LinkedList() { + this.head = this.tail = null; + this.length = 0; + } + LinkedList.prototype.append = function () { + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + this.insertBefore(nodes[0], null); + if (nodes.length > 1) { + this.append.apply(this, nodes.slice(1)); + } + }; + LinkedList.prototype.contains = function (node) { + var cur, next = this.iterator(); + while ((cur = next())) { + if (cur === node) + return true; + } + return false; + }; + LinkedList.prototype.insertBefore = function (node, refNode) { + if (!node) + return; + node.next = refNode; + if (refNode != null) { + node.prev = refNode.prev; + if (refNode.prev != null) { + refNode.prev.next = node; + } + refNode.prev = node; + if (refNode === this.head) { + this.head = node; + } + } + else if (this.tail != null) { + this.tail.next = node; + node.prev = this.tail; + this.tail = node; + } + else { + node.prev = null; + this.head = this.tail = node; + } + this.length += 1; + }; + LinkedList.prototype.offset = function (target) { + var index = 0, cur = this.head; + while (cur != null) { + if (cur === target) + return index; + index += cur.length(); + cur = cur.next; + } + return -1; + }; + LinkedList.prototype.remove = function (node) { + if (!this.contains(node)) + return; + if (node.prev != null) + node.prev.next = node.next; + if (node.next != null) + node.next.prev = node.prev; + if (node === this.head) + this.head = node.next; + if (node === this.tail) + this.tail = node.prev; + this.length -= 1; + }; + LinkedList.prototype.iterator = function (curNode) { + if (curNode === void 0) { curNode = this.head; } + // TODO use yield when we can + return function () { + var ret = curNode; + if (curNode != null) + curNode = curNode.next; + return ret; + }; + }; + LinkedList.prototype.find = function (index, inclusive) { + if (inclusive === void 0) { inclusive = false; } + var cur, next = this.iterator(); + while ((cur = next())) { + var length = cur.length(); + if (index < length || + (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) { + return [cur, index]; + } + index -= length; + } + return [null, 0]; + }; + LinkedList.prototype.forEach = function (callback) { + var cur, next = this.iterator(); + while ((cur = next())) { + callback(cur); + } + }; + LinkedList.prototype.forEachAt = function (index, length, callback) { + if (length <= 0) + return; + var _a = this.find(index), startNode = _a[0], offset = _a[1]; + var cur, curIndex = index - offset, next = this.iterator(startNode); + while ((cur = next()) && curIndex < index + length) { + var curLength = cur.length(); + if (index > curIndex) { + callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index)); + } + else { + callback(cur, 0, Math.min(curLength, index + length - curIndex)); + } + curIndex += curLength; + } + }; + LinkedList.prototype.map = function (callback) { + return this.reduce(function (memo, cur) { + memo.push(callback(cur)); + return memo; + }, []); + }; + LinkedList.prototype.reduce = function (callback, memo) { + var cur, next = this.iterator(); + while ((cur = next())) { + memo = callback(memo, cur); + } + return memo; + }; + return LinkedList; +}()); +exports.default = LinkedList; + + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var container_1 = __webpack_require__(17); +var Registry = __webpack_require__(1); +var OBSERVER_CONFIG = { + attributes: true, + characterData: true, + characterDataOldValue: true, + childList: true, + subtree: true, +}; +var MAX_OPTIMIZE_ITERATIONS = 100; +var ScrollBlot = /** @class */ (function (_super) { + __extends(ScrollBlot, _super); + function ScrollBlot(node) { + var _this = _super.call(this, node) || this; + _this.scroll = _this; + _this.observer = new MutationObserver(function (mutations) { + _this.update(mutations); + }); + _this.observer.observe(_this.domNode, OBSERVER_CONFIG); + _this.attach(); + return _this; + } + ScrollBlot.prototype.detach = function () { + _super.prototype.detach.call(this); + this.observer.disconnect(); + }; + ScrollBlot.prototype.deleteAt = function (index, length) { + this.update(); + if (index === 0 && length === this.length()) { + this.children.forEach(function (child) { + child.remove(); + }); + } + else { + _super.prototype.deleteAt.call(this, index, length); + } + }; + ScrollBlot.prototype.formatAt = function (index, length, name, value) { + this.update(); + _super.prototype.formatAt.call(this, index, length, name, value); + }; + ScrollBlot.prototype.insertAt = function (index, value, def) { + this.update(); + _super.prototype.insertAt.call(this, index, value, def); + }; + ScrollBlot.prototype.optimize = function (mutations, context) { + var _this = this; + if (mutations === void 0) { mutations = []; } + if (context === void 0) { context = {}; } + _super.prototype.optimize.call(this, context); + // We must modify mutations directly, cannot make copy and then modify + var records = [].slice.call(this.observer.takeRecords()); + // Array.push currently seems to be implemented by a non-tail recursive function + // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords()); + while (records.length > 0) + mutations.push(records.pop()); + // TODO use WeakMap + var mark = function (blot, markParent) { + if (markParent === void 0) { markParent = true; } + if (blot == null || blot === _this) + return; + if (blot.domNode.parentNode == null) + return; + // @ts-ignore + if (blot.domNode[Registry.DATA_KEY].mutations == null) { + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations = []; + } + if (markParent) + mark(blot.parent); + }; + var optimize = function (blot) { + // Post-order traversal + if ( + // @ts-ignore + blot.domNode[Registry.DATA_KEY] == null || + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations == null) { + return; + } + if (blot instanceof container_1.default) { + blot.children.forEach(optimize); + } + blot.optimize(context); + }; + var remaining = mutations; + for (var i = 0; remaining.length > 0; i += 1) { + if (i >= MAX_OPTIMIZE_ITERATIONS) { + throw new Error('[Parchment] Maximum optimize iterations reached'); + } + remaining.forEach(function (mutation) { + var blot = Registry.find(mutation.target, true); + if (blot == null) + return; + if (blot.domNode === mutation.target) { + if (mutation.type === 'childList') { + mark(Registry.find(mutation.previousSibling, false)); + [].forEach.call(mutation.addedNodes, function (node) { + var child = Registry.find(node, false); + mark(child, false); + if (child instanceof container_1.default) { + child.children.forEach(function (grandChild) { + mark(grandChild, false); + }); + } + }); + } + else if (mutation.type === 'attributes') { + mark(blot.prev); + } + } + mark(blot); + }); + this.children.forEach(optimize); + remaining = [].slice.call(this.observer.takeRecords()); + records = remaining.slice(); + while (records.length > 0) + mutations.push(records.pop()); + } + }; + ScrollBlot.prototype.update = function (mutations, context) { + var _this = this; + if (context === void 0) { context = {}; } + mutations = mutations || this.observer.takeRecords(); + // TODO use WeakMap + mutations + .map(function (mutation) { + var blot = Registry.find(mutation.target, true); + if (blot == null) + return null; + // @ts-ignore + if (blot.domNode[Registry.DATA_KEY].mutations == null) { + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations = [mutation]; + return blot; + } + else { + // @ts-ignore + blot.domNode[Registry.DATA_KEY].mutations.push(mutation); + return null; + } + }) + .forEach(function (blot) { + if (blot == null || + blot === _this || + //@ts-ignore + blot.domNode[Registry.DATA_KEY] == null) + return; + // @ts-ignore + blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context); + }); + // @ts-ignore + if (this.domNode[Registry.DATA_KEY].mutations != null) { + // @ts-ignore + _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context); + } + this.optimize(mutations, context); + }; + ScrollBlot.blotName = 'scroll'; + ScrollBlot.defaultChild = 'block'; + ScrollBlot.scope = Registry.Scope.BLOCK_BLOT; + ScrollBlot.tagName = 'DIV'; + return ScrollBlot; +}(container_1.default)); +exports.default = ScrollBlot; + + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var format_1 = __webpack_require__(18); +var Registry = __webpack_require__(1); +// Shallow object comparison +function isEqual(obj1, obj2) { + if (Object.keys(obj1).length !== Object.keys(obj2).length) + return false; + // @ts-ignore + for (var prop in obj1) { + // @ts-ignore + if (obj1[prop] !== obj2[prop]) + return false; + } + return true; +} +var InlineBlot = /** @class */ (function (_super) { + __extends(InlineBlot, _super); + function InlineBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + InlineBlot.formats = function (domNode) { + if (domNode.tagName === InlineBlot.tagName) + return undefined; + return _super.formats.call(this, domNode); + }; + InlineBlot.prototype.format = function (name, value) { + var _this = this; + if (name === this.statics.blotName && !value) { + this.children.forEach(function (child) { + if (!(child instanceof format_1.default)) { + child = child.wrap(InlineBlot.blotName, true); + } + _this.attributes.copy(child); + }); + this.unwrap(); + } + else { + _super.prototype.format.call(this, name, value); + } + }; + InlineBlot.prototype.formatAt = function (index, length, name, value) { + if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) { + var blot = this.isolate(index, length); + blot.format(name, value); + } + else { + _super.prototype.formatAt.call(this, index, length, name, value); + } + }; + InlineBlot.prototype.optimize = function (context) { + _super.prototype.optimize.call(this, context); + var formats = this.formats(); + if (Object.keys(formats).length === 0) { + return this.unwrap(); // unformatted span + } + var next = this.next; + if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) { + next.moveChildren(this); + next.remove(); + } + }; + InlineBlot.blotName = 'inline'; + InlineBlot.scope = Registry.Scope.INLINE_BLOT; + InlineBlot.tagName = 'SPAN'; + return InlineBlot; +}(format_1.default)); +exports.default = InlineBlot; + + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var format_1 = __webpack_require__(18); +var Registry = __webpack_require__(1); +var BlockBlot = /** @class */ (function (_super) { + __extends(BlockBlot, _super); + function BlockBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + BlockBlot.formats = function (domNode) { + var tagName = Registry.query(BlockBlot.blotName).tagName; + if (domNode.tagName === tagName) + return undefined; + return _super.formats.call(this, domNode); + }; + BlockBlot.prototype.format = function (name, value) { + if (Registry.query(name, Registry.Scope.BLOCK) == null) { + return; + } + else if (name === this.statics.blotName && !value) { + this.replaceWith(BlockBlot.blotName); + } + else { + _super.prototype.format.call(this, name, value); + } + }; + BlockBlot.prototype.formatAt = function (index, length, name, value) { + if (Registry.query(name, Registry.Scope.BLOCK) != null) { + this.format(name, value); + } + else { + _super.prototype.formatAt.call(this, index, length, name, value); + } + }; + BlockBlot.prototype.insertAt = function (index, value, def) { + if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) { + // Insert text or inline + _super.prototype.insertAt.call(this, index, value, def); + } + else { + var after = this.split(index); + var blot = Registry.create(value, def); + after.parent.insertBefore(blot, after); + } + }; + BlockBlot.prototype.update = function (mutations, context) { + if (navigator.userAgent.match(/Trident/)) { + this.build(); + } + else { + _super.prototype.update.call(this, mutations, context); + } + }; + BlockBlot.blotName = 'block'; + BlockBlot.scope = Registry.Scope.BLOCK_BLOT; + BlockBlot.tagName = 'P'; + return BlockBlot; +}(format_1.default)); +exports.default = BlockBlot; + + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var leaf_1 = __webpack_require__(19); +var EmbedBlot = /** @class */ (function (_super) { + __extends(EmbedBlot, _super); + function EmbedBlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + EmbedBlot.formats = function (domNode) { + return undefined; + }; + EmbedBlot.prototype.format = function (name, value) { + // super.formatAt wraps, which is what we want in general, + // but this allows subclasses to overwrite for formats + // that just apply to particular embeds + _super.prototype.formatAt.call(this, 0, this.length(), name, value); + }; + EmbedBlot.prototype.formatAt = function (index, length, name, value) { + if (index === 0 && length === this.length()) { + this.format(name, value); + } + else { + _super.prototype.formatAt.call(this, index, length, name, value); + } + }; + EmbedBlot.prototype.formats = function () { + return this.statics.formats(this.domNode); + }; + return EmbedBlot; +}(leaf_1.default)); +exports.default = EmbedBlot; + + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var leaf_1 = __webpack_require__(19); +var Registry = __webpack_require__(1); +var TextBlot = /** @class */ (function (_super) { + __extends(TextBlot, _super); + function TextBlot(node) { + var _this = _super.call(this, node) || this; + _this.text = _this.statics.value(_this.domNode); + return _this; + } + TextBlot.create = function (value) { + return document.createTextNode(value); + }; + TextBlot.value = function (domNode) { + var text = domNode.data; + // @ts-ignore + if (text['normalize']) + text = text['normalize'](); + return text; + }; + TextBlot.prototype.deleteAt = function (index, length) { + this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length); + }; + TextBlot.prototype.index = function (node, offset) { + if (this.domNode === node) { + return offset; + } + return -1; + }; + TextBlot.prototype.insertAt = function (index, value, def) { + if (def == null) { + this.text = this.text.slice(0, index) + value + this.text.slice(index); + this.domNode.data = this.text; + } + else { + _super.prototype.insertAt.call(this, index, value, def); + } + }; + TextBlot.prototype.length = function () { + return this.text.length; + }; + TextBlot.prototype.optimize = function (context) { + _super.prototype.optimize.call(this, context); + this.text = this.statics.value(this.domNode); + if (this.text.length === 0) { + this.remove(); + } + else if (this.next instanceof TextBlot && this.next.prev === this) { + this.insertAt(this.length(), this.next.value()); + this.next.remove(); + } + }; + TextBlot.prototype.position = function (index, inclusive) { + if (inclusive === void 0) { inclusive = false; } + return [this.domNode, index]; + }; + TextBlot.prototype.split = function (index, force) { + if (force === void 0) { force = false; } + if (!force) { + if (index === 0) + return this; + if (index === this.length()) + return this.next; + } + var after = Registry.create(this.domNode.splitText(index)); + this.parent.insertBefore(after, this.next); + this.text = this.statics.value(this.domNode); + return after; + }; + TextBlot.prototype.update = function (mutations, context) { + var _this = this; + if (mutations.some(function (mutation) { + return mutation.type === 'characterData' && mutation.target === _this.domNode; + })) { + this.text = this.statics.value(this.domNode); + } + }; + TextBlot.prototype.value = function () { + return this.text; + }; + TextBlot.blotName = 'text'; + TextBlot.scope = Registry.Scope.INLINE_BLOT; + return TextBlot; +}(leaf_1.default)); +exports.default = TextBlot; + + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var elem = document.createElement('div'); +elem.classList.toggle('test-class', false); +if (elem.classList.contains('test-class')) { + var _toggle = DOMTokenList.prototype.toggle; + DOMTokenList.prototype.toggle = function (token, force) { + if (arguments.length > 1 && !this.contains(token) === !force) { + return force; + } else { + return _toggle.call(this, token); + } + }; +} + +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + position = position || 0; + return this.substr(position, searchString.length) === searchString; + }; +} + +if (!String.prototype.endsWith) { + String.prototype.endsWith = function (searchString, position) { + var subjectString = this.toString(); + if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; +} + +if (!Array.prototype.find) { + Object.defineProperty(Array.prototype, "find", { + value: function value(predicate) { + if (this === null) { + throw new TypeError('Array.prototype.find called on null or undefined'); + } + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + var list = Object(this); + var length = list.length >>> 0; + var thisArg = arguments[1]; + var value; + + for (var i = 0; i < length; i++) { + value = list[i]; + if (predicate.call(thisArg, value, i, list)) { + return value; + } + } + return undefined; + } + }); +} + +document.addEventListener("DOMContentLoaded", function () { + // Disable resizing in Firefox + document.execCommand("enableObjectResizing", false, false); + // Disable automatic linkifying in IE11 + document.execCommand("autoUrlDetect", false, false); +}); + +/***/ }), +/* 51 */ +/***/ (function(module, exports) { + +/** + * This library modifies the diff-patch-match library by Neil Fraser + * by removing the patch and match functionality and certain advanced + * options in the diff function. The original license is as follows: + * + * === + * + * Diff Match and Patch + * + * Copyright 2006 Google Inc. + * http://code.google.com/p/google-diff-match-patch/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * The data structure representing a diff is an array of tuples: + * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']] + * which means: delete 'Hello', add 'Goodbye' and keep ' world.' + */ +var DIFF_DELETE = -1; +var DIFF_INSERT = 1; +var DIFF_EQUAL = 0; + + +/** + * Find the differences between two texts. Simplifies the problem by stripping + * any common prefix or suffix off the texts before diffing. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {Int} cursor_pos Expected edit position in text1 (optional) + * @return {Array} Array of diff tuples. + */ +function diff_main(text1, text2, cursor_pos) { + // Check for equality (speedup). + if (text1 == text2) { + if (text1) { + return [[DIFF_EQUAL, text1]]; + } + return []; + } + + // Check cursor_pos within bounds + if (cursor_pos < 0 || text1.length < cursor_pos) { + cursor_pos = null; + } + + // Trim off common prefix (speedup). + var commonlength = diff_commonPrefix(text1, text2); + var commonprefix = text1.substring(0, commonlength); + text1 = text1.substring(commonlength); + text2 = text2.substring(commonlength); + + // Trim off common suffix (speedup). + commonlength = diff_commonSuffix(text1, text2); + var commonsuffix = text1.substring(text1.length - commonlength); + text1 = text1.substring(0, text1.length - commonlength); + text2 = text2.substring(0, text2.length - commonlength); + + // Compute the diff on the middle block. + var diffs = diff_compute_(text1, text2); + + // Restore the prefix and suffix. + if (commonprefix) { + diffs.unshift([DIFF_EQUAL, commonprefix]); + } + if (commonsuffix) { + diffs.push([DIFF_EQUAL, commonsuffix]); + } + diff_cleanupMerge(diffs); + if (cursor_pos != null) { + diffs = fix_cursor(diffs, cursor_pos); + } + diffs = fix_emoji(diffs); + return diffs; +}; + + +/** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @return {Array} Array of diff tuples. + */ +function diff_compute_(text1, text2) { + var diffs; + + if (!text1) { + // Just add some text (speedup). + return [[DIFF_INSERT, text2]]; + } + + if (!text2) { + // Just delete some text (speedup). + return [[DIFF_DELETE, text1]]; + } + + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + var i = longtext.indexOf(shorttext); + if (i != -1) { + // Shorter text is inside the longer text (speedup). + diffs = [[DIFF_INSERT, longtext.substring(0, i)], + [DIFF_EQUAL, shorttext], + [DIFF_INSERT, longtext.substring(i + shorttext.length)]]; + // Swap insertions for deletions if diff is reversed. + if (text1.length > text2.length) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if (shorttext.length == 1) { + // Single character string. + // After the previous speedup, the character can't be an equality. + return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; + } + + // Check to see if the problem can be split in two. + var hm = diff_halfMatch_(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + var text1_a = hm[0]; + var text1_b = hm[1]; + var text2_a = hm[2]; + var text2_b = hm[3]; + var mid_common = hm[4]; + // Send both pairs off for separate processing. + var diffs_a = diff_main(text1_a, text2_a); + var diffs_b = diff_main(text1_b, text2_b); + // Merge the results. + return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b); + } + + return diff_bisect_(text1, text2); +}; + + +/** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @return {Array} Array of diff tuples. + * @private + */ +function diff_bisect_(text1, text2) { + // Cache the text lengths to prevent multiple calls. + var text1_length = text1.length; + var text2_length = text2.length; + var max_d = Math.ceil((text1_length + text2_length) / 2); + var v_offset = max_d; + var v_length = 2 * max_d; + var v1 = new Array(v_length); + var v2 = new Array(v_length); + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (var x = 0; x < v_length; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[v_offset + 1] = 0; + v2[v_offset + 1] = 0; + var delta = text1_length - text2_length; + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + var front = (delta % 2 != 0); + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + var k1start = 0; + var k1end = 0; + var k2start = 0; + var k2end = 0; + for (var d = 0; d < max_d; d++) { + // Walk the front path one step. + for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + var k1_offset = v_offset + k1; + var x1; + if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) { + x1 = v1[k1_offset + 1]; + } else { + x1 = v1[k1_offset - 1] + 1; + } + var y1 = x1 - k1; + while (x1 < text1_length && y1 < text2_length && + text1.charAt(x1) == text2.charAt(y1)) { + x1++; + y1++; + } + v1[k1_offset] = x1; + if (x1 > text1_length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2_length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + var k2_offset = v_offset + delta - k1; + if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) { + // Mirror x2 onto top-left coordinate system. + var x2 = text1_length - v2[k2_offset]; + if (x1 >= x2) { + // Overlap detected. + return diff_bisectSplit_(text1, text2, x1, y1); + } + } + } + } + + // Walk the reverse path one step. + for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + var k2_offset = v_offset + k2; + var x2; + if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) { + x2 = v2[k2_offset + 1]; + } else { + x2 = v2[k2_offset - 1] + 1; + } + var y2 = x2 - k2; + while (x2 < text1_length && y2 < text2_length && + text1.charAt(text1_length - x2 - 1) == + text2.charAt(text2_length - y2 - 1)) { + x2++; + y2++; + } + v2[k2_offset] = x2; + if (x2 > text1_length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2_length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + var k1_offset = v_offset + delta - k2; + if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) { + var x1 = v1[k1_offset]; + var y1 = v_offset + x1 - k1_offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1_length - x2; + if (x1 >= x2) { + // Overlap detected. + return diff_bisectSplit_(text1, text2, x1, y1); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; +}; + + +/** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @return {Array} Array of diff tuples. + */ +function diff_bisectSplit_(text1, text2, x, y) { + var text1a = text1.substring(0, x); + var text2a = text2.substring(0, y); + var text1b = text1.substring(x); + var text2b = text2.substring(y); + + // Compute both diffs serially. + var diffs = diff_main(text1a, text2a); + var diffsb = diff_main(text1b, text2b); + + return diffs.concat(diffsb); +}; + + +/** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ +function diff_commonPrefix(text1, text2) { + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + var pointerstart = 0; + while (pointermin < pointermid) { + if (text1.substring(pointerstart, pointermid) == + text2.substring(pointerstart, pointermid)) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; +}; + + +/** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ +function diff_commonSuffix(text1, text2) { + // Quick check for common null cases. + if (!text1 || !text2 || + text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + var pointerend = 0; + while (pointermin < pointermid) { + if (text1.substring(text1.length - pointermid, text1.length - pointerend) == + text2.substring(text2.length - pointermid, text2.length - pointerend)) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; +}; + + +/** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + */ +function diff_halfMatch_(text1, text2) { + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diff_halfMatchI_(longtext, shorttext, i) { + // Start with a 1/4 length substring at position i as a seed. + var seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + var j = -1; + var best_common = ''; + var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; + while ((j = shorttext.indexOf(seed, j + 1)) != -1) { + var prefixLength = diff_commonPrefix(longtext.substring(i), + shorttext.substring(j)); + var suffixLength = diff_commonSuffix(longtext.substring(0, i), + shorttext.substring(0, j)); + if (best_common.length < suffixLength + prefixLength) { + best_common = shorttext.substring(j - suffixLength, j) + + shorttext.substring(j, j + prefixLength); + best_longtext_a = longtext.substring(0, i - suffixLength); + best_longtext_b = longtext.substring(i + prefixLength); + best_shorttext_a = shorttext.substring(0, j - suffixLength); + best_shorttext_b = shorttext.substring(j + prefixLength); + } + } + if (best_common.length * 2 >= longtext.length) { + return [best_longtext_a, best_longtext_b, + best_shorttext_a, best_shorttext_b, best_common]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + var hm1 = diff_halfMatchI_(longtext, shorttext, + Math.ceil(longtext.length / 4)); + // Check again based on the third quarter. + var hm2 = diff_halfMatchI_(longtext, shorttext, + Math.ceil(longtext.length / 2)); + var hm; + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + var text1_a, text1_b, text2_a, text2_b; + if (text1.length > text2.length) { + text1_a = hm[0]; + text1_b = hm[1]; + text2_a = hm[2]; + text2_b = hm[3]; + } else { + text2_a = hm[0]; + text2_b = hm[1]; + text1_a = hm[2]; + text1_b = hm[3]; + } + var mid_common = hm[4]; + return [text1_a, text1_b, text2_a, text2_b, mid_common]; +}; + + +/** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {Array} diffs Array of diff tuples. + */ +function diff_cleanupMerge(diffs) { + diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end. + var pointer = 0; + var count_delete = 0; + var count_insert = 0; + var text_delete = ''; + var text_insert = ''; + var commonlength; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + count_insert++; + text_insert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + count_delete++; + text_delete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (count_delete + count_insert > 1) { + if (count_delete !== 0 && count_insert !== 0) { + // Factor out any common prefixies. + commonlength = diff_commonPrefix(text_insert, text_delete); + if (commonlength !== 0) { + if ((pointer - count_delete - count_insert) > 0 && + diffs[pointer - count_delete - count_insert - 1][0] == + DIFF_EQUAL) { + diffs[pointer - count_delete - count_insert - 1][1] += + text_insert.substring(0, commonlength); + } else { + diffs.splice(0, 0, [DIFF_EQUAL, + text_insert.substring(0, commonlength)]); + pointer++; + } + text_insert = text_insert.substring(commonlength); + text_delete = text_delete.substring(commonlength); + } + // Factor out any common suffixies. + commonlength = diff_commonSuffix(text_insert, text_delete); + if (commonlength !== 0) { + diffs[pointer][1] = text_insert.substring(text_insert.length - + commonlength) + diffs[pointer][1]; + text_insert = text_insert.substring(0, text_insert.length - + commonlength); + text_delete = text_delete.substring(0, text_delete.length - + commonlength); + } + } + // Delete the offending records and add the merged ones. + if (count_delete === 0) { + diffs.splice(pointer - count_insert, + count_delete + count_insert, [DIFF_INSERT, text_insert]); + } else if (count_insert === 0) { + diffs.splice(pointer - count_delete, + count_delete + count_insert, [DIFF_DELETE, text_delete]); + } else { + diffs.splice(pointer - count_delete - count_insert, + count_delete + count_insert, [DIFF_DELETE, text_delete], + [DIFF_INSERT, text_insert]); + } + pointer = pointer - count_delete - count_insert + + (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1; + } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) { + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + count_insert = 0; + count_delete = 0; + text_delete = ''; + text_insert = ''; + break; + } + } + if (diffs[diffs.length - 1][1] === '') { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + var changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] == DIFF_EQUAL && + diffs[pointer + 1][0] == DIFF_EQUAL) { + // This is a single edit surrounded by equalities. + if (diffs[pointer][1].substring(diffs[pointer][1].length - + diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) { + // Shift the edit over the previous equality. + diffs[pointer][1] = diffs[pointer - 1][1] + + diffs[pointer][1].substring(0, diffs[pointer][1].length - + diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == + diffs[pointer + 1][1]) { + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = + diffs[pointer][1].substring(diffs[pointer + 1][1].length) + + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + diff_cleanupMerge(diffs); + } +}; + + +var diff = diff_main; +diff.INSERT = DIFF_INSERT; +diff.DELETE = DIFF_DELETE; +diff.EQUAL = DIFF_EQUAL; + +module.exports = diff; + +/* + * Modify a diff such that the cursor position points to the start of a change: + * E.g. + * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1) + * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]] + * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2) + * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]] + * + * @param {Array} diffs Array of diff tuples + * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds! + * @return {Array} A tuple [cursor location in the modified diff, modified diff] + */ +function cursor_normalize_diff (diffs, cursor_pos) { + if (cursor_pos === 0) { + return [DIFF_EQUAL, diffs]; + } + for (var current_pos = 0, i = 0; i < diffs.length; i++) { + var d = diffs[i]; + if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) { + var next_pos = current_pos + d[1].length; + if (cursor_pos === next_pos) { + return [i + 1, diffs]; + } else if (cursor_pos < next_pos) { + // copy to prevent side effects + diffs = diffs.slice(); + // split d into two diff changes + var split_pos = cursor_pos - current_pos; + var d_left = [d[0], d[1].slice(0, split_pos)]; + var d_right = [d[0], d[1].slice(split_pos)]; + diffs.splice(i, 1, d_left, d_right); + return [i + 1, diffs]; + } else { + current_pos = next_pos; + } + } + } + throw new Error('cursor_pos is out of bounds!') +} + +/* + * Modify a diff such that the edit position is "shifted" to the proposed edit location (cursor_position). + * + * Case 1) + * Check if a naive shift is possible: + * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X) + * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result + * Case 2) + * Check if the following shifts are possible: + * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix'] + * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix'] + * ^ ^ + * d d_next + * + * @param {Array} diffs Array of diff tuples + * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds! + * @return {Array} Array of diff tuples + */ +function fix_cursor (diffs, cursor_pos) { + var norm = cursor_normalize_diff(diffs, cursor_pos); + var ndiffs = norm[1]; + var cursor_pointer = norm[0]; + var d = ndiffs[cursor_pointer]; + var d_next = ndiffs[cursor_pointer + 1]; + + if (d == null) { + // Text was deleted from end of original string, + // cursor is now out of bounds in new string + return diffs; + } else if (d[0] !== DIFF_EQUAL) { + // A modification happened at the cursor location. + // This is the expected outcome, so we can return the original diff. + return diffs; + } else { + if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) { + // Case 1) + // It is possible to perform a naive shift + ndiffs.splice(cursor_pointer, 2, d_next, d) + return merge_tuples(ndiffs, cursor_pointer, 2) + } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) { + // Case 2) + // d[1] is a prefix of d_next[1] + // We can assume that d_next[0] !== 0, since d[0] === 0 + // Shift edit locations.. + ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]); + var suffix = d_next[1].slice(d[1].length); + if (suffix.length > 0) { + ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]); + } + return merge_tuples(ndiffs, cursor_pointer, 3) + } else { + // Not possible to perform any modification + return diffs; + } + } +} + +/* + * Check diff did not split surrogate pairs. + * Ex. [0, '\uD83D'], [-1, '\uDC36'], [1, '\uDC2F'] -> [-1, '\uD83D\uDC36'], [1, '\uD83D\uDC2F'] + * '\uD83D\uDC36' === '🐶', '\uD83D\uDC2F' === '🐯' + * + * @param {Array} diffs Array of diff tuples + * @return {Array} Array of diff tuples + */ +function fix_emoji (diffs) { + var compact = false; + var starts_with_pair_end = function(str) { + return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF; + } + var ends_with_pair_start = function(str) { + return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF; + } + for (var i = 2; i < diffs.length; i += 1) { + if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) && + diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) && + diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) { + compact = true; + + diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1]; + diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1]; + + diffs[i-2][1] = diffs[i-2][1].slice(0, -1); + } + } + if (!compact) { + return diffs; + } + var fixed_diffs = []; + for (var i = 0; i < diffs.length; i += 1) { + if (diffs[i][1].length > 0) { + fixed_diffs.push(diffs[i]); + } + } + return fixed_diffs; +} + +/* + * Try to merge tuples with their neigbors in a given range. + * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab'] + * + * @param {Array} diffs Array of diff tuples. + * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]). + * @param {Int} length Number of consecutive elements to check. + * @return {Array} Array of merged diff tuples. + */ +function merge_tuples (diffs, start, length) { + // Check from (start-1) to (start+length). + for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) { + if (i + 1 < diffs.length) { + var left_d = diffs[i]; + var right_d = diffs[i+1]; + if (left_d[0] === right_d[1]) { + diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]); + } + } + } + return diffs; +} + + +/***/ }), +/* 52 */ +/***/ (function(module, exports) { + +exports = module.exports = typeof Object.keys === 'function' + ? Object.keys : shim; + +exports.shim = shim; +function shim (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} + + +/***/ }), +/* 53 */ +/***/ (function(module, exports) { + +var supportsArgumentsClass = (function(){ + return Object.prototype.toString.call(arguments) +})() == '[object Arguments]'; + +exports = module.exports = supportsArgumentsClass ? supported : unsupported; + +exports.supported = supported; +function supported(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +}; + +exports.unsupported = unsupported; +function unsupported(object){ + return object && + typeof object == 'object' && + typeof object.length == 'number' && + Object.prototype.hasOwnProperty.call(object, 'callee') && + !Object.prototype.propertyIsEnumerable.call(object, 'callee') || + false; +}; + + +/***/ }), +/* 54 */ +/***/ (function(module, exports) { + +'use strict'; + +var has = Object.prototype.hasOwnProperty + , prefix = '~'; + +/** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @api private + */ +function Events() {} + +// +// We try to not inherit from `Object.prototype`. In some engines creating an +// instance in this way is faster than calling `Object.create(null)` directly. +// If `Object.create(null)` is not supported we prefix the event names with a +// character to make sure that the built-in object properties are not +// overridden or used as an attack vector. +// +if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; +} + +/** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {Mixed} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @api private + */ +function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; +} + +/** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @api public + */ +function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; +} + +/** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @api public + */ +EventEmitter.prototype.eventNames = function eventNames() { + var names = [] + , events + , name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; +}; + +/** + * Return the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Boolean} exists Only check if there are listeners. + * @returns {Array|Boolean} + * @api public + */ +EventEmitter.prototype.listeners = function listeners(event, exists) { + var evt = prefix ? prefix + event : event + , available = this._events[evt]; + + if (exists) return !!available; + if (!available) return []; + if (available.fn) return [available.fn]; + + for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { + ee[i] = available[i].fn; + } + + return ee; +}; + +/** + * Calls each of the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @api public + */ +EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt] + , len = arguments.length + , args + , i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: return listeners.fn.call(listeners.context), true; + case 2: return listeners.fn.call(listeners.context, a1), true; + case 3: return listeners.fn.call(listeners.context, a1, a2), true; + case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len -1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length + , j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: listeners[i].fn.call(listeners[i].context); break; + case 2: listeners[i].fn.call(listeners[i].context, a1); break; + case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; + case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; + default: + if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; +}; + +/** + * Add a listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.on = function on(event, fn, context) { + var listener = new EE(fn, context || this) + , evt = prefix ? prefix + event : event; + + if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; +}; + +/** + * Add a one-time listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.once = function once(event, fn, context) { + var listener = new EE(fn, context || this, true) + , evt = prefix ? prefix + event : event; + + if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; +}; + +/** + * Remove the listeners of a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {Mixed} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn + && (!once || listeners.once) + && (!context || listeners.context === context) + ) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn + || (once && !listeners[i].once) + || (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + + return this; +}; + +/** + * Remove all listeners, or those of the specified event. + * + * @param {String|Symbol} [event] The event name. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; +}; + +// +// Alias methods names because people roll like that. +// +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +// +// This function doesn't apply anymore. +// +EventEmitter.prototype.setMaxListeners = function setMaxListeners() { + return this; +}; + +// +// Expose the prefix. +// +EventEmitter.prefixed = prefix; + +// +// Allow `EventEmitter` to be imported as module namespace. +// +EventEmitter.EventEmitter = EventEmitter; + +// +// Expose the module. +// +if ('undefined' !== typeof module) { + module.exports = EventEmitter; +} + + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.matchText = exports.matchSpacing = exports.matchNewline = exports.matchBlot = exports.matchAttributor = exports.default = undefined; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _extend2 = __webpack_require__(3); + +var _extend3 = _interopRequireDefault(_extend2); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +var _align = __webpack_require__(36); + +var _background = __webpack_require__(37); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _color = __webpack_require__(26); + +var _direction = __webpack_require__(38); + +var _font = __webpack_require__(39); + +var _size = __webpack_require__(40); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:clipboard'); + +var DOM_KEY = '__ql-matcher'; + +var CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], [Node.TEXT_NODE, matchNewline], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchSpacing], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['li', matchIndent], ['b', matchAlias.bind(matchAlias, 'bold')], ['i', matchAlias.bind(matchAlias, 'italic')], ['style', matchIgnore]]; + +var ATTRIBUTE_ATTRIBUTORS = [_align.AlignAttribute, _direction.DirectionAttribute].reduce(function (memo, attr) { + memo[attr.keyName] = attr; + return memo; +}, {}); + +var STYLE_ATTRIBUTORS = [_align.AlignStyle, _background.BackgroundStyle, _color.ColorStyle, _direction.DirectionStyle, _font.FontStyle, _size.SizeStyle].reduce(function (memo, attr) { + memo[attr.keyName] = attr; + return memo; +}, {}); + +var Clipboard = function (_Module) { + _inherits(Clipboard, _Module); + + function Clipboard(quill, options) { + _classCallCheck(this, Clipboard); + + var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this, quill, options)); + + _this.quill.root.addEventListener('paste', _this.onPaste.bind(_this)); + _this.container = _this.quill.addContainer('ql-clipboard'); + _this.container.setAttribute('contenteditable', true); + _this.container.setAttribute('tabindex', -1); + _this.matchers = []; + CLIPBOARD_CONFIG.concat(_this.options.matchers).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + selector = _ref2[0], + matcher = _ref2[1]; + + if (!options.matchVisual && matcher === matchSpacing) return; + _this.addMatcher(selector, matcher); + }); + return _this; + } + + _createClass(Clipboard, [{ + key: 'addMatcher', + value: function addMatcher(selector, matcher) { + this.matchers.push([selector, matcher]); + } + }, { + key: 'convert', + value: function convert(html) { + if (typeof html === 'string') { + this.container.innerHTML = html.replace(/\>\r?\n +\<'); // Remove spaces between tags + return this.convert(); + } + var formats = this.quill.getFormat(this.quill.selection.savedRange.index); + if (formats[_code2.default.blotName]) { + var text = this.container.innerText; + this.container.innerHTML = ''; + return new _quillDelta2.default().insert(text, _defineProperty({}, _code2.default.blotName, formats[_code2.default.blotName])); + } + + var _prepareMatching = this.prepareMatching(), + _prepareMatching2 = _slicedToArray(_prepareMatching, 2), + elementMatchers = _prepareMatching2[0], + textMatchers = _prepareMatching2[1]; + + var delta = traverse(this.container, elementMatchers, textMatchers); + // Remove trailing newline + if (deltaEndsWith(delta, '\n') && delta.ops[delta.ops.length - 1].attributes == null) { + delta = delta.compose(new _quillDelta2.default().retain(delta.length() - 1).delete(1)); + } + debug.log('convert', this.container.innerHTML, delta); + this.container.innerHTML = ''; + return delta; + } + }, { + key: 'dangerouslyPasteHTML', + value: function dangerouslyPasteHTML(index, html) { + var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API; + + if (typeof index === 'string') { + this.quill.setContents(this.convert(index), html); + this.quill.setSelection(0, _quill2.default.sources.SILENT); + } else { + var paste = this.convert(html); + this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source); + this.quill.setSelection(index + paste.length(), _quill2.default.sources.SILENT); + } + } + }, { + key: 'onPaste', + value: function onPaste(e) { + var _this2 = this; + + if (e.defaultPrevented || !this.quill.isEnabled()) return; + var range = this.quill.getSelection(); + var delta = new _quillDelta2.default().retain(range.index); + var scrollTop = this.quill.scrollingContainer.scrollTop; + this.container.focus(); + this.quill.selection.update(_quill2.default.sources.SILENT); + setTimeout(function () { + delta = delta.concat(_this2.convert()).delete(range.length); + _this2.quill.updateContents(delta, _quill2.default.sources.USER); + // range.length contributes to delta.length() + _this2.quill.setSelection(delta.length() - range.length, _quill2.default.sources.SILENT); + _this2.quill.scrollingContainer.scrollTop = scrollTop; + _this2.quill.focus(); + }, 1); + } + }, { + key: 'prepareMatching', + value: function prepareMatching() { + var _this3 = this; + + var elementMatchers = [], + textMatchers = []; + this.matchers.forEach(function (pair) { + var _pair = _slicedToArray(pair, 2), + selector = _pair[0], + matcher = _pair[1]; + + switch (selector) { + case Node.TEXT_NODE: + textMatchers.push(matcher); + break; + case Node.ELEMENT_NODE: + elementMatchers.push(matcher); + break; + default: + [].forEach.call(_this3.container.querySelectorAll(selector), function (node) { + // TODO use weakmap + node[DOM_KEY] = node[DOM_KEY] || []; + node[DOM_KEY].push(matcher); + }); + break; + } + }); + return [elementMatchers, textMatchers]; + } + }]); + + return Clipboard; +}(_module2.default); + +Clipboard.DEFAULTS = { + matchers: [], + matchVisual: true +}; + +function applyFormat(delta, format, value) { + if ((typeof format === 'undefined' ? 'undefined' : _typeof(format)) === 'object') { + return Object.keys(format).reduce(function (delta, key) { + return applyFormat(delta, key, format[key]); + }, delta); + } else { + return delta.reduce(function (delta, op) { + if (op.attributes && op.attributes[format]) { + return delta.push(op); + } else { + return delta.insert(op.insert, (0, _extend3.default)({}, _defineProperty({}, format, value), op.attributes)); + } + }, new _quillDelta2.default()); + } +} + +function computeStyle(node) { + if (node.nodeType !== Node.ELEMENT_NODE) return {}; + var DOM_KEY = '__ql-computed-style'; + return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node)); +} + +function deltaEndsWith(delta, text) { + var endText = ""; + for (var i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) { + var op = delta.ops[i]; + if (typeof op.insert !== 'string') break; + endText = op.insert + endText; + } + return endText.slice(-1 * text.length) === text; +} + +function isLine(node) { + if (node.childNodes.length === 0) return false; // Exclude embed blocks + var style = computeStyle(node); + return ['block', 'list-item'].indexOf(style.display) > -1; +} + +function traverse(node, elementMatchers, textMatchers) { + // Post-order + if (node.nodeType === node.TEXT_NODE) { + return textMatchers.reduce(function (delta, matcher) { + return matcher(node, delta); + }, new _quillDelta2.default()); + } else if (node.nodeType === node.ELEMENT_NODE) { + return [].reduce.call(node.childNodes || [], function (delta, childNode) { + var childrenDelta = traverse(childNode, elementMatchers, textMatchers); + if (childNode.nodeType === node.ELEMENT_NODE) { + childrenDelta = elementMatchers.reduce(function (childrenDelta, matcher) { + return matcher(childNode, childrenDelta); + }, childrenDelta); + childrenDelta = (childNode[DOM_KEY] || []).reduce(function (childrenDelta, matcher) { + return matcher(childNode, childrenDelta); + }, childrenDelta); + } + return delta.concat(childrenDelta); + }, new _quillDelta2.default()); + } else { + return new _quillDelta2.default(); + } +} + +function matchAlias(format, node, delta) { + return applyFormat(delta, format, true); +} + +function matchAttributor(node, delta) { + var attributes = _parchment2.default.Attributor.Attribute.keys(node); + var classes = _parchment2.default.Attributor.Class.keys(node); + var styles = _parchment2.default.Attributor.Style.keys(node); + var formats = {}; + attributes.concat(classes).concat(styles).forEach(function (name) { + var attr = _parchment2.default.query(name, _parchment2.default.Scope.ATTRIBUTE); + if (attr != null) { + formats[attr.attrName] = attr.value(node); + if (formats[attr.attrName]) return; + } + attr = ATTRIBUTE_ATTRIBUTORS[name]; + if (attr != null && (attr.attrName === name || attr.keyName === name)) { + formats[attr.attrName] = attr.value(node) || undefined; + } + attr = STYLE_ATTRIBUTORS[name]; + if (attr != null && (attr.attrName === name || attr.keyName === name)) { + attr = STYLE_ATTRIBUTORS[name]; + formats[attr.attrName] = attr.value(node) || undefined; + } + }); + if (Object.keys(formats).length > 0) { + delta = applyFormat(delta, formats); + } + return delta; +} + +function matchBlot(node, delta) { + var match = _parchment2.default.query(node); + if (match == null) return delta; + if (match.prototype instanceof _parchment2.default.Embed) { + var embed = {}; + var value = match.value(node); + if (value != null) { + embed[match.blotName] = value; + delta = new _quillDelta2.default().insert(embed, match.formats(node)); + } + } else if (typeof match.formats === 'function') { + delta = applyFormat(delta, match.blotName, match.formats(node)); + } + return delta; +} + +function matchBreak(node, delta) { + if (!deltaEndsWith(delta, '\n')) { + delta.insert('\n'); + } + return delta; +} + +function matchIgnore() { + return new _quillDelta2.default(); +} + +function matchIndent(node, delta) { + var match = _parchment2.default.query(node); + if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\n')) { + return delta; + } + var indent = -1, + parent = node.parentNode; + while (!parent.classList.contains('ql-clipboard')) { + if ((_parchment2.default.query(parent) || {}).blotName === 'list') { + indent += 1; + } + parent = parent.parentNode; + } + if (indent <= 0) return delta; + return delta.compose(new _quillDelta2.default().retain(delta.length() - 1).retain(1, { indent: indent })); +} + +function matchNewline(node, delta) { + if (!deltaEndsWith(delta, '\n')) { + if (isLine(node) || delta.length() > 0 && node.nextSibling && isLine(node.nextSibling)) { + delta.insert('\n'); + } + } + return delta; +} + +function matchSpacing(node, delta) { + if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\n\n')) { + var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom); + if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) { + delta.insert('\n'); + } + } + return delta; +} + +function matchStyles(node, delta) { + var formats = {}; + var style = node.style || {}; + if (style.fontStyle && computeStyle(node).fontStyle === 'italic') { + formats.italic = true; + } + if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') || parseInt(computeStyle(node).fontWeight) >= 700)) { + formats.bold = true; + } + if (Object.keys(formats).length > 0) { + delta = applyFormat(delta, formats); + } + if (parseFloat(style.textIndent || 0) > 0) { + // Could be 0.5in + delta = new _quillDelta2.default().insert('\t').concat(delta); + } + return delta; +} + +function matchText(node, delta) { + var text = node.data; + // Word represents empty line with   + if (node.parentNode.tagName === 'O:P') { + return delta.insert(text.trim()); + } + if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) { + return delta; + } + if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) { + // eslint-disable-next-line func-style + var replacer = function replacer(collapse, match) { + match = match.replace(/[^\u00a0]/g, ''); // \u00a0 is nbsp; + return match.length < 1 && collapse ? ' ' : match; + }; + text = text.replace(/\r\n/g, ' ').replace(/\n/g, ' '); + text = text.replace(/\s\s+/g, replacer.bind(replacer, true)); // collapse whitespace + if (node.previousSibling == null && isLine(node.parentNode) || node.previousSibling != null && isLine(node.previousSibling)) { + text = text.replace(/^\s+/, replacer.bind(replacer, false)); + } + if (node.nextSibling == null && isLine(node.parentNode) || node.nextSibling != null && isLine(node.nextSibling)) { + text = text.replace(/\s+$/, replacer.bind(replacer, false)); + } + } + return delta.insert(text); +} + +exports.default = Clipboard; +exports.matchAttributor = matchAttributor; +exports.matchBlot = matchBlot; +exports.matchNewline = matchNewline; +exports.matchSpacing = matchSpacing; +exports.matchText = matchText; + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Bold = function (_Inline) { + _inherits(Bold, _Inline); + + function Bold() { + _classCallCheck(this, Bold); + + return _possibleConstructorReturn(this, (Bold.__proto__ || Object.getPrototypeOf(Bold)).apply(this, arguments)); + } + + _createClass(Bold, [{ + key: 'optimize', + value: function optimize(context) { + _get(Bold.prototype.__proto__ || Object.getPrototypeOf(Bold.prototype), 'optimize', this).call(this, context); + if (this.domNode.tagName !== this.statics.tagName[0]) { + this.replaceWith(this.statics.blotName); + } + } + }], [{ + key: 'create', + value: function create() { + return _get(Bold.__proto__ || Object.getPrototypeOf(Bold), 'create', this).call(this); + } + }, { + key: 'formats', + value: function formats() { + return true; + } + }]); + + return Bold; +}(_inline2.default); + +Bold.blotName = 'bold'; +Bold.tagName = ['STRONG', 'B']; + +exports.default = Bold; + +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.addControls = exports.default = undefined; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _quillDelta = __webpack_require__(2); + +var _quillDelta2 = _interopRequireDefault(_quillDelta); + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _logger = __webpack_require__(10); + +var _logger2 = _interopRequireDefault(_logger); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var debug = (0, _logger2.default)('quill:toolbar'); + +var Toolbar = function (_Module) { + _inherits(Toolbar, _Module); + + function Toolbar(quill, options) { + _classCallCheck(this, Toolbar); + + var _this = _possibleConstructorReturn(this, (Toolbar.__proto__ || Object.getPrototypeOf(Toolbar)).call(this, quill, options)); + + if (Array.isArray(_this.options.container)) { + var container = document.createElement('div'); + addControls(container, _this.options.container); + quill.container.parentNode.insertBefore(container, quill.container); + _this.container = container; + } else if (typeof _this.options.container === 'string') { + _this.container = document.querySelector(_this.options.container); + } else { + _this.container = _this.options.container; + } + if (!(_this.container instanceof HTMLElement)) { + var _ret; + + return _ret = debug.error('Container required for toolbar', _this.options), _possibleConstructorReturn(_this, _ret); + } + _this.container.classList.add('ql-toolbar'); + _this.controls = []; + _this.handlers = {}; + Object.keys(_this.options.handlers).forEach(function (format) { + _this.addHandler(format, _this.options.handlers[format]); + }); + [].forEach.call(_this.container.querySelectorAll('button, select'), function (input) { + _this.attach(input); + }); + _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (type, range) { + if (type === _quill2.default.events.SELECTION_CHANGE) { + _this.update(range); + } + }); + _this.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () { + var _this$quill$selection = _this.quill.selection.getRange(), + _this$quill$selection2 = _slicedToArray(_this$quill$selection, 1), + range = _this$quill$selection2[0]; // quill.getSelection triggers update + + + _this.update(range); + }); + return _this; + } + + _createClass(Toolbar, [{ + key: 'addHandler', + value: function addHandler(format, handler) { + this.handlers[format] = handler; + } + }, { + key: 'attach', + value: function attach(input) { + var _this2 = this; + + var format = [].find.call(input.classList, function (className) { + return className.indexOf('ql-') === 0; + }); + if (!format) return; + format = format.slice('ql-'.length); + if (input.tagName === 'BUTTON') { + input.setAttribute('type', 'button'); + } + if (this.handlers[format] == null) { + if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) { + debug.warn('ignoring attaching to disabled format', format, input); + return; + } + if (_parchment2.default.query(format) == null) { + debug.warn('ignoring attaching to nonexistent format', format, input); + return; + } + } + var eventName = input.tagName === 'SELECT' ? 'change' : 'click'; + input.addEventListener(eventName, function (e) { + var value = void 0; + if (input.tagName === 'SELECT') { + if (input.selectedIndex < 0) return; + var selected = input.options[input.selectedIndex]; + if (selected.hasAttribute('selected')) { + value = false; + } else { + value = selected.value || false; + } + } else { + if (input.classList.contains('ql-active')) { + value = false; + } else { + value = input.value || !input.hasAttribute('value'); + } + e.preventDefault(); + } + _this2.quill.focus(); + + var _quill$selection$getR = _this2.quill.selection.getRange(), + _quill$selection$getR2 = _slicedToArray(_quill$selection$getR, 1), + range = _quill$selection$getR2[0]; + + if (_this2.handlers[format] != null) { + _this2.handlers[format].call(_this2, value); + } else if (_parchment2.default.query(format).prototype instanceof _parchment2.default.Embed) { + value = prompt('Enter ' + format); + if (!value) return; + _this2.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert(_defineProperty({}, format, value)), _quill2.default.sources.USER); + } else { + _this2.quill.format(format, value, _quill2.default.sources.USER); + } + _this2.update(range); + }); + // TODO use weakmap + this.controls.push([format, input]); + } + }, { + key: 'update', + value: function update(range) { + var formats = range == null ? {} : this.quill.getFormat(range); + this.controls.forEach(function (pair) { + var _pair = _slicedToArray(pair, 2), + format = _pair[0], + input = _pair[1]; + + if (input.tagName === 'SELECT') { + var option = void 0; + if (range == null) { + option = null; + } else if (formats[format] == null) { + option = input.querySelector('option[selected]'); + } else if (!Array.isArray(formats[format])) { + var value = formats[format]; + if (typeof value === 'string') { + value = value.replace(/\"/g, '\\"'); + } + option = input.querySelector('option[value="' + value + '"]'); + } + if (option == null) { + input.value = ''; // TODO make configurable? + input.selectedIndex = -1; + } else { + option.selected = true; + } + } else { + if (range == null) { + input.classList.remove('ql-active'); + } else if (input.hasAttribute('value')) { + // both being null should match (default values) + // '1' should match with 1 (headers) + var isActive = formats[format] === input.getAttribute('value') || formats[format] != null && formats[format].toString() === input.getAttribute('value') || formats[format] == null && !input.getAttribute('value'); + input.classList.toggle('ql-active', isActive); + } else { + input.classList.toggle('ql-active', formats[format] != null); + } + } + }); + } + }]); + + return Toolbar; +}(_module2.default); + +Toolbar.DEFAULTS = {}; + +function addButton(container, format, value) { + var input = document.createElement('button'); + input.setAttribute('type', 'button'); + input.classList.add('ql-' + format); + if (value != null) { + input.value = value; + } + container.appendChild(input); +} + +function addControls(container, groups) { + if (!Array.isArray(groups[0])) { + groups = [groups]; + } + groups.forEach(function (controls) { + var group = document.createElement('span'); + group.classList.add('ql-formats'); + controls.forEach(function (control) { + if (typeof control === 'string') { + addButton(group, control); + } else { + var format = Object.keys(control)[0]; + var value = control[format]; + if (Array.isArray(value)) { + addSelect(group, format, value); + } else { + addButton(group, format, value); + } + } + }); + container.appendChild(group); + }); +} + +function addSelect(container, format, values) { + var input = document.createElement('select'); + input.classList.add('ql-' + format); + values.forEach(function (value) { + var option = document.createElement('option'); + if (value !== false) { + option.setAttribute('value', value); + } else { + option.setAttribute('selected', 'selected'); + } + input.appendChild(option); + }); + container.appendChild(input); +} + +Toolbar.DEFAULTS = { + container: null, + handlers: { + clean: function clean() { + var _this3 = this; + + var range = this.quill.getSelection(); + if (range == null) return; + if (range.length == 0) { + var formats = this.quill.getFormat(); + Object.keys(formats).forEach(function (name) { + // Clean functionality in existing apps only clean inline formats + if (_parchment2.default.query(name, _parchment2.default.Scope.INLINE) != null) { + _this3.quill.format(name, false); + } + }); + } else { + this.quill.removeFormat(range, _quill2.default.sources.USER); + } + }, + direction: function direction(value) { + var align = this.quill.getFormat()['align']; + if (value === 'rtl' && align == null) { + this.quill.format('align', 'right', _quill2.default.sources.USER); + } else if (!value && align === 'right') { + this.quill.format('align', false, _quill2.default.sources.USER); + } + this.quill.format('direction', value, _quill2.default.sources.USER); + }, + indent: function indent(value) { + var range = this.quill.getSelection(); + var formats = this.quill.getFormat(range); + var indent = parseInt(formats.indent || 0); + if (value === '+1' || value === '-1') { + var modifier = value === '+1' ? 1 : -1; + if (formats.direction === 'rtl') modifier *= -1; + this.quill.format('indent', indent + modifier, _quill2.default.sources.USER); + } + }, + link: function link(value) { + if (value === true) { + value = prompt('Enter link URL:'); + } + this.quill.format('link', value, _quill2.default.sources.USER); + }, + list: function list(value) { + var range = this.quill.getSelection(); + var formats = this.quill.getFormat(range); + if (value === 'check') { + if (formats['list'] === 'checked' || formats['list'] === 'unchecked') { + this.quill.format('list', false, _quill2.default.sources.USER); + } else { + this.quill.format('list', 'unchecked', _quill2.default.sources.USER); + } + } else { + this.quill.format('list', value, _quill2.default.sources.USER); + } + } + } +}; + +exports.default = Toolbar; +exports.addControls = addControls; + +/***/ }), +/* 58 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _picker = __webpack_require__(28); + +var _picker2 = _interopRequireDefault(_picker); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ColorPicker = function (_Picker) { + _inherits(ColorPicker, _Picker); + + function ColorPicker(select, label) { + _classCallCheck(this, ColorPicker); + + var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this, select)); + + _this.label.innerHTML = label; + _this.container.classList.add('ql-color-picker'); + [].slice.call(_this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function (item) { + item.classList.add('ql-primary'); + }); + return _this; + } + + _createClass(ColorPicker, [{ + key: 'buildItem', + value: function buildItem(option) { + var item = _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'buildItem', this).call(this, option); + item.style.backgroundColor = option.getAttribute('value') || ''; + return item; + } + }, { + key: 'selectItem', + value: function selectItem(item, trigger) { + _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'selectItem', this).call(this, item, trigger); + var colorLabel = this.label.querySelector('.ql-color-label'); + var value = item ? item.getAttribute('data-value') || '' : ''; + if (colorLabel) { + if (colorLabel.tagName === 'line') { + colorLabel.style.stroke = value; + } else { + colorLabel.style.fill = value; + } + } + } + }]); + + return ColorPicker; +}(_picker2.default); + +exports.default = ColorPicker; + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _picker = __webpack_require__(28); + +var _picker2 = _interopRequireDefault(_picker); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var IconPicker = function (_Picker) { + _inherits(IconPicker, _Picker); + + function IconPicker(select, icons) { + _classCallCheck(this, IconPicker); + + var _this = _possibleConstructorReturn(this, (IconPicker.__proto__ || Object.getPrototypeOf(IconPicker)).call(this, select)); + + _this.container.classList.add('ql-icon-picker'); + [].forEach.call(_this.container.querySelectorAll('.ql-picker-item'), function (item) { + item.innerHTML = icons[item.getAttribute('data-value') || '']; + }); + _this.defaultItem = _this.container.querySelector('.ql-selected'); + _this.selectItem(_this.defaultItem); + return _this; + } + + _createClass(IconPicker, [{ + key: 'selectItem', + value: function selectItem(item, trigger) { + _get(IconPicker.prototype.__proto__ || Object.getPrototypeOf(IconPicker.prototype), 'selectItem', this).call(this, item, trigger); + item = item || this.defaultItem; + this.label.innerHTML = item.innerHTML; + } + }]); + + return IconPicker; +}(_picker2.default); + +exports.default = IconPicker; + +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Tooltip = function () { + function Tooltip(quill, boundsContainer) { + var _this = this; + + _classCallCheck(this, Tooltip); + + this.quill = quill; + this.boundsContainer = boundsContainer || document.body; + this.root = quill.addContainer('ql-tooltip'); + this.root.innerHTML = this.constructor.TEMPLATE; + if (this.quill.root === this.quill.scrollingContainer) { + this.quill.root.addEventListener('scroll', function () { + _this.root.style.marginTop = -1 * _this.quill.root.scrollTop + 'px'; + }); + } + this.hide(); + } + + _createClass(Tooltip, [{ + key: 'hide', + value: function hide() { + this.root.classList.add('ql-hidden'); + } + }, { + key: 'position', + value: function position(reference) { + var left = reference.left + reference.width / 2 - this.root.offsetWidth / 2; + // root.scrollTop should be 0 if scrollContainer !== root + var top = reference.bottom + this.quill.root.scrollTop; + this.root.style.left = left + 'px'; + this.root.style.top = top + 'px'; + this.root.classList.remove('ql-flip'); + var containerBounds = this.boundsContainer.getBoundingClientRect(); + var rootBounds = this.root.getBoundingClientRect(); + var shift = 0; + if (rootBounds.right > containerBounds.right) { + shift = containerBounds.right - rootBounds.right; + this.root.style.left = left + shift + 'px'; + } + if (rootBounds.left < containerBounds.left) { + shift = containerBounds.left - rootBounds.left; + this.root.style.left = left + shift + 'px'; + } + if (rootBounds.bottom > containerBounds.bottom) { + var height = rootBounds.bottom - rootBounds.top; + var verticalShift = reference.bottom - reference.top + height; + this.root.style.top = top - verticalShift + 'px'; + this.root.classList.add('ql-flip'); + } + return shift; + } + }, { + key: 'show', + value: function show() { + this.root.classList.remove('ql-editing'); + this.root.classList.remove('ql-hidden'); + } + }]); + + return Tooltip; +}(); + +exports.default = Tooltip; + +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _emitter = __webpack_require__(8); + +var _emitter2 = _interopRequireDefault(_emitter); + +var _base = __webpack_require__(43); + +var _base2 = _interopRequireDefault(_base); + +var _link = __webpack_require__(27); + +var _link2 = _interopRequireDefault(_link); + +var _selection = __webpack_require__(15); + +var _icons = __webpack_require__(41); + +var _icons2 = _interopRequireDefault(_icons); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TOOLBAR_CONFIG = [[{ header: ['1', '2', '3', false] }], ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean']]; + +var SnowTheme = function (_BaseTheme) { + _inherits(SnowTheme, _BaseTheme); + + function SnowTheme(quill, options) { + _classCallCheck(this, SnowTheme); + + if (options.modules.toolbar != null && options.modules.toolbar.container == null) { + options.modules.toolbar.container = TOOLBAR_CONFIG; + } + + var _this = _possibleConstructorReturn(this, (SnowTheme.__proto__ || Object.getPrototypeOf(SnowTheme)).call(this, quill, options)); + + _this.quill.container.classList.add('ql-snow'); + return _this; + } + + _createClass(SnowTheme, [{ + key: 'extendToolbar', + value: function extendToolbar(toolbar) { + toolbar.container.classList.add('ql-snow'); + this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default); + this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default); + this.tooltip = new SnowTooltip(this.quill, this.options.bounds); + if (toolbar.container.querySelector('.ql-link')) { + this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function (range, context) { + toolbar.handlers['link'].call(toolbar, !context.format.link); + }); + } + } + }]); + + return SnowTheme; +}(_base2.default); + +SnowTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, { + modules: { + toolbar: { + handlers: { + link: function link(value) { + if (value) { + var range = this.quill.getSelection(); + if (range == null || range.length == 0) return; + var preview = this.quill.getText(range); + if (/^\S+@\S+\.\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) { + preview = 'mailto:' + preview; + } + var tooltip = this.quill.theme.tooltip; + tooltip.edit('link', preview); + } else { + this.quill.format('link', false); + } + } + } + } + } +}); + +var SnowTooltip = function (_BaseTooltip) { + _inherits(SnowTooltip, _BaseTooltip); + + function SnowTooltip(quill, bounds) { + _classCallCheck(this, SnowTooltip); + + var _this2 = _possibleConstructorReturn(this, (SnowTooltip.__proto__ || Object.getPrototypeOf(SnowTooltip)).call(this, quill, bounds)); + + _this2.preview = _this2.root.querySelector('a.ql-preview'); + return _this2; + } + + _createClass(SnowTooltip, [{ + key: 'listen', + value: function listen() { + var _this3 = this; + + _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'listen', this).call(this); + this.root.querySelector('a.ql-action').addEventListener('click', function (event) { + if (_this3.root.classList.contains('ql-editing')) { + _this3.save(); + } else { + _this3.edit('link', _this3.preview.textContent); + } + event.preventDefault(); + }); + this.root.querySelector('a.ql-remove').addEventListener('click', function (event) { + if (_this3.linkRange != null) { + var range = _this3.linkRange; + _this3.restoreFocus(); + _this3.quill.formatText(range, 'link', false, _emitter2.default.sources.USER); + delete _this3.linkRange; + } + event.preventDefault(); + _this3.hide(); + }); + this.quill.on(_emitter2.default.events.SELECTION_CHANGE, function (range, oldRange, source) { + if (range == null) return; + if (range.length === 0 && source === _emitter2.default.sources.USER) { + var _quill$scroll$descend = _this3.quill.scroll.descendant(_link2.default, range.index), + _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2), + link = _quill$scroll$descend2[0], + offset = _quill$scroll$descend2[1]; + + if (link != null) { + _this3.linkRange = new _selection.Range(range.index - offset, link.length()); + var preview = _link2.default.formats(link.domNode); + _this3.preview.textContent = preview; + _this3.preview.setAttribute('href', preview); + _this3.show(); + _this3.position(_this3.quill.getBounds(_this3.linkRange)); + return; + } + } else { + delete _this3.linkRange; + } + _this3.hide(); + }); + } + }, { + key: 'show', + value: function show() { + _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'show', this).call(this); + this.root.removeAttribute('data-mode'); + } + }]); + + return SnowTooltip; +}(_base.BaseTooltip); + +SnowTooltip.TEMPLATE = ['', '', '', ''].join(''); + +exports.default = SnowTheme; + +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _core = __webpack_require__(29); + +var _core2 = _interopRequireDefault(_core); + +var _align = __webpack_require__(36); + +var _direction = __webpack_require__(38); + +var _indent = __webpack_require__(64); + +var _blockquote = __webpack_require__(65); + +var _blockquote2 = _interopRequireDefault(_blockquote); + +var _header = __webpack_require__(66); + +var _header2 = _interopRequireDefault(_header); + +var _list = __webpack_require__(67); + +var _list2 = _interopRequireDefault(_list); + +var _background = __webpack_require__(37); + +var _color = __webpack_require__(26); + +var _font = __webpack_require__(39); + +var _size = __webpack_require__(40); + +var _bold = __webpack_require__(56); + +var _bold2 = _interopRequireDefault(_bold); + +var _italic = __webpack_require__(68); + +var _italic2 = _interopRequireDefault(_italic); + +var _link = __webpack_require__(27); + +var _link2 = _interopRequireDefault(_link); + +var _script = __webpack_require__(69); + +var _script2 = _interopRequireDefault(_script); + +var _strike = __webpack_require__(70); + +var _strike2 = _interopRequireDefault(_strike); + +var _underline = __webpack_require__(71); + +var _underline2 = _interopRequireDefault(_underline); + +var _image = __webpack_require__(72); + +var _image2 = _interopRequireDefault(_image); + +var _video = __webpack_require__(73); + +var _video2 = _interopRequireDefault(_video); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +var _formula = __webpack_require__(74); + +var _formula2 = _interopRequireDefault(_formula); + +var _syntax = __webpack_require__(75); + +var _syntax2 = _interopRequireDefault(_syntax); + +var _toolbar = __webpack_require__(57); + +var _toolbar2 = _interopRequireDefault(_toolbar); + +var _icons = __webpack_require__(41); + +var _icons2 = _interopRequireDefault(_icons); + +var _picker = __webpack_require__(28); + +var _picker2 = _interopRequireDefault(_picker); + +var _colorPicker = __webpack_require__(59); + +var _colorPicker2 = _interopRequireDefault(_colorPicker); + +var _iconPicker = __webpack_require__(60); + +var _iconPicker2 = _interopRequireDefault(_iconPicker); + +var _tooltip = __webpack_require__(61); + +var _tooltip2 = _interopRequireDefault(_tooltip); + +var _bubble = __webpack_require__(108); + +var _bubble2 = _interopRequireDefault(_bubble); + +var _snow = __webpack_require__(62); + +var _snow2 = _interopRequireDefault(_snow); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_core2.default.register({ + 'attributors/attribute/direction': _direction.DirectionAttribute, + + 'attributors/class/align': _align.AlignClass, + 'attributors/class/background': _background.BackgroundClass, + 'attributors/class/color': _color.ColorClass, + 'attributors/class/direction': _direction.DirectionClass, + 'attributors/class/font': _font.FontClass, + 'attributors/class/size': _size.SizeClass, + + 'attributors/style/align': _align.AlignStyle, + 'attributors/style/background': _background.BackgroundStyle, + 'attributors/style/color': _color.ColorStyle, + 'attributors/style/direction': _direction.DirectionStyle, + 'attributors/style/font': _font.FontStyle, + 'attributors/style/size': _size.SizeStyle +}, true); + +_core2.default.register({ + 'formats/align': _align.AlignClass, + 'formats/direction': _direction.DirectionClass, + 'formats/indent': _indent.IndentClass, + + 'formats/background': _background.BackgroundStyle, + 'formats/color': _color.ColorStyle, + 'formats/font': _font.FontClass, + 'formats/size': _size.SizeClass, + + 'formats/blockquote': _blockquote2.default, + 'formats/code-block': _code2.default, + 'formats/header': _header2.default, + 'formats/list': _list2.default, + + 'formats/bold': _bold2.default, + 'formats/code': _code.Code, + 'formats/italic': _italic2.default, + 'formats/link': _link2.default, + 'formats/script': _script2.default, + 'formats/strike': _strike2.default, + 'formats/underline': _underline2.default, + + 'formats/image': _image2.default, + 'formats/video': _video2.default, + + 'formats/list/item': _list.ListItem, + + 'modules/formula': _formula2.default, + 'modules/syntax': _syntax2.default, + 'modules/toolbar': _toolbar2.default, + + 'themes/bubble': _bubble2.default, + 'themes/snow': _snow2.default, + + 'ui/icons': _icons2.default, + 'ui/picker': _picker2.default, + 'ui/icon-picker': _iconPicker2.default, + 'ui/color-picker': _colorPicker2.default, + 'ui/tooltip': _tooltip2.default +}, true); + +exports.default = _core2.default; + +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.IndentClass = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var IdentAttributor = function (_Parchment$Attributor) { + _inherits(IdentAttributor, _Parchment$Attributor); + + function IdentAttributor() { + _classCallCheck(this, IdentAttributor); + + return _possibleConstructorReturn(this, (IdentAttributor.__proto__ || Object.getPrototypeOf(IdentAttributor)).apply(this, arguments)); + } + + _createClass(IdentAttributor, [{ + key: 'add', + value: function add(node, value) { + if (value === '+1' || value === '-1') { + var indent = this.value(node) || 0; + value = value === '+1' ? indent + 1 : indent - 1; + } + if (value === 0) { + this.remove(node); + return true; + } else { + return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'add', this).call(this, node, value); + } + } + }, { + key: 'canAdd', + value: function canAdd(node, value) { + return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, value) || _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, parseInt(value)); + } + }, { + key: 'value', + value: function value(node) { + return parseInt(_get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'value', this).call(this, node)) || undefined; // Don't return NaN + } + }]); + + return IdentAttributor; +}(_parchment2.default.Attributor.Class); + +var IndentClass = new IdentAttributor('indent', 'ql-indent', { + scope: _parchment2.default.Scope.BLOCK, + whitelist: [1, 2, 3, 4, 5, 6, 7, 8] +}); + +exports.IndentClass = IndentClass; + +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Blockquote = function (_Block) { + _inherits(Blockquote, _Block); + + function Blockquote() { + _classCallCheck(this, Blockquote); + + return _possibleConstructorReturn(this, (Blockquote.__proto__ || Object.getPrototypeOf(Blockquote)).apply(this, arguments)); + } + + return Blockquote; +}(_block2.default); + +Blockquote.blotName = 'blockquote'; +Blockquote.tagName = 'blockquote'; + +exports.default = Blockquote; + +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Header = function (_Block) { + _inherits(Header, _Block); + + function Header() { + _classCallCheck(this, Header); + + return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments)); + } + + _createClass(Header, null, [{ + key: 'formats', + value: function formats(domNode) { + return this.tagName.indexOf(domNode.tagName) + 1; + } + }]); + + return Header; +}(_block2.default); + +Header.blotName = 'header'; +Header.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; + +exports.default = Header; + +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.ListItem = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _block = __webpack_require__(4); + +var _block2 = _interopRequireDefault(_block); + +var _container = __webpack_require__(25); + +var _container2 = _interopRequireDefault(_container); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ListItem = function (_Block) { + _inherits(ListItem, _Block); + + function ListItem() { + _classCallCheck(this, ListItem); + + return _possibleConstructorReturn(this, (ListItem.__proto__ || Object.getPrototypeOf(ListItem)).apply(this, arguments)); + } + + _createClass(ListItem, [{ + key: 'format', + value: function format(name, value) { + if (name === List.blotName && !value) { + this.replaceWith(_parchment2.default.create(this.statics.scope)); + } else { + _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'format', this).call(this, name, value); + } + } + }, { + key: 'remove', + value: function remove() { + if (this.prev == null && this.next == null) { + this.parent.remove(); + } else { + _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'remove', this).call(this); + } + } + }, { + key: 'replaceWith', + value: function replaceWith(name, value) { + this.parent.isolate(this.offset(this.parent), this.length()); + if (name === this.parent.statics.blotName) { + this.parent.replaceWith(name, value); + return this; + } else { + this.parent.unwrap(); + return _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'replaceWith', this).call(this, name, value); + } + } + }], [{ + key: 'formats', + value: function formats(domNode) { + return domNode.tagName === this.tagName ? undefined : _get(ListItem.__proto__ || Object.getPrototypeOf(ListItem), 'formats', this).call(this, domNode); + } + }]); + + return ListItem; +}(_block2.default); + +ListItem.blotName = 'list-item'; +ListItem.tagName = 'LI'; + +var List = function (_Container) { + _inherits(List, _Container); + + _createClass(List, null, [{ + key: 'create', + value: function create(value) { + var tagName = value === 'ordered' ? 'OL' : 'UL'; + var node = _get(List.__proto__ || Object.getPrototypeOf(List), 'create', this).call(this, tagName); + if (value === 'checked' || value === 'unchecked') { + node.setAttribute('data-checked', value === 'checked'); + } + return node; + } + }, { + key: 'formats', + value: function formats(domNode) { + if (domNode.tagName === 'OL') return 'ordered'; + if (domNode.tagName === 'UL') { + if (domNode.hasAttribute('data-checked')) { + return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked'; + } else { + return 'bullet'; + } + } + return undefined; + } + }]); + + function List(domNode) { + _classCallCheck(this, List); + + var _this2 = _possibleConstructorReturn(this, (List.__proto__ || Object.getPrototypeOf(List)).call(this, domNode)); + + var listEventHandler = function listEventHandler(e) { + if (e.target.parentNode !== domNode) return; + var format = _this2.statics.formats(domNode); + var blot = _parchment2.default.find(e.target); + if (format === 'checked') { + blot.format('list', 'unchecked'); + } else if (format === 'unchecked') { + blot.format('list', 'checked'); + } + }; + + domNode.addEventListener('touchstart', listEventHandler); + domNode.addEventListener('mousedown', listEventHandler); + return _this2; + } + + _createClass(List, [{ + key: 'format', + value: function format(name, value) { + if (this.children.length > 0) { + this.children.tail.format(name, value); + } + } + }, { + key: 'formats', + value: function formats() { + // We don't inherit from FormatBlot + return _defineProperty({}, this.statics.blotName, this.statics.formats(this.domNode)); + } + }, { + key: 'insertBefore', + value: function insertBefore(blot, ref) { + if (blot instanceof ListItem) { + _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'insertBefore', this).call(this, blot, ref); + } else { + var index = ref == null ? this.length() : ref.offset(this); + var after = this.split(index); + after.parent.insertBefore(blot, after); + } + } + }, { + key: 'optimize', + value: function optimize(context) { + _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'optimize', this).call(this, context); + var next = this.next; + if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && next.domNode.tagName === this.domNode.tagName && next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) { + next.moveChildren(this); + next.remove(); + } + } + }, { + key: 'replace', + value: function replace(target) { + if (target.statics.blotName !== this.statics.blotName) { + var item = _parchment2.default.create(this.statics.defaultChild); + target.moveChildren(item); + this.appendChild(item); + } + _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'replace', this).call(this, target); + } + }]); + + return List; +}(_container2.default); + +List.blotName = 'list'; +List.scope = _parchment2.default.Scope.BLOCK_BLOT; +List.tagName = ['OL', 'UL']; +List.defaultChild = 'list-item'; +List.allowedChildren = [ListItem]; + +exports.ListItem = ListItem; +exports.default = List; + +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _bold = __webpack_require__(56); + +var _bold2 = _interopRequireDefault(_bold); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Italic = function (_Bold) { + _inherits(Italic, _Bold); + + function Italic() { + _classCallCheck(this, Italic); + + return _possibleConstructorReturn(this, (Italic.__proto__ || Object.getPrototypeOf(Italic)).apply(this, arguments)); + } + + return Italic; +}(_bold2.default); + +Italic.blotName = 'italic'; +Italic.tagName = ['EM', 'I']; + +exports.default = Italic; + +/***/ }), +/* 69 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Script = function (_Inline) { + _inherits(Script, _Inline); + + function Script() { + _classCallCheck(this, Script); + + return _possibleConstructorReturn(this, (Script.__proto__ || Object.getPrototypeOf(Script)).apply(this, arguments)); + } + + _createClass(Script, null, [{ + key: 'create', + value: function create(value) { + if (value === 'super') { + return document.createElement('sup'); + } else if (value === 'sub') { + return document.createElement('sub'); + } else { + return _get(Script.__proto__ || Object.getPrototypeOf(Script), 'create', this).call(this, value); + } + } + }, { + key: 'formats', + value: function formats(domNode) { + if (domNode.tagName === 'SUB') return 'sub'; + if (domNode.tagName === 'SUP') return 'super'; + return undefined; + } + }]); + + return Script; +}(_inline2.default); + +Script.blotName = 'script'; +Script.tagName = ['SUB', 'SUP']; + +exports.default = Script; + +/***/ }), +/* 70 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Strike = function (_Inline) { + _inherits(Strike, _Inline); + + function Strike() { + _classCallCheck(this, Strike); + + return _possibleConstructorReturn(this, (Strike.__proto__ || Object.getPrototypeOf(Strike)).apply(this, arguments)); + } + + return Strike; +}(_inline2.default); + +Strike.blotName = 'strike'; +Strike.tagName = 'S'; + +exports.default = Strike; + +/***/ }), +/* 71 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _inline = __webpack_require__(6); + +var _inline2 = _interopRequireDefault(_inline); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Underline = function (_Inline) { + _inherits(Underline, _Inline); + + function Underline() { + _classCallCheck(this, Underline); + + return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).apply(this, arguments)); + } + + return Underline; +}(_inline2.default); + +Underline.blotName = 'underline'; +Underline.tagName = 'U'; + +exports.default = Underline; + +/***/ }), +/* 72 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _link = __webpack_require__(27); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ATTRIBUTES = ['alt', 'height', 'width']; + +var Image = function (_Parchment$Embed) { + _inherits(Image, _Parchment$Embed); + + function Image() { + _classCallCheck(this, Image); + + return _possibleConstructorReturn(this, (Image.__proto__ || Object.getPrototypeOf(Image)).apply(this, arguments)); + } + + _createClass(Image, [{ + key: 'format', + value: function format(name, value) { + if (ATTRIBUTES.indexOf(name) > -1) { + if (value) { + this.domNode.setAttribute(name, value); + } else { + this.domNode.removeAttribute(name); + } + } else { + _get(Image.prototype.__proto__ || Object.getPrototypeOf(Image.prototype), 'format', this).call(this, name, value); + } + } + }], [{ + key: 'create', + value: function create(value) { + var node = _get(Image.__proto__ || Object.getPrototypeOf(Image), 'create', this).call(this, value); + if (typeof value === 'string') { + node.setAttribute('src', this.sanitize(value)); + } + return node; + } + }, { + key: 'formats', + value: function formats(domNode) { + return ATTRIBUTES.reduce(function (formats, attribute) { + if (domNode.hasAttribute(attribute)) { + formats[attribute] = domNode.getAttribute(attribute); + } + return formats; + }, {}); + } + }, { + key: 'match', + value: function match(url) { + return (/\.(jpe?g|gif|png)$/.test(url) || /^data:image\/.+;base64/.test(url) + ); + } + }, { + key: 'sanitize', + value: function sanitize(url) { + return (0, _link.sanitize)(url, ['http', 'https', 'data']) ? url : '//:0'; + } + }, { + key: 'value', + value: function value(domNode) { + return domNode.getAttribute('src'); + } + }]); + + return Image; +}(_parchment2.default.Embed); + +Image.blotName = 'image'; +Image.tagName = 'IMG'; + +exports.default = Image; + +/***/ }), +/* 73 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _block = __webpack_require__(4); + +var _link = __webpack_require__(27); + +var _link2 = _interopRequireDefault(_link); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ATTRIBUTES = ['height', 'width']; + +var Video = function (_BlockEmbed) { + _inherits(Video, _BlockEmbed); + + function Video() { + _classCallCheck(this, Video); + + return _possibleConstructorReturn(this, (Video.__proto__ || Object.getPrototypeOf(Video)).apply(this, arguments)); + } + + _createClass(Video, [{ + key: 'format', + value: function format(name, value) { + if (ATTRIBUTES.indexOf(name) > -1) { + if (value) { + this.domNode.setAttribute(name, value); + } else { + this.domNode.removeAttribute(name); + } + } else { + _get(Video.prototype.__proto__ || Object.getPrototypeOf(Video.prototype), 'format', this).call(this, name, value); + } + } + }], [{ + key: 'create', + value: function create(value) { + var node = _get(Video.__proto__ || Object.getPrototypeOf(Video), 'create', this).call(this, value); + node.setAttribute('frameborder', '0'); + node.setAttribute('allowfullscreen', true); + node.setAttribute('src', this.sanitize(value)); + return node; + } + }, { + key: 'formats', + value: function formats(domNode) { + return ATTRIBUTES.reduce(function (formats, attribute) { + if (domNode.hasAttribute(attribute)) { + formats[attribute] = domNode.getAttribute(attribute); + } + return formats; + }, {}); + } + }, { + key: 'sanitize', + value: function sanitize(url) { + return _link2.default.sanitize(url); + } + }, { + key: 'value', + value: function value(domNode) { + return domNode.getAttribute('src'); + } + }]); + + return Video; +}(_block.BlockEmbed); + +Video.blotName = 'video'; +Video.className = 'ql-video'; +Video.tagName = 'IFRAME'; + +exports.default = Video; + +/***/ }), +/* 74 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.FormulaBlot = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _embed = __webpack_require__(35); + +var _embed2 = _interopRequireDefault(_embed); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var FormulaBlot = function (_Embed) { + _inherits(FormulaBlot, _Embed); + + function FormulaBlot() { + _classCallCheck(this, FormulaBlot); + + return _possibleConstructorReturn(this, (FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot)).apply(this, arguments)); + } + + _createClass(FormulaBlot, null, [{ + key: 'create', + value: function create(value) { + var node = _get(FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot), 'create', this).call(this, value); + if (typeof value === 'string') { + window.katex.render(value, node, { + throwOnError: false, + errorColor: '#f00' + }); + node.setAttribute('data-value', value); + } + return node; + } + }, { + key: 'value', + value: function value(domNode) { + return domNode.getAttribute('data-value'); + } + }]); + + return FormulaBlot; +}(_embed2.default); + +FormulaBlot.blotName = 'formula'; +FormulaBlot.className = 'ql-formula'; +FormulaBlot.tagName = 'SPAN'; + +var Formula = function (_Module) { + _inherits(Formula, _Module); + + _createClass(Formula, null, [{ + key: 'register', + value: function register() { + _quill2.default.register(FormulaBlot, true); + } + }]); + + function Formula() { + _classCallCheck(this, Formula); + + var _this2 = _possibleConstructorReturn(this, (Formula.__proto__ || Object.getPrototypeOf(Formula)).call(this)); + + if (window.katex == null) { + throw new Error('Formula module requires KaTeX.'); + } + return _this2; + } + + return Formula; +}(_module2.default); + +exports.FormulaBlot = FormulaBlot; +exports.default = Formula; + +/***/ }), +/* 75 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.CodeToken = exports.CodeBlock = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _parchment = __webpack_require__(0); + +var _parchment2 = _interopRequireDefault(_parchment); + +var _quill = __webpack_require__(5); + +var _quill2 = _interopRequireDefault(_quill); + +var _module = __webpack_require__(9); + +var _module2 = _interopRequireDefault(_module); + +var _code = __webpack_require__(13); + +var _code2 = _interopRequireDefault(_code); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var SyntaxCodeBlock = function (_CodeBlock) { + _inherits(SyntaxCodeBlock, _CodeBlock); + + function SyntaxCodeBlock() { + _classCallCheck(this, SyntaxCodeBlock); + + return _possibleConstructorReturn(this, (SyntaxCodeBlock.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock)).apply(this, arguments)); + } + + _createClass(SyntaxCodeBlock, [{ + key: 'replaceWith', + value: function replaceWith(block) { + this.domNode.textContent = this.domNode.textContent; + this.attach(); + _get(SyntaxCodeBlock.prototype.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock.prototype), 'replaceWith', this).call(this, block); + } + }, { + key: 'highlight', + value: function highlight(_highlight) { + var text = this.domNode.textContent; + if (this.cachedText !== text) { + if (text.trim().length > 0 || this.cachedText == null) { + this.domNode.innerHTML = _highlight(text); + this.domNode.normalize(); + this.attach(); + } + this.cachedText = text; + } + } + }]); + + return SyntaxCodeBlock; +}(_code2.default); + +SyntaxCodeBlock.className = 'ql-syntax'; + +var CodeToken = new _parchment2.default.Attributor.Class('token', 'hljs', { + scope: _parchment2.default.Scope.INLINE +}); + +var Syntax = function (_Module) { + _inherits(Syntax, _Module); + + _createClass(Syntax, null, [{ + key: 'register', + value: function register() { + _quill2.default.register(CodeToken, true); + _quill2.default.register(SyntaxCodeBlock, true); + } + }]); + + function Syntax(quill, options) { + _classCallCheck(this, Syntax); + + var _this2 = _possibleConstructorReturn(this, (Syntax.__proto__ || Object.getPrototypeOf(Syntax)).call(this, quill, options)); + + if (typeof _this2.options.highlight !== 'function') { + throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.'); + } + var timer = null; + _this2.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () { + clearTimeout(timer); + timer = setTimeout(function () { + _this2.highlight(); + timer = null; + }, _this2.options.interval); + }); + _this2.highlight(); + return _this2; + } + + _createClass(Syntax, [{ + key: 'highlight', + value: function highlight() { + var _this3 = this; + + if (this.quill.selection.composing) return; + this.quill.update(_quill2.default.sources.USER); + var range = this.quill.getSelection(); + this.quill.scroll.descendants(SyntaxCodeBlock).forEach(function (code) { + code.highlight(_this3.options.highlight); + }); + this.quill.update(_quill2.default.sources.SILENT); + if (range != null) { + this.quill.setSelection(range, _quill2.default.sources.SILENT); + } + } + }]); + + return Syntax; +}(_module2.default); + +Syntax.DEFAULTS = { + highlight: function () { + if (window.hljs == null) return null; + return function (text) { + var result = window.hljs.highlightAuto(text); + return result.value; + }; + }(), + interval: 1000 +}; + +exports.CodeBlock = SyntaxCodeBlock; +exports.CodeToken = CodeToken; +exports.default = Syntax; + +/***/ }), +/* 76 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 77 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 78 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 79 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 80 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 81 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 82 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 83 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 84 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 85 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 86 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 87 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 88 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 89 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 90 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 91 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 92 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 93 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 94 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 95 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 96 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 97 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 98 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 99 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 100 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 101 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 102 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 103 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 104 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 105 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 106 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 107 */ +/***/ (function(module, exports) { + +module.exports = " "; + +/***/ }), +/* 108 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.BubbleTooltip = undefined; + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _extend = __webpack_require__(3); + +var _extend2 = _interopRequireDefault(_extend); + +var _emitter = __webpack_require__(8); + +var _emitter2 = _interopRequireDefault(_emitter); + +var _base = __webpack_require__(43); + +var _base2 = _interopRequireDefault(_base); + +var _selection = __webpack_require__(15); + +var _icons = __webpack_require__(41); + +var _icons2 = _interopRequireDefault(_icons); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TOOLBAR_CONFIG = [['bold', 'italic', 'link'], [{ header: 1 }, { header: 2 }, 'blockquote']]; + +var BubbleTheme = function (_BaseTheme) { + _inherits(BubbleTheme, _BaseTheme); + + function BubbleTheme(quill, options) { + _classCallCheck(this, BubbleTheme); + + if (options.modules.toolbar != null && options.modules.toolbar.container == null) { + options.modules.toolbar.container = TOOLBAR_CONFIG; + } + + var _this = _possibleConstructorReturn(this, (BubbleTheme.__proto__ || Object.getPrototypeOf(BubbleTheme)).call(this, quill, options)); + + _this.quill.container.classList.add('ql-bubble'); + return _this; + } + + _createClass(BubbleTheme, [{ + key: 'extendToolbar', + value: function extendToolbar(toolbar) { + this.tooltip = new BubbleTooltip(this.quill, this.options.bounds); + this.tooltip.root.appendChild(toolbar.container); + this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default); + this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default); + } + }]); + + return BubbleTheme; +}(_base2.default); + +BubbleTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, { + modules: { + toolbar: { + handlers: { + link: function link(value) { + if (!value) { + this.quill.format('link', false); + } else { + this.quill.theme.tooltip.edit(); + } + } + } + } + } +}); + +var BubbleTooltip = function (_BaseTooltip) { + _inherits(BubbleTooltip, _BaseTooltip); + + function BubbleTooltip(quill, bounds) { + _classCallCheck(this, BubbleTooltip); + + var _this2 = _possibleConstructorReturn(this, (BubbleTooltip.__proto__ || Object.getPrototypeOf(BubbleTooltip)).call(this, quill, bounds)); + + _this2.quill.on(_emitter2.default.events.EDITOR_CHANGE, function (type, range, oldRange, source) { + if (type !== _emitter2.default.events.SELECTION_CHANGE) return; + if (range != null && range.length > 0 && source === _emitter2.default.sources.USER) { + _this2.show(); + // Lock our width so we will expand beyond our offsetParent boundaries + _this2.root.style.left = '0px'; + _this2.root.style.width = ''; + _this2.root.style.width = _this2.root.offsetWidth + 'px'; + var lines = _this2.quill.getLines(range.index, range.length); + if (lines.length === 1) { + _this2.position(_this2.quill.getBounds(range)); + } else { + var lastLine = lines[lines.length - 1]; + var index = _this2.quill.getIndex(lastLine); + var length = Math.min(lastLine.length() - 1, range.index + range.length - index); + var _bounds = _this2.quill.getBounds(new _selection.Range(index, length)); + _this2.position(_bounds); + } + } else if (document.activeElement !== _this2.textbox && _this2.quill.hasFocus()) { + _this2.hide(); + } + }); + return _this2; + } + + _createClass(BubbleTooltip, [{ + key: 'listen', + value: function listen() { + var _this3 = this; + + _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'listen', this).call(this); + this.root.querySelector('.ql-close').addEventListener('click', function () { + _this3.root.classList.remove('ql-editing'); + }); + this.quill.on(_emitter2.default.events.SCROLL_OPTIMIZE, function () { + // Let selection be restored by toolbar handlers before repositioning + setTimeout(function () { + if (_this3.root.classList.contains('ql-hidden')) return; + var range = _this3.quill.getSelection(); + if (range != null) { + _this3.position(_this3.quill.getBounds(range)); + } + }, 1); + }); + } + }, { + key: 'cancel', + value: function cancel() { + this.show(); + } + }, { + key: 'position', + value: function position(reference) { + var shift = _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'position', this).call(this, reference); + var arrow = this.root.querySelector('.ql-tooltip-arrow'); + arrow.style.marginLeft = ''; + if (shift === 0) return shift; + arrow.style.marginLeft = -1 * shift - arrow.offsetWidth / 2 + 'px'; + } + }]); + + return BubbleTooltip; +}(_base.BaseTooltip); + +BubbleTooltip.TEMPLATE = ['', '
', '', '', '
'].join(''); + +exports.BubbleTooltip = BubbleTooltip; +exports.default = BubbleTheme; + +/***/ }), +/* 109 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(63); + + +/***/ }) +/******/ ])["default"]; +}); \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/quill.min.js b/Wino.Mail/JS/Quill/quill.min.js new file mode 100644 index 00000000..ff30fd90 --- /dev/null +++ b/Wino.Mail/JS/Quill/quill.min.js @@ -0,0 +1,8 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=45)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(17),o=n(18),i=n(19),l=n(48),a=n(49),s=n(50),u=n(51),c=n(52),f=n(11),h=n(29),p=n(30),d=n(28),y=n(1),v={Scope:y.Scope,create:y.create,find:y.find,query:y.query,register:y.register,Container:r.default,Format:o.default,Leaf:i.default,Embed:u.default,Scroll:l.default,Block:s.default,Inline:a.default,Text:c.default,Attributor:{Attribute:f.default,Class:h.default,Style:p.default,Store:d.default}};e.default=v},function(t,e,n){"use strict";function r(t,e){var n=i(t);if(null==n)throw new s("Unable to create "+t+" blot");var r=n;return new r(t instanceof Node||t.nodeType===Node.TEXT_NODE?t:r.create(e),e)}function o(t,n){return void 0===n&&(n=!1),null==t?null:null!=t[e.DATA_KEY]?t[e.DATA_KEY].blot:n?o(t.parentNode,n):null}function i(t,e){void 0===e&&(e=p.ANY);var n;if("string"==typeof t)n=h[t]||u[t];else if(t instanceof Text||t.nodeType===Node.TEXT_NODE)n=h.text;else if("number"==typeof t)t&p.LEVEL&p.BLOCK?n=h.block:t&p.LEVEL&p.INLINE&&(n=h.inline);else if(t instanceof HTMLElement){var r=(t.getAttribute("class")||"").split(/\s+/);for(var o in r)if(n=c[r[o]])break;n=n||f[t.tagName]}return null==n?null:e&p.LEVEL&n.scope&&e&p.TYPE&n.scope?n:null}function l(){for(var t=[],e=0;e1)return t.map(function(t){return l(t)});var n=t[0];if("string"!=typeof n.blotName&&"string"!=typeof n.attrName)throw new s("Invalid definition");if("abstract"===n.blotName)throw new s("Cannot register abstract class");if(h[n.blotName||n.attrName]=n,"string"==typeof n.keyName)u[n.keyName]=n;else if(null!=n.className&&(c[n.className]=n),null!=n.tagName){Array.isArray(n.tagName)?n.tagName=n.tagName.map(function(t){return t.toUpperCase()}):n.tagName=n.tagName.toUpperCase();var r=Array.isArray(n.tagName)?n.tagName:[n.tagName];r.forEach(function(t){null!=f[t]&&null!=n.className||(f[t]=n)})}return n}var a=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var s=function(t){function e(e){var n=this;return e="[Parchment] "+e,n=t.call(this,e)||this,n.message=e,n.name=n.constructor.name,n}return a(e,t),e}(Error);e.ParchmentError=s;var u={},c={},f={},h={};e.DATA_KEY="__blot";var p;!function(t){t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY"}(p=e.Scope||(e.Scope={})),e.create=r,e.find=o,e.query=i,e.register=l},function(t,e){"use strict";var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString,o=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===r.call(t)},i=function(t){if(!t||"[object Object]"!==r.call(t))return!1;var e=n.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&n.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!e&&!o)return!1;var i;for(i in t);return void 0===i||n.call(t,i)};t.exports=function t(){var e,n,r,l,a,s,u=arguments[0],c=1,f=arguments.length,h=!1;for("boolean"==typeof u&&(h=u,u=arguments[1]||{},c=2),(null==u||"object"!=typeof u&&"function"!=typeof u)&&(u={});c1&&void 0!==arguments[1]?arguments[1]:{};return null==t?e:("function"==typeof t.formats&&(e=(0,f.default)(e,t.formats())),null==t.parent||"scroll"==t.parent.blotName||t.parent.statics.scope!==t.statics.scope?e:a(t.parent,e))}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BlockEmbed=e.bubbleFormats=void 0;var s=function(){function t(t,e){for(var n=0;n0&&(t1&&void 0!==arguments[1]&&arguments[1];if(n&&(0===t||t>=this.length()-1)){var r=this.clone();return 0===t?(this.parent.insertBefore(r,this),this):(this.parent.insertBefore(r,this.next),r)}var o=u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"split",this).call(this,t,n);return this.cache={},o}}]),e}(y.default.Block);x.blotName="block",x.tagName="P",x.defaultChild="break",x.allowedChildren=[m.default,y.default.Embed,O.default],e.bubbleFormats=a,e.BlockEmbed=w,e.default=x},function(t,e,n){var r=n(54),o=n(12),i=n(2),l=n(20),a=String.fromCharCode(0),s=function(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]};s.prototype.insert=function(t,e){var n={};return 0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))},s.prototype.delete=function(t){return t<=0?this:this.push({delete:t})},s.prototype.retain=function(t,e){if(t<=0)return this;var n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)},s.prototype.push=function(t){var e=this.ops.length,n=this.ops[e-1];if(t=i(!0,{},t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,"object"!=typeof(n=this.ops[e-1])))return this.ops.unshift(t),this;if(o(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this},s.prototype.chop=function(){var t=this.ops[this.ops.length-1];return t&&t.retain&&!t.attributes&&this.ops.pop(),this},s.prototype.filter=function(t){return this.ops.filter(t)},s.prototype.forEach=function(t){this.ops.forEach(t)},s.prototype.map=function(t){return this.ops.map(t)},s.prototype.partition=function(t){var e=[],n=[];return this.forEach(function(r){(t(r)?e:n).push(r)}),[e,n]},s.prototype.reduce=function(t,e){return this.ops.reduce(t,e)},s.prototype.changeLength=function(){return this.reduce(function(t,e){return e.insert?t+l.length(e):e.delete?t-e.delete:t},0)},s.prototype.length=function(){return this.reduce(function(t,e){return t+l.length(e)},0)},s.prototype.slice=function(t,e){t=t||0,"number"!=typeof e&&(e=1/0);for(var n=[],r=l.iterator(this.ops),o=0;o0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e},s.prototype.diff=function(t,e){if(this.ops===t.ops)return new s;var n=[this,t].map(function(e){return e.map(function(n){if(null!=n.insert)return"string"==typeof n.insert?n.insert:a;var r=e===t?"on":"with";throw new Error("diff() called "+r+" non-document")}).join("")}),i=new s,u=r(n[0],n[1],e),c=l.iterator(this.ops),f=l.iterator(t.ops);return u.forEach(function(t){for(var e=t[1].length;e>0;){var n=0;switch(t[0]){case r.INSERT:n=Math.min(f.peekLength(),e),i.push(f.next(n));break;case r.DELETE:n=Math.min(e,c.peekLength()),c.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(c.peekLength(),f.peekLength(),e);var a=c.next(n),s=f.next(n);o(a.insert,s.insert)?i.retain(n,l.attributes.diff(a.attributes,s.attributes)):i.push(s).delete(n)}e-=n}}),i.chop()},s.prototype.eachLine=function(t,e){e=e||"\n";for(var n=l.iterator(this.ops),r=new s,o=0;n.hasNext();){if("insert"!==n.peekType())return;var i=n.peek(),a=l.length(i)-n.peekLength(),u="string"==typeof i.insert?i.insert.indexOf(e,a)-a:-1;if(u<0)r.push(n.next());else if(u>0)r.push(n.next(u));else{if(!1===t(r,n.next(1).attributes||{},o))return;o+=1,r=new s}}r.length()>0&&t(r,{},o)},s.prototype.transform=function(t,e){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);for(var n=l.iterator(this.ops),r=l.iterator(t.ops),o=new s;n.hasNext()||r.hasNext();)if("insert"!==n.peekType()||!e&&"insert"===r.peekType())if("insert"===r.peekType())o.push(r.next());else{var i=Math.min(n.peekLength(),r.peekLength()),a=n.next(i),u=r.next(i);if(a.delete)continue;u.delete?o.push(u):o.retain(i,l.attributes.transform(a.attributes,u.attributes,e))}else o.retain(l.length(n.next()));return o.chop()},s.prototype.transformPosition=function(t,e){e=!!e;for(var n=l.iterator(this.ops),r=0;n.hasNext()&&r<=t;){var o=n.peekLength(),i=n.peekType();n.next(),"delete"!==i?("insert"===i&&(r0){var n=this.parent.isolate(this.offset(),this.length());this.moveChildren(n),n.wrap(this)}}}],[{key:"compare",value:function(t,n){var r=e.order.indexOf(t),o=e.order.indexOf(n);return r>=0||o>=0?r-o:t===n?0:t0){var a,s=[g.default.events.TEXT_CHANGE,l,i,e];if((a=this.emitter).emit.apply(a,[g.default.events.EDITOR_CHANGE].concat(s)),e!==g.default.sources.SILENT){var c;(c=this.emitter).emit.apply(c,s)}}return l}function s(t,e,n,r,o){var i={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(o=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(o=r,r=n,n=e,e=0),"object"===(void 0===n?"undefined":c(n))?(i=n,o=r):"string"==typeof n&&(null!=r?i[n]=r:o=n),o=o||g.default.sources.API,[t,e,i,o]}function u(t,e,n,r){if(null==t)return null;var o=void 0,i=void 0;if(e instanceof d.default){var l=[t.index,t.index+t.length].map(function(t){return e.transformPosition(t,r!==g.default.sources.USER)}),a=f(l,2);o=a[0],i=a[1]}else{var s=[t.index,t.index+t.length].map(function(t){return t=0?t+n:Math.max(e,t+n)}),u=f(s,2);o=u[0],i=u[1]}return new x.Range(o,i-o)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.overload=e.expandConfig=void 0;var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(i(this,t),this.options=l(e,r),this.container=this.options.container,null==this.container)return P.error("Invalid Quill container",e);this.options.debug&&t.debug(this.options.debug);var o=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",this.container.__quill=this,this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.root.setAttribute("data-gramm",!1),this.scrollingContainer=this.options.scrollingContainer||this.root,this.emitter=new g.default,this.scroll=w.default.create(this.root,{emitter:this.emitter,whitelist:this.options.formats}),this.editor=new v.default(this.scroll),this.selection=new k.default(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.theme.init(),this.emitter.on(g.default.events.EDITOR_CHANGE,function(t){t===g.default.events.TEXT_CHANGE&&n.root.classList.toggle("ql-blank",n.editor.isBlank())}),this.emitter.on(g.default.events.SCROLL_UPDATE,function(t,e){var r=n.selection.lastRange,o=r&&0===r.length?r.index:void 0;a.call(n,function(){return n.editor.update(null,e,o)},t)});var s=this.clipboard.convert("
"+o+"


");this.setContents(s),this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable()}return h(t,null,[{key:"debug",value:function(t){!0===t&&(t="log"),A.default.level(t)}},{key:"find",value:function(t){return t.__quill||w.default.find(t)}},{key:"import",value:function(t){return null==this.imports[t]&&P.error("Cannot import "+t+". Are you sure it was registered?"),this.imports[t]}},{key:"register",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"!=typeof t){var o=t.attrName||t.blotName;"string"==typeof o?this.register("formats/"+o,t,e):Object.keys(t).forEach(function(r){n.register(r,t[r],e)})}else null==this.imports[t]||r||P.warn("Overwriting "+t+" with",e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&"abstract"!==e.blotName?w.default.register(e):t.startsWith("modules")&&"function"==typeof e.register&&e.register()}}]),h(t,[{key:"addContainer",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){var n=t;t=document.createElement("div"),t.classList.add(n)}return this.container.insertBefore(t,e),t}},{key:"blur",value:function(){this.selection.setRange(null)}},{key:"deleteText",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.deleteText(t,e)},n,t,-1*e)}},{key:"disable",value:function(){this.enable(!1)}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}},{key:"focus",value:function(){var t=this.scrollingContainer.scrollTop;this.selection.focus(),this.scrollingContainer.scrollTop=t,this.scrollIntoView()}},{key:"format",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:g.default.sources.API;return a.call(this,function(){var r=n.getSelection(!0),i=new d.default;if(null==r)return i;if(w.default.query(t,w.default.Scope.BLOCK))i=n.editor.formatLine(r.index,r.length,o({},t,e));else{if(0===r.length)return n.selection.format(t,e),i;i=n.editor.formatText(r.index,r.length,o({},t,e))}return n.setSelection(r,g.default.sources.SILENT),i},r)}},{key:"formatLine",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatLine(t,e,l)},o,t,0)}},{key:"formatText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatText(t,e,l)},o,t,0)}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=void 0;n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length);var r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}},{key:"getContents",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getContents(t,e)}},{key:"getFormat",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}},{key:"getIndex",value:function(t){return t.offset(this.scroll)}},{key:"getLength",value:function(){return this.scroll.length()}},{key:"getLeaf",value:function(t){return this.scroll.leaf(t)}},{key:"getLine",value:function(t){return this.scroll.line(t)}},{key:"getLines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}},{key:"getModule",value:function(t){return this.theme.modules[t]}},{key:"getSelection",value:function(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}},{key:"getText",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getText(t,e)}},{key:"hasFocus",value:function(){return this.selection.hasFocus()}},{key:"insertEmbed",value:function(e,n,r){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.sources.API;return a.call(this,function(){return o.editor.insertEmbed(e,n,r)},i,e)}},{key:"insertText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,0,n,r,o),c=f(u,4);return t=c[0],l=c[2],o=c[3],a.call(this,function(){return i.editor.insertText(t,e,l)},o,t,e.length)}},{key:"isEnabled",value:function(){return!this.container.classList.contains("ql-disabled")}},{key:"off",value:function(){return this.emitter.off.apply(this.emitter,arguments)}},{key:"on",value:function(){return this.emitter.on.apply(this.emitter,arguments)}},{key:"once",value:function(){return this.emitter.once.apply(this.emitter,arguments)}},{key:"pasteHTML",value:function(t,e,n){this.clipboard.dangerouslyPasteHTML(t,e,n)}},{key:"removeFormat",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.removeFormat(t,e)},n,t)}},{key:"scrollIntoView",value:function(){this.selection.scrollIntoView(this.scrollingContainer)}},{key:"setContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){t=new d.default(t);var n=e.getLength(),r=e.editor.deleteText(0,n),o=e.editor.applyDelta(t),i=o.ops[o.ops.length-1];return null!=i&&"string"==typeof i.insert&&"\n"===i.insert[i.insert.length-1]&&(e.editor.deleteText(e.getLength()-1,1),o.delete(1)),r.compose(o)},n)}},{key:"setSelection",value:function(e,n,r){if(null==e)this.selection.setRange(null,n||t.sources.API);else{var o=s(e,n,r),i=f(o,4);e=i[0],n=i[1],r=i[3],this.selection.setRange(new x.Range(e,n),r),r!==g.default.sources.SILENT&&this.selection.scrollIntoView(this.scrollingContainer)}}},{key:"setText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API,n=(new d.default).insert(t);return this.setContents(n,e)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g.default.sources.USER,e=this.scroll.update(t);return this.selection.update(t),e}},{key:"updateContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){return t=new d.default(t),e.editor.applyDelta(t,n)},n,!0)}}]),t}();S.DEFAULTS={bounds:null,formats:null,modules:{},placeholder:"",readOnly:!1,scrollingContainer:null,strict:!0,theme:"default"},S.events=g.default.events,S.sources=g.default.sources,S.version="1.3.6",S.imports={delta:d.default,parchment:w.default,"core/module":_.default,"core/theme":T.default},e.expandConfig=l,e.overload=s,e.default=S},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,t),this.quill=e,this.options=n};o.DEFAULTS={},e.default=o},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(0),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default.Text);e.default=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1?e-1:0),r=1;r1?n-1:0),o=1;o-1:this.whitelist.indexOf(e)>-1))},t.prototype.remove=function(t){t.removeAttribute(this.keyName)},t.prototype.value=function(t){var e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""},t}();e.default=o},function(t,e,n){function r(t){return null===t||void 0===t}function o(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}function i(t,e,n){var i,c;if(r(t)||r(e))return!1;if(t.prototype!==e.prototype)return!1;if(s(t))return!!s(e)&&(t=l.call(t),e=l.call(e),u(t,e,n));if(o(t)){if(!o(e))return!1;if(t.length!==e.length)return!1;for(i=0;i=0;i--)if(f[i]!=h[i])return!1;for(i=f.length-1;i>=0;i--)if(c=f[i],!u(t[c],e[c],n))return!1;return typeof t==typeof e}var l=Array.prototype.slice,a=n(55),s=n(56),u=t.exports=function(t,e,n){return n||(n={}),t===e||(t instanceof Date&&e instanceof Date?t.getTime()===e.getTime():!t||!e||"object"!=typeof t&&"object"!=typeof e?n.strict?t===e:t==e:i(t,e,n))}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Code=void 0;var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var n=0;n=t+n)){var l=this.newlineIndex(t,!0)+1,a=i-l+1,s=this.isolate(l,a),u=s.next;s.format(r,o),u instanceof e&&u.formatAt(0,t-l+n-a,r,o)}}}},{key:"insertAt",value:function(t,e,n){if(null==n){var r=this.descendant(m.default,t),o=a(r,2),i=o[0],l=o[1];i.insertAt(l,e)}}},{key:"length",value:function(){var t=this.domNode.textContent.length;return this.domNode.textContent.endsWith("\n")?t:t+1}},{key:"newlineIndex",value:function(t){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1])return this.domNode.textContent.slice(0,t).lastIndexOf("\n");var e=this.domNode.textContent.slice(t).indexOf("\n");return e>-1?t+e:-1}},{key:"optimize",value:function(t){this.domNode.textContent.endsWith("\n")||this.appendChild(p.default.create("text","\n")),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&this.statics.formats(this.domNode)===n.statics.formats(n.domNode)&&(n.optimize(t),n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t),[].slice.call(this.domNode.querySelectorAll("*")).forEach(function(t){var e=p.default.find(t);null==e?t.parentNode.removeChild(t):e instanceof p.default.Embed?e.remove():e.unwrap()})}}],[{key:"create",value:function(t){var n=u(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("spellcheck",!1),n}},{key:"formats",value:function(){return!0}}]),e}(y.default);O.blotName="code-block",O.tagName="PRE",O.TAB=" ",e.Code=_,e.default=O},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1}Object.defineProperty(e,"__esModule",{value:!0}),e.sanitize=e.default=void 0;var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]&&arguments[1],n=this.container.querySelector(".ql-selected");if(t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=[].indexOf.call(t.parentNode.children,t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e))){if("function"==typeof Event)this.select.dispatchEvent(new Event("change"));else if("object"===("undefined"==typeof Event?"undefined":l(Event))){var r=document.createEvent("Event");r.initEvent("change",!0,!0),this.select.dispatchEvent(r)}this.close()}}},{key:"update",value:function(){var t=void 0;if(this.select.selectedIndex>-1){var e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);var n=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",n)}}]),t}();e.default=p},function(t,e,n){"use strict";function r(t){var e=a.find(t);if(null==e)try{e=a.create(t)}catch(n){e=a.create(a.Scope.INLINE),[].slice.call(t.childNodes).forEach(function(t){e.domNode.appendChild(t)}),t.parentNode&&t.parentNode.replaceChild(e.domNode,t),e.attach()}return e}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(47),l=n(27),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.build(),n}return o(e,t),e.prototype.appendChild=function(t){this.insertBefore(t)},e.prototype.attach=function(){t.prototype.attach.call(this),this.children.forEach(function(t){t.attach()})},e.prototype.build=function(){var t=this;this.children=new i.default,[].slice.call(this.domNode.childNodes).reverse().forEach(function(e){try{var n=r(e);t.insertBefore(n,t.children.head||void 0)}catch(t){if(t instanceof a.ParchmentError)return;throw t}})},e.prototype.deleteAt=function(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,function(t,e,n){t.deleteAt(e,n)})},e.prototype.descendant=function(t,n){var r=this.children.find(n),o=r[0],i=r[1];return null==t.blotName&&t(o)||null!=t.blotName&&o instanceof t?[o,i]:o instanceof e?o.descendant(t,i):[null,-1]},e.prototype.descendants=function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=Number.MAX_VALUE);var o=[],i=r;return this.children.forEachAt(n,r,function(n,r,l){(null==t.blotName&&t(n)||null!=t.blotName&&n instanceof t)&&o.push(n),n instanceof e&&(o=o.concat(n.descendants(t,r,i))),i-=l}),o},e.prototype.detach=function(){this.children.forEach(function(t){t.detach()}),t.prototype.detach.call(this)},e.prototype.formatAt=function(t,e,n,r){this.children.forEachAt(t,e,function(t,e,o){t.formatAt(e,o,n,r)})},e.prototype.insertAt=function(t,e,n){var r=this.children.find(t),o=r[0],i=r[1];if(o)o.insertAt(i,e,n);else{var l=null==n?a.create("text",e):a.create(e,n);this.appendChild(l)}},e.prototype.insertBefore=function(t,e){if(null!=this.statics.allowedChildren&&!this.statics.allowedChildren.some(function(e){return t instanceof e}))throw new a.ParchmentError("Cannot insert "+t.statics.blotName+" into "+this.statics.blotName);t.insertInto(this,e)},e.prototype.length=function(){return this.children.reduce(function(t,e){return t+e.length()},0)},e.prototype.moveChildren=function(t,e){this.children.forEach(function(n){t.insertBefore(n,e)})},e.prototype.optimize=function(e){if(t.prototype.optimize.call(this,e),0===this.children.length)if(null!=this.statics.defaultChild){var n=a.create(this.statics.defaultChild);this.appendChild(n),n.optimize(e)}else this.remove()},e.prototype.path=function(t,n){void 0===n&&(n=!1);var r=this.children.find(t,n),o=r[0],i=r[1],l=[[this,t]];return o instanceof e?l.concat(o.path(i,n)):(null!=o&&l.push([o,i]),l)},e.prototype.removeChild=function(t){this.children.remove(t)},e.prototype.replace=function(n){n instanceof e&&n.moveChildren(this),t.prototype.replace.call(this,n)},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=this.clone();return this.parent.insertBefore(n,this.next),this.children.forEachAt(t,this.length(),function(t,r,o){t=t.split(r,e),n.appendChild(t)}),n},e.prototype.unwrap=function(){this.moveChildren(this.parent,this.next),this.remove()},e.prototype.update=function(t,e){var n=this,o=[],i=[];t.forEach(function(t){t.target===n.domNode&&"childList"===t.type&&(o.push.apply(o,t.addedNodes),i.push.apply(i,t.removedNodes))}),i.forEach(function(t){if(!(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)){var e=a.find(t);null!=e&&(null!=e.domNode.parentNode&&e.domNode.parentNode!==n.domNode||e.detach())}}),o.filter(function(t){return t.parentNode==n.domNode}).sort(function(t,e){return t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1}).forEach(function(t){var e=null;null!=t.nextSibling&&(e=a.find(t.nextSibling));var o=r(t);o.next==e&&null!=o.next||(null!=o.parent&&o.parent.removeChild(n),n.insertBefore(o,e||void 0))})},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(11),i=n(28),l=n(17),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.attributes=new i.default(n.domNode),n}return r(e,t),e.formats=function(t){return"string"==typeof this.tagName||(Array.isArray(this.tagName)?t.tagName.toLowerCase():void 0)},e.prototype.format=function(t,e){var n=a.query(t);n instanceof o.default?this.attributes.attribute(n,e):e&&(null==n||t===this.statics.blotName&&this.formats()[t]===e||this.replaceWith(t,e))},e.prototype.formats=function(){var t=this.attributes.values(),e=this.statics.formats(this.domNode);return null!=e&&(t[this.statics.blotName]=e),t},e.prototype.replaceWith=function(e,n){var r=t.prototype.replaceWith.call(this,e,n);return this.attributes.copy(r),r},e.prototype.update=function(e,n){var r=this;t.prototype.update.call(this,e,n),e.some(function(t){return t.target===r.domNode&&"attributes"===t.type})&&this.attributes.build()},e.prototype.wrap=function(n,r){var o=t.prototype.wrap.call(this,n,r);return o instanceof e&&o.statics.scope===this.statics.scope&&this.attributes.move(o),o},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(27),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.value=function(t){return!0},e.prototype.index=function(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1},e.prototype.position=function(t,e){var n=[].indexOf.call(this.parent.domNode.childNodes,this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]},e.prototype.value=function(){return t={},t[this.statics.blotName]=this.statics.value(this.domNode)||!0,t;var t},e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){function r(t){this.ops=t,this.index=0,this.offset=0}var o=n(12),i=n(2),l={attributes:{compose:function(t,e,n){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var r=i(!0,{},e);n||(r=Object.keys(r).reduce(function(t,e){return null!=r[e]&&(t[e]=r[e]),t},{}));for(var o in t)void 0!==t[o]&&void 0===e[o]&&(r[o]=t[o]);return Object.keys(r).length>0?r:void 0},diff:function(t,e){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var n=Object.keys(t).concat(Object.keys(e)).reduce(function(n,r){return o(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n},{});return Object.keys(n).length>0?n:void 0},transform:function(t,e,n){if("object"!=typeof t)return e;if("object"==typeof e){if(!n)return e;var r=Object.keys(e).reduce(function(n,r){return void 0===t[r]&&(n[r]=e[r]),n},{});return Object.keys(r).length>0?r:void 0}}},iterator:function(t){return new r(t)},length:function(t){return"number"==typeof t.delete?t.delete:"number"==typeof t.retain?t.retain:"string"==typeof t.insert?t.insert.length:1}};r.prototype.hasNext=function(){return this.peekLength()<1/0},r.prototype.next=function(t){t||(t=1/0);var e=this.ops[this.index];if(e){var n=this.offset,r=l.length(e);if(t>=r-n?(t=r-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};var o={};return e.attributes&&(o.attributes=e.attributes),"number"==typeof e.retain?o.retain=t:"string"==typeof e.insert?o.insert=e.insert.substr(n,t):o.insert=e.insert,o}return{retain:1/0}},r.prototype.peek=function(){return this.ops[this.index]},r.prototype.peekLength=function(){return this.ops[this.index]?l.length(this.ops[this.index])-this.offset:1/0},r.prototype.peekType=function(){return this.ops[this.index]?"number"==typeof this.ops[this.index].delete?"delete":"number"==typeof this.ops[this.index].retain?"retain":"insert":"retain"},t.exports=l},function(t,e){var n=function(){"use strict";function t(t,e){return null!=e&&t instanceof e}function e(n,r,o,i,c){function f(n,o){if(null===n)return null;if(0===o)return n;var y,v;if("object"!=typeof n)return n;if(t(n,a))y=new a;else if(t(n,s))y=new s;else if(t(n,u))y=new u(function(t,e){n.then(function(e){t(f(e,o-1))},function(t){e(f(t,o-1))})});else if(e.__isArray(n))y=[];else if(e.__isRegExp(n))y=new RegExp(n.source,l(n)),n.lastIndex&&(y.lastIndex=n.lastIndex);else if(e.__isDate(n))y=new Date(n.getTime());else{if(d&&Buffer.isBuffer(n))return y=new Buffer(n.length),n.copy(y),y;t(n,Error)?y=Object.create(n):void 0===i?(v=Object.getPrototypeOf(n),y=Object.create(v)):(y=Object.create(i),v=i)}if(r){var b=h.indexOf(n);if(-1!=b)return p[b];h.push(n),p.push(y)}t(n,a)&&n.forEach(function(t,e){var n=f(e,o-1),r=f(t,o-1);y.set(n,r)}),t(n,s)&&n.forEach(function(t){var e=f(t,o-1);y.add(e)});for(var g in n){var m;v&&(m=Object.getOwnPropertyDescriptor(v,g)),m&&null==m.set||(y[g]=f(n[g],o-1))}if(Object.getOwnPropertySymbols)for(var _=Object.getOwnPropertySymbols(n),g=0;g<_.length;g++){var O=_[g],w=Object.getOwnPropertyDescriptor(n,O);(!w||w.enumerable||c)&&(y[O]=f(n[O],o-1),w.enumerable||Object.defineProperty(y,O,{enumerable:!1}))}if(c)for(var x=Object.getOwnPropertyNames(n),g=0;g1&&void 0!==arguments[1]?arguments[1]:0;i(this,t),this.index=e,this.length=n},O=function(){function t(e,n){var r=this;i(this,t),this.emitter=n,this.scroll=e,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=c.default.create("cursor",this),this.lastRange=this.savedRange=new _(0,0),this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,function(){r.mouseDown||setTimeout(r.update.bind(r,v.default.sources.USER),1)}),this.emitter.on(v.default.events.EDITOR_CHANGE,function(t,e){t===v.default.events.TEXT_CHANGE&&e.length()>0&&r.update(v.default.sources.SILENT)}),this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE,function(){if(r.hasFocus()){var t=r.getNativeRange();null!=t&&t.start.node!==r.cursor.textNode&&r.emitter.once(v.default.events.SCROLL_UPDATE,function(){try{r.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset)}catch(t){}})}}),this.emitter.on(v.default.events.SCROLL_OPTIMIZE,function(t,e){if(e.range){var n=e.range,o=n.startNode,i=n.startOffset,l=n.endNode,a=n.endOffset;r.setNativeRange(o,i,l,a)}}),this.update(v.default.sources.SILENT)}return s(t,[{key:"handleComposition",value:function(){var t=this;this.root.addEventListener("compositionstart",function(){t.composing=!0}),this.root.addEventListener("compositionend",function(){if(t.composing=!1,t.cursor.parent){var e=t.cursor.restore();if(!e)return;setTimeout(function(){t.setNativeRange(e.startNode,e.startOffset,e.endNode,e.endOffset)},1)}})}},{key:"handleDragging",value:function(){var t=this;this.emitter.listenDOM("mousedown",document.body,function(){t.mouseDown=!0}),this.emitter.listenDOM("mouseup",document.body,function(){t.mouseDown=!1,t.update(v.default.sources.USER)})}},{key:"focus",value:function(){this.hasFocus()||(this.root.focus(),this.setRange(this.savedRange))}},{key:"format",value:function(t,e){if(null==this.scroll.whitelist||this.scroll.whitelist[t]){this.scroll.update();var n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!c.default.query(t,c.default.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){var r=c.default.find(n.start.node,!1);if(null==r)return;if(r instanceof c.default.Leaf){var o=r.split(n.start.offset);r.parent.insertBefore(this.cursor,o)}else r.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.scroll.length();t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;var r=void 0,o=this.scroll.leaf(t),i=a(o,2),l=i[0],s=i[1];if(null==l)return null;var u=l.position(s,!0),c=a(u,2);r=c[0],s=c[1];var f=document.createRange();if(e>0){f.setStart(r,s);var h=this.scroll.leaf(t+e),p=a(h,2);if(l=p[0],s=p[1],null==l)return null;var d=l.position(s,!0),y=a(d,2);return r=y[0],s=y[1],f.setEnd(r,s),f.getBoundingClientRect()}var v="left",b=void 0;return r instanceof Text?(s0&&(v="right")),{bottom:b.top+b.height,height:b.height,left:b[v],right:b[v],top:b.top,width:0}}},{key:"getNativeRange",value:function(){var t=document.getSelection();if(null==t||t.rangeCount<=0)return null;var e=t.getRangeAt(0);if(null==e)return null;var n=this.normalizeNative(e);return m.info("getNativeRange",n),n}},{key:"getRange",value:function(){var t=this.getNativeRange();return null==t?[null,null]:[this.normalizedToRange(t),t]}},{key:"hasFocus",value:function(){return document.activeElement===this.root}},{key:"normalizedToRange",value:function(t){var e=this,n=[[t.start.node,t.start.offset]];t.native.collapsed||n.push([t.end.node,t.end.offset]);var r=n.map(function(t){var n=a(t,2),r=n[0],o=n[1],i=c.default.find(r,!0),l=i.offset(e.scroll);return 0===o?l:i instanceof c.default.Container?l+i.length():l+i.index(r,o)}),i=Math.min(Math.max.apply(Math,o(r)),this.scroll.length()-1),l=Math.min.apply(Math,[i].concat(o(r)));return new _(l,i-l)}},{key:"normalizeNative",value:function(t){if(!l(this.root,t.startContainer)||!t.collapsed&&!l(this.root,t.endContainer))return null;var e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach(function(t){for(var e=t.node,n=t.offset;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length+1}t.node=e,t.offset=n}),e}},{key:"rangeToNative",value:function(t){var e=this,n=t.collapsed?[t.index]:[t.index,t.index+t.length],r=[],o=this.scroll.length();return n.forEach(function(t,n){t=Math.min(o-1,t);var i=void 0,l=e.scroll.leaf(t),s=a(l,2),u=s[0],c=s[1],f=u.position(c,0!==n),h=a(f,2);i=h[0],c=h[1],r.push(i,c)}),r.length<2&&(r=r.concat(r)),r}},{key:"scrollIntoView",value:function(t){var e=this.lastRange;if(null!=e){var n=this.getBounds(e.index,e.length);if(null!=n){var r=this.scroll.length()-1,o=this.scroll.line(Math.min(e.index,r)),i=a(o,1),l=i[0],s=l;if(e.length>0){var u=this.scroll.line(Math.min(e.index+e.length,r));s=a(u,1)[0]}if(null!=l&&null!=s){var c=t.getBoundingClientRect();n.topc.bottom&&(t.scrollTop+=n.bottom-c.bottom)}}}}},{key:"setNativeRange",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(m.info("setNativeRange",t,e,n,r),null==t||null!=this.root.parentNode&&null!=t.parentNode&&null!=n.parentNode){var i=document.getSelection();if(null!=i)if(null!=t){this.hasFocus()||this.root.focus();var l=(this.getNativeRange()||{}).native;if(null==l||o||t!==l.startContainer||e!==l.startOffset||n!==l.endContainer||r!==l.endOffset){"BR"==t.tagName&&(e=[].indexOf.call(t.parentNode.childNodes,t),t=t.parentNode),"BR"==n.tagName&&(r=[].indexOf.call(n.parentNode.childNodes,n),n=n.parentNode);var a=document.createRange();a.setStart(t,e),a.setEnd(n,r),i.removeAllRanges(),i.addRange(a)}}else i.removeAllRanges(),this.root.blur(),document.body.focus()}}},{key:"setRange",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:v.default.sources.API;if("string"==typeof e&&(n=e,e=!1),m.info("setRange",t),null!=t){var r=this.rangeToNative(t);this.setNativeRange.apply(this,o(r).concat([e]))}else this.setNativeRange(null);this.update(n)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v.default.sources.USER,e=this.lastRange,n=this.getRange(),r=a(n,2),o=r[0],i=r[1];if(this.lastRange=o,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,d.default)(e,this.lastRange)){var l;!this.composing&&null!=i&&i.native.collapsed&&i.start.node!==this.cursor.textNode&&this.cursor.restore();var s=[v.default.events.SELECTION_CHANGE,(0,h.default)(this.lastRange),(0,h.default)(e),t];if((l=this.emitter).emit.apply(l,[v.default.events.EDITOR_CHANGE].concat(s)),t!==v.default.sources.SILENT){var u;(u=this.emitter).emit.apply(u,s)}}}}]),t}();e.Range=_,e.default=O},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(0),s=r(a),u=n(3),c=r(u),f=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),e}(s.default.Container);f.allowedChildren=[c.default,u.BlockEmbed,f],e.default=f},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ColorStyle=e.ColorClass=e.ColorAttributor=void 0;var l=function(){function t(t,e){for(var n=0;n1){var u=o.formats(),c=this.quill.getFormat(t.index-1,1);i=A.default.attributes.diff(u,c)||{}}}var f=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;this.quill.deleteText(t.index-f,f,S.default.sources.USER),Object.keys(i).length>0&&this.quill.formatLine(t.index-f,f,i,S.default.sources.USER),this.quill.focus()}}function c(t,e){var n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(!(t.index>=this.quill.getLength()-n)){var r={},o=0,i=this.quill.getLine(t.index),l=b(i,1),a=l[0];if(e.offset>=a.length()-1){var s=this.quill.getLine(t.index+1),u=b(s,1),c=u[0];if(c){var f=a.formats(),h=this.quill.getFormat(t.index,1);r=A.default.attributes.diff(f,h)||{},o=c.length()}}this.quill.deleteText(t.index,n,S.default.sources.USER),Object.keys(r).length>0&&this.quill.formatLine(t.index+o-1,n,r,S.default.sources.USER)}}function f(t){var e=this.quill.getLines(t),n={};if(e.length>1){var r=e[0].formats(),o=e[e.length-1].formats();n=A.default.attributes.diff(o,r)||{}}this.quill.deleteText(t,S.default.sources.USER),Object.keys(n).length>0&&this.quill.formatLine(t.index,1,n,S.default.sources.USER),this.quill.setSelection(t.index,S.default.sources.SILENT),this.quill.focus()}function h(t,e){var n=this;t.length>0&&this.quill.scroll.deleteAt(t.index,t.length);var r=Object.keys(e.format).reduce(function(t,n){return T.default.query(n,T.default.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t},{});this.quill.insertText(t.index,"\n",r,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.focus(),Object.keys(e.format).forEach(function(t){null==r[t]&&(Array.isArray(e.format[t])||"link"!==t&&n.quill.format(t,e.format[t],S.default.sources.USER))})}function p(t){return{key:D.keys.TAB,shiftKey:!t,format:{"code-block":!0},handler:function(e){var n=T.default.query("code-block"),r=e.index,o=e.length,i=this.quill.scroll.descendant(n,r),l=b(i,2),a=l[0],s=l[1];if(null!=a){var u=this.quill.getIndex(a),c=a.newlineIndex(s,!0)+1,f=a.newlineIndex(u+s+o),h=a.domNode.textContent.slice(c,f).split("\n");s=0,h.forEach(function(e,i){t?(a.insertAt(c+s,n.TAB),s+=n.TAB.length,0===i?r+=n.TAB.length:o+=n.TAB.length):e.startsWith(n.TAB)&&(a.deleteAt(c+s,n.TAB.length),s-=n.TAB.length,0===i?r-=n.TAB.length:o-=n.TAB.length),s+=e.length+1}),this.quill.update(S.default.sources.USER),this.quill.setSelection(r,o,S.default.sources.SILENT)}}}}function d(t){return{key:t[0].toUpperCase(),shortKey:!0,handler:function(e,n){this.quill.format(t,!n.format[t],S.default.sources.USER)}}}function y(t){if("string"==typeof t||"number"==typeof t)return y({key:t});if("object"===(void 0===t?"undefined":v(t))&&(t=(0,_.default)(t,!1)),"string"==typeof t.key)if(null!=D.keys[t.key.toUpperCase()])t.key=D.keys[t.key.toUpperCase()];else{if(1!==t.key.length)return null;t.key=t.key.toUpperCase().charCodeAt(0)}return t.shortKey&&(t[B]=t.shortKey,delete t.shortKey),t}Object.defineProperty(e,"__esModule",{value:!0}),e.SHORTKEY=e.default=void 0;var v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),g=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=y(t);if(null==r||null==r.key)return I.warn("Attempted to add invalid keyboard binding",r);"function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),r=(0,k.default)(r,e,n),this.bindings[r.key]=this.bindings[r.key]||[],this.bindings[r.key].push(r)}},{key:"listen",value:function(){var t=this;this.quill.root.addEventListener("keydown",function(n){if(!n.defaultPrevented){var r=n.which||n.keyCode,o=(t.bindings[r]||[]).filter(function(t){return e.match(n,t)});if(0!==o.length){var i=t.quill.getSelection();if(null!=i&&t.quill.hasFocus()){var l=t.quill.getLine(i.index),a=b(l,2),s=a[0],u=a[1],c=t.quill.getLeaf(i.index),f=b(c,2),h=f[0],p=f[1],d=0===i.length?[h,p]:t.quill.getLeaf(i.index+i.length),y=b(d,2),g=y[0],m=y[1],_=h instanceof T.default.Text?h.value().slice(0,p):"",O=g instanceof T.default.Text?g.value().slice(m):"",x={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:t.quill.getFormat(i),offset:u,prefix:_,suffix:O};o.some(function(e){if(null!=e.collapsed&&e.collapsed!==x.collapsed)return!1;if(null!=e.empty&&e.empty!==x.empty)return!1;if(null!=e.offset&&e.offset!==x.offset)return!1;if(Array.isArray(e.format)){if(e.format.every(function(t){return null==x.format[t]}))return!1}else if("object"===v(e.format)&&!Object.keys(e.format).every(function(t){return!0===e.format[t]?null!=x.format[t]:!1===e.format[t]?null==x.format[t]:(0,w.default)(e.format[t],x.format[t])}))return!1;return!(null!=e.prefix&&!e.prefix.test(x.prefix))&&(!(null!=e.suffix&&!e.suffix.test(x.suffix))&&!0!==e.handler.call(t,i,x))})&&n.preventDefault()}}}})}}]),e}(R.default);D.keys={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46},D.DEFAULTS={bindings:{bold:d("bold"),italic:d("italic"),underline:d("underline"),indent:{key:D.keys.TAB,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","+1",S.default.sources.USER)}},outdent:{key:D.keys.TAB,shiftKey:!0,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","-1",S.default.sources.USER)}},"outdent backspace":{key:D.keys.BACKSPACE,collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler:function(t,e){null!=e.format.indent?this.quill.format("indent","-1",S.default.sources.USER):null!=e.format.list&&this.quill.format("list",!1,S.default.sources.USER)}},"indent code-block":p(!0),"outdent code-block":p(!1),"remove tab":{key:D.keys.TAB,shiftKey:!0,collapsed:!0,prefix:/\t$/,handler:function(t){this.quill.deleteText(t.index-1,1,S.default.sources.USER)}},tab:{key:D.keys.TAB,handler:function(t){this.quill.history.cutoff();var e=(new N.default).retain(t.index).delete(t.length).insert("\t");this.quill.updateContents(e,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,S.default.sources.SILENT)}},"list empty enter":{key:D.keys.ENTER,collapsed:!0,format:["list"],empty:!0,handler:function(t,e){this.quill.format("list",!1,S.default.sources.USER),e.format.indent&&this.quill.format("indent",!1,S.default.sources.USER)}},"checklist enter":{key:D.keys.ENTER,collapsed:!0,format:{list:"checked"},handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(0,k.default)({},r.formats(),{list:"checked"}),l=(new N.default).retain(t.index).insert("\n",i).retain(r.length()-o-1).retain(1,{list:"unchecked"});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"header enter":{key:D.keys.ENTER,collapsed:!0,format:["header"],suffix:/^$/,handler:function(t,e){var n=this.quill.getLine(t.index),r=b(n,2),o=r[0],i=r[1],l=(new N.default).retain(t.index).insert("\n",e.format).retain(o.length()-i-1).retain(1,{header:null});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"list autofill":{key:" ",collapsed:!0,format:{list:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler:function(t,e){var n=e.prefix.length,r=this.quill.getLine(t.index),o=b(r,2),i=o[0],l=o[1];if(l>n)return!0;var a=void 0;switch(e.prefix.trim()){case"[]":case"[ ]":a="unchecked";break;case"[x]":a="checked";break;case"-":case"*":a="bullet";break;default:a="ordered"}this.quill.insertText(t.index," ",S.default.sources.USER),this.quill.history.cutoff();var s=(new N.default).retain(t.index-l).delete(n+1).retain(i.length()-2-l).retain(1,{list:a});this.quill.updateContents(s,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,S.default.sources.SILENT)}},"code exit":{key:D.keys.ENTER,collapsed:!0,format:["code-block"],prefix:/\n\n$/,suffix:/^\s+$/,handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(new N.default).retain(t.index+r.length()-o-2).retain(1,{"code-block":null}).delete(1);this.quill.updateContents(i,S.default.sources.USER)}},"embed left":s(D.keys.LEFT,!1),"embed left shift":s(D.keys.LEFT,!0),"embed right":s(D.keys.RIGHT,!1),"embed right shift":s(D.keys.RIGHT,!0)}},e.default=D,e.SHORTKEY=B},function(t,e,n){"use strict";t.exports={align:{"":n(75),center:n(76),right:n(77),justify:n(78)},background:n(79),blockquote:n(80),bold:n(81),clean:n(82),code:n(40),"code-block":n(40),color:n(83),direction:{"":n(84),rtl:n(85)},float:{center:n(86),full:n(87),left:n(88),right:n(89)},formula:n(90),header:{1:n(91),2:n(92)},italic:n(93),image:n(94),indent:{"+1":n(95),"-1":n(96)},link:n(97),list:{ordered:n(98),bullet:n(99),check:n(100)},script:{sub:n(101),super:n(102)},strike:n(103),underline:n(104),video:n(105)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=function(){function t(t){this.domNode=t,this.domNode[r.DATA_KEY]={blot:this}}return Object.defineProperty(t.prototype,"statics",{get:function(){return this.constructor},enumerable:!0,configurable:!0}),t.create=function(t){if(null==this.tagName)throw new r.ParchmentError("Blot definition missing tagName");var e;return Array.isArray(this.tagName)?("string"==typeof t&&(t=t.toUpperCase(),parseInt(t).toString()===t&&(t=parseInt(t))),e="number"==typeof t?document.createElement(this.tagName[t-1]):this.tagName.indexOf(t)>-1?document.createElement(t):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e},t.prototype.attach=function(){null!=this.parent&&(this.scroll=this.parent.scroll)},t.prototype.clone=function(){var t=this.domNode.cloneNode(!1);return r.create(t)},t.prototype.detach=function(){null!=this.parent&&this.parent.removeChild(this),delete this.domNode[r.DATA_KEY]},t.prototype.deleteAt=function(t,e){this.isolate(t,e).remove()},t.prototype.formatAt=function(t,e,n,o){var i=this.isolate(t,e);if(null!=r.query(n,r.Scope.BLOT)&&o)i.wrap(n,o);else if(null!=r.query(n,r.Scope.ATTRIBUTE)){var l=r.create(this.statics.scope);i.wrap(l),l.format(n,o)}},t.prototype.insertAt=function(t,e,n){var o=null==n?r.create("text",e):r.create(e,n),i=this.split(t);this.parent.insertBefore(o,i)},t.prototype.insertInto=function(t,e){void 0===e&&(e=null),null!=this.parent&&this.parent.children.remove(this);var n=null;t.children.insertBefore(this,e),null!=e&&(n=e.domNode),this.domNode.parentNode==t.domNode&&this.domNode.nextSibling==n||t.domNode.insertBefore(this.domNode,n),this.parent=t,this.attach()},t.prototype.isolate=function(t,e){var n=this.split(t);return n.split(e),n},t.prototype.length=function(){return 1},t.prototype.offset=function(t){return void 0===t&&(t=this.parent),null==this.parent||this==t?0:this.parent.children.offset(this)+this.parent.offset(t)},t.prototype.optimize=function(t){null!=this.domNode[r.DATA_KEY]&&delete this.domNode[r.DATA_KEY].mutations},t.prototype.remove=function(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()},t.prototype.replace=function(t){null!=t.parent&&(t.parent.insertBefore(this,t.next),t.remove())},t.prototype.replaceWith=function(t,e){var n="string"==typeof t?r.create(t,e):t;return n.replace(this),n},t.prototype.split=function(t,e){return 0===t?this:this.next},t.prototype.update=function(t,e){},t.prototype.wrap=function(t,e){var n="string"==typeof t?r.create(t,e):t;return null!=this.parent&&this.parent.insertBefore(n,this.next),n.appendChild(this),n},t.blotName="abstract",t}();e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(11),o=n(29),i=n(30),l=n(1),a=function(){function t(t){this.attributes={},this.domNode=t,this.build()}return t.prototype.attribute=function(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])},t.prototype.build=function(){var t=this;this.attributes={};var e=r.default.keys(this.domNode),n=o.default.keys(this.domNode),a=i.default.keys(this.domNode);e.concat(n).concat(a).forEach(function(e){var n=l.query(e,l.Scope.ATTRIBUTE);n instanceof r.default&&(t.attributes[n.attrName]=n)})},t.prototype.copy=function(t){var e=this;Object.keys(this.attributes).forEach(function(n){var r=e.attributes[n].value(e.domNode);t.format(n,r)})},t.prototype.move=function(t){var e=this;this.copy(t),Object.keys(this.attributes).forEach(function(t){e.attributes[t].remove(e.domNode)}),this.attributes={}},t.prototype.values=function(){var t=this;return Object.keys(this.attributes).reduce(function(e,n){return e[n]=t.attributes[n].value(t.domNode),e},{})},t}();e.default=a},function(t,e,n){"use strict";function r(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter(function(t){return 0===t.indexOf(e+"-")})}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("class")||"").split(/\s+/).map(function(t){return t.split("-").slice(0,-1).join("-")})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(this.keyName+"-"+e),!0)},e.prototype.remove=function(t){r(t,this.keyName).forEach(function(e){t.classList.remove(e)}),0===t.classList.length&&t.removeAttribute("class")},e.prototype.value=function(t){var e=r(t,this.keyName)[0]||"",n=e.slice(this.keyName.length+1);return this.canAdd(t,n)?n:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){var e=t.split("-"),n=e.slice(1).map(function(t){return t[0].toUpperCase()+t.slice(1)}).join("");return e[0]+n}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("style")||"").split(";").map(function(t){return t.split(":")[0].trim()})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(t.style[r(this.keyName)]=e,!0)},e.prototype.remove=function(t){t.style[r(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")},e.prototype.value=function(t){var e=t.style[r(this.keyName)];return this.canAdd(t,e)?e:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n '},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;nr.right&&(i=r.right-o.right,this.root.style.left=e+i+"px"),o.leftr.bottom){var l=o.bottom-o.top,a=t.bottom-t.top+l;this.root.style.top=n-a+"px",this.root.classList.add("ql-flip")}return i}},{key:"show",value:function(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}}]),t}();e.default=i},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?(e[1]||"https")+"://www.youtube.com/embed/"+e[2]+"?showinfo=0":(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?(e[1]||"https")+"://player.vimeo.com/video/"+e[2]+"/":t}function s(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach(function(e){var r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",e),t.appendChild(r)})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BaseTooltip=void 0;var u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value=""),this.position(this.quill.getBounds(this.quill.selection.savedRange)),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute("data-"+t)||""),this.root.setAttribute("data-mode",t)}},{key:"restoreFocus",value:function(){var t=this.quill.scrollingContainer.scrollTop;this.quill.focus(),this.quill.scrollingContainer.scrollTop=t}},{key:"save",value:function(){var t=this.textbox.value;switch(this.root.getAttribute("data-mode")){case"link":var e=this.quill.root.scrollTop;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,v.default.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,v.default.sources.USER)),this.quill.root.scrollTop=e;break;case"video":t=a(t);case"formula":if(!t)break;var n=this.quill.getSelection(!0);if(null!=n){var r=n.index+n.length;this.quill.insertEmbed(r,this.root.getAttribute("data-mode"),t,v.default.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(r+1," ",v.default.sources.USER),this.quill.setSelection(r+2,v.default.sources.USER)}}this.textbox.value="",this.hide()}}]),e}(A.default);e.BaseTooltip=M,e.default=L},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(46),i=r(o),l=n(34),a=n(36),s=n(62),u=n(63),c=r(u),f=n(64),h=r(f),p=n(65),d=r(p),y=n(35),v=n(24),b=n(37),g=n(38),m=n(39),_=r(m),O=n(66),w=r(O),x=n(15),k=r(x),E=n(67),N=r(E),j=n(68),A=r(j),q=n(69),T=r(q),P=n(70),S=r(P),C=n(71),L=r(C),M=n(13),R=r(M),I=n(72),B=r(I),D=n(73),U=r(D),F=n(74),H=r(F),K=n(26),z=r(K),Z=n(16),V=r(Z),W=n(41),G=r(W),Y=n(42),X=r(Y),$=n(43),Q=r($),J=n(107),tt=r(J),et=n(108),nt=r(et);i.default.register({"attributors/attribute/direction":a.DirectionAttribute,"attributors/class/align":l.AlignClass,"attributors/class/background":y.BackgroundClass,"attributors/class/color":v.ColorClass,"attributors/class/direction":a.DirectionClass,"attributors/class/font":b.FontClass,"attributors/class/size":g.SizeClass,"attributors/style/align":l.AlignStyle,"attributors/style/background":y.BackgroundStyle,"attributors/style/color":v.ColorStyle,"attributors/style/direction":a.DirectionStyle,"attributors/style/font":b.FontStyle,"attributors/style/size":g.SizeStyle},!0),i.default.register({"formats/align":l.AlignClass,"formats/direction":a.DirectionClass,"formats/indent":s.IndentClass,"formats/background":y.BackgroundStyle,"formats/color":v.ColorStyle,"formats/font":b.FontClass,"formats/size":g.SizeClass,"formats/blockquote":c.default,"formats/code-block":R.default,"formats/header":h.default,"formats/list":d.default,"formats/bold":_.default,"formats/code":M.Code,"formats/italic":w.default,"formats/link":k.default,"formats/script":N.default,"formats/strike":A.default,"formats/underline":T.default,"formats/image":S.default,"formats/video":L.default,"formats/list/item":p.ListItem,"modules/formula":B.default,"modules/syntax":U.default,"modules/toolbar":H.default,"themes/bubble":tt.default,"themes/snow":nt.default,"ui/icons":z.default,"ui/picker":V.default,"ui/icon-picker":X.default,"ui/color-picker":G.default,"ui/tooltip":Q.default},!0),e.default=i.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),i=r(o),l=n(6),a=r(l),s=n(3),u=r(s),c=n(14),f=r(c),h=n(23),p=r(h),d=n(31),y=r(d),v=n(33),b=r(v),g=n(5),m=r(g),_=n(59),O=r(_),w=n(8),x=r(w),k=n(60),E=r(k),N=n(61),j=r(N),A=n(25),q=r(A);a.default.register({"blots/block":u.default,"blots/block/embed":s.BlockEmbed,"blots/break":f.default,"blots/container":p.default,"blots/cursor":y.default,"blots/embed":b.default,"blots/inline":m.default,"blots/scroll":O.default,"blots/text":x.default,"modules/clipboard":E.default,"modules/history":j.default,"modules/keyboard":q.default}),i.default.register(u.default,f.default,y.default,m.default,O.default,x.default),e.default=a.default},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(){this.head=this.tail=null,this.length=0}return t.prototype.append=function(){for(var t=[],e=0;e1&&this.append.apply(this,t.slice(1))},t.prototype.contains=function(t){for(var e,n=this.iterator();e=n();)if(e===t)return!0;return!1},t.prototype.insertBefore=function(t,e){t&&(t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)},t.prototype.offset=function(t){for(var e=0,n=this.head;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1},t.prototype.remove=function(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)},t.prototype.iterator=function(t){return void 0===t&&(t=this.head),function(){var e=t;return null!=t&&(t=t.next),e}},t.prototype.find=function(t,e){void 0===e&&(e=!1);for(var n,r=this.iterator();n=r();){var o=n.length();if(ta?n(r,t-a,Math.min(e,a+u-t)):n(r,0,Math.min(u,t+e-a)),a+=u}},t.prototype.map=function(t){return this.reduce(function(e,n){return e.push(t(n)),e},[])},t.prototype.reduce=function(t,e){for(var n,r=this.iterator();n=r();)e=t(e,n);return e},t}();e.default=r},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(17),i=n(1),l={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},a=function(t){function e(e){var n=t.call(this,e)||this;return n.scroll=n,n.observer=new MutationObserver(function(t){n.update(t)}),n.observer.observe(n.domNode,l),n.attach(),n}return r(e,t),e.prototype.detach=function(){t.prototype.detach.call(this),this.observer.disconnect()},e.prototype.deleteAt=function(e,n){this.update(),0===e&&n===this.length()?this.children.forEach(function(t){t.remove()}):t.prototype.deleteAt.call(this,e,n)},e.prototype.formatAt=function(e,n,r,o){this.update(),t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){this.update(),t.prototype.insertAt.call(this,e,n,r)},e.prototype.optimize=function(e,n){var r=this;void 0===e&&(e=[]),void 0===n&&(n={}),t.prototype.optimize.call(this,n);for(var l=[].slice.call(this.observer.takeRecords());l.length>0;)e.push(l.pop());for(var a=function(t,e){void 0===e&&(e=!0),null!=t&&t!==r&&null!=t.domNode.parentNode&&(null==t.domNode[i.DATA_KEY].mutations&&(t.domNode[i.DATA_KEY].mutations=[]),e&&a(t.parent))},s=function(t){null!=t.domNode[i.DATA_KEY]&&null!=t.domNode[i.DATA_KEY].mutations&&(t instanceof o.default&&t.children.forEach(s),t.optimize(n))},u=e,c=0;u.length>0;c+=1){if(c>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(u.forEach(function(t){var e=i.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(a(i.find(t.previousSibling,!1)),[].forEach.call(t.addedNodes,function(t){var e=i.find(t,!1);a(e,!1),e instanceof o.default&&e.children.forEach(function(t){a(t,!1)})})):"attributes"===t.type&&a(e.prev)),a(e))}),this.children.forEach(s),u=[].slice.call(this.observer.takeRecords()),l=u.slice();l.length>0;)e.push(l.pop())}},e.prototype.update=function(e,n){var r=this;void 0===n&&(n={}),e=e||this.observer.takeRecords(),e.map(function(t){var e=i.find(t.target,!0);return null==e?null:null==e.domNode[i.DATA_KEY].mutations?(e.domNode[i.DATA_KEY].mutations=[t],e):(e.domNode[i.DATA_KEY].mutations.push(t),null)}).forEach(function(t){null!=t&&t!==r&&null!=t.domNode[i.DATA_KEY]&&t.update(t.domNode[i.DATA_KEY].mutations||[],n)}),null!=this.domNode[i.DATA_KEY].mutations&&t.prototype.update.call(this,this.domNode[i.DATA_KEY].mutations,n),this.optimize(e,n)},e.blotName="scroll",e.defaultChild="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="DIV",e}(o.default);e.default=a},function(t,e,n){"use strict";function r(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(t[n]!==e[n])return!1;return!0}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(18),l=n(1),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.formats=function(n){if(n.tagName!==e.tagName)return t.formats.call(this,n)},e.prototype.format=function(n,r){var o=this;n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):(this.children.forEach(function(t){t instanceof i.default||(t=t.wrap(e.blotName,!0)),o.attributes.copy(t)}),this.unwrap())},e.prototype.formatAt=function(e,n,r,o){if(null!=this.formats()[r]||l.query(r,l.Scope.ATTRIBUTE)){this.isolate(e,n).format(r,o)}else t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n);var o=this.formats();if(0===Object.keys(o).length)return this.unwrap();var i=this.next;i instanceof e&&i.prev===this&&r(o,i.formats())&&(i.moveChildren(this),i.remove())},e.blotName="inline",e.scope=l.Scope.INLINE_BLOT,e.tagName="SPAN",e}(i.default);e.default=a},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(18),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(n){var r=i.query(e.blotName).tagName;if(n.tagName!==r)return t.formats.call(this,n)},e.prototype.format=function(n,r){null!=i.query(n,i.Scope.BLOCK)&&(n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):this.replaceWith(e.blotName))},e.prototype.formatAt=function(e,n,r,o){null!=i.query(r,i.Scope.BLOCK)?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){if(null==r||null!=i.query(n,i.Scope.INLINE))t.prototype.insertAt.call(this,e,n,r);else{var o=this.split(e),l=i.create(n,r);o.parent.insertBefore(l,o)}},e.prototype.update=function(e,n){navigator.userAgent.match(/Trident/)?this.build():t.prototype.update.call(this,e,n)},e.blotName="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="P",e}(o.default);e.default=l},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(t){},e.prototype.format=function(e,n){t.prototype.formatAt.call(this,0,this.length(),e,n)},e.prototype.formatAt=function(e,n,r,o){0===e&&n===this.length()?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.formats=function(){return this.statics.formats(this.domNode)},e}(o.default);e.default=i},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=n(1),l=function(t){function e(e){var n=t.call(this,e)||this;return n.text=n.statics.value(n.domNode),n}return r(e,t),e.create=function(t){return document.createTextNode(t)},e.value=function(t){var e=t.data;return e.normalize&&(e=e.normalize()),e},e.prototype.deleteAt=function(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)},e.prototype.index=function(t,e){return this.domNode===t?e:-1},e.prototype.insertAt=function(e,n,r){null==r?(this.text=this.text.slice(0,e)+n+this.text.slice(e),this.domNode.data=this.text):t.prototype.insertAt.call(this,e,n,r)},e.prototype.length=function(){return this.text.length},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof e&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())},e.prototype.position=function(t,e){return void 0===e&&(e=!1),[this.domNode,t]},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=i.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next),this.text=this.statics.value(this.domNode),n},e.prototype.update=function(t,e){var n=this;t.some(function(t){return"characterData"===t.type&&t.target===n.domNode})&&(this.text=this.statics.value(this.domNode))},e.prototype.value=function(){return this.text},e.blotName="text",e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){"use strict";var r=document.createElement("div");if(r.classList.toggle("test-class",!1),r.classList.contains("test-class")){var o=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return arguments.length>1&&!this.contains(t)==!e?e:o.call(this,t)}}String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return e=e||0,this.substr(e,t.length)===t}),String.prototype.endsWith||(String.prototype.endsWith=function(t,e){var n=this.toString();("number"!=typeof e||!isFinite(e)||Math.floor(e)!==e||e>n.length)&&(e=n.length),e-=t.length;var r=n.indexOf(t,e);return-1!==r&&r===e}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var e,n=Object(this),r=n.length>>>0,o=arguments[1],i=0;ie.length?t:e,l=t.length>e.length?e:t,a=i.indexOf(l);if(-1!=a)return r=[[y,i.substring(0,a)],[v,l],[y,i.substring(a+l.length)]],t.length>e.length&&(r[0][0]=r[2][0]=d),r;if(1==l.length)return[[d,t],[y,e]];var u=s(t,e);if(u){var c=u[0],f=u[1],h=u[2],p=u[3],b=u[4],g=n(c,h),m=n(f,p);return g.concat([[v,b]],m)}return o(t,e)}function o(t,e){for(var n=t.length,r=e.length,o=Math.ceil((n+r)/2),l=o,a=2*o,s=new Array(a),u=new Array(a),c=0;cn)v+=2;else if(x>r)p+=2;else if(h){var k=l+f-_;if(k>=0&&k=E)return i(t,e,O,x)}}}for(var N=-m+b;N<=m-g;N+=2){var E,k=l+N;E=N==-m||N!=m&&u[k-1]n)g+=2;else if(j>r)b+=2;else if(!h){var w=l+f-N;if(w>=0&&w=E)return i(t,e,O,x)}}}}return[[d,t],[y,e]]}function i(t,e,r,o){var i=t.substring(0,r),l=e.substring(0,o),a=t.substring(r),s=e.substring(o),u=n(i,l),c=n(a,s);return u.concat(c)}function l(t,e){if(!t||!e||t.charAt(0)!=e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),o=r,i=0;n=t.length?[r,o,i,s,f]:null}var r=t.length>e.length?t:e,o=t.length>e.length?e:t;if(r.length<4||2*o.lengthu[4].length?s:u:s;var c,f,h,p;return t.length>e.length?(c=i[0],f=i[1],h=i[2],p=i[3]):(h=i[0],p=i[1],c=i[2],f=i[3]),[c,f,h,p,i[4]]}function u(t){t.push([v,""]);for(var e,n=0,r=0,o=0,i="",s="";n1?(0!==r&&0!==o&&(e=l(s,i),0!==e&&(n-r-o>0&&t[n-r-o-1][0]==v?t[n-r-o-1][1]+=s.substring(0,e):(t.splice(0,0,[v,s.substring(0,e)]),n++),s=s.substring(e),i=i.substring(e)),0!==(e=a(s,i))&&(t[n][1]=s.substring(s.length-e)+t[n][1],s=s.substring(0,s.length-e),i=i.substring(0,i.length-e))),0===r?t.splice(n-o,r+o,[y,s]):0===o?t.splice(n-r,r+o,[d,i]):t.splice(n-r-o,r+o,[d,i],[y,s]),n=n-r-o+(r?1:0)+(o?1:0)+1):0!==n&&t[n-1][0]==v?(t[n-1][1]+=t[n][1],t.splice(n,1)):n++,o=0,r=0,i="",s=""}""===t[t.length-1][1]&&t.pop();var c=!1;for(n=1;n0&&r.splice(o+2,0,[l[0],a]),p(r,o,3)}return t}function h(t){for(var e=!1,n=function(t){return t.charCodeAt(0)>=56320&&t.charCodeAt(0)<=57343},r=2;r=55296&&t.charCodeAt(t.length-1)<=56319}(t[r-2][1])&&t[r-1][0]===d&&n(t[r-1][1])&&t[r][0]===y&&n(t[r][1])&&(e=!0,t[r-1][1]=t[r-2][1].slice(-1)+t[r-1][1],t[r][1]=t[r-2][1].slice(-1)+t[r][1],t[r-2][1]=t[r-2][1].slice(0,-1));if(!e)return t;for(var o=[],r=0;r0&&o.push(t[r]);return o}function p(t,e,n){for(var r=e+n-1;r>=0&&r>=e-1;r--)if(r+1=r&&!a.endsWith("\n")&&(n=!0),e.scroll.insertAt(t,a);var c=e.scroll.line(t),f=u(c,2),h=f[0],p=f[1],y=(0,T.default)({},(0,O.bubbleFormats)(h));if(h instanceof w.default){var b=h.descendant(v.default.Leaf,p),g=u(b,1),m=g[0];y=(0,T.default)(y,(0,O.bubbleFormats)(m))}l=d.default.attributes.diff(y,l)||{}}else if("object"===s(o.insert)){var _=Object.keys(o.insert)[0];if(null==_)return t;e.scroll.insertAt(t,_,o.insert[_])}r+=i}return Object.keys(l).forEach(function(n){e.scroll.formatAt(t,i,n,l[n])}),t+i},0),t.reduce(function(t,n){return"number"==typeof n.delete?(e.scroll.deleteAt(t,n.delete),t):t+(n.retain||n.insert.length||1)},0),this.scroll.batchEnd(),this.update(t)}},{key:"deleteText",value:function(t,e){return this.scroll.deleteAt(t,e),this.update((new h.default).retain(t).delete(e))}},{key:"formatLine",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.scroll.update(),Object.keys(r).forEach(function(o){if(null==n.scroll.whitelist||n.scroll.whitelist[o]){var i=n.scroll.lines(t,Math.max(e,1)),l=e;i.forEach(function(e){var i=e.length();if(e instanceof g.default){var a=t-e.offset(n.scroll),s=e.newlineIndex(a+l)-a+1;e.formatAt(a,s,o,r[o])}else e.format(o,r[o]);l-=i})}}),this.scroll.optimize(),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"formatText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e,o,r[o])}),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"getContents",value:function(t,e){return this.delta.slice(t,t+e)}},{key:"getDelta",value:function(){return this.scroll.lines().reduce(function(t,e){return t.concat(e.delta())},new h.default)}},{key:"getFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach(function(t){var e=u(t,1),o=e[0];o instanceof w.default?n.push(o):o instanceof v.default.Leaf&&r.push(o)}):(n=this.scroll.lines(t,e),r=this.scroll.descendants(v.default.Leaf,t,e));var o=[n,r].map(function(t){if(0===t.length)return{};for(var e=(0,O.bubbleFormats)(t.shift());Object.keys(e).length>0;){var n=t.shift();if(null==n)return e;e=l((0,O.bubbleFormats)(n),e)}return e});return T.default.apply(T.default,o)}},{key:"getText",value:function(t,e){return this.getContents(t,e).filter(function(t){return"string"==typeof t.insert}).map(function(t){return t.insert}).join("")}},{key:"insertEmbed",value:function(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new h.default).retain(t).insert(o({},e,n)))}},{key:"insertText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e.length,o,r[o])}),this.update((new h.default).retain(t).insert(e,(0,N.default)(r)))}},{key:"isBlank",value:function(){if(0==this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;var t=this.scroll.children.head;return t.statics.blotName===w.default.blotName&&(!(t.children.length>1)&&t.children.head instanceof k.default)}},{key:"removeFormat",value:function(t,e){var n=this.getText(t,e),r=this.scroll.line(t+e),o=u(r,2),i=o[0],l=o[1],a=0,s=new h.default;null!=i&&(a=i instanceof g.default?i.newlineIndex(l)-l+1:i.length()-l,s=i.delta().slice(l,l+a-1).insert("\n"));var c=this.getContents(t,e+a),f=c.diff((new h.default).insert(n).concat(s)),p=(new h.default).retain(t).concat(f);return this.applyDelta(p)}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(P)&&v.default.find(e[0].target)){var o=v.default.find(e[0].target),i=(0,O.bubbleFormats)(o),l=o.offset(this.scroll),a=e[0].oldValue.replace(_.default.CONTENTS,""),s=(new h.default).insert(a),u=(new h.default).insert(o.value());t=(new h.default).retain(l).concat(s.diff(u,n)).reduce(function(t,e){return e.insert?t.insert(e.insert,i):t.push(e)},new h.default),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,A.default)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}}]),t}();e.default=S},function(t,e){"use strict";function n(){}function r(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function o(){this._events=new n,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,l="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(l=!1)),o.prototype.eventNames=function(){var t,e,n=[];if(0===this._eventsCount)return n;for(e in t=this._events)i.call(t,e)&&n.push(l?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(t,e){var n=l?l+t:t,r=this._events[n];if(e)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=new Array(i);o0){if(i instanceof y.BlockEmbed||f instanceof y.BlockEmbed)return void this.optimize();if(i instanceof _.default){var h=i.newlineIndex(i.length(),!0);if(h>-1&&(i=i.split(h+1))===f)return void this.optimize()}else if(f instanceof _.default){var p=f.newlineIndex(0);p>-1&&f.split(p+1)}var d=f.children.head instanceof g.default?null:f.children.head;i.moveChildren(f,d),i.remove()}this.optimize()}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t)}},{key:"formatAt",value:function(t,n,r,o){(null==this.whitelist||this.whitelist[r])&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,n,r,o),this.optimize())}},{key:"insertAt",value:function(t,n,r){if(null==r||null==this.whitelist||this.whitelist[n]){if(t>=this.length())if(null==r||null==h.default.query(n,h.default.Scope.BLOCK)){var o=h.default.create(this.statics.defaultChild);this.appendChild(o),null==r&&n.endsWith("\n")&&(n=n.slice(0,-1)),o.insertAt(0,n,r)}else{var i=h.default.create(n,r);this.appendChild(i)}else c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r);this.optimize()}}},{key:"insertBefore",value:function(t,n){if(t.statics.scope===h.default.Scope.INLINE_BLOT){var r=h.default.create(this.statics.defaultChild);r.appendChild(t),t=r}c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n)}},{key:"leaf",value:function(t){return this.path(t).pop()||[null,-1]}},{key:"line",value:function(t){return t===this.length()?this.line(t-1):this.descendant(a,t)}},{key:"lines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return function t(e,n,r){var o=[],i=r;return e.children.forEachAt(n,r,function(e,n,r){a(e)?o.push(e):e instanceof h.default.Container&&(o=o.concat(t(e,n,i))),i-=r}),o}(this,t,e)}},{key:"optimize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!0!==this.batch&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t,n),t.length>0&&this.emitter.emit(d.default.events.SCROLL_OPTIMIZE,t,n))}},{key:"path",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"path",this).call(this,t).slice(1)}},{key:"update",value:function(t){if(!0!==this.batch){var n=d.default.sources.USER;"string"==typeof t&&(n=t),Array.isArray(t)||(t=this.observer.takeRecords()),t.length>0&&this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE,n,t),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"update",this).call(this,t.concat([])),t.length>0&&this.emitter.emit(d.default.events.SCROLL_UPDATE,n,t)}}}]),e}(h.default.Scroll);x.blotName="scroll",x.className="ql-editor",x.tagName="DIV",x.defaultChild="block",x.allowedChildren=[v.default,y.BlockEmbed,w.default],e.default=x},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){return"object"===(void 0===e?"undefined":x(e))?Object.keys(e).reduce(function(t,n){return s(t,n,e[n])},t):t.reduce(function(t,r){return r.attributes&&r.attributes[e]?t.push(r):t.insert(r.insert,(0,j.default)({},o({},e,n),r.attributes))},new q.default)}function u(t){if(t.nodeType!==Node.ELEMENT_NODE)return{};return t["__ql-computed-style"]||(t["__ql-computed-style"]=window.getComputedStyle(t))}function c(t,e){for(var n="",r=t.ops.length-1;r>=0&&n.length-1}function h(t,e,n){return t.nodeType===t.TEXT_NODE?n.reduce(function(e,n){return n(t,e)},new q.default):t.nodeType===t.ELEMENT_NODE?[].reduce.call(t.childNodes||[],function(r,o){var i=h(o,e,n);return o.nodeType===t.ELEMENT_NODE&&(i=e.reduce(function(t,e){return e(o,t)},i),i=(o[W]||[]).reduce(function(t,e){return e(o,t)},i)),r.concat(i)},new q.default):new q.default}function p(t,e,n){return s(n,t,!0)}function d(t,e){var n=P.default.Attributor.Attribute.keys(t),r=P.default.Attributor.Class.keys(t),o=P.default.Attributor.Style.keys(t),i={};return n.concat(r).concat(o).forEach(function(e){var n=P.default.query(e,P.default.Scope.ATTRIBUTE);null!=n&&(i[n.attrName]=n.value(t),i[n.attrName])||(n=Y[e],null==n||n.attrName!==e&&n.keyName!==e||(i[n.attrName]=n.value(t)||void 0),null==(n=X[e])||n.attrName!==e&&n.keyName!==e||(n=X[e],i[n.attrName]=n.value(t)||void 0))}),Object.keys(i).length>0&&(e=s(e,i)),e}function y(t,e){var n=P.default.query(t);if(null==n)return e;if(n.prototype instanceof P.default.Embed){var r={},o=n.value(t);null!=o&&(r[n.blotName]=o,e=(new q.default).insert(r,n.formats(t)))}else"function"==typeof n.formats&&(e=s(e,n.blotName,n.formats(t)));return e}function v(t,e){return c(e,"\n")||e.insert("\n"),e}function b(){return new q.default}function g(t,e){var n=P.default.query(t);if(null==n||"list-item"!==n.blotName||!c(e,"\n"))return e;for(var r=-1,o=t.parentNode;!o.classList.contains("ql-clipboard");)"list"===(P.default.query(o)||{}).blotName&&(r+=1),o=o.parentNode;return r<=0?e:e.compose((new q.default).retain(e.length()-1).retain(1,{indent:r}))}function m(t,e){return c(e,"\n")||(f(t)||e.length()>0&&t.nextSibling&&f(t.nextSibling))&&e.insert("\n"),e}function _(t,e){if(f(t)&&null!=t.nextElementSibling&&!c(e,"\n\n")){var n=t.offsetHeight+parseFloat(u(t).marginTop)+parseFloat(u(t).marginBottom);t.nextElementSibling.offsetTop>t.offsetTop+1.5*n&&e.insert("\n")}return e}function O(t,e){var n={},r=t.style||{};return r.fontStyle&&"italic"===u(t).fontStyle&&(n.italic=!0),r.fontWeight&&(u(t).fontWeight.startsWith("bold")||parseInt(u(t).fontWeight)>=700)&&(n.bold=!0),Object.keys(n).length>0&&(e=s(e,n)),parseFloat(r.textIndent||0)>0&&(e=(new q.default).insert("\t").concat(e)),e}function w(t,e){var n=t.data;if("O:P"===t.parentNode.tagName)return e.insert(n.trim());if(0===n.trim().length&&t.parentNode.classList.contains("ql-clipboard"))return e;if(!u(t.parentNode).whiteSpace.startsWith("pre")){var r=function(t,e){return e=e.replace(/[^\u00a0]/g,""),e.length<1&&t?" ":e};n=n.replace(/\r\n/g," ").replace(/\n/g," "),n=n.replace(/\s\s+/g,r.bind(r,!0)),(null==t.previousSibling&&f(t.parentNode)||null!=t.previousSibling&&f(t.previousSibling))&&(n=n.replace(/^\s+/,r.bind(r,!1))),(null==t.nextSibling&&f(t.parentNode)||null!=t.nextSibling&&f(t.nextSibling))&&(n=n.replace(/\s+$/,r.bind(r,!1)))}return e.insert(n)}Object.defineProperty(e,"__esModule",{value:!0}),e.matchText=e.matchSpacing=e.matchNewline=e.matchBlot=e.matchAttributor=e.default=void 0;var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var n=0;n\r?\n +\<"),this.convert();var e=this.quill.getFormat(this.quill.selection.savedRange.index);if(e[F.default.blotName]){var n=this.container.innerText;return this.container.innerHTML="",(new q.default).insert(n,o({},F.default.blotName,e[F.default.blotName]))}var r=this.prepareMatching(),i=k(r,2),l=i[0],a=i[1],s=h(this.container,l,a);return c(s,"\n")&&null==s.ops[s.ops.length-1].attributes&&(s=s.compose((new q.default).retain(s.length()-1).delete(1))),V.log("convert",this.container.innerHTML,s),this.container.innerHTML="",s}},{key:"dangerouslyPasteHTML",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:C.default.sources.API;if("string"==typeof t)this.quill.setContents(this.convert(t),e),this.quill.setSelection(0,C.default.sources.SILENT);else{var r=this.convert(e);this.quill.updateContents((new q.default).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),C.default.sources.SILENT)}}},{key:"onPaste",value:function(t){var e=this;if(!t.defaultPrevented&&this.quill.isEnabled()){var n=this.quill.getSelection(),r=(new q.default).retain(n.index),o=this.quill.scrollingContainer.scrollTop;this.container.focus(),this.quill.selection.update(C.default.sources.SILENT),setTimeout(function(){r=r.concat(e.convert()).delete(n.length),e.quill.updateContents(r,C.default.sources.USER),e.quill.setSelection(r.length()-n.length,C.default.sources.SILENT),e.quill.scrollingContainer.scrollTop=o,e.quill.focus()},1)}}},{key:"prepareMatching",value:function(){var t=this,e=[],n=[];return this.matchers.forEach(function(r){var o=k(r,2),i=o[0],l=o[1];switch(i){case Node.TEXT_NODE:n.push(l);break;case Node.ELEMENT_NODE:e.push(l);break;default:[].forEach.call(t.container.querySelectorAll(i),function(t){t[W]=t[W]||[],t[W].push(l)})}}),[e,n]}}]),e}(I.default);$.DEFAULTS={matchers:[],matchVisual:!0},e.default=$,e.matchAttributor=d,e.matchBlot=y,e.matchNewline=m,e.matchSpacing=_,e.matchText=w},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.ops[t.ops.length-1];return null!=e&&(null!=e.insert?"string"==typeof e.insert&&e.insert.endsWith("\n"):null!=e.attributes&&Object.keys(e.attributes).some(function(t){return null!=f.default.query(t,f.default.Scope.BLOCK)}))}function s(t){var e=t.reduce(function(t,e){return t+=e.delete||0},0),n=t.length()-e;return a(t)&&(n-=1),n}Object.defineProperty(e,"__esModule",{value:!0}),e.getLastChangeIndex=e.default=void 0;var u=function(){function t(t,e){for(var n=0;nr&&this.stack.undo.length>0){var o=this.stack.undo.pop();n=n.compose(o.undo),t=o.redo.compose(t)}else this.lastRecorded=r;this.stack.undo.push({redo:t,undo:n}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift()}}},{key:"redo",value:function(){this.change("redo","undo")}},{key:"transform",value:function(t){this.stack.undo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)}),this.stack.redo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)})}},{key:"undo",value:function(){this.change("undo","redo")}}]),e}(y.default);v.DEFAULTS={delay:1e3,maxStack:100,userOnly:!1},e.default=v,e.getLastChangeIndex=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.IndentClass=void 0;var l=function(){function t(t,e){for(var n=0;n0&&this.children.tail.format(t,e)}},{key:"formats",value:function(){return o({},this.statics.blotName,this.statics.formats(this.domNode))}},{key:"insertBefore",value:function(t,n){if(t instanceof v)u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n);else{var r=null==n?this.length():n.offset(this),o=this.split(r);o.parent.insertBefore(t,o)}}},{key:"optimize",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&n.domNode.tagName===this.domNode.tagName&&n.domNode.getAttribute("data-checked")===this.domNode.getAttribute("data-checked")&&(n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){if(t.statics.blotName!==this.statics.blotName){var n=f.default.create(this.statics.defaultChild);t.moveChildren(n),this.appendChild(n)}u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t)}}]),e}(y.default);b.blotName="list",b.scope=f.default.Scope.BLOCK_BLOT,b.tagName=["OL","UL"],b.defaultChild="list-item",b.allowedChildren=[v],e.ListItem=v,e.default=b},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(39),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="italic",s.tagName=["EM","I"],e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return"string"==typeof t&&n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"match",value:function(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}},{key:"sanitize",value:function(t){return(0,c.sanitize)(t,["http","https","data"])?t:"//:0"}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(u.default.Embed);h.blotName="image",h.tagName="IMG",e.default=h},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("frameborder","0"),n.setAttribute("allowfullscreen",!0),n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"sanitize",value:function(t){return c.default.sanitize(t)}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(s.BlockEmbed);h.blotName="video",h.className="ql-video",h.tagName="IFRAME",e.default=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.FormulaBlot=void 0;var a=function(){function t(t,e){for(var n=0;n0||null==this.cachedText)&&(this.domNode.innerHTML=t(e),this.domNode.normalize(),this.attach()),this.cachedText=e)}}]),e}(v.default);b.className="ql-syntax";var g=new c.default.Attributor.Class("token","hljs",{scope:c.default.Scope.INLINE}),m=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if("function"!=typeof r.options.highlight)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");var l=null;return r.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){clearTimeout(l),l=setTimeout(function(){r.highlight(),l=null},r.options.interval)}),r.highlight(),r}return l(e,t),a(e,null,[{key:"register",value:function(){h.default.register(g,!0),h.default.register(b,!0)}}]),a(e,[{key:"highlight",value:function(){var t=this;if(!this.quill.selection.composing){this.quill.update(h.default.sources.USER);var e=this.quill.getSelection();this.quill.scroll.descendants(b).forEach(function(e){e.highlight(t.options.highlight)}),this.quill.update(h.default.sources.SILENT),null!=e&&this.quill.setSelection(e,h.default.sources.SILENT)}}}]),e}(d.default);m.DEFAULTS={highlight:function(){return null==window.hljs?null:function(t){return window.hljs.highlightAuto(t).value}}(),interval:1e3},e.CodeBlock=b,e.CodeToken=g,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){var r=document.createElement("button");r.setAttribute("type","button"),r.classList.add("ql-"+e),null!=n&&(r.value=n),t.appendChild(r)}function u(t,e){Array.isArray(e[0])||(e=[e]),e.forEach(function(e){var n=document.createElement("span");n.classList.add("ql-formats"),e.forEach(function(t){if("string"==typeof t)s(n,t);else{var e=Object.keys(t)[0],r=t[e];Array.isArray(r)?c(n,e,r):s(n,e,r)}}),t.appendChild(n)})}function c(t,e,n){var r=document.createElement("select");r.classList.add("ql-"+e),n.forEach(function(t){var e=document.createElement("option");!1!==t?e.setAttribute("value",t):e.setAttribute("selected","selected"),r.appendChild(e)}),t.appendChild(r)}Object.defineProperty(e,"__esModule",{value:!0}),e.addControls=e.default=void 0;var f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BubbleTooltip=void 0;var a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=function(){function t(t,e){for(var n=0;n0&&o===h.default.sources.USER){r.show(),r.root.style.left="0px",r.root.style.width="",r.root.style.width=r.root.offsetWidth+"px";var i=r.quill.getLines(e.index,e.length);if(1===i.length)r.position(r.quill.getBounds(e));else{var l=i[i.length-1],a=r.quill.getIndex(l),s=Math.min(l.length()-1,e.index+e.length-a),u=r.quill.getBounds(new y.Range(a,s));r.position(u)}}else document.activeElement!==r.textbox&&r.quill.hasFocus()&&r.hide()}),r}return l(e,t),s(e,[{key:"listen",value:function(){var t=this;a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"listen",this).call(this),this.root.querySelector(".ql-close").addEventListener("click",function(){t.root.classList.remove("ql-editing")}),this.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){setTimeout(function(){if(!t.root.classList.contains("ql-hidden")){var e=t.quill.getSelection();null!=e&&t.position(t.quill.getBounds(e))}},1)})}},{key:"cancel",value:function(){this.show()}},{key:"position",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"position",this).call(this,t),r=this.root.querySelector(".ql-tooltip-arrow");if(r.style.marginLeft="",0===n)return n;r.style.marginLeft=-1*n-r.offsetWidth/2+"px"}}]),e}(p.BaseTooltip);_.TEMPLATE=['','
','','',"
"].join(""),e.BubbleTooltip=_,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n','','',''].join(""),e.default=w}]).default}); +//# sourceMappingURL=quill.min.js.map \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/quill.min.js.map b/Wino.Mail/JS/Quill/quill.min.js.map new file mode 100644 index 00000000..f2729907 --- /dev/null +++ b/Wino.Mail/JS/Quill/quill.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///quill.min.js","webpack:///webpack/bootstrap bc1e3bc04ac5f71cbeee","webpack:///./node_modules/parchment/src/parchment.ts","webpack:///./node_modules/parchment/src/registry.ts","webpack:///./node_modules/extend/index.js","webpack:///./blots/block.js","webpack:///./node_modules/quill-delta/lib/delta.js","webpack:///./blots/inline.js","webpack:///./core/quill.js","webpack:///./core/module.js","webpack:///./blots/text.js","webpack:///./core/emitter.js","webpack:///./core/logger.js","webpack:///./node_modules/parchment/src/attributor/attributor.ts","webpack:///./node_modules/deep-equal/index.js","webpack:///./formats/code.js","webpack:///./blots/break.js","webpack:///./formats/link.js","webpack:///./ui/picker.js","webpack:///./node_modules/parchment/src/blot/abstract/container.ts","webpack:///./node_modules/parchment/src/blot/abstract/format.ts","webpack:///./node_modules/parchment/src/blot/abstract/leaf.ts","webpack:///./node_modules/quill-delta/lib/op.js","webpack:///./node_modules/clone/clone.js","webpack:///./core/selection.js","webpack:///./blots/container.js","webpack:///./formats/color.js","webpack:///./modules/keyboard.js","webpack:///./ui/icons.js","webpack:///./node_modules/parchment/src/blot/abstract/shadow.ts","webpack:///./node_modules/parchment/src/attributor/store.ts","webpack:///./node_modules/parchment/src/attributor/class.ts","webpack:///./node_modules/parchment/src/attributor/style.ts","webpack:///./blots/cursor.js","webpack:///./core/theme.js","webpack:///./blots/embed.js","webpack:///./formats/align.js","webpack:///./formats/background.js","webpack:///./formats/direction.js","webpack:///./formats/font.js","webpack:///./formats/size.js","webpack:///./formats/bold.js","webpack:///./assets/icons/code.svg","webpack:///./ui/color-picker.js","webpack:///./ui/icon-picker.js","webpack:///./ui/tooltip.js","webpack:///./themes/base.js","webpack:///./quill.js","webpack:///./core.js","webpack:///./node_modules/parchment/src/collection/linked-list.ts","webpack:///./node_modules/parchment/src/blot/scroll.ts","webpack:///./node_modules/parchment/src/blot/inline.ts","webpack:///./node_modules/parchment/src/blot/block.ts","webpack:///./node_modules/parchment/src/blot/embed.ts","webpack:///./node_modules/parchment/src/blot/text.ts","webpack:///./core/polyfill.js","webpack:///./node_modules/fast-diff/diff.js","webpack:///./node_modules/deep-equal/lib/keys.js","webpack:///./node_modules/deep-equal/lib/is_arguments.js","webpack:///./core/editor.js","webpack:///./node_modules/eventemitter3/index.js","webpack:///./blots/scroll.js","webpack:///./modules/clipboard.js","webpack:///./modules/history.js","webpack:///./formats/indent.js","webpack:///./formats/blockquote.js","webpack:///./formats/header.js","webpack:///./formats/list.js","webpack:///./formats/italic.js","webpack:///./formats/script.js","webpack:///./formats/strike.js","webpack:///./formats/underline.js","webpack:///./formats/image.js","webpack:///./formats/video.js","webpack:///./modules/formula.js","webpack:///./modules/syntax.js","webpack:///./modules/toolbar.js","webpack:///./assets/icons/align-left.svg","webpack:///./assets/icons/align-center.svg","webpack:///./assets/icons/align-right.svg","webpack:///./assets/icons/align-justify.svg","webpack:///./assets/icons/background.svg","webpack:///./assets/icons/blockquote.svg","webpack:///./assets/icons/bold.svg","webpack:///./assets/icons/clean.svg","webpack:///./assets/icons/color.svg","webpack:///./assets/icons/direction-ltr.svg","webpack:///./assets/icons/direction-rtl.svg","webpack:///./assets/icons/float-center.svg","webpack:///./assets/icons/float-full.svg","webpack:///./assets/icons/float-left.svg","webpack:///./assets/icons/float-right.svg","webpack:///./assets/icons/formula.svg","webpack:///./assets/icons/header.svg","webpack:///./assets/icons/header-2.svg","webpack:///./assets/icons/italic.svg","webpack:///./assets/icons/image.svg","webpack:///./assets/icons/indent.svg","webpack:///./assets/icons/outdent.svg","webpack:///./assets/icons/link.svg","webpack:///./assets/icons/list-ordered.svg","webpack:///./assets/icons/list-bullet.svg","webpack:///./assets/icons/list-check.svg","webpack:///./assets/icons/subscript.svg","webpack:///./assets/icons/superscript.svg","webpack:///./assets/icons/strike.svg","webpack:///./assets/icons/underline.svg","webpack:///./assets/icons/video.svg","webpack:///./assets/icons/dropdown.svg","webpack:///./themes/bubble.js","webpack:///./themes/snow.js"],"names":["root","factory","exports","module","define","amd","self","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","value","container_1","format_1","leaf_1","scroll_1","inline_1","block_1","embed_1","text_1","attributor_1","class_1","style_1","store_1","Registry","Parchment","Scope","create","find","query","register","Container","default","Format","Leaf","Embed","Scroll","Block","Inline","Text","Attributor","Attribute","Class","Style","Store","input","match","ParchmentError","BlotClass","Node","TEXT_NODE","node","bubble","DATA_KEY","blot","parentNode","scope","ANY","types","attributes","LEVEL","BLOCK","INLINE","HTMLElement","names","getAttribute","split","classes","tags","tagName","TYPE","Definitions","_i","arguments","length","map","Definition","blotName","attrName","keyName","className","Array","isArray","toUpperCase","tagNames","forEach","tag","__extends","extendStatics","setPrototypeOf","__proto__","b","__","constructor","_super","message","_this","Error","hasOwn","toStr","toString","arr","isPlainObject","obj","hasOwnConstructor","hasIsPrototypeOf","key","extend","options","src","copy","copyIsArray","clone","target","deep","_interopRequireDefault","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","writable","bubbleFormats","formats","undefined","_extend2","parent","statics","BlockEmbed","_createClass","defineProperties","props","descriptor","protoProps","staticProps","_get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","_extend","_quillDelta","_quillDelta2","_parchment","_parchment2","_break","_break2","_inline","_inline2","_text","_text2","_Parchment$Embed","apply","domNode","insert","values","attribute","BLOCK_ATTRIBUTE","index","format","def","endsWith","block","insertBefore","next","insertAt","slice","BLOCK_BLOT","_Parchment$Block","_this2","cache","delta","descendants","reduce","leaf","Math","min","lines","text","shift","children","tail","line","ref","head","remove","context","child","force","defaultChild","allowedChildren","diff","equal","op","NULL_CHARACTER","String","fromCharCode","Delta","ops","newOp","keys","push","delete","retain","lastOp","unshift","splice","chop","pop","filter","predicate","partition","passed","failed","initial","changeLength","elem","start","end","Infinity","iter","iterator","hasNext","nextOp","compose","other","thisIter","otherIter","peekType","peekLength","thisOp","otherOp","concat","strings","prep","join","diffResult","component","opLength","INSERT","DELETE","EQUAL","eachLine","newline","peek","indexOf","transform","priority","transformPosition","offset","nextType","_Parchment$Inline","compare","BLOT","isolate","wrap","moveChildren","selfIndex","order","otherIndex","_defineProperty","expandConfig","container","userConfig","clipboard","keyboard","history","theme","Quill","DEFAULTS","import","_theme2","themeConfig","config","moduleNames","moduleConfig","moduleClass","debug","error","toolbar","document","querySelector","modify","modifier","source","strict","isEnabled","_emitter4","sources","USER","range","getSelection","oldDelta","editor","change","shiftRange","setSelection","SILENT","_emitter","args","events","TEXT_CHANGE","emitter","emit","EDITOR_CHANGE","_emitter2","overload","_typeof","API","_map","pos","_map2","_slicedToArray","_map3","max","_map4","_selection","Range","Symbol","sliceIterator","_arr","_n","_d","_e","_s","done","err","_editor","_editor2","_emitter3","_module","_module2","_selection2","_logger","_logger2","_theme","html","innerHTML","trim","classList","add","__quill","addContainer","setAttribute","scrollingContainer","scroll","whitelist","selection","addModule","init","on","type","toggle","isBlank","SCROLL_UPDATE","mutations","lastRange","update","contents","convert","setContents","clear","placeholder","readOnly","disable","limit","level","imports","path","overwrite","warn","startsWith","refNode","createElement","setRange","_this3","_overload","_overload2","deleteText","enable","enabled","scrollTop","focus","scrollIntoView","_this4","formatLine","formatText","_this5","_overload3","_overload4","_this6","_overload5","_overload6","bounds","getBounds","containerBounds","getBoundingClientRect","bottom","top","height","left","right","width","getLength","_overload7","_overload8","getContents","getFormat","Number","MAX_VALUE","getRange","_overload9","_overload10","getText","hasFocus","embed","_this7","insertEmbed","_this8","_overload11","_overload12","insertText","contains","off","once","dangerouslyPasteHTML","_this9","_overload13","_overload14","removeFormat","_this10","deleted","applied","applyDelta","_overload15","_overload16","_this11","version","parchment","core/module","core/theme","Module","quill","TextBlot","_Parchment$Text","_eventemitter","_eventemitter2","eventName","addEventListener","_len","_key","querySelectorAll","_node$__quill$emitter","handleDOM","Emitter","_EventEmitter","listeners","log","event","_len2","_key2","_ref","handler","SCROLL_BEFORE_UPDATE","SCROLL_OPTIMIZE","SELECTION_CHANGE","method","levels","_console","console","namespace","ns","logger","bind","newLevel","attributeBit","ATTRIBUTE","item","canAdd","replace","removeAttribute","isUndefinedOrNull","isBuffer","x","objEquiv","a","opts","isArguments","pSlice","deepEqual","ka","objectKeys","kb","e","sort","actual","expected","Date","getTime","Code","_block","_block2","_Inline","CodeBlock","_Block","textContent","frag","_descendant","descendant","_descendant2","deleteAt","nextNewline","newlineIndex","prevNewline","isolateLength","formatAt","_descendant3","_descendant4","searchIndex","lastIndexOf","appendChild","prev","optimize","removeChild","unwrap","TAB","Break","sanitize","url","protocols","anchor","href","protocol","Link","PROTOCOL_WHITELIST","SANITIZED_URL","toggleAriaAttribute","element","_keyboard","_keyboard2","_dropdown","_dropdown2","optionsCounter","Picker","select","buildPicker","style","display","label","togglePicker","keyCode","ENTER","ESCAPE","escape","preventDefault","option","tabIndex","hasAttribute","selectItem","id","buildItem","selected","buildLabel","buildOptions","close","setTimeout","trigger","selectedIndex","Event","dispatchEvent","createEvent","initEvent","isActive","makeBlot","childNodes","replaceChild","attach","linked_list_1","shadow_1","ContainerBlot","build","reverse","forEachAt","criteria","_a","lengthLeft","detach","childBlot","refBlot","some","insertInto","memo","targetParent","inclusive","position","after","addedNodes","removedNodes","mutation","body","compareDocumentPosition","DOCUMENT_POSITION_CONTAINED_BY","DOCUMENT_POSITION_FOLLOWING","nextSibling","FormatBlot","toLowerCase","replaceWith","replacement","wrapper","move","LeafBlot","INLINE_BLOT","Iterator","lib","keepNull","retOp","substr","_instanceof","circular","depth","includeNonEnumerable","_clone","proto","nativeMap","nativeSet","nativePromise","resolve","reject","then","__isArray","__isRegExp","RegExp","__getRegExpFlags","lastIndex","__isDate","useBuffer","Buffer","allParents","allChildren","keyChild","valueChild","set","entryChild","attrs","getOwnPropertySymbols","symbols","symbol","allPropertyNames","getOwnPropertyNames","propertyName","__objToStr","re","flags","global","ignoreCase","multiline","Map","_","Set","Promise","clonePrototype","_toConsumableArray","arr2","from","_clone2","_deepEqual","_deepEqual2","Selection","composing","mouseDown","cursor","savedRange","handleComposition","handleDragging","listenDOM","native","getNativeRange","textNode","setNativeRange","ignored","_context$range","startNode","startOffset","endNode","endOffset","restore","nativeRange","collapsed","data","scrollLength","_scroll$leaf","_scroll$leaf2","_leaf$position","_leaf$position2","createRange","setStart","_scroll$leaf3","_scroll$leaf4","_leaf$position3","_leaf$position4","setEnd","side","rect","rangeCount","getRangeAt","normalizeNative","info","normalized","normalizedToRange","activeElement","positions","indexes","_position","startContainer","endContainer","lastChild","_scroll$leaf5","_scroll$leaf6","_leaf$position5","_leaf$position6","_scroll$line","_scroll$line2","first","last","_scroll$line3","scrollBounds","removeAllRanges","addRange","blur","rangeToNative","oldRange","_getRange","_getRange2","_Parchment$Container","ColorStyle","ColorClass","ColorAttributor","_Parchment$Attributor","parseInt","makeEmbedArrowHandler","shiftKey","_ref3","where","Keyboard","LEFT","altKey","RIGHT","_quill$getLeaf3","getLeaf","_quill2","handleBackspace","_quill$getLine11","getLine","_quill$getLine12","_quill$getLine13","_quill$getLine14","curFormats","prevFormats","_op2","test","prefix","handleDelete","suffix","nextLength","_quill$getLine15","_quill$getLine16","_quill$getLine17","_quill$getLine18","nextFormats","handleDeleteRange","getLines","firstFormats","lastFormats","handleEnter","lineFormats","makeCodeBlockHandler","indent","code-block","_quill$scroll$descend","_quill$scroll$descend2","scrollIndex","getIndex","makeFormatHandler","shortKey","normalize","binding","charCodeAt","SHORTKEY","_op","_quill","navigator","platform","_Module","bindings","addBinding","metaKey","ctrlKey","userAgent","BACKSPACE","listen","evt","which","defaultPrevented","_quill$getLine","_quill$getLine2","_quill$getLeaf","_quill$getLeaf2","leafStart","offsetStart","_ref2","leafEnd","offsetEnd","prefixText","suffixText","curContext","empty","every","UP","DOWN","bold","italic","underline","outdent","outdent backspace","list","indent code-block","outdent code-block","remove tab","tab","cutoff","updateContents","list empty enter","checklist enter","_quill$getLine3","_quill$getLine4","header enter","_quill$getLine5","_quill$getLine6","header","list autofill","_quill$getLine7","_quill$getLine8","code exit","_quill$getLine9","_quill$getLine10","embed left","embed left shift","embed right","embed right shift","align","","center","justify","background","blockquote","clean","code","color","direction","rtl","float","full","formula","1","2","image","+1","-1","link","ordered","bullet","check","script","sub","super","strike","video","ShadowBlot","cloneNode","parentBlot","refDomNode","AttributorStore","styles","attr","ClassAttributor","result","camelize","parts","rest","part","StyleAttributor","Cursor","createTextNode","CONTENTS","_length","restoreText","Theme","themes","GUARD_TEXT","contentNode","childNode","leftGuard","rightGuard","prevLength","AlignStyle","AlignClass","AlignAttribute","BackgroundStyle","BackgroundClass","_color","DirectionStyle","DirectionClass","DirectionAttribute","FontClass","FontStyle","FontStyleAttributor","SizeStyle","SizeClass","Bold","_picker","_picker2","ColorPicker","_Picker","backgroundColor","colorLabel","stroke","fill","IconPicker","icons","defaultItem","Tooltip","boundsContainer","TEMPLATE","marginTop","hide","reference","offsetWidth","rootBounds","verticalShift","extractVideoUrl","fillSelect","defaultValue","BaseTooltip","_colorPicker","_colorPicker2","_iconPicker","_iconPicker2","_tooltip","_tooltip2","ALIGNS","COLORS","FONTS","HEADERS","SIZES","BaseTheme","_Theme","listener","removeEventListener","tooltip","textbox","pickers","picker","extendToolbar","buttons","button","selects","handlers","edit","fileInput","files","reader","FileReader","onload","readAsDataURL","click","_Tooltip","save","cancel","mode","preview","linkRange","restoreFocus","_core","_core2","_align","_direction","_indent","_blockquote","_blockquote2","_header","_header2","_list","_list2","_background","_font","_size","_bold","_bold2","_italic","_italic2","_link","_link2","_script","_script2","_strike","_strike2","_underline","_underline2","_image","_image2","_video","_video2","_code","_code2","_formula","_formula2","_syntax","_syntax2","_toolbar","_toolbar2","_icons","_icons2","_bubble","_bubble2","_snow","_snow2","attributors/attribute/direction","attributors/class/align","attributors/class/background","attributors/class/color","attributors/class/direction","attributors/class/font","attributors/class/size","attributors/style/align","attributors/style/background","attributors/style/color","attributors/style/direction","attributors/style/font","attributors/style/size","formats/align","formats/direction","formats/indent","IndentClass","formats/background","formats/color","formats/font","formats/size","formats/blockquote","formats/code-block","formats/header","formats/list","formats/bold","formats/code","formats/italic","formats/link","formats/script","formats/strike","formats/underline","formats/image","formats/video","formats/list/item","ListItem","modules/formula","modules/syntax","modules/toolbar","themes/bubble","themes/snow","ui/icons","ui/picker","ui/icon-picker","ui/color-picker","ui/tooltip","_container","_container2","_cursor","_cursor2","_embed","_embed2","_scroll","_scroll2","_clipboard","_clipboard2","_history","_history2","blots/block","blots/block/embed","blots/break","blots/container","blots/cursor","blots/embed","blots/inline","blots/scroll","blots/text","modules/clipboard","modules/history","modules/keyboard","LinkedList","append","nodes","cur","curNode","ret","callback","curIndex","curLength","OBSERVER_CONFIG","characterData","characterDataOldValue","childList","subtree","ScrollBlot","observer","MutationObserver","observe","disconnect","records","takeRecords","mark","markParent","remaining","previousSibling","grandChild","isEqual","obj1","obj2","prop","InlineBlot","BlockBlot","EmbedBlot","splitText","_toggle","DOMTokenList","token","searchString","subjectString","isFinite","floor","thisArg","execCommand","diff_main","text1","text2","cursor_pos","DIFF_EQUAL","commonlength","diff_commonPrefix","commonprefix","substring","diff_commonSuffix","commonsuffix","diffs","diff_compute_","diff_cleanupMerge","fix_cursor","fix_emoji","DIFF_INSERT","DIFF_DELETE","longtext","shorttext","hm","diff_halfMatch_","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","diff_bisect_","text1_length","text2_length","max_d","ceil","v_offset","v_length","v1","v2","front","k1start","k1end","k2start","k2end","k1","x1","k1_offset","y1","charAt","k2_offset","x2","diff_bisectSplit_","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","pointermin","pointermax","pointermid","pointerstart","pointerend","diff_halfMatchI_","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","seed","j","best_common","prefixLength","suffixLength","hm1","hm2","pointer","count_delete","count_insert","text_delete","text_insert","changes","cursor_normalize_diff","current_pos","next_pos","split_pos","d_left","d_right","norm","ndiffs","cursor_pointer","d_next","merge_tuples","compact","starts_with_pair_end","str","fixed_diffs","left_d","right_d","shim","supported","unsupported","propertyIsEnumerable","supportsArgumentsClass","combineFormats","combined","merged","normalizeDelta","ASCII","Editor","getDelta","consumeNextNewline","batchStart","_line$descendant","_line$descendant2","batchEnd","lengthRemaining","lineLength","codeIndex","codeLength","leaves","_path","formatsArr","blots","_scroll$line4","cursorIndex","textBlot","oldValue","oldText","newText","Events","EE","fn","EventEmitter","_events","_eventsCount","has","eventNames","exists","available","ee","a1","a2","a3","a4","a5","len","removeListener","removeAllListeners","addListener","setMaxListeners","prefixed","isLine","_Parchment$Scroll","batch","_line","_line2","_line3","_line4","applyFormat","_extend3","computeStyle","nodeType","ELEMENT_NODE","window","getComputedStyle","deltaEndsWith","endText","traverse","elementMatchers","textMatchers","matcher","childrenDelta","DOM_KEY","matchAlias","matchAttributor","ATTRIBUTE_ATTRIBUTORS","STYLE_ATTRIBUTORS","matchBlot","matchBreak","matchIgnore","matchIndent","matchNewline","matchSpacing","nextElementSibling","nodeHeight","offsetHeight","parseFloat","marginBottom","offsetTop","matchStyles","fontStyle","fontWeight","textIndent","matchText","whiteSpace","replacer","collapse","CLIPBOARD_CONFIG","Clipboard","onPaste","matchers","selector","matchVisual","addMatcher","innerText","_prepareMatching","prepareMatching","_prepareMatching2","paste","pair","_pair","endsWithNewlineChange","getLastChangeIndex","deleteLength","changeIndex","History","lastRecorded","ignoreChange","userOnly","record","undo","redo","dest","stack","changeDelta","undoDelta","timestamp","now","delay","maxStack","IdentAttributor","Blockquote","Header","List","_Container","listEventHandler","Italic","_Bold","Script","Strike","Underline","ATTRIBUTES","Image","Video","_BlockEmbed","FormulaBlot","_Embed","katex","render","throwOnError","errorColor","Formula","CodeToken","SyntaxCodeBlock","_CodeBlock","highlight","cachedText","Syntax","timer","clearTimeout","interval","hljs","highlightAuto","addButton","addControls","groups","controls","group","control","addSelect","Toolbar","_ret","addHandler","_this$quill$selection","_this$quill$selection2","_quill$selection$getR","_quill$selection$getR2","prompt","BubbleTooltip","_base","_base2","TOOLBAR_CONFIG","BubbleTheme","_BaseTheme","buildButtons","buildPickers","_BaseTooltip","show","lastLine","arrow","marginLeft","SnowTheme","SnowTooltip"],"mappings":"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","file":"quill.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Quill\"] = factory();\n\telse\n\t\troot[\"Quill\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/*!\n * Quill Editor v1.3.6\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Quill\"] = factory();\n\telse\n\t\troot[\"Quill\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 45);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar container_1 = __webpack_require__(17);\nvar format_1 = __webpack_require__(18);\nvar leaf_1 = __webpack_require__(19);\nvar scroll_1 = __webpack_require__(48);\nvar inline_1 = __webpack_require__(49);\nvar block_1 = __webpack_require__(50);\nvar embed_1 = __webpack_require__(51);\nvar text_1 = __webpack_require__(52);\nvar attributor_1 = __webpack_require__(11);\nvar class_1 = __webpack_require__(29);\nvar style_1 = __webpack_require__(30);\nvar store_1 = __webpack_require__(28);\nvar Registry = __webpack_require__(1);\nvar Parchment = {\n Scope: Registry.Scope,\n create: Registry.create,\n find: Registry.find,\n query: Registry.query,\n register: Registry.register,\n Container: container_1.default,\n Format: format_1.default,\n Leaf: leaf_1.default,\n Embed: embed_1.default,\n Scroll: scroll_1.default,\n Block: block_1.default,\n Inline: inline_1.default,\n Text: text_1.default,\n Attributor: {\n Attribute: attributor_1.default,\n Class: class_1.default,\n Style: style_1.default,\n Store: store_1.default,\n },\n};\nexports.default = Parchment;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ParchmentError = /** @class */ (function (_super) {\n __extends(ParchmentError, _super);\n function ParchmentError(message) {\n var _this = this;\n message = '[Parchment] ' + message;\n _this = _super.call(this, message) || this;\n _this.message = message;\n _this.name = _this.constructor.name;\n return _this;\n }\n return ParchmentError;\n}(Error));\nexports.ParchmentError = ParchmentError;\nvar attributes = {};\nvar classes = {};\nvar tags = {};\nvar types = {};\nexports.DATA_KEY = '__blot';\nvar Scope;\n(function (Scope) {\n Scope[Scope[\"TYPE\"] = 3] = \"TYPE\";\n Scope[Scope[\"LEVEL\"] = 12] = \"LEVEL\";\n Scope[Scope[\"ATTRIBUTE\"] = 13] = \"ATTRIBUTE\";\n Scope[Scope[\"BLOT\"] = 14] = \"BLOT\";\n Scope[Scope[\"INLINE\"] = 7] = \"INLINE\";\n Scope[Scope[\"BLOCK\"] = 11] = \"BLOCK\";\n Scope[Scope[\"BLOCK_BLOT\"] = 10] = \"BLOCK_BLOT\";\n Scope[Scope[\"INLINE_BLOT\"] = 6] = \"INLINE_BLOT\";\n Scope[Scope[\"BLOCK_ATTRIBUTE\"] = 9] = \"BLOCK_ATTRIBUTE\";\n Scope[Scope[\"INLINE_ATTRIBUTE\"] = 5] = \"INLINE_ATTRIBUTE\";\n Scope[Scope[\"ANY\"] = 15] = \"ANY\";\n})(Scope = exports.Scope || (exports.Scope = {}));\nfunction create(input, value) {\n var match = query(input);\n if (match == null) {\n throw new ParchmentError(\"Unable to create \" + input + \" blot\");\n }\n var BlotClass = match;\n var node = \n // @ts-ignore\n input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value);\n return new BlotClass(node, value);\n}\nexports.create = create;\nfunction find(node, bubble) {\n if (bubble === void 0) { bubble = false; }\n if (node == null)\n return null;\n // @ts-ignore\n if (node[exports.DATA_KEY] != null)\n return node[exports.DATA_KEY].blot;\n if (bubble)\n return find(node.parentNode, bubble);\n return null;\n}\nexports.find = find;\nfunction query(query, scope) {\n if (scope === void 0) { scope = Scope.ANY; }\n var match;\n if (typeof query === 'string') {\n match = types[query] || attributes[query];\n // @ts-ignore\n }\n else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) {\n match = types['text'];\n }\n else if (typeof query === 'number') {\n if (query & Scope.LEVEL & Scope.BLOCK) {\n match = types['block'];\n }\n else if (query & Scope.LEVEL & Scope.INLINE) {\n match = types['inline'];\n }\n }\n else if (query instanceof HTMLElement) {\n var names = (query.getAttribute('class') || '').split(/\\s+/);\n for (var i in names) {\n match = classes[names[i]];\n if (match)\n break;\n }\n match = match || tags[query.tagName];\n }\n if (match == null)\n return null;\n // @ts-ignore\n if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope)\n return match;\n return null;\n}\nexports.query = query;\nfunction register() {\n var Definitions = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n Definitions[_i] = arguments[_i];\n }\n if (Definitions.length > 1) {\n return Definitions.map(function (d) {\n return register(d);\n });\n }\n var Definition = Definitions[0];\n if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') {\n throw new ParchmentError('Invalid definition');\n }\n else if (Definition.blotName === 'abstract') {\n throw new ParchmentError('Cannot register abstract class');\n }\n types[Definition.blotName || Definition.attrName] = Definition;\n if (typeof Definition.keyName === 'string') {\n attributes[Definition.keyName] = Definition;\n }\n else {\n if (Definition.className != null) {\n classes[Definition.className] = Definition;\n }\n if (Definition.tagName != null) {\n if (Array.isArray(Definition.tagName)) {\n Definition.tagName = Definition.tagName.map(function (tagName) {\n return tagName.toUpperCase();\n });\n }\n else {\n Definition.tagName = Definition.tagName.toUpperCase();\n }\n var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName];\n tagNames.forEach(function (tag) {\n if (tags[tag] == null || Definition.className == null) {\n tags[tag] = Definition;\n }\n });\n }\n }\n return Definition;\n}\nexports.register = register;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = target[name];\n\t\t\t\tcopy = options[name];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\ttarget[name] = extend(deep, clone, copy);\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\ttarget[name] = copy;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.BlockEmbed = exports.bubbleFormats = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _break = __webpack_require__(14);\n\nvar _break2 = _interopRequireDefault(_break);\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nvar _text = __webpack_require__(8);\n\nvar _text2 = _interopRequireDefault(_text);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar NEWLINE_LENGTH = 1;\n\nvar BlockEmbed = function (_Parchment$Embed) {\n _inherits(BlockEmbed, _Parchment$Embed);\n\n function BlockEmbed() {\n _classCallCheck(this, BlockEmbed);\n\n return _possibleConstructorReturn(this, (BlockEmbed.__proto__ || Object.getPrototypeOf(BlockEmbed)).apply(this, arguments));\n }\n\n _createClass(BlockEmbed, [{\n key: 'attach',\n value: function attach() {\n _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'attach', this).call(this);\n this.attributes = new _parchment2.default.Attributor.Store(this.domNode);\n }\n }, {\n key: 'delta',\n value: function delta() {\n return new _quillDelta2.default().insert(this.value(), (0, _extend2.default)(this.formats(), this.attributes.values()));\n }\n }, {\n key: 'format',\n value: function format(name, value) {\n var attribute = _parchment2.default.query(name, _parchment2.default.Scope.BLOCK_ATTRIBUTE);\n if (attribute != null) {\n this.attributes.attribute(attribute, value);\n }\n }\n }, {\n key: 'formatAt',\n value: function formatAt(index, length, name, value) {\n this.format(name, value);\n }\n }, {\n key: 'insertAt',\n value: function insertAt(index, value, def) {\n if (typeof value === 'string' && value.endsWith('\\n')) {\n var block = _parchment2.default.create(Block.blotName);\n this.parent.insertBefore(block, index === 0 ? this : this.next);\n block.insertAt(0, value.slice(0, -1));\n } else {\n _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'insertAt', this).call(this, index, value, def);\n }\n }\n }]);\n\n return BlockEmbed;\n}(_parchment2.default.Embed);\n\nBlockEmbed.scope = _parchment2.default.Scope.BLOCK_BLOT;\n// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\n\nvar Block = function (_Parchment$Block) {\n _inherits(Block, _Parchment$Block);\n\n function Block(domNode) {\n _classCallCheck(this, Block);\n\n var _this2 = _possibleConstructorReturn(this, (Block.__proto__ || Object.getPrototypeOf(Block)).call(this, domNode));\n\n _this2.cache = {};\n return _this2;\n }\n\n _createClass(Block, [{\n key: 'delta',\n value: function delta() {\n if (this.cache.delta == null) {\n this.cache.delta = this.descendants(_parchment2.default.Leaf).reduce(function (delta, leaf) {\n if (leaf.length() === 0) {\n return delta;\n } else {\n return delta.insert(leaf.value(), bubbleFormats(leaf));\n }\n }, new _quillDelta2.default()).insert('\\n', bubbleFormats(this));\n }\n return this.cache.delta;\n }\n }, {\n key: 'deleteAt',\n value: function deleteAt(index, length) {\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'deleteAt', this).call(this, index, length);\n this.cache = {};\n }\n }, {\n key: 'formatAt',\n value: function formatAt(index, length, name, value) {\n if (length <= 0) return;\n if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) {\n if (index + length === this.length()) {\n this.format(name, value);\n }\n } else {\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'formatAt', this).call(this, index, Math.min(length, this.length() - index - 1), name, value);\n }\n this.cache = {};\n }\n }, {\n key: 'insertAt',\n value: function insertAt(index, value, def) {\n if (def != null) return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, index, value, def);\n if (value.length === 0) return;\n var lines = value.split('\\n');\n var text = lines.shift();\n if (text.length > 0) {\n if (index < this.length() - 1 || this.children.tail == null) {\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, Math.min(index, this.length() - 1), text);\n } else {\n this.children.tail.insertAt(this.children.tail.length(), text);\n }\n this.cache = {};\n }\n var block = this;\n lines.reduce(function (index, line) {\n block = block.split(index, true);\n block.insertAt(0, line);\n return line.length;\n }, index + text.length);\n }\n }, {\n key: 'insertBefore',\n value: function insertBefore(blot, ref) {\n var head = this.children.head;\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertBefore', this).call(this, blot, ref);\n if (head instanceof _break2.default) {\n head.remove();\n }\n this.cache = {};\n }\n }, {\n key: 'length',\n value: function length() {\n if (this.cache.length == null) {\n this.cache.length = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'length', this).call(this) + NEWLINE_LENGTH;\n }\n return this.cache.length;\n }\n }, {\n key: 'moveChildren',\n value: function moveChildren(target, ref) {\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'moveChildren', this).call(this, target, ref);\n this.cache = {};\n }\n }, {\n key: 'optimize',\n value: function optimize(context) {\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'optimize', this).call(this, context);\n this.cache = {};\n }\n }, {\n key: 'path',\n value: function path(index) {\n return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'path', this).call(this, index, true);\n }\n }, {\n key: 'removeChild',\n value: function removeChild(child) {\n _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'removeChild', this).call(this, child);\n this.cache = {};\n }\n }, {\n key: 'split',\n value: function split(index) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n var clone = this.clone();\n if (index === 0) {\n this.parent.insertBefore(clone, this);\n return this;\n } else {\n this.parent.insertBefore(clone, this.next);\n return clone;\n }\n } else {\n var next = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'split', this).call(this, index, force);\n this.cache = {};\n return next;\n }\n }\n }]);\n\n return Block;\n}(_parchment2.default.Block);\n\nBlock.blotName = 'block';\nBlock.tagName = 'P';\nBlock.defaultChild = 'break';\nBlock.allowedChildren = [_inline2.default, _parchment2.default.Embed, _text2.default];\n\nfunction bubbleFormats(blot) {\n var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (blot == null) return formats;\n if (typeof blot.formats === 'function') {\n formats = (0, _extend2.default)(formats, blot.formats());\n }\n if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {\n return formats;\n }\n return bubbleFormats(blot.parent, formats);\n}\n\nexports.bubbleFormats = bubbleFormats;\nexports.BlockEmbed = BlockEmbed;\nexports.default = Block;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar diff = __webpack_require__(54);\nvar equal = __webpack_require__(12);\nvar extend = __webpack_require__(2);\nvar op = __webpack_require__(20);\n\n\nvar NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()\n\n\nvar Delta = function (ops) {\n // Assume we are given a well formed ops\n if (Array.isArray(ops)) {\n this.ops = ops;\n } else if (ops != null && Array.isArray(ops.ops)) {\n this.ops = ops.ops;\n } else {\n this.ops = [];\n }\n};\n\n\nDelta.prototype.insert = function (text, attributes) {\n var newOp = {};\n if (text.length === 0) return this;\n newOp.insert = text;\n if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n};\n\nDelta.prototype['delete'] = function (length) {\n if (length <= 0) return this;\n return this.push({ 'delete': length });\n};\n\nDelta.prototype.retain = function (length, attributes) {\n if (length <= 0) return this;\n var newOp = { retain: length };\n if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n};\n\nDelta.prototype.push = function (newOp) {\n var index = this.ops.length;\n var lastOp = this.ops[index - 1];\n newOp = extend(true, {}, newOp);\n if (typeof lastOp === 'object') {\n if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') {\n this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] };\n return this;\n }\n // Since it does not matter if we insert before or after deleting at the same index,\n // always prefer to insert first\n if (typeof lastOp['delete'] === 'number' && newOp.insert != null) {\n index -= 1;\n lastOp = this.ops[index - 1];\n if (typeof lastOp !== 'object') {\n this.ops.unshift(newOp);\n return this;\n }\n }\n if (equal(newOp.attributes, lastOp.attributes)) {\n if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') {\n this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n return this;\n } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') {\n this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n return this;\n }\n }\n }\n if (index === this.ops.length) {\n this.ops.push(newOp);\n } else {\n this.ops.splice(index, 0, newOp);\n }\n return this;\n};\n\nDelta.prototype.chop = function () {\n var lastOp = this.ops[this.ops.length - 1];\n if (lastOp && lastOp.retain && !lastOp.attributes) {\n this.ops.pop();\n }\n return this;\n};\n\nDelta.prototype.filter = function (predicate) {\n return this.ops.filter(predicate);\n};\n\nDelta.prototype.forEach = function (predicate) {\n this.ops.forEach(predicate);\n};\n\nDelta.prototype.map = function (predicate) {\n return this.ops.map(predicate);\n};\n\nDelta.prototype.partition = function (predicate) {\n var passed = [], failed = [];\n this.forEach(function(op) {\n var target = predicate(op) ? passed : failed;\n target.push(op);\n });\n return [passed, failed];\n};\n\nDelta.prototype.reduce = function (predicate, initial) {\n return this.ops.reduce(predicate, initial);\n};\n\nDelta.prototype.changeLength = function () {\n return this.reduce(function (length, elem) {\n if (elem.insert) {\n return length + op.length(elem);\n } else if (elem.delete) {\n return length - elem.delete;\n }\n return length;\n }, 0);\n};\n\nDelta.prototype.length = function () {\n return this.reduce(function (length, elem) {\n return length + op.length(elem);\n }, 0);\n};\n\nDelta.prototype.slice = function (start, end) {\n start = start || 0;\n if (typeof end !== 'number') end = Infinity;\n var ops = [];\n var iter = op.iterator(this.ops);\n var index = 0;\n while (index < end && iter.hasNext()) {\n var nextOp;\n if (index < start) {\n nextOp = iter.next(start - index);\n } else {\n nextOp = iter.next(end - index);\n ops.push(nextOp);\n }\n index += op.length(nextOp);\n }\n return new Delta(ops);\n};\n\n\nDelta.prototype.compose = function (other) {\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n var delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else if (thisIter.peekType() === 'delete') {\n delta.push(thisIter.next());\n } else {\n var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n var thisOp = thisIter.next(length);\n var otherOp = otherIter.next(length);\n if (typeof otherOp.retain === 'number') {\n var newOp = {};\n if (typeof thisOp.retain === 'number') {\n newOp.retain = length;\n } else {\n newOp.insert = thisOp.insert;\n }\n // Preserve null when composing with a retain, otherwise remove it for inserts\n var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number');\n if (attributes) newOp.attributes = attributes;\n delta.push(newOp);\n // Other op should be delete, we could be an insert or retain\n // Insert + delete cancels out\n } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') {\n delta.push(otherOp);\n }\n }\n }\n return delta.chop();\n};\n\nDelta.prototype.concat = function (other) {\n var delta = new Delta(this.ops.slice());\n if (other.ops.length > 0) {\n delta.push(other.ops[0]);\n delta.ops = delta.ops.concat(other.ops.slice(1));\n }\n return delta;\n};\n\nDelta.prototype.diff = function (other, index) {\n if (this.ops === other.ops) {\n return new Delta();\n }\n var strings = [this, other].map(function (delta) {\n return delta.map(function (op) {\n if (op.insert != null) {\n return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;\n }\n var prep = (delta === other) ? 'on' : 'with';\n throw new Error('diff() called ' + prep + ' non-document');\n }).join('');\n });\n var delta = new Delta();\n var diffResult = diff(strings[0], strings[1], index);\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n diffResult.forEach(function (component) {\n var length = component[1].length;\n while (length > 0) {\n var opLength = 0;\n switch (component[0]) {\n case diff.INSERT:\n opLength = Math.min(otherIter.peekLength(), length);\n delta.push(otherIter.next(opLength));\n break;\n case diff.DELETE:\n opLength = Math.min(length, thisIter.peekLength());\n thisIter.next(opLength);\n delta['delete'](opLength);\n break;\n case diff.EQUAL:\n opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length);\n var thisOp = thisIter.next(opLength);\n var otherOp = otherIter.next(opLength);\n if (equal(thisOp.insert, otherOp.insert)) {\n delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes));\n } else {\n delta.push(otherOp)['delete'](opLength);\n }\n break;\n }\n length -= opLength;\n }\n });\n return delta.chop();\n};\n\nDelta.prototype.eachLine = function (predicate, newline) {\n newline = newline || '\\n';\n var iter = op.iterator(this.ops);\n var line = new Delta();\n var i = 0;\n while (iter.hasNext()) {\n if (iter.peekType() !== 'insert') return;\n var thisOp = iter.peek();\n var start = op.length(thisOp) - iter.peekLength();\n var index = typeof thisOp.insert === 'string' ?\n thisOp.insert.indexOf(newline, start) - start : -1;\n if (index < 0) {\n line.push(iter.next());\n } else if (index > 0) {\n line.push(iter.next(index));\n } else {\n if (predicate(line, iter.next(1).attributes || {}, i) === false) {\n return;\n }\n i += 1;\n line = new Delta();\n }\n }\n if (line.length() > 0) {\n predicate(line, {}, i);\n }\n};\n\nDelta.prototype.transform = function (other, priority) {\n priority = !!priority;\n if (typeof other === 'number') {\n return this.transformPosition(other, priority);\n }\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n var delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) {\n delta.retain(op.length(thisIter.next()));\n } else if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else {\n var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n var thisOp = thisIter.next(length);\n var otherOp = otherIter.next(length);\n if (thisOp['delete']) {\n // Our delete either makes their delete redundant or removes their retain\n continue;\n } else if (otherOp['delete']) {\n delta.push(otherOp);\n } else {\n // We retain either their retain or insert\n delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority));\n }\n }\n }\n return delta.chop();\n};\n\nDelta.prototype.transformPosition = function (index, priority) {\n priority = !!priority;\n var thisIter = op.iterator(this.ops);\n var offset = 0;\n while (thisIter.hasNext() && offset <= index) {\n var length = thisIter.peekLength();\n var nextType = thisIter.peekType();\n thisIter.next();\n if (nextType === 'delete') {\n index -= Math.min(length, index - offset);\n continue;\n } else if (nextType === 'insert' && (offset < index || !priority)) {\n index += length;\n }\n offset += length;\n }\n return index;\n};\n\n\nmodule.exports = Delta;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _text = __webpack_require__(8);\n\nvar _text2 = _interopRequireDefault(_text);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Inline = function (_Parchment$Inline) {\n _inherits(Inline, _Parchment$Inline);\n\n function Inline() {\n _classCallCheck(this, Inline);\n\n return _possibleConstructorReturn(this, (Inline.__proto__ || Object.getPrototypeOf(Inline)).apply(this, arguments));\n }\n\n _createClass(Inline, [{\n key: 'formatAt',\n value: function formatAt(index, length, name, value) {\n if (Inline.compare(this.statics.blotName, name) < 0 && _parchment2.default.query(name, _parchment2.default.Scope.BLOT)) {\n var blot = this.isolate(index, length);\n if (value) {\n blot.wrap(name, value);\n }\n } else {\n _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'formatAt', this).call(this, index, length, name, value);\n }\n }\n }, {\n key: 'optimize',\n value: function optimize(context) {\n _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'optimize', this).call(this, context);\n if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) {\n var parent = this.parent.isolate(this.offset(), this.length());\n this.moveChildren(parent);\n parent.wrap(this);\n }\n }\n }], [{\n key: 'compare',\n value: function compare(self, other) {\n var selfIndex = Inline.order.indexOf(self);\n var otherIndex = Inline.order.indexOf(other);\n if (selfIndex >= 0 || otherIndex >= 0) {\n return selfIndex - otherIndex;\n } else if (self === other) {\n return 0;\n } else if (self < other) {\n return -1;\n } else {\n return 1;\n }\n }\n }]);\n\n return Inline;\n}(_parchment2.default.Inline);\n\nInline.allowedChildren = [Inline, _parchment2.default.Embed, _text2.default];\n// Lower index means deeper in the DOM tree, since not found (-1) is for embeds\nInline.order = ['cursor', 'inline', // Must be lower\n'underline', 'strike', 'italic', 'bold', 'script', 'link', 'code' // Must be higher\n];\n\nexports.default = Inline;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.overload = exports.expandConfig = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(53);\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _editor = __webpack_require__(57);\n\nvar _editor2 = _interopRequireDefault(_editor);\n\nvar _emitter3 = __webpack_require__(9);\n\nvar _emitter4 = _interopRequireDefault(_emitter3);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _selection = __webpack_require__(22);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nvar _logger = __webpack_require__(10);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _theme = __webpack_require__(32);\n\nvar _theme2 = _interopRequireDefault(_theme);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar debug = (0, _logger2.default)('quill');\n\nvar Quill = function () {\n _createClass(Quill, null, [{\n key: 'debug',\n value: function debug(limit) {\n if (limit === true) {\n limit = 'log';\n }\n _logger2.default.level(limit);\n }\n }, {\n key: 'find',\n value: function find(node) {\n return node.__quill || _parchment2.default.find(node);\n }\n }, {\n key: 'import',\n value: function _import(name) {\n if (this.imports[name] == null) {\n debug.error('Cannot import ' + name + '. Are you sure it was registered?');\n }\n return this.imports[name];\n }\n }, {\n key: 'register',\n value: function register(path, target) {\n var _this = this;\n\n var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (typeof path !== 'string') {\n var name = path.attrName || path.blotName;\n if (typeof name === 'string') {\n // register(Blot | Attributor, overwrite)\n this.register('formats/' + name, path, target);\n } else {\n Object.keys(path).forEach(function (key) {\n _this.register(key, path[key], target);\n });\n }\n } else {\n if (this.imports[path] != null && !overwrite) {\n debug.warn('Overwriting ' + path + ' with', target);\n }\n this.imports[path] = target;\n if ((path.startsWith('blots/') || path.startsWith('formats/')) && target.blotName !== 'abstract') {\n _parchment2.default.register(target);\n } else if (path.startsWith('modules') && typeof target.register === 'function') {\n target.register();\n }\n }\n }\n }]);\n\n function Quill(container) {\n var _this2 = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Quill);\n\n this.options = expandConfig(container, options);\n this.container = this.options.container;\n if (this.container == null) {\n return debug.error('Invalid Quill container', container);\n }\n if (this.options.debug) {\n Quill.debug(this.options.debug);\n }\n var html = this.container.innerHTML.trim();\n this.container.classList.add('ql-container');\n this.container.innerHTML = '';\n this.container.__quill = this;\n this.root = this.addContainer('ql-editor');\n this.root.classList.add('ql-blank');\n this.root.setAttribute('data-gramm', false);\n this.scrollingContainer = this.options.scrollingContainer || this.root;\n this.emitter = new _emitter4.default();\n this.scroll = _parchment2.default.create(this.root, {\n emitter: this.emitter,\n whitelist: this.options.formats\n });\n this.editor = new _editor2.default(this.scroll);\n this.selection = new _selection2.default(this.scroll, this.emitter);\n this.theme = new this.options.theme(this, this.options);\n this.keyboard = this.theme.addModule('keyboard');\n this.clipboard = this.theme.addModule('clipboard');\n this.history = this.theme.addModule('history');\n this.theme.init();\n this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type) {\n if (type === _emitter4.default.events.TEXT_CHANGE) {\n _this2.root.classList.toggle('ql-blank', _this2.editor.isBlank());\n }\n });\n this.emitter.on(_emitter4.default.events.SCROLL_UPDATE, function (source, mutations) {\n var range = _this2.selection.lastRange;\n var index = range && range.length === 0 ? range.index : undefined;\n modify.call(_this2, function () {\n return _this2.editor.update(null, mutations, index);\n }, source);\n });\n var contents = this.clipboard.convert('
' + html + '


');\n this.setContents(contents);\n this.history.clear();\n if (this.options.placeholder) {\n this.root.setAttribute('data-placeholder', this.options.placeholder);\n }\n if (this.options.readOnly) {\n this.disable();\n }\n }\n\n _createClass(Quill, [{\n key: 'addContainer',\n value: function addContainer(container) {\n var refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (typeof container === 'string') {\n var className = container;\n container = document.createElement('div');\n container.classList.add(className);\n }\n this.container.insertBefore(container, refNode);\n return container;\n }\n }, {\n key: 'blur',\n value: function blur() {\n this.selection.setRange(null);\n }\n }, {\n key: 'deleteText',\n value: function deleteText(index, length, source) {\n var _this3 = this;\n\n var _overload = overload(index, length, source);\n\n var _overload2 = _slicedToArray(_overload, 4);\n\n index = _overload2[0];\n length = _overload2[1];\n source = _overload2[3];\n\n return modify.call(this, function () {\n return _this3.editor.deleteText(index, length);\n }, source, index, -1 * length);\n }\n }, {\n key: 'disable',\n value: function disable() {\n this.enable(false);\n }\n }, {\n key: 'enable',\n value: function enable() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n this.scroll.enable(enabled);\n this.container.classList.toggle('ql-disabled', !enabled);\n }\n }, {\n key: 'focus',\n value: function focus() {\n var scrollTop = this.scrollingContainer.scrollTop;\n this.selection.focus();\n this.scrollingContainer.scrollTop = scrollTop;\n this.scrollIntoView();\n }\n }, {\n key: 'format',\n value: function format(name, value) {\n var _this4 = this;\n\n var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API;\n\n return modify.call(this, function () {\n var range = _this4.getSelection(true);\n var change = new _quillDelta2.default();\n if (range == null) {\n return change;\n } else if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) {\n change = _this4.editor.formatLine(range.index, range.length, _defineProperty({}, name, value));\n } else if (range.length === 0) {\n _this4.selection.format(name, value);\n return change;\n } else {\n change = _this4.editor.formatText(range.index, range.length, _defineProperty({}, name, value));\n }\n _this4.setSelection(range, _emitter4.default.sources.SILENT);\n return change;\n }, source);\n }\n }, {\n key: 'formatLine',\n value: function formatLine(index, length, name, value, source) {\n var _this5 = this;\n\n var formats = void 0;\n\n var _overload3 = overload(index, length, name, value, source);\n\n var _overload4 = _slicedToArray(_overload3, 4);\n\n index = _overload4[0];\n length = _overload4[1];\n formats = _overload4[2];\n source = _overload4[3];\n\n return modify.call(this, function () {\n return _this5.editor.formatLine(index, length, formats);\n }, source, index, 0);\n }\n }, {\n key: 'formatText',\n value: function formatText(index, length, name, value, source) {\n var _this6 = this;\n\n var formats = void 0;\n\n var _overload5 = overload(index, length, name, value, source);\n\n var _overload6 = _slicedToArray(_overload5, 4);\n\n index = _overload6[0];\n length = _overload6[1];\n formats = _overload6[2];\n source = _overload6[3];\n\n return modify.call(this, function () {\n return _this6.editor.formatText(index, length, formats);\n }, source, index, 0);\n }\n }, {\n key: 'getBounds',\n value: function getBounds(index) {\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var bounds = void 0;\n if (typeof index === 'number') {\n bounds = this.selection.getBounds(index, length);\n } else {\n bounds = this.selection.getBounds(index.index, index.length);\n }\n var containerBounds = this.container.getBoundingClientRect();\n return {\n bottom: bounds.bottom - containerBounds.top,\n height: bounds.height,\n left: bounds.left - containerBounds.left,\n right: bounds.right - containerBounds.left,\n top: bounds.top - containerBounds.top,\n width: bounds.width\n };\n }\n }, {\n key: 'getContents',\n value: function getContents() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index;\n\n var _overload7 = overload(index, length);\n\n var _overload8 = _slicedToArray(_overload7, 2);\n\n index = _overload8[0];\n length = _overload8[1];\n\n return this.editor.getContents(index, length);\n }\n }, {\n key: 'getFormat',\n value: function getFormat() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection(true);\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (typeof index === 'number') {\n return this.editor.getFormat(index, length);\n } else {\n return this.editor.getFormat(index.index, index.length);\n }\n }\n }, {\n key: 'getIndex',\n value: function getIndex(blot) {\n return blot.offset(this.scroll);\n }\n }, {\n key: 'getLength',\n value: function getLength() {\n return this.scroll.length();\n }\n }, {\n key: 'getLeaf',\n value: function getLeaf(index) {\n return this.scroll.leaf(index);\n }\n }, {\n key: 'getLine',\n value: function getLine(index) {\n return this.scroll.line(index);\n }\n }, {\n key: 'getLines',\n value: function getLines() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE;\n\n if (typeof index !== 'number') {\n return this.scroll.lines(index.index, index.length);\n } else {\n return this.scroll.lines(index, length);\n }\n }\n }, {\n key: 'getModule',\n value: function getModule(name) {\n return this.theme.modules[name];\n }\n }, {\n key: 'getSelection',\n value: function getSelection() {\n var focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (focus) this.focus();\n this.update(); // Make sure we access getRange with editor in consistent state\n return this.selection.getRange()[0];\n }\n }, {\n key: 'getText',\n value: function getText() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index;\n\n var _overload9 = overload(index, length);\n\n var _overload10 = _slicedToArray(_overload9, 2);\n\n index = _overload10[0];\n length = _overload10[1];\n\n return this.editor.getText(index, length);\n }\n }, {\n key: 'hasFocus',\n value: function hasFocus() {\n return this.selection.hasFocus();\n }\n }, {\n key: 'insertEmbed',\n value: function insertEmbed(index, embed, value) {\n var _this7 = this;\n\n var source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API;\n\n return modify.call(this, function () {\n return _this7.editor.insertEmbed(index, embed, value);\n }, source, index);\n }\n }, {\n key: 'insertText',\n value: function insertText(index, text, name, value, source) {\n var _this8 = this;\n\n var formats = void 0;\n\n var _overload11 = overload(index, 0, name, value, source);\n\n var _overload12 = _slicedToArray(_overload11, 4);\n\n index = _overload12[0];\n formats = _overload12[2];\n source = _overload12[3];\n\n return modify.call(this, function () {\n return _this8.editor.insertText(index, text, formats);\n }, source, index, text.length);\n }\n }, {\n key: 'isEnabled',\n value: function isEnabled() {\n return !this.container.classList.contains('ql-disabled');\n }\n }, {\n key: 'off',\n value: function off() {\n return this.emitter.off.apply(this.emitter, arguments);\n }\n }, {\n key: 'on',\n value: function on() {\n return this.emitter.on.apply(this.emitter, arguments);\n }\n }, {\n key: 'once',\n value: function once() {\n return this.emitter.once.apply(this.emitter, arguments);\n }\n }, {\n key: 'pasteHTML',\n value: function pasteHTML(index, html, source) {\n this.clipboard.dangerouslyPasteHTML(index, html, source);\n }\n }, {\n key: 'removeFormat',\n value: function removeFormat(index, length, source) {\n var _this9 = this;\n\n var _overload13 = overload(index, length, source);\n\n var _overload14 = _slicedToArray(_overload13, 4);\n\n index = _overload14[0];\n length = _overload14[1];\n source = _overload14[3];\n\n return modify.call(this, function () {\n return _this9.editor.removeFormat(index, length);\n }, source, index);\n }\n }, {\n key: 'scrollIntoView',\n value: function scrollIntoView() {\n this.selection.scrollIntoView(this.scrollingContainer);\n }\n }, {\n key: 'setContents',\n value: function setContents(delta) {\n var _this10 = this;\n\n var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;\n\n return modify.call(this, function () {\n delta = new _quillDelta2.default(delta);\n var length = _this10.getLength();\n var deleted = _this10.editor.deleteText(0, length);\n var applied = _this10.editor.applyDelta(delta);\n var lastOp = applied.ops[applied.ops.length - 1];\n if (lastOp != null && typeof lastOp.insert === 'string' && lastOp.insert[lastOp.insert.length - 1] === '\\n') {\n _this10.editor.deleteText(_this10.getLength() - 1, 1);\n applied.delete(1);\n }\n var ret = deleted.compose(applied);\n return ret;\n }, source);\n }\n }, {\n key: 'setSelection',\n value: function setSelection(index, length, source) {\n if (index == null) {\n this.selection.setRange(null, length || Quill.sources.API);\n } else {\n var _overload15 = overload(index, length, source);\n\n var _overload16 = _slicedToArray(_overload15, 4);\n\n index = _overload16[0];\n length = _overload16[1];\n source = _overload16[3];\n\n this.selection.setRange(new _selection.Range(index, length), source);\n if (source !== _emitter4.default.sources.SILENT) {\n this.selection.scrollIntoView(this.scrollingContainer);\n }\n }\n }\n }, {\n key: 'setText',\n value: function setText(text) {\n var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;\n\n var delta = new _quillDelta2.default().insert(text);\n return this.setContents(delta, source);\n }\n }, {\n key: 'update',\n value: function update() {\n var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER;\n\n var change = this.scroll.update(source); // Will update selection before selection.update() does if text changes\n this.selection.update(source);\n return change;\n }\n }, {\n key: 'updateContents',\n value: function updateContents(delta) {\n var _this11 = this;\n\n var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;\n\n return modify.call(this, function () {\n delta = new _quillDelta2.default(delta);\n return _this11.editor.applyDelta(delta, source);\n }, source, true);\n }\n }]);\n\n return Quill;\n}();\n\nQuill.DEFAULTS = {\n bounds: null,\n formats: null,\n modules: {},\n placeholder: '',\n readOnly: false,\n scrollingContainer: null,\n strict: true,\n theme: 'default'\n};\nQuill.events = _emitter4.default.events;\nQuill.sources = _emitter4.default.sources;\n// eslint-disable-next-line no-undef\nQuill.version = false ? 'dev' : \"1.3.6\";\n\nQuill.imports = {\n 'delta': _quillDelta2.default,\n 'parchment': _parchment2.default,\n 'core/module': _module2.default,\n 'core/theme': _theme2.default\n};\n\nfunction expandConfig(container, userConfig) {\n userConfig = (0, _extend2.default)(true, {\n container: container,\n modules: {\n clipboard: true,\n keyboard: true,\n history: true\n }\n }, userConfig);\n if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) {\n userConfig.theme = _theme2.default;\n } else {\n userConfig.theme = Quill.import('themes/' + userConfig.theme);\n if (userConfig.theme == null) {\n throw new Error('Invalid theme ' + userConfig.theme + '. Did you register it?');\n }\n }\n var themeConfig = (0, _extend2.default)(true, {}, userConfig.theme.DEFAULTS);\n [themeConfig, userConfig].forEach(function (config) {\n config.modules = config.modules || {};\n Object.keys(config.modules).forEach(function (module) {\n if (config.modules[module] === true) {\n config.modules[module] = {};\n }\n });\n });\n var moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules));\n var moduleConfig = moduleNames.reduce(function (config, name) {\n var moduleClass = Quill.import('modules/' + name);\n if (moduleClass == null) {\n debug.error('Cannot load ' + name + ' module. Are you sure you registered it?');\n } else {\n config[name] = moduleClass.DEFAULTS || {};\n }\n return config;\n }, {});\n // Special case toolbar shorthand\n if (userConfig.modules != null && userConfig.modules.toolbar && userConfig.modules.toolbar.constructor !== Object) {\n userConfig.modules.toolbar = {\n container: userConfig.modules.toolbar\n };\n }\n userConfig = (0, _extend2.default)(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig);\n ['bounds', 'container', 'scrollingContainer'].forEach(function (key) {\n if (typeof userConfig[key] === 'string') {\n userConfig[key] = document.querySelector(userConfig[key]);\n }\n });\n userConfig.modules = Object.keys(userConfig.modules).reduce(function (config, name) {\n if (userConfig.modules[name]) {\n config[name] = userConfig.modules[name];\n }\n return config;\n }, {});\n return userConfig;\n}\n\n// Handle selection preservation and TEXT_CHANGE emission\n// common to modification APIs\nfunction modify(modifier, source, index, shift) {\n if (this.options.strict && !this.isEnabled() && source === _emitter4.default.sources.USER) {\n return new _quillDelta2.default();\n }\n var range = index == null ? null : this.getSelection();\n var oldDelta = this.editor.delta;\n var change = modifier();\n if (range != null) {\n if (index === true) index = range.index;\n if (shift == null) {\n range = shiftRange(range, change, source);\n } else if (shift !== 0) {\n range = shiftRange(range, index, shift, source);\n }\n this.setSelection(range, _emitter4.default.sources.SILENT);\n }\n if (change.length() > 0) {\n var _emitter;\n\n var args = [_emitter4.default.events.TEXT_CHANGE, change, oldDelta, source];\n (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args));\n if (source !== _emitter4.default.sources.SILENT) {\n var _emitter2;\n\n (_emitter2 = this.emitter).emit.apply(_emitter2, args);\n }\n }\n return change;\n}\n\nfunction overload(index, length, name, value, source) {\n var formats = {};\n if (typeof index.index === 'number' && typeof index.length === 'number') {\n // Allow for throwaway end (used by insertText/insertEmbed)\n if (typeof length !== 'number') {\n source = value, value = name, name = length, length = index.length, index = index.index;\n } else {\n length = index.length, index = index.index;\n }\n } else if (typeof length !== 'number') {\n source = value, value = name, name = length, length = 0;\n }\n // Handle format being object, two format name/value strings or excluded\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n formats = name;\n source = value;\n } else if (typeof name === 'string') {\n if (value != null) {\n formats[name] = value;\n } else {\n source = name;\n }\n }\n // Handle optional source\n source = source || _emitter4.default.sources.API;\n return [index, length, formats, source];\n}\n\nfunction shiftRange(range, index, length, source) {\n if (range == null) return null;\n var start = void 0,\n end = void 0;\n if (index instanceof _quillDelta2.default) {\n var _map = [range.index, range.index + range.length].map(function (pos) {\n return index.transformPosition(pos, source !== _emitter4.default.sources.USER);\n });\n\n var _map2 = _slicedToArray(_map, 2);\n\n start = _map2[0];\n end = _map2[1];\n } else {\n var _map3 = [range.index, range.index + range.length].map(function (pos) {\n if (pos < index || pos === index && source === _emitter4.default.sources.USER) return pos;\n if (length >= 0) {\n return pos + length;\n } else {\n return Math.max(index, pos + length);\n }\n });\n\n var _map4 = _slicedToArray(_map3, 2);\n\n start = _map4[0];\n end = _map4[1];\n }\n return new _selection.Range(start, end - start);\n}\n\nexports.expandConfig = expandConfig;\nexports.overload = overload;\nexports.default = Quill;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Module = function Module(quill) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Module);\n\n this.quill = quill;\n this.options = options;\n};\n\nModule.DEFAULTS = {};\n\nexports.default = Module;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TextBlot = function (_Parchment$Text) {\n _inherits(TextBlot, _Parchment$Text);\n\n function TextBlot() {\n _classCallCheck(this, TextBlot);\n\n return _possibleConstructorReturn(this, (TextBlot.__proto__ || Object.getPrototypeOf(TextBlot)).apply(this, arguments));\n }\n\n return TextBlot;\n}(_parchment2.default.Text);\n\nexports.default = TextBlot;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _eventemitter = __webpack_require__(58);\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nvar _logger = __webpack_require__(10);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar debug = (0, _logger2.default)('quill:events');\n\nvar EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];\n\nEVENTS.forEach(function (eventName) {\n document.addEventListener(eventName, function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n [].slice.call(document.querySelectorAll('.ql-container')).forEach(function (node) {\n // TODO use WeakMap\n if (node.__quill && node.__quill.emitter) {\n var _node$__quill$emitter;\n\n (_node$__quill$emitter = node.__quill.emitter).handleDOM.apply(_node$__quill$emitter, args);\n }\n });\n });\n});\n\nvar Emitter = function (_EventEmitter) {\n _inherits(Emitter, _EventEmitter);\n\n function Emitter() {\n _classCallCheck(this, Emitter);\n\n var _this = _possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this));\n\n _this.listeners = {};\n _this.on('error', debug.error);\n return _this;\n }\n\n _createClass(Emitter, [{\n key: 'emit',\n value: function emit() {\n debug.log.apply(debug, arguments);\n _get(Emitter.prototype.__proto__ || Object.getPrototypeOf(Emitter.prototype), 'emit', this).apply(this, arguments);\n }\n }, {\n key: 'handleDOM',\n value: function handleDOM(event) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n (this.listeners[event.type] || []).forEach(function (_ref) {\n var node = _ref.node,\n handler = _ref.handler;\n\n if (event.target === node || node.contains(event.target)) {\n handler.apply(undefined, [event].concat(args));\n }\n });\n }\n }, {\n key: 'listenDOM',\n value: function listenDOM(eventName, node, handler) {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName].push({ node: node, handler: handler });\n }\n }]);\n\n return Emitter;\n}(_eventemitter2.default);\n\nEmitter.events = {\n EDITOR_CHANGE: 'editor-change',\n SCROLL_BEFORE_UPDATE: 'scroll-before-update',\n SCROLL_OPTIMIZE: 'scroll-optimize',\n SCROLL_UPDATE: 'scroll-update',\n SELECTION_CHANGE: 'selection-change',\n TEXT_CHANGE: 'text-change'\n};\nEmitter.sources = {\n API: 'api',\n SILENT: 'silent',\n USER: 'user'\n};\n\nexports.default = Emitter;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar levels = ['error', 'warn', 'log', 'info'];\nvar level = 'warn';\n\nfunction debug(method) {\n if (levels.indexOf(method) <= levels.indexOf(level)) {\n var _console;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n (_console = console)[method].apply(_console, args); // eslint-disable-line no-console\n }\n}\n\nfunction namespace(ns) {\n return levels.reduce(function (logger, method) {\n logger[method] = debug.bind(console, method, ns);\n return logger;\n }, {});\n}\n\ndebug.level = namespace.level = function (newLevel) {\n level = newLevel;\n};\n\nexports.default = namespace;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registry = __webpack_require__(1);\nvar Attributor = /** @class */ (function () {\n function Attributor(attrName, keyName, options) {\n if (options === void 0) { options = {}; }\n this.attrName = attrName;\n this.keyName = keyName;\n var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE;\n if (options.scope != null) {\n // Ignore type bits, force attribute bit\n this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit;\n }\n else {\n this.scope = Registry.Scope.ATTRIBUTE;\n }\n if (options.whitelist != null)\n this.whitelist = options.whitelist;\n }\n Attributor.keys = function (node) {\n return [].map.call(node.attributes, function (item) {\n return item.name;\n });\n };\n Attributor.prototype.add = function (node, value) {\n if (!this.canAdd(node, value))\n return false;\n node.setAttribute(this.keyName, value);\n return true;\n };\n Attributor.prototype.canAdd = function (node, value) {\n var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));\n if (match == null)\n return false;\n if (this.whitelist == null)\n return true;\n if (typeof value === 'string') {\n return this.whitelist.indexOf(value.replace(/[\"']/g, '')) > -1;\n }\n else {\n return this.whitelist.indexOf(value) > -1;\n }\n };\n Attributor.prototype.remove = function (node) {\n node.removeAttribute(this.keyName);\n };\n Attributor.prototype.value = function (node) {\n var value = node.getAttribute(this.keyName);\n if (this.canAdd(node, value) && value) {\n return value;\n }\n return '';\n };\n return Attributor;\n}());\nexports.default = Attributor;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pSlice = Array.prototype.slice;\nvar objectKeys = __webpack_require__(55);\nvar isArguments = __webpack_require__(56);\n\nvar deepEqual = module.exports = function (actual, expected, opts) {\n if (!opts) opts = {};\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n\n // 7.3. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n return opts.strict ? actual === expected : actual == expected;\n\n // 7.4. For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected, opts);\n }\n}\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer (x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') return false;\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n var i, key;\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n //~~~I've managed to break Object.keys through screwy arguments passing.\n // Converting to array solves the problem.\n if (isArguments(a)) {\n if (!isArguments(b)) {\n return false;\n }\n a = pSlice.call(a);\n b = pSlice.call(b);\n return deepEqual(a, b, opts);\n }\n if (isBuffer(a)) {\n if (!isBuffer(b)) {\n return false;\n }\n if (a.length !== b.length) return false;\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n try {\n var ka = objectKeys(a),\n kb = objectKeys(b);\n } catch (e) {//happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) return false;\n }\n return typeof a === typeof b;\n}\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.Code = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nvar _text = __webpack_require__(8);\n\nvar _text2 = _interopRequireDefault(_text);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Code = function (_Inline) {\n _inherits(Code, _Inline);\n\n function Code() {\n _classCallCheck(this, Code);\n\n return _possibleConstructorReturn(this, (Code.__proto__ || Object.getPrototypeOf(Code)).apply(this, arguments));\n }\n\n return Code;\n}(_inline2.default);\n\nCode.blotName = 'code';\nCode.tagName = 'CODE';\n\nvar CodeBlock = function (_Block) {\n _inherits(CodeBlock, _Block);\n\n function CodeBlock() {\n _classCallCheck(this, CodeBlock);\n\n return _possibleConstructorReturn(this, (CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock)).apply(this, arguments));\n }\n\n _createClass(CodeBlock, [{\n key: 'delta',\n value: function delta() {\n var _this3 = this;\n\n var text = this.domNode.textContent;\n if (text.endsWith('\\n')) {\n // Should always be true\n text = text.slice(0, -1);\n }\n return text.split('\\n').reduce(function (delta, frag) {\n return delta.insert(frag).insert('\\n', _this3.formats());\n }, new _quillDelta2.default());\n }\n }, {\n key: 'format',\n value: function format(name, value) {\n if (name === this.statics.blotName && value) return;\n\n var _descendant = this.descendant(_text2.default, this.length() - 1),\n _descendant2 = _slicedToArray(_descendant, 1),\n text = _descendant2[0];\n\n if (text != null) {\n text.deleteAt(text.length() - 1, 1);\n }\n _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'format', this).call(this, name, value);\n }\n }, {\n key: 'formatAt',\n value: function formatAt(index, length, name, value) {\n if (length === 0) return;\n if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK) == null || name === this.statics.blotName && value === this.statics.formats(this.domNode)) {\n return;\n }\n var nextNewline = this.newlineIndex(index);\n if (nextNewline < 0 || nextNewline >= index + length) return;\n var prevNewline = this.newlineIndex(index, true) + 1;\n var isolateLength = nextNewline - prevNewline + 1;\n var blot = this.isolate(prevNewline, isolateLength);\n var next = blot.next;\n blot.format(name, value);\n if (next instanceof CodeBlock) {\n next.formatAt(0, index - prevNewline + length - isolateLength, name, value);\n }\n }\n }, {\n key: 'insertAt',\n value: function insertAt(index, value, def) {\n if (def != null) return;\n\n var _descendant3 = this.descendant(_text2.default, index),\n _descendant4 = _slicedToArray(_descendant3, 2),\n text = _descendant4[0],\n offset = _descendant4[1];\n\n text.insertAt(offset, value);\n }\n }, {\n key: 'length',\n value: function length() {\n var length = this.domNode.textContent.length;\n if (!this.domNode.textContent.endsWith('\\n')) {\n return length + 1;\n }\n return length;\n }\n }, {\n key: 'newlineIndex',\n value: function newlineIndex(searchIndex) {\n var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!reverse) {\n var offset = this.domNode.textContent.slice(searchIndex).indexOf('\\n');\n return offset > -1 ? searchIndex + offset : -1;\n } else {\n return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\\n');\n }\n }\n }, {\n key: 'optimize',\n value: function optimize(context) {\n if (!this.domNode.textContent.endsWith('\\n')) {\n this.appendChild(_parchment2.default.create('text', '\\n'));\n }\n _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'optimize', this).call(this, context);\n var next = this.next;\n if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) {\n next.optimize(context);\n next.moveChildren(this);\n next.remove();\n }\n }\n }, {\n key: 'replace',\n value: function replace(target) {\n _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'replace', this).call(this, target);\n [].slice.call(this.domNode.querySelectorAll('*')).forEach(function (node) {\n var blot = _parchment2.default.find(node);\n if (blot == null) {\n node.parentNode.removeChild(node);\n } else if (blot instanceof _parchment2.default.Embed) {\n blot.remove();\n } else {\n blot.unwrap();\n }\n });\n }\n }], [{\n key: 'create',\n value: function create(value) {\n var domNode = _get(CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock), 'create', this).call(this, value);\n domNode.setAttribute('spellcheck', false);\n return domNode;\n }\n }, {\n key: 'formats',\n value: function formats() {\n return true;\n }\n }]);\n\n return CodeBlock;\n}(_block2.default);\n\nCodeBlock.blotName = 'code-block';\nCodeBlock.tagName = 'PRE';\nCodeBlock.TAB = ' ';\n\nexports.Code = Code;\nexports.default = CodeBlock;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Break = function (_Parchment$Embed) {\n _inherits(Break, _Parchment$Embed);\n\n function Break() {\n _classCallCheck(this, Break);\n\n return _possibleConstructorReturn(this, (Break.__proto__ || Object.getPrototypeOf(Break)).apply(this, arguments));\n }\n\n _createClass(Break, [{\n key: 'insertInto',\n value: function insertInto(parent, ref) {\n if (parent.children.length === 0) {\n _get(Break.prototype.__proto__ || Object.getPrototypeOf(Break.prototype), 'insertInto', this).call(this, parent, ref);\n } else {\n this.remove();\n }\n }\n }, {\n key: 'length',\n value: function length() {\n return 0;\n }\n }, {\n key: 'value',\n value: function value() {\n return '';\n }\n }], [{\n key: 'value',\n value: function value() {\n return undefined;\n }\n }]);\n\n return Break;\n}(_parchment2.default.Embed);\n\nBreak.blotName = 'break';\nBreak.tagName = 'BR';\n\nexports.default = Break;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.sanitize = exports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Link = function (_Inline) {\n _inherits(Link, _Inline);\n\n function Link() {\n _classCallCheck(this, Link);\n\n return _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).apply(this, arguments));\n }\n\n _createClass(Link, [{\n key: 'format',\n value: function format(name, value) {\n if (name !== this.statics.blotName || !value) return _get(Link.prototype.__proto__ || Object.getPrototypeOf(Link.prototype), 'format', this).call(this, name, value);\n value = this.constructor.sanitize(value);\n this.domNode.setAttribute('href', value);\n }\n }], [{\n key: 'create',\n value: function create(value) {\n var node = _get(Link.__proto__ || Object.getPrototypeOf(Link), 'create', this).call(this, value);\n value = this.sanitize(value);\n node.setAttribute('href', value);\n node.setAttribute('target', '_blank');\n return node;\n }\n }, {\n key: 'formats',\n value: function formats(domNode) {\n return domNode.getAttribute('href');\n }\n }, {\n key: 'sanitize',\n value: function sanitize(url) {\n return _sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL;\n }\n }]);\n\n return Link;\n}(_inline2.default);\n\nLink.blotName = 'link';\nLink.tagName = 'A';\nLink.SANITIZED_URL = 'about:blank';\nLink.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel'];\n\nfunction _sanitize(url, protocols) {\n var anchor = document.createElement('a');\n anchor.href = url;\n var protocol = anchor.href.slice(0, anchor.href.indexOf(':'));\n return protocols.indexOf(protocol) > -1;\n}\n\nexports.default = Link;\nexports.sanitize = _sanitize;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _keyboard = __webpack_require__(25);\n\nvar _keyboard2 = _interopRequireDefault(_keyboard);\n\nvar _dropdown = __webpack_require__(106);\n\nvar _dropdown2 = _interopRequireDefault(_dropdown);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar optionsCounter = 0;\n\nfunction toggleAriaAttribute(element, attribute) {\n element.setAttribute(attribute, !(element.getAttribute(attribute) === 'true'));\n}\n\nvar Picker = function () {\n function Picker(select) {\n var _this = this;\n\n _classCallCheck(this, Picker);\n\n this.select = select;\n this.container = document.createElement('span');\n this.buildPicker();\n this.select.style.display = 'none';\n this.select.parentNode.insertBefore(this.container, this.select);\n\n this.label.addEventListener('mousedown', function () {\n _this.togglePicker();\n });\n this.label.addEventListener('keydown', function (event) {\n switch (event.keyCode) {\n // Allows the \"Enter\" key to open the picker\n case _keyboard2.default.keys.ENTER:\n _this.togglePicker();\n break;\n\n // Allows the \"Escape\" key to close the picker\n case _keyboard2.default.keys.ESCAPE:\n _this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n this.select.addEventListener('change', this.update.bind(this));\n }\n\n _createClass(Picker, [{\n key: 'togglePicker',\n value: function togglePicker() {\n this.container.classList.toggle('ql-expanded');\n // Toggle aria-expanded and aria-hidden to make the picker accessible\n toggleAriaAttribute(this.label, 'aria-expanded');\n toggleAriaAttribute(this.options, 'aria-hidden');\n }\n }, {\n key: 'buildItem',\n value: function buildItem(option) {\n var _this2 = this;\n\n var item = document.createElement('span');\n item.tabIndex = '0';\n item.setAttribute('role', 'button');\n\n item.classList.add('ql-picker-item');\n if (option.hasAttribute('value')) {\n item.setAttribute('data-value', option.getAttribute('value'));\n }\n if (option.textContent) {\n item.setAttribute('data-label', option.textContent);\n }\n item.addEventListener('click', function () {\n _this2.selectItem(item, true);\n });\n item.addEventListener('keydown', function (event) {\n switch (event.keyCode) {\n // Allows the \"Enter\" key to select an item\n case _keyboard2.default.keys.ENTER:\n _this2.selectItem(item, true);\n event.preventDefault();\n break;\n\n // Allows the \"Escape\" key to close the picker\n case _keyboard2.default.keys.ESCAPE:\n _this2.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n\n return item;\n }\n }, {\n key: 'buildLabel',\n value: function buildLabel() {\n var label = document.createElement('span');\n label.classList.add('ql-picker-label');\n label.innerHTML = _dropdown2.default;\n label.tabIndex = '0';\n label.setAttribute('role', 'button');\n label.setAttribute('aria-expanded', 'false');\n this.container.appendChild(label);\n return label;\n }\n }, {\n key: 'buildOptions',\n value: function buildOptions() {\n var _this3 = this;\n\n var options = document.createElement('span');\n options.classList.add('ql-picker-options');\n\n // Don't want screen readers to read this until options are visible\n options.setAttribute('aria-hidden', 'true');\n options.tabIndex = '-1';\n\n // Need a unique id for aria-controls\n options.id = 'ql-picker-options-' + optionsCounter;\n optionsCounter += 1;\n this.label.setAttribute('aria-controls', options.id);\n\n this.options = options;\n\n [].slice.call(this.select.options).forEach(function (option) {\n var item = _this3.buildItem(option);\n options.appendChild(item);\n if (option.selected === true) {\n _this3.selectItem(item);\n }\n });\n this.container.appendChild(options);\n }\n }, {\n key: 'buildPicker',\n value: function buildPicker() {\n var _this4 = this;\n\n [].slice.call(this.select.attributes).forEach(function (item) {\n _this4.container.setAttribute(item.name, item.value);\n });\n this.container.classList.add('ql-picker');\n this.label = this.buildLabel();\n this.buildOptions();\n }\n }, {\n key: 'escape',\n value: function escape() {\n var _this5 = this;\n\n // Close menu and return focus to trigger label\n this.close();\n // Need setTimeout for accessibility to ensure that the browser executes\n // focus on the next process thread and after any DOM content changes\n setTimeout(function () {\n return _this5.label.focus();\n }, 1);\n }\n }, {\n key: 'close',\n value: function close() {\n this.container.classList.remove('ql-expanded');\n this.label.setAttribute('aria-expanded', 'false');\n this.options.setAttribute('aria-hidden', 'true');\n }\n }, {\n key: 'selectItem',\n value: function selectItem(item) {\n var trigger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var selected = this.container.querySelector('.ql-selected');\n if (item === selected) return;\n if (selected != null) {\n selected.classList.remove('ql-selected');\n }\n if (item == null) return;\n item.classList.add('ql-selected');\n this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item);\n if (item.hasAttribute('data-value')) {\n this.label.setAttribute('data-value', item.getAttribute('data-value'));\n } else {\n this.label.removeAttribute('data-value');\n }\n if (item.hasAttribute('data-label')) {\n this.label.setAttribute('data-label', item.getAttribute('data-label'));\n } else {\n this.label.removeAttribute('data-label');\n }\n if (trigger) {\n if (typeof Event === 'function') {\n this.select.dispatchEvent(new Event('change'));\n } else if ((typeof Event === 'undefined' ? 'undefined' : _typeof(Event)) === 'object') {\n // IE11\n var event = document.createEvent('Event');\n event.initEvent('change', true, true);\n this.select.dispatchEvent(event);\n }\n this.close();\n }\n }\n }, {\n key: 'update',\n value: function update() {\n var option = void 0;\n if (this.select.selectedIndex > -1) {\n var item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex];\n option = this.select.options[this.select.selectedIndex];\n this.selectItem(item);\n } else {\n this.selectItem(null);\n }\n var isActive = option != null && option !== this.select.querySelector('option[selected]');\n this.label.classList.toggle('ql-active', isActive);\n }\n }]);\n\n return Picker;\n}();\n\nexports.default = Picker;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar linked_list_1 = __webpack_require__(47);\nvar shadow_1 = __webpack_require__(27);\nvar Registry = __webpack_require__(1);\nvar ContainerBlot = /** @class */ (function (_super) {\n __extends(ContainerBlot, _super);\n function ContainerBlot(domNode) {\n var _this = _super.call(this, domNode) || this;\n _this.build();\n return _this;\n }\n ContainerBlot.prototype.appendChild = function (other) {\n this.insertBefore(other);\n };\n ContainerBlot.prototype.attach = function () {\n _super.prototype.attach.call(this);\n this.children.forEach(function (child) {\n child.attach();\n });\n };\n ContainerBlot.prototype.build = function () {\n var _this = this;\n this.children = new linked_list_1.default();\n // Need to be reversed for if DOM nodes already in order\n [].slice\n .call(this.domNode.childNodes)\n .reverse()\n .forEach(function (node) {\n try {\n var child = makeBlot(node);\n _this.insertBefore(child, _this.children.head || undefined);\n }\n catch (err) {\n if (err instanceof Registry.ParchmentError)\n return;\n else\n throw err;\n }\n });\n };\n ContainerBlot.prototype.deleteAt = function (index, length) {\n if (index === 0 && length === this.length()) {\n return this.remove();\n }\n this.children.forEachAt(index, length, function (child, offset, length) {\n child.deleteAt(offset, length);\n });\n };\n ContainerBlot.prototype.descendant = function (criteria, index) {\n var _a = this.children.find(index), child = _a[0], offset = _a[1];\n if ((criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)) {\n return [child, offset];\n }\n else if (child instanceof ContainerBlot) {\n return child.descendant(criteria, offset);\n }\n else {\n return [null, -1];\n }\n };\n ContainerBlot.prototype.descendants = function (criteria, index, length) {\n if (index === void 0) { index = 0; }\n if (length === void 0) { length = Number.MAX_VALUE; }\n var descendants = [];\n var lengthLeft = length;\n this.children.forEachAt(index, length, function (child, index, length) {\n if ((criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)) {\n descendants.push(child);\n }\n if (child instanceof ContainerBlot) {\n descendants = descendants.concat(child.descendants(criteria, index, lengthLeft));\n }\n lengthLeft -= length;\n });\n return descendants;\n };\n ContainerBlot.prototype.detach = function () {\n this.children.forEach(function (child) {\n child.detach();\n });\n _super.prototype.detach.call(this);\n };\n ContainerBlot.prototype.formatAt = function (index, length, name, value) {\n this.children.forEachAt(index, length, function (child, offset, length) {\n child.formatAt(offset, length, name, value);\n });\n };\n ContainerBlot.prototype.insertAt = function (index, value, def) {\n var _a = this.children.find(index), child = _a[0], offset = _a[1];\n if (child) {\n child.insertAt(offset, value, def);\n }\n else {\n var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);\n this.appendChild(blot);\n }\n };\n ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) {\n if (this.statics.allowedChildren != null &&\n !this.statics.allowedChildren.some(function (child) {\n return childBlot instanceof child;\n })) {\n throw new Registry.ParchmentError(\"Cannot insert \" + childBlot.statics.blotName + \" into \" + this.statics.blotName);\n }\n childBlot.insertInto(this, refBlot);\n };\n ContainerBlot.prototype.length = function () {\n return this.children.reduce(function (memo, child) {\n return memo + child.length();\n }, 0);\n };\n ContainerBlot.prototype.moveChildren = function (targetParent, refNode) {\n this.children.forEach(function (child) {\n targetParent.insertBefore(child, refNode);\n });\n };\n ContainerBlot.prototype.optimize = function (context) {\n _super.prototype.optimize.call(this, context);\n if (this.children.length === 0) {\n if (this.statics.defaultChild != null) {\n var child = Registry.create(this.statics.defaultChild);\n this.appendChild(child);\n child.optimize(context);\n }\n else {\n this.remove();\n }\n }\n };\n ContainerBlot.prototype.path = function (index, inclusive) {\n if (inclusive === void 0) { inclusive = false; }\n var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1];\n var position = [[this, index]];\n if (child instanceof ContainerBlot) {\n return position.concat(child.path(offset, inclusive));\n }\n else if (child != null) {\n position.push([child, offset]);\n }\n return position;\n };\n ContainerBlot.prototype.removeChild = function (child) {\n this.children.remove(child);\n };\n ContainerBlot.prototype.replace = function (target) {\n if (target instanceof ContainerBlot) {\n target.moveChildren(this);\n }\n _super.prototype.replace.call(this, target);\n };\n ContainerBlot.prototype.split = function (index, force) {\n if (force === void 0) { force = false; }\n if (!force) {\n if (index === 0)\n return this;\n if (index === this.length())\n return this.next;\n }\n var after = this.clone();\n this.parent.insertBefore(after, this.next);\n this.children.forEachAt(index, this.length(), function (child, offset, length) {\n child = child.split(offset, force);\n after.appendChild(child);\n });\n return after;\n };\n ContainerBlot.prototype.unwrap = function () {\n this.moveChildren(this.parent, this.next);\n this.remove();\n };\n ContainerBlot.prototype.update = function (mutations, context) {\n var _this = this;\n var addedNodes = [];\n var removedNodes = [];\n mutations.forEach(function (mutation) {\n if (mutation.target === _this.domNode && mutation.type === 'childList') {\n addedNodes.push.apply(addedNodes, mutation.addedNodes);\n removedNodes.push.apply(removedNodes, mutation.removedNodes);\n }\n });\n removedNodes.forEach(function (node) {\n // Check node has actually been removed\n // One exception is Chrome does not immediately remove IFRAMEs\n // from DOM but MutationRecord is correct in its reported removal\n if (node.parentNode != null &&\n // @ts-ignore\n node.tagName !== 'IFRAME' &&\n document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return;\n }\n var blot = Registry.find(node);\n if (blot == null)\n return;\n if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) {\n blot.detach();\n }\n });\n addedNodes\n .filter(function (node) {\n return node.parentNode == _this.domNode;\n })\n .sort(function (a, b) {\n if (a === b)\n return 0;\n if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {\n return 1;\n }\n return -1;\n })\n .forEach(function (node) {\n var refBlot = null;\n if (node.nextSibling != null) {\n refBlot = Registry.find(node.nextSibling);\n }\n var blot = makeBlot(node);\n if (blot.next != refBlot || blot.next == null) {\n if (blot.parent != null) {\n blot.parent.removeChild(_this);\n }\n _this.insertBefore(blot, refBlot || undefined);\n }\n });\n };\n return ContainerBlot;\n}(shadow_1.default));\nfunction makeBlot(node) {\n var blot = Registry.find(node);\n if (blot == null) {\n try {\n blot = Registry.create(node);\n }\n catch (e) {\n blot = Registry.create(Registry.Scope.INLINE);\n [].slice.call(node.childNodes).forEach(function (child) {\n // @ts-ignore\n blot.domNode.appendChild(child);\n });\n if (node.parentNode) {\n node.parentNode.replaceChild(blot.domNode, node);\n }\n blot.attach();\n }\n }\n return blot;\n}\nexports.default = ContainerBlot;\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(11);\nvar store_1 = __webpack_require__(28);\nvar container_1 = __webpack_require__(17);\nvar Registry = __webpack_require__(1);\nvar FormatBlot = /** @class */ (function (_super) {\n __extends(FormatBlot, _super);\n function FormatBlot(domNode) {\n var _this = _super.call(this, domNode) || this;\n _this.attributes = new store_1.default(_this.domNode);\n return _this;\n }\n FormatBlot.formats = function (domNode) {\n if (typeof this.tagName === 'string') {\n return true;\n }\n else if (Array.isArray(this.tagName)) {\n return domNode.tagName.toLowerCase();\n }\n return undefined;\n };\n FormatBlot.prototype.format = function (name, value) {\n var format = Registry.query(name);\n if (format instanceof attributor_1.default) {\n this.attributes.attribute(format, value);\n }\n else if (value) {\n if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) {\n this.replaceWith(name, value);\n }\n }\n };\n FormatBlot.prototype.formats = function () {\n var formats = this.attributes.values();\n var format = this.statics.formats(this.domNode);\n if (format != null) {\n formats[this.statics.blotName] = format;\n }\n return formats;\n };\n FormatBlot.prototype.replaceWith = function (name, value) {\n var replacement = _super.prototype.replaceWith.call(this, name, value);\n this.attributes.copy(replacement);\n return replacement;\n };\n FormatBlot.prototype.update = function (mutations, context) {\n var _this = this;\n _super.prototype.update.call(this, mutations, context);\n if (mutations.some(function (mutation) {\n return mutation.target === _this.domNode && mutation.type === 'attributes';\n })) {\n this.attributes.build();\n }\n };\n FormatBlot.prototype.wrap = function (name, value) {\n var wrapper = _super.prototype.wrap.call(this, name, value);\n if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) {\n this.attributes.move(wrapper);\n }\n return wrapper;\n };\n return FormatBlot;\n}(container_1.default));\nexports.default = FormatBlot;\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar shadow_1 = __webpack_require__(27);\nvar Registry = __webpack_require__(1);\nvar LeafBlot = /** @class */ (function (_super) {\n __extends(LeafBlot, _super);\n function LeafBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n LeafBlot.value = function (domNode) {\n return true;\n };\n LeafBlot.prototype.index = function (node, offset) {\n if (this.domNode === node ||\n this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return Math.min(offset, 1);\n }\n return -1;\n };\n LeafBlot.prototype.position = function (index, inclusive) {\n var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode);\n if (index > 0)\n offset += 1;\n return [this.parent.domNode, offset];\n };\n LeafBlot.prototype.value = function () {\n return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;\n var _a;\n };\n LeafBlot.scope = Registry.Scope.INLINE_BLOT;\n return LeafBlot;\n}(shadow_1.default));\nexports.default = LeafBlot;\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar equal = __webpack_require__(12);\nvar extend = __webpack_require__(2);\n\n\nvar lib = {\n attributes: {\n compose: function (a, b, keepNull) {\n if (typeof a !== 'object') a = {};\n if (typeof b !== 'object') b = {};\n var attributes = extend(true, {}, b);\n if (!keepNull) {\n attributes = Object.keys(attributes).reduce(function (copy, key) {\n if (attributes[key] != null) {\n copy[key] = attributes[key];\n }\n return copy;\n }, {});\n }\n for (var key in a) {\n if (a[key] !== undefined && b[key] === undefined) {\n attributes[key] = a[key];\n }\n }\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n },\n\n diff: function(a, b) {\n if (typeof a !== 'object') a = {};\n if (typeof b !== 'object') b = {};\n var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) {\n if (!equal(a[key], b[key])) {\n attributes[key] = b[key] === undefined ? null : b[key];\n }\n return attributes;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n },\n\n transform: function (a, b, priority) {\n if (typeof a !== 'object') return b;\n if (typeof b !== 'object') return undefined;\n if (!priority) return b; // b simply overwrites us without priority\n var attributes = Object.keys(b).reduce(function (attributes, key) {\n if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value\n return attributes;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n },\n\n iterator: function (ops) {\n return new Iterator(ops);\n },\n\n length: function (op) {\n if (typeof op['delete'] === 'number') {\n return op['delete'];\n } else if (typeof op.retain === 'number') {\n return op.retain;\n } else {\n return typeof op.insert === 'string' ? op.insert.length : 1;\n }\n }\n};\n\n\nfunction Iterator(ops) {\n this.ops = ops;\n this.index = 0;\n this.offset = 0;\n};\n\nIterator.prototype.hasNext = function () {\n return this.peekLength() < Infinity;\n};\n\nIterator.prototype.next = function (length) {\n if (!length) length = Infinity;\n var nextOp = this.ops[this.index];\n if (nextOp) {\n var offset = this.offset;\n var opLength = lib.length(nextOp)\n if (length >= opLength - offset) {\n length = opLength - offset;\n this.index += 1;\n this.offset = 0;\n } else {\n this.offset += length;\n }\n if (typeof nextOp['delete'] === 'number') {\n return { 'delete': length };\n } else {\n var retOp = {};\n if (nextOp.attributes) {\n retOp.attributes = nextOp.attributes;\n }\n if (typeof nextOp.retain === 'number') {\n retOp.retain = length;\n } else if (typeof nextOp.insert === 'string') {\n retOp.insert = nextOp.insert.substr(offset, length);\n } else {\n // offset should === 0, length should === 1\n retOp.insert = nextOp.insert;\n }\n return retOp;\n }\n } else {\n return { retain: Infinity };\n }\n};\n\nIterator.prototype.peek = function () {\n return this.ops[this.index];\n};\n\nIterator.prototype.peekLength = function () {\n if (this.ops[this.index]) {\n // Should never return 0 if our index is being managed correctly\n return lib.length(this.ops[this.index]) - this.offset;\n } else {\n return Infinity;\n }\n};\n\nIterator.prototype.peekType = function () {\n if (this.ops[this.index]) {\n if (typeof this.ops[this.index]['delete'] === 'number') {\n return 'delete';\n } else if (typeof this.ops[this.index].retain === 'number') {\n return 'retain';\n } else {\n return 'insert';\n }\n }\n return 'retain';\n};\n\n\nmodule.exports = lib;\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\nvar clone = (function() {\n'use strict';\n\nfunction _instanceof(obj, type) {\n return type != null && obj instanceof type;\n}\n\nvar nativeMap;\ntry {\n nativeMap = Map;\n} catch(_) {\n // maybe a reference error because no `Map`. Give it a dummy value that no\n // value will ever be an instanceof.\n nativeMap = function() {};\n}\n\nvar nativeSet;\ntry {\n nativeSet = Set;\n} catch(_) {\n nativeSet = function() {};\n}\n\nvar nativePromise;\ntry {\n nativePromise = Promise;\n} catch(_) {\n nativePromise = function() {};\n}\n\n/**\n * Clones (copies) an Object using deep copying.\n *\n * This function supports circular references by default, but if you are certain\n * there are no circular references in your object, you can save some CPU time\n * by calling clone(obj, false).\n *\n * Caution: if `circular` is false and `parent` contains circular references,\n * your program may enter an infinite loop and crash.\n *\n * @param `parent` - the object to be cloned\n * @param `circular` - set to true if the object to be cloned may contain\n * circular references. (optional - true by default)\n * @param `depth` - set to a number if the object is only to be cloned to\n * a particular depth. (optional - defaults to Infinity)\n * @param `prototype` - sets the prototype to be used when cloning an object.\n * (optional - defaults to parent prototype).\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n * should be cloned as well. Non-enumerable properties on the prototype\n * chain will be ignored. (optional - false by default)\n*/\nfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n if (typeof circular === 'object') {\n depth = circular.depth;\n prototype = circular.prototype;\n includeNonEnumerable = circular.includeNonEnumerable;\n circular = circular.circular;\n }\n // maintain two arrays for circular references, where corresponding parents\n // and children have the same index\n var allParents = [];\n var allChildren = [];\n\n var useBuffer = typeof Buffer != 'undefined';\n\n if (typeof circular == 'undefined')\n circular = true;\n\n if (typeof depth == 'undefined')\n depth = Infinity;\n\n // recurse this function so we don't reset allParents and allChildren\n function _clone(parent, depth) {\n // cloning null always returns null\n if (parent === null)\n return null;\n\n if (depth === 0)\n return parent;\n\n var child;\n var proto;\n if (typeof parent != 'object') {\n return parent;\n }\n\n if (_instanceof(parent, nativeMap)) {\n child = new nativeMap();\n } else if (_instanceof(parent, nativeSet)) {\n child = new nativeSet();\n } else if (_instanceof(parent, nativePromise)) {\n child = new nativePromise(function (resolve, reject) {\n parent.then(function(value) {\n resolve(_clone(value, depth - 1));\n }, function(err) {\n reject(_clone(err, depth - 1));\n });\n });\n } else if (clone.__isArray(parent)) {\n child = [];\n } else if (clone.__isRegExp(parent)) {\n child = new RegExp(parent.source, __getRegExpFlags(parent));\n if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n } else if (clone.__isDate(parent)) {\n child = new Date(parent.getTime());\n } else if (useBuffer && Buffer.isBuffer(parent)) {\n child = new Buffer(parent.length);\n parent.copy(child);\n return child;\n } else if (_instanceof(parent, Error)) {\n child = Object.create(parent);\n } else {\n if (typeof prototype == 'undefined') {\n proto = Object.getPrototypeOf(parent);\n child = Object.create(proto);\n }\n else {\n child = Object.create(prototype);\n proto = prototype;\n }\n }\n\n if (circular) {\n var index = allParents.indexOf(parent);\n\n if (index != -1) {\n return allChildren[index];\n }\n allParents.push(parent);\n allChildren.push(child);\n }\n\n if (_instanceof(parent, nativeMap)) {\n parent.forEach(function(value, key) {\n var keyChild = _clone(key, depth - 1);\n var valueChild = _clone(value, depth - 1);\n child.set(keyChild, valueChild);\n });\n }\n if (_instanceof(parent, nativeSet)) {\n parent.forEach(function(value) {\n var entryChild = _clone(value, depth - 1);\n child.add(entryChild);\n });\n }\n\n for (var i in parent) {\n var attrs;\n if (proto) {\n attrs = Object.getOwnPropertyDescriptor(proto, i);\n }\n\n if (attrs && attrs.set == null) {\n continue;\n }\n child[i] = _clone(parent[i], depth - 1);\n }\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(parent);\n for (var i = 0; i < symbols.length; i++) {\n // Don't need to worry about cloning a symbol because it is a primitive,\n // like a number or string.\n var symbol = symbols[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n continue;\n }\n child[symbol] = _clone(parent[symbol], depth - 1);\n if (!descriptor.enumerable) {\n Object.defineProperty(child, symbol, {\n enumerable: false\n });\n }\n }\n }\n\n if (includeNonEnumerable) {\n var allPropertyNames = Object.getOwnPropertyNames(parent);\n for (var i = 0; i < allPropertyNames.length; i++) {\n var propertyName = allPropertyNames[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n if (descriptor && descriptor.enumerable) {\n continue;\n }\n child[propertyName] = _clone(parent[propertyName], depth - 1);\n Object.defineProperty(child, propertyName, {\n enumerable: false\n });\n }\n }\n\n return child;\n }\n\n return _clone(parent, depth);\n}\n\n/**\n * Simple flat clone using prototype, accepts only objects, usefull for property\n * override on FLAT configuration object (no nested props).\n *\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n * works.\n */\nclone.clonePrototype = function clonePrototype(parent) {\n if (parent === null)\n return null;\n\n var c = function () {};\n c.prototype = parent;\n return new c();\n};\n\n// private utility functions\n\nfunction __objToStr(o) {\n return Object.prototype.toString.call(o);\n}\nclone.__objToStr = __objToStr;\n\nfunction __isDate(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Date]';\n}\nclone.__isDate = __isDate;\n\nfunction __isArray(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Array]';\n}\nclone.__isArray = __isArray;\n\nfunction __isRegExp(o) {\n return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n}\nclone.__isRegExp = __isRegExp;\n\nfunction __getRegExpFlags(re) {\n var flags = '';\n if (re.global) flags += 'g';\n if (re.ignoreCase) flags += 'i';\n if (re.multiline) flags += 'm';\n return flags;\n}\nclone.__getRegExpFlags = __getRegExpFlags;\n\nreturn clone;\n})();\n\nif (typeof module === 'object' && module.exports) {\n module.exports = clone;\n}\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.Range = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _clone = __webpack_require__(21);\n\nvar _clone2 = _interopRequireDefault(_clone);\n\nvar _deepEqual = __webpack_require__(12);\n\nvar _deepEqual2 = _interopRequireDefault(_deepEqual);\n\nvar _emitter3 = __webpack_require__(9);\n\nvar _emitter4 = _interopRequireDefault(_emitter3);\n\nvar _logger = __webpack_require__(10);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar debug = (0, _logger2.default)('quill:selection');\n\nvar Range = function Range(index) {\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n _classCallCheck(this, Range);\n\n this.index = index;\n this.length = length;\n};\n\nvar Selection = function () {\n function Selection(scroll, emitter) {\n var _this = this;\n\n _classCallCheck(this, Selection);\n\n this.emitter = emitter;\n this.scroll = scroll;\n this.composing = false;\n this.mouseDown = false;\n this.root = this.scroll.domNode;\n this.cursor = _parchment2.default.create('cursor', this);\n // savedRange is last non-null range\n this.lastRange = this.savedRange = new Range(0, 0);\n this.handleComposition();\n this.handleDragging();\n this.emitter.listenDOM('selectionchange', document, function () {\n if (!_this.mouseDown) {\n setTimeout(_this.update.bind(_this, _emitter4.default.sources.USER), 1);\n }\n });\n this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type, delta) {\n if (type === _emitter4.default.events.TEXT_CHANGE && delta.length() > 0) {\n _this.update(_emitter4.default.sources.SILENT);\n }\n });\n this.emitter.on(_emitter4.default.events.SCROLL_BEFORE_UPDATE, function () {\n if (!_this.hasFocus()) return;\n var native = _this.getNativeRange();\n if (native == null) return;\n if (native.start.node === _this.cursor.textNode) return; // cursor.restore() will handle\n // TODO unclear if this has negative side effects\n _this.emitter.once(_emitter4.default.events.SCROLL_UPDATE, function () {\n try {\n _this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset);\n } catch (ignored) {}\n });\n });\n this.emitter.on(_emitter4.default.events.SCROLL_OPTIMIZE, function (mutations, context) {\n if (context.range) {\n var _context$range = context.range,\n startNode = _context$range.startNode,\n startOffset = _context$range.startOffset,\n endNode = _context$range.endNode,\n endOffset = _context$range.endOffset;\n\n _this.setNativeRange(startNode, startOffset, endNode, endOffset);\n }\n });\n this.update(_emitter4.default.sources.SILENT);\n }\n\n _createClass(Selection, [{\n key: 'handleComposition',\n value: function handleComposition() {\n var _this2 = this;\n\n this.root.addEventListener('compositionstart', function () {\n _this2.composing = true;\n });\n this.root.addEventListener('compositionend', function () {\n _this2.composing = false;\n if (_this2.cursor.parent) {\n var range = _this2.cursor.restore();\n if (!range) return;\n setTimeout(function () {\n _this2.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset);\n }, 1);\n }\n });\n }\n }, {\n key: 'handleDragging',\n value: function handleDragging() {\n var _this3 = this;\n\n this.emitter.listenDOM('mousedown', document.body, function () {\n _this3.mouseDown = true;\n });\n this.emitter.listenDOM('mouseup', document.body, function () {\n _this3.mouseDown = false;\n _this3.update(_emitter4.default.sources.USER);\n });\n }\n }, {\n key: 'focus',\n value: function focus() {\n if (this.hasFocus()) return;\n this.root.focus();\n this.setRange(this.savedRange);\n }\n }, {\n key: 'format',\n value: function format(_format, value) {\n if (this.scroll.whitelist != null && !this.scroll.whitelist[_format]) return;\n this.scroll.update();\n var nativeRange = this.getNativeRange();\n if (nativeRange == null || !nativeRange.native.collapsed || _parchment2.default.query(_format, _parchment2.default.Scope.BLOCK)) return;\n if (nativeRange.start.node !== this.cursor.textNode) {\n var blot = _parchment2.default.find(nativeRange.start.node, false);\n if (blot == null) return;\n // TODO Give blot ability to not split\n if (blot instanceof _parchment2.default.Leaf) {\n var after = blot.split(nativeRange.start.offset);\n blot.parent.insertBefore(this.cursor, after);\n } else {\n blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen\n }\n this.cursor.attach();\n }\n this.cursor.format(_format, value);\n this.scroll.optimize();\n this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n this.update();\n }\n }, {\n key: 'getBounds',\n value: function getBounds(index) {\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var scrollLength = this.scroll.length();\n index = Math.min(index, scrollLength - 1);\n length = Math.min(index + length, scrollLength - 1) - index;\n var node = void 0,\n _scroll$leaf = this.scroll.leaf(index),\n _scroll$leaf2 = _slicedToArray(_scroll$leaf, 2),\n leaf = _scroll$leaf2[0],\n offset = _scroll$leaf2[1];\n if (leaf == null) return null;\n\n var _leaf$position = leaf.position(offset, true);\n\n var _leaf$position2 = _slicedToArray(_leaf$position, 2);\n\n node = _leaf$position2[0];\n offset = _leaf$position2[1];\n\n var range = document.createRange();\n if (length > 0) {\n range.setStart(node, offset);\n\n var _scroll$leaf3 = this.scroll.leaf(index + length);\n\n var _scroll$leaf4 = _slicedToArray(_scroll$leaf3, 2);\n\n leaf = _scroll$leaf4[0];\n offset = _scroll$leaf4[1];\n\n if (leaf == null) return null;\n\n var _leaf$position3 = leaf.position(offset, true);\n\n var _leaf$position4 = _slicedToArray(_leaf$position3, 2);\n\n node = _leaf$position4[0];\n offset = _leaf$position4[1];\n\n range.setEnd(node, offset);\n return range.getBoundingClientRect();\n } else {\n var side = 'left';\n var rect = void 0;\n if (node instanceof Text) {\n if (offset < node.data.length) {\n range.setStart(node, offset);\n range.setEnd(node, offset + 1);\n } else {\n range.setStart(node, offset - 1);\n range.setEnd(node, offset);\n side = 'right';\n }\n rect = range.getBoundingClientRect();\n } else {\n rect = leaf.domNode.getBoundingClientRect();\n if (offset > 0) side = 'right';\n }\n return {\n bottom: rect.top + rect.height,\n height: rect.height,\n left: rect[side],\n right: rect[side],\n top: rect.top,\n width: 0\n };\n }\n }\n }, {\n key: 'getNativeRange',\n value: function getNativeRange() {\n var selection = document.getSelection();\n if (selection == null || selection.rangeCount <= 0) return null;\n var nativeRange = selection.getRangeAt(0);\n if (nativeRange == null) return null;\n var range = this.normalizeNative(nativeRange);\n debug.info('getNativeRange', range);\n return range;\n }\n }, {\n key: 'getRange',\n value: function getRange() {\n var normalized = this.getNativeRange();\n if (normalized == null) return [null, null];\n var range = this.normalizedToRange(normalized);\n return [range, normalized];\n }\n }, {\n key: 'hasFocus',\n value: function hasFocus() {\n return document.activeElement === this.root;\n }\n }, {\n key: 'normalizedToRange',\n value: function normalizedToRange(range) {\n var _this4 = this;\n\n var positions = [[range.start.node, range.start.offset]];\n if (!range.native.collapsed) {\n positions.push([range.end.node, range.end.offset]);\n }\n var indexes = positions.map(function (position) {\n var _position = _slicedToArray(position, 2),\n node = _position[0],\n offset = _position[1];\n\n var blot = _parchment2.default.find(node, true);\n var index = blot.offset(_this4.scroll);\n if (offset === 0) {\n return index;\n } else if (blot instanceof _parchment2.default.Container) {\n return index + blot.length();\n } else {\n return index + blot.index(node, offset);\n }\n });\n var end = Math.min(Math.max.apply(Math, _toConsumableArray(indexes)), this.scroll.length() - 1);\n var start = Math.min.apply(Math, [end].concat(_toConsumableArray(indexes)));\n return new Range(start, end - start);\n }\n }, {\n key: 'normalizeNative',\n value: function normalizeNative(nativeRange) {\n if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) {\n return null;\n }\n var range = {\n start: { node: nativeRange.startContainer, offset: nativeRange.startOffset },\n end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n native: nativeRange\n };\n [range.start, range.end].forEach(function (position) {\n var node = position.node,\n offset = position.offset;\n while (!(node instanceof Text) && node.childNodes.length > 0) {\n if (node.childNodes.length > offset) {\n node = node.childNodes[offset];\n offset = 0;\n } else if (node.childNodes.length === offset) {\n node = node.lastChild;\n offset = node instanceof Text ? node.data.length : node.childNodes.length + 1;\n } else {\n break;\n }\n }\n position.node = node, position.offset = offset;\n });\n return range;\n }\n }, {\n key: 'rangeToNative',\n value: function rangeToNative(range) {\n var _this5 = this;\n\n var indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length];\n var args = [];\n var scrollLength = this.scroll.length();\n indexes.forEach(function (index, i) {\n index = Math.min(scrollLength - 1, index);\n var node = void 0,\n _scroll$leaf5 = _this5.scroll.leaf(index),\n _scroll$leaf6 = _slicedToArray(_scroll$leaf5, 2),\n leaf = _scroll$leaf6[0],\n offset = _scroll$leaf6[1];\n var _leaf$position5 = leaf.position(offset, i !== 0);\n\n var _leaf$position6 = _slicedToArray(_leaf$position5, 2);\n\n node = _leaf$position6[0];\n offset = _leaf$position6[1];\n\n args.push(node, offset);\n });\n if (args.length < 2) {\n args = args.concat(args);\n }\n return args;\n }\n }, {\n key: 'scrollIntoView',\n value: function scrollIntoView(scrollingContainer) {\n var range = this.lastRange;\n if (range == null) return;\n var bounds = this.getBounds(range.index, range.length);\n if (bounds == null) return;\n var limit = this.scroll.length() - 1;\n\n var _scroll$line = this.scroll.line(Math.min(range.index, limit)),\n _scroll$line2 = _slicedToArray(_scroll$line, 1),\n first = _scroll$line2[0];\n\n var last = first;\n if (range.length > 0) {\n var _scroll$line3 = this.scroll.line(Math.min(range.index + range.length, limit));\n\n var _scroll$line4 = _slicedToArray(_scroll$line3, 1);\n\n last = _scroll$line4[0];\n }\n if (first == null || last == null) return;\n var scrollBounds = scrollingContainer.getBoundingClientRect();\n if (bounds.top < scrollBounds.top) {\n scrollingContainer.scrollTop -= scrollBounds.top - bounds.top;\n } else if (bounds.bottom > scrollBounds.bottom) {\n scrollingContainer.scrollTop += bounds.bottom - scrollBounds.bottom;\n }\n }\n }, {\n key: 'setNativeRange',\n value: function setNativeRange(startNode, startOffset) {\n var endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode;\n var endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset;\n var force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) {\n return;\n }\n var selection = document.getSelection();\n if (selection == null) return;\n if (startNode != null) {\n if (!this.hasFocus()) this.root.focus();\n var native = (this.getNativeRange() || {}).native;\n if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) {\n\n if (startNode.tagName == \"BR\") {\n startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode);\n startNode = startNode.parentNode;\n }\n if (endNode.tagName == \"BR\") {\n endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode);\n endNode = endNode.parentNode;\n }\n var range = document.createRange();\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n } else {\n selection.removeAllRanges();\n this.root.blur();\n document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs)\n }\n }\n }, {\n key: 'setRange',\n value: function setRange(range) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API;\n\n if (typeof force === 'string') {\n source = force;\n force = false;\n }\n debug.info('setRange', range);\n if (range != null) {\n var args = this.rangeToNative(range);\n this.setNativeRange.apply(this, _toConsumableArray(args).concat([force]));\n } else {\n this.setNativeRange(null);\n }\n this.update(source);\n }\n }, {\n key: 'update',\n value: function update() {\n var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER;\n\n var oldRange = this.lastRange;\n\n var _getRange = this.getRange(),\n _getRange2 = _slicedToArray(_getRange, 2),\n lastRange = _getRange2[0],\n nativeRange = _getRange2[1];\n\n this.lastRange = lastRange;\n if (this.lastRange != null) {\n this.savedRange = this.lastRange;\n }\n if (!(0, _deepEqual2.default)(oldRange, this.lastRange)) {\n var _emitter;\n\n if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) {\n this.cursor.restore();\n }\n var args = [_emitter4.default.events.SELECTION_CHANGE, (0, _clone2.default)(this.lastRange), (0, _clone2.default)(oldRange), source];\n (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args));\n if (source !== _emitter4.default.sources.SILENT) {\n var _emitter2;\n\n (_emitter2 = this.emitter).emit.apply(_emitter2, args);\n }\n }\n }\n }]);\n\n return Selection;\n}();\n\nfunction contains(parent, descendant) {\n try {\n // Firefox inserts inaccessible nodes around video elements\n descendant.parentNode;\n } catch (e) {\n return false;\n }\n // IE11 has bug with Text nodes\n // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect\n if (descendant instanceof Text) {\n descendant = descendant.parentNode;\n }\n return parent.contains(descendant);\n}\n\nexports.Range = Range;\nexports.default = Selection;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Container = function (_Parchment$Container) {\n _inherits(Container, _Parchment$Container);\n\n function Container() {\n _classCallCheck(this, Container);\n\n return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).apply(this, arguments));\n }\n\n return Container;\n}(_parchment2.default.Container);\n\nContainer.allowedChildren = [_block2.default, _block.BlockEmbed, Container];\n\nexports.default = Container;\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ColorStyle = exports.ColorClass = exports.ColorAttributor = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ColorAttributor = function (_Parchment$Attributor) {\n _inherits(ColorAttributor, _Parchment$Attributor);\n\n function ColorAttributor() {\n _classCallCheck(this, ColorAttributor);\n\n return _possibleConstructorReturn(this, (ColorAttributor.__proto__ || Object.getPrototypeOf(ColorAttributor)).apply(this, arguments));\n }\n\n _createClass(ColorAttributor, [{\n key: 'value',\n value: function value(domNode) {\n var value = _get(ColorAttributor.prototype.__proto__ || Object.getPrototypeOf(ColorAttributor.prototype), 'value', this).call(this, domNode);\n if (!value.startsWith('rgb(')) return value;\n value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n return '#' + value.split(',').map(function (component) {\n return ('00' + parseInt(component).toString(16)).slice(-2);\n }).join('');\n }\n }]);\n\n return ColorAttributor;\n}(_parchment2.default.Attributor.Style);\n\nvar ColorClass = new _parchment2.default.Attributor.Class('color', 'ql-color', {\n scope: _parchment2.default.Scope.INLINE\n});\nvar ColorStyle = new ColorAttributor('color', 'color', {\n scope: _parchment2.default.Scope.INLINE\n});\n\nexports.ColorAttributor = ColorAttributor;\nexports.ColorClass = ColorClass;\nexports.ColorStyle = ColorStyle;\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SHORTKEY = exports.default = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _clone = __webpack_require__(21);\n\nvar _clone2 = _interopRequireDefault(_clone);\n\nvar _deepEqual = __webpack_require__(12);\n\nvar _deepEqual2 = _interopRequireDefault(_deepEqual);\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _op = __webpack_require__(20);\n\nvar _op2 = _interopRequireDefault(_op);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _logger = __webpack_require__(10);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar debug = (0, _logger2.default)('quill:keyboard');\n\nvar SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\nvar Keyboard = function (_Module) {\n _inherits(Keyboard, _Module);\n\n _createClass(Keyboard, null, [{\n key: 'match',\n value: function match(evt, binding) {\n binding = normalize(binding);\n if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) {\n return !!binding[key] !== evt[key] && binding[key] !== null;\n })) {\n return false;\n }\n return binding.key === (evt.which || evt.keyCode);\n }\n }]);\n\n function Keyboard(quill, options) {\n _classCallCheck(this, Keyboard);\n\n var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options));\n\n _this.bindings = {};\n Object.keys(_this.options.bindings).forEach(function (name) {\n if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) {\n return;\n }\n if (_this.options.bindings[name]) {\n _this.addBinding(_this.options.bindings[name]);\n }\n });\n _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);\n _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {});\n if (/Firefox/i.test(navigator.userAgent)) {\n // Need to handle delete and backspace for Firefox in the general case #1171\n _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);\n _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);\n } else {\n _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);\n _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);\n }\n _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);\n _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);\n _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace);\n _this.listen();\n return _this;\n }\n\n _createClass(Keyboard, [{\n key: 'addBinding',\n value: function addBinding(key) {\n var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var binding = normalize(key);\n if (binding == null || binding.key == null) {\n return debug.warn('Attempted to add invalid keyboard binding', binding);\n }\n if (typeof context === 'function') {\n context = { handler: context };\n }\n if (typeof handler === 'function') {\n handler = { handler: handler };\n }\n binding = (0, _extend2.default)(binding, context, handler);\n this.bindings[binding.key] = this.bindings[binding.key] || [];\n this.bindings[binding.key].push(binding);\n }\n }, {\n key: 'listen',\n value: function listen() {\n var _this2 = this;\n\n this.quill.root.addEventListener('keydown', function (evt) {\n if (evt.defaultPrevented) return;\n var which = evt.which || evt.keyCode;\n var bindings = (_this2.bindings[which] || []).filter(function (binding) {\n return Keyboard.match(evt, binding);\n });\n if (bindings.length === 0) return;\n var range = _this2.quill.getSelection();\n if (range == null || !_this2.quill.hasFocus()) return;\n\n var _quill$getLine = _this2.quill.getLine(range.index),\n _quill$getLine2 = _slicedToArray(_quill$getLine, 2),\n line = _quill$getLine2[0],\n offset = _quill$getLine2[1];\n\n var _quill$getLeaf = _this2.quill.getLeaf(range.index),\n _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2),\n leafStart = _quill$getLeaf2[0],\n offsetStart = _quill$getLeaf2[1];\n\n var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length),\n _ref2 = _slicedToArray(_ref, 2),\n leafEnd = _ref2[0],\n offsetEnd = _ref2[1];\n\n var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : '';\n var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : '';\n var curContext = {\n collapsed: range.length === 0,\n empty: range.length === 0 && line.length() <= 1,\n format: _this2.quill.getFormat(range),\n offset: offset,\n prefix: prefixText,\n suffix: suffixText\n };\n var prevented = bindings.some(function (binding) {\n if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;\n if (binding.empty != null && binding.empty !== curContext.empty) return false;\n if (binding.offset != null && binding.offset !== curContext.offset) return false;\n if (Array.isArray(binding.format)) {\n // any format is present\n if (binding.format.every(function (name) {\n return curContext.format[name] == null;\n })) {\n return false;\n }\n } else if (_typeof(binding.format) === 'object') {\n // all formats must match\n if (!Object.keys(binding.format).every(function (name) {\n if (binding.format[name] === true) return curContext.format[name] != null;\n if (binding.format[name] === false) return curContext.format[name] == null;\n return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]);\n })) {\n return false;\n }\n }\n if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;\n if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;\n return binding.handler.call(_this2, range, curContext) !== true;\n });\n if (prevented) {\n evt.preventDefault();\n }\n });\n }\n }]);\n\n return Keyboard;\n}(_module2.default);\n\nKeyboard.keys = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESCAPE: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n DELETE: 46\n};\n\nKeyboard.DEFAULTS = {\n bindings: {\n 'bold': makeFormatHandler('bold'),\n 'italic': makeFormatHandler('italic'),\n 'underline': makeFormatHandler('underline'),\n 'indent': {\n // highlight tab or tab at beginning of list, indent or blockquote\n key: Keyboard.keys.TAB,\n format: ['blockquote', 'indent', 'list'],\n handler: function handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '+1', _quill2.default.sources.USER);\n }\n },\n 'outdent': {\n key: Keyboard.keys.TAB,\n shiftKey: true,\n format: ['blockquote', 'indent', 'list'],\n // highlight tab or tab at beginning of list, indent or blockquote\n handler: function handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '-1', _quill2.default.sources.USER);\n }\n },\n 'outdent backspace': {\n key: Keyboard.keys.BACKSPACE,\n collapsed: true,\n shiftKey: null,\n metaKey: null,\n ctrlKey: null,\n altKey: null,\n format: ['indent', 'list'],\n offset: 0,\n handler: function handler(range, context) {\n if (context.format.indent != null) {\n this.quill.format('indent', '-1', _quill2.default.sources.USER);\n } else if (context.format.list != null) {\n this.quill.format('list', false, _quill2.default.sources.USER);\n }\n }\n },\n 'indent code-block': makeCodeBlockHandler(true),\n 'outdent code-block': makeCodeBlockHandler(false),\n 'remove tab': {\n key: Keyboard.keys.TAB,\n shiftKey: true,\n collapsed: true,\n prefix: /\\t$/,\n handler: function handler(range) {\n this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER);\n }\n },\n 'tab': {\n key: Keyboard.keys.TAB,\n handler: function handler(range) {\n this.quill.history.cutoff();\n var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\\t');\n this.quill.updateContents(delta, _quill2.default.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n }\n },\n 'list empty enter': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: ['list'],\n empty: true,\n handler: function handler(range, context) {\n this.quill.format('list', false, _quill2.default.sources.USER);\n if (context.format.indent) {\n this.quill.format('indent', false, _quill2.default.sources.USER);\n }\n }\n },\n 'checklist enter': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: { list: 'checked' },\n handler: function handler(range) {\n var _quill$getLine3 = this.quill.getLine(range.index),\n _quill$getLine4 = _slicedToArray(_quill$getLine3, 2),\n line = _quill$getLine4[0],\n offset = _quill$getLine4[1];\n\n var formats = (0, _extend2.default)({}, line.formats(), { list: 'checked' });\n var delta = new _quillDelta2.default().retain(range.index).insert('\\n', formats).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' });\n this.quill.updateContents(delta, _quill2.default.sources.USER);\n this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n this.quill.scrollIntoView();\n }\n },\n 'header enter': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: ['header'],\n suffix: /^$/,\n handler: function handler(range, context) {\n var _quill$getLine5 = this.quill.getLine(range.index),\n _quill$getLine6 = _slicedToArray(_quill$getLine5, 2),\n line = _quill$getLine6[0],\n offset = _quill$getLine6[1];\n\n var delta = new _quillDelta2.default().retain(range.index).insert('\\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null });\n this.quill.updateContents(delta, _quill2.default.sources.USER);\n this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n this.quill.scrollIntoView();\n }\n },\n 'list autofill': {\n key: ' ',\n collapsed: true,\n format: { list: false },\n prefix: /^\\s*?(\\d+\\.|-|\\*|\\[ ?\\]|\\[x\\])$/,\n handler: function handler(range, context) {\n var length = context.prefix.length;\n\n var _quill$getLine7 = this.quill.getLine(range.index),\n _quill$getLine8 = _slicedToArray(_quill$getLine7, 2),\n line = _quill$getLine8[0],\n offset = _quill$getLine8[1];\n\n if (offset > length) return true;\n var value = void 0;\n switch (context.prefix.trim()) {\n case '[]':case '[ ]':\n value = 'unchecked';\n break;\n case '[x]':\n value = 'checked';\n break;\n case '-':case '*':\n value = 'bullet';\n break;\n default:\n value = 'ordered';\n }\n this.quill.insertText(range.index, ' ', _quill2.default.sources.USER);\n this.quill.history.cutoff();\n var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value });\n this.quill.updateContents(delta, _quill2.default.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT);\n }\n },\n 'code exit': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: ['code-block'],\n prefix: /\\n\\n$/,\n suffix: /^\\s+$/,\n handler: function handler(range) {\n var _quill$getLine9 = this.quill.getLine(range.index),\n _quill$getLine10 = _slicedToArray(_quill$getLine9, 2),\n line = _quill$getLine10[0],\n offset = _quill$getLine10[1];\n\n var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1);\n this.quill.updateContents(delta, _quill2.default.sources.USER);\n }\n },\n 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false),\n 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true),\n 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false),\n 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true)\n }\n};\n\nfunction makeEmbedArrowHandler(key, shiftKey) {\n var _ref3;\n\n var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix';\n return _ref3 = {\n key: key,\n shiftKey: shiftKey,\n altKey: null\n }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) {\n var index = range.index;\n if (key === Keyboard.keys.RIGHT) {\n index += range.length + 1;\n }\n\n var _quill$getLeaf3 = this.quill.getLeaf(index),\n _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1),\n leaf = _quill$getLeaf4[0];\n\n if (!(leaf instanceof _parchment2.default.Embed)) return true;\n if (key === Keyboard.keys.LEFT) {\n if (shiftKey) {\n this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER);\n } else {\n this.quill.setSelection(range.index - 1, _quill2.default.sources.USER);\n }\n } else {\n if (shiftKey) {\n this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER);\n } else {\n this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER);\n }\n }\n return false;\n }), _ref3;\n}\n\nfunction handleBackspace(range, context) {\n if (range.index === 0 || this.quill.getLength() <= 1) return;\n\n var _quill$getLine11 = this.quill.getLine(range.index),\n _quill$getLine12 = _slicedToArray(_quill$getLine11, 1),\n line = _quill$getLine12[0];\n\n var formats = {};\n if (context.offset === 0) {\n var _quill$getLine13 = this.quill.getLine(range.index - 1),\n _quill$getLine14 = _slicedToArray(_quill$getLine13, 1),\n prev = _quill$getLine14[0];\n\n if (prev != null && prev.length() > 1) {\n var curFormats = line.formats();\n var prevFormats = this.quill.getFormat(range.index - 1, 1);\n formats = _op2.default.attributes.diff(curFormats, prevFormats) || {};\n }\n }\n // Check for astral symbols\n var length = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$/.test(context.prefix) ? 2 : 1;\n this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER);\n if (Object.keys(formats).length > 0) {\n this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER);\n }\n this.quill.focus();\n}\n\nfunction handleDelete(range, context) {\n // Check for astral symbols\n var length = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(context.suffix) ? 2 : 1;\n if (range.index >= this.quill.getLength() - length) return;\n var formats = {},\n nextLength = 0;\n\n var _quill$getLine15 = this.quill.getLine(range.index),\n _quill$getLine16 = _slicedToArray(_quill$getLine15, 1),\n line = _quill$getLine16[0];\n\n if (context.offset >= line.length() - 1) {\n var _quill$getLine17 = this.quill.getLine(range.index + 1),\n _quill$getLine18 = _slicedToArray(_quill$getLine17, 1),\n next = _quill$getLine18[0];\n\n if (next) {\n var curFormats = line.formats();\n var nextFormats = this.quill.getFormat(range.index, 1);\n formats = _op2.default.attributes.diff(curFormats, nextFormats) || {};\n nextLength = next.length();\n }\n }\n this.quill.deleteText(range.index, length, _quill2.default.sources.USER);\n if (Object.keys(formats).length > 0) {\n this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER);\n }\n}\n\nfunction handleDeleteRange(range) {\n var lines = this.quill.getLines(range);\n var formats = {};\n if (lines.length > 1) {\n var firstFormats = lines[0].formats();\n var lastFormats = lines[lines.length - 1].formats();\n formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {};\n }\n this.quill.deleteText(range, _quill2.default.sources.USER);\n if (Object.keys(formats).length > 0) {\n this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER);\n }\n this.quill.setSelection(range.index, _quill2.default.sources.SILENT);\n this.quill.focus();\n}\n\nfunction handleEnter(range, context) {\n var _this3 = this;\n\n if (range.length > 0) {\n this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change\n }\n var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) {\n if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) {\n lineFormats[format] = context.format[format];\n }\n return lineFormats;\n }, {});\n this.quill.insertText(range.index, '\\n', lineFormats, _quill2.default.sources.USER);\n // Earlier scroll.deleteAt might have messed up our selection,\n // so insertText's built in selection preservation is not reliable\n this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n this.quill.focus();\n Object.keys(context.format).forEach(function (name) {\n if (lineFormats[name] != null) return;\n if (Array.isArray(context.format[name])) return;\n if (name === 'link') return;\n _this3.quill.format(name, context.format[name], _quill2.default.sources.USER);\n });\n}\n\nfunction makeCodeBlockHandler(indent) {\n return {\n key: Keyboard.keys.TAB,\n shiftKey: !indent,\n format: { 'code-block': true },\n handler: function handler(range) {\n var CodeBlock = _parchment2.default.query('code-block');\n var index = range.index,\n length = range.length;\n\n var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index),\n _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),\n block = _quill$scroll$descend2[0],\n offset = _quill$scroll$descend2[1];\n\n if (block == null) return;\n var scrollIndex = this.quill.getIndex(block);\n var start = block.newlineIndex(offset, true) + 1;\n var end = block.newlineIndex(scrollIndex + offset + length);\n var lines = block.domNode.textContent.slice(start, end).split('\\n');\n offset = 0;\n lines.forEach(function (line, i) {\n if (indent) {\n block.insertAt(start + offset, CodeBlock.TAB);\n offset += CodeBlock.TAB.length;\n if (i === 0) {\n index += CodeBlock.TAB.length;\n } else {\n length += CodeBlock.TAB.length;\n }\n } else if (line.startsWith(CodeBlock.TAB)) {\n block.deleteAt(start + offset, CodeBlock.TAB.length);\n offset -= CodeBlock.TAB.length;\n if (i === 0) {\n index -= CodeBlock.TAB.length;\n } else {\n length -= CodeBlock.TAB.length;\n }\n }\n offset += line.length + 1;\n });\n this.quill.update(_quill2.default.sources.USER);\n this.quill.setSelection(index, length, _quill2.default.sources.SILENT);\n }\n };\n}\n\nfunction makeFormatHandler(format) {\n return {\n key: format[0].toUpperCase(),\n shortKey: true,\n handler: function handler(range, context) {\n this.quill.format(format, !context.format[format], _quill2.default.sources.USER);\n }\n };\n}\n\nfunction normalize(binding) {\n if (typeof binding === 'string' || typeof binding === 'number') {\n return normalize({ key: binding });\n }\n if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') {\n binding = (0, _clone2.default)(binding, false);\n }\n if (typeof binding.key === 'string') {\n if (Keyboard.keys[binding.key.toUpperCase()] != null) {\n binding.key = Keyboard.keys[binding.key.toUpperCase()];\n } else if (binding.key.length === 1) {\n binding.key = binding.key.toUpperCase().charCodeAt(0);\n } else {\n return null;\n }\n }\n if (binding.shortKey) {\n binding[SHORTKEY] = binding.shortKey;\n delete binding.shortKey;\n }\n return binding;\n}\n\nexports.default = Keyboard;\nexports.SHORTKEY = SHORTKEY;\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n 'align': {\n '': __webpack_require__(75),\n 'center': __webpack_require__(76),\n 'right': __webpack_require__(77),\n 'justify': __webpack_require__(78)\n },\n 'background': __webpack_require__(79),\n 'blockquote': __webpack_require__(80),\n 'bold': __webpack_require__(81),\n 'clean': __webpack_require__(82),\n 'code': __webpack_require__(40),\n 'code-block': __webpack_require__(40),\n 'color': __webpack_require__(83),\n 'direction': {\n '': __webpack_require__(84),\n 'rtl': __webpack_require__(85)\n },\n 'float': {\n 'center': __webpack_require__(86),\n 'full': __webpack_require__(87),\n 'left': __webpack_require__(88),\n 'right': __webpack_require__(89)\n },\n 'formula': __webpack_require__(90),\n 'header': {\n '1': __webpack_require__(91),\n '2': __webpack_require__(92)\n },\n 'italic': __webpack_require__(93),\n 'image': __webpack_require__(94),\n 'indent': {\n '+1': __webpack_require__(95),\n '-1': __webpack_require__(96)\n },\n 'link': __webpack_require__(97),\n 'list': {\n 'ordered': __webpack_require__(98),\n 'bullet': __webpack_require__(99),\n 'check': __webpack_require__(100)\n },\n 'script': {\n 'sub': __webpack_require__(101),\n 'super': __webpack_require__(102)\n },\n 'strike': __webpack_require__(103),\n 'underline': __webpack_require__(104),\n 'video': __webpack_require__(105)\n};\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registry = __webpack_require__(1);\nvar ShadowBlot = /** @class */ (function () {\n function ShadowBlot(domNode) {\n this.domNode = domNode;\n // @ts-ignore\n this.domNode[Registry.DATA_KEY] = { blot: this };\n }\n Object.defineProperty(ShadowBlot.prototype, \"statics\", {\n // Hack for accessing inherited static methods\n get: function () {\n return this.constructor;\n },\n enumerable: true,\n configurable: true\n });\n ShadowBlot.create = function (value) {\n if (this.tagName == null) {\n throw new Registry.ParchmentError('Blot definition missing tagName');\n }\n var node;\n if (Array.isArray(this.tagName)) {\n if (typeof value === 'string') {\n value = value.toUpperCase();\n if (parseInt(value).toString() === value) {\n value = parseInt(value);\n }\n }\n if (typeof value === 'number') {\n node = document.createElement(this.tagName[value - 1]);\n }\n else if (this.tagName.indexOf(value) > -1) {\n node = document.createElement(value);\n }\n else {\n node = document.createElement(this.tagName[0]);\n }\n }\n else {\n node = document.createElement(this.tagName);\n }\n if (this.className) {\n node.classList.add(this.className);\n }\n return node;\n };\n ShadowBlot.prototype.attach = function () {\n if (this.parent != null) {\n this.scroll = this.parent.scroll;\n }\n };\n ShadowBlot.prototype.clone = function () {\n var domNode = this.domNode.cloneNode(false);\n return Registry.create(domNode);\n };\n ShadowBlot.prototype.detach = function () {\n if (this.parent != null)\n this.parent.removeChild(this);\n // @ts-ignore\n delete this.domNode[Registry.DATA_KEY];\n };\n ShadowBlot.prototype.deleteAt = function (index, length) {\n var blot = this.isolate(index, length);\n blot.remove();\n };\n ShadowBlot.prototype.formatAt = function (index, length, name, value) {\n var blot = this.isolate(index, length);\n if (Registry.query(name, Registry.Scope.BLOT) != null && value) {\n blot.wrap(name, value);\n }\n else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) {\n var parent = Registry.create(this.statics.scope);\n blot.wrap(parent);\n parent.format(name, value);\n }\n };\n ShadowBlot.prototype.insertAt = function (index, value, def) {\n var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);\n var ref = this.split(index);\n this.parent.insertBefore(blot, ref);\n };\n ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) {\n if (refBlot === void 0) { refBlot = null; }\n if (this.parent != null) {\n this.parent.children.remove(this);\n }\n var refDomNode = null;\n parentBlot.children.insertBefore(this, refBlot);\n if (refBlot != null) {\n refDomNode = refBlot.domNode;\n }\n if (this.domNode.parentNode != parentBlot.domNode ||\n this.domNode.nextSibling != refDomNode) {\n parentBlot.domNode.insertBefore(this.domNode, refDomNode);\n }\n this.parent = parentBlot;\n this.attach();\n };\n ShadowBlot.prototype.isolate = function (index, length) {\n var target = this.split(index);\n target.split(length);\n return target;\n };\n ShadowBlot.prototype.length = function () {\n return 1;\n };\n ShadowBlot.prototype.offset = function (root) {\n if (root === void 0) { root = this.parent; }\n if (this.parent == null || this == root)\n return 0;\n return this.parent.children.offset(this) + this.parent.offset(root);\n };\n ShadowBlot.prototype.optimize = function (context) {\n // TODO clean up once we use WeakMap\n // @ts-ignore\n if (this.domNode[Registry.DATA_KEY] != null) {\n // @ts-ignore\n delete this.domNode[Registry.DATA_KEY].mutations;\n }\n };\n ShadowBlot.prototype.remove = function () {\n if (this.domNode.parentNode != null) {\n this.domNode.parentNode.removeChild(this.domNode);\n }\n this.detach();\n };\n ShadowBlot.prototype.replace = function (target) {\n if (target.parent == null)\n return;\n target.parent.insertBefore(this, target.next);\n target.remove();\n };\n ShadowBlot.prototype.replaceWith = function (name, value) {\n var replacement = typeof name === 'string' ? Registry.create(name, value) : name;\n replacement.replace(this);\n return replacement;\n };\n ShadowBlot.prototype.split = function (index, force) {\n return index === 0 ? this : this.next;\n };\n ShadowBlot.prototype.update = function (mutations, context) {\n // Nothing to do by default\n };\n ShadowBlot.prototype.wrap = function (name, value) {\n var wrapper = typeof name === 'string' ? Registry.create(name, value) : name;\n if (this.parent != null) {\n this.parent.insertBefore(wrapper, this.next);\n }\n wrapper.appendChild(this);\n return wrapper;\n };\n ShadowBlot.blotName = 'abstract';\n return ShadowBlot;\n}());\nexports.default = ShadowBlot;\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(11);\nvar class_1 = __webpack_require__(29);\nvar style_1 = __webpack_require__(30);\nvar Registry = __webpack_require__(1);\nvar AttributorStore = /** @class */ (function () {\n function AttributorStore(domNode) {\n this.attributes = {};\n this.domNode = domNode;\n this.build();\n }\n AttributorStore.prototype.attribute = function (attribute, value) {\n // verb\n if (value) {\n if (attribute.add(this.domNode, value)) {\n if (attribute.value(this.domNode) != null) {\n this.attributes[attribute.attrName] = attribute;\n }\n else {\n delete this.attributes[attribute.attrName];\n }\n }\n }\n else {\n attribute.remove(this.domNode);\n delete this.attributes[attribute.attrName];\n }\n };\n AttributorStore.prototype.build = function () {\n var _this = this;\n this.attributes = {};\n var attributes = attributor_1.default.keys(this.domNode);\n var classes = class_1.default.keys(this.domNode);\n var styles = style_1.default.keys(this.domNode);\n attributes\n .concat(classes)\n .concat(styles)\n .forEach(function (name) {\n var attr = Registry.query(name, Registry.Scope.ATTRIBUTE);\n if (attr instanceof attributor_1.default) {\n _this.attributes[attr.attrName] = attr;\n }\n });\n };\n AttributorStore.prototype.copy = function (target) {\n var _this = this;\n Object.keys(this.attributes).forEach(function (key) {\n var value = _this.attributes[key].value(_this.domNode);\n target.format(key, value);\n });\n };\n AttributorStore.prototype.move = function (target) {\n var _this = this;\n this.copy(target);\n Object.keys(this.attributes).forEach(function (key) {\n _this.attributes[key].remove(_this.domNode);\n });\n this.attributes = {};\n };\n AttributorStore.prototype.values = function () {\n var _this = this;\n return Object.keys(this.attributes).reduce(function (attributes, name) {\n attributes[name] = _this.attributes[name].value(_this.domNode);\n return attributes;\n }, {});\n };\n return AttributorStore;\n}());\nexports.default = AttributorStore;\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(11);\nfunction match(node, prefix) {\n var className = node.getAttribute('class') || '';\n return className.split(/\\s+/).filter(function (name) {\n return name.indexOf(prefix + \"-\") === 0;\n });\n}\nvar ClassAttributor = /** @class */ (function (_super) {\n __extends(ClassAttributor, _super);\n function ClassAttributor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ClassAttributor.keys = function (node) {\n return (node.getAttribute('class') || '').split(/\\s+/).map(function (name) {\n return name\n .split('-')\n .slice(0, -1)\n .join('-');\n });\n };\n ClassAttributor.prototype.add = function (node, value) {\n if (!this.canAdd(node, value))\n return false;\n this.remove(node);\n node.classList.add(this.keyName + \"-\" + value);\n return true;\n };\n ClassAttributor.prototype.remove = function (node) {\n var matches = match(node, this.keyName);\n matches.forEach(function (name) {\n node.classList.remove(name);\n });\n if (node.classList.length === 0) {\n node.removeAttribute('class');\n }\n };\n ClassAttributor.prototype.value = function (node) {\n var result = match(node, this.keyName)[0] || '';\n var value = result.slice(this.keyName.length + 1); // +1 for hyphen\n return this.canAdd(node, value) ? value : '';\n };\n return ClassAttributor;\n}(attributor_1.default));\nexports.default = ClassAttributor;\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(11);\nfunction camelize(name) {\n var parts = name.split('-');\n var rest = parts\n .slice(1)\n .map(function (part) {\n return part[0].toUpperCase() + part.slice(1);\n })\n .join('');\n return parts[0] + rest;\n}\nvar StyleAttributor = /** @class */ (function (_super) {\n __extends(StyleAttributor, _super);\n function StyleAttributor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n StyleAttributor.keys = function (node) {\n return (node.getAttribute('style') || '').split(';').map(function (value) {\n var arr = value.split(':');\n return arr[0].trim();\n });\n };\n StyleAttributor.prototype.add = function (node, value) {\n if (!this.canAdd(node, value))\n return false;\n // @ts-ignore\n node.style[camelize(this.keyName)] = value;\n return true;\n };\n StyleAttributor.prototype.remove = function (node) {\n // @ts-ignore\n node.style[camelize(this.keyName)] = '';\n if (!node.getAttribute('style')) {\n node.removeAttribute('style');\n }\n };\n StyleAttributor.prototype.value = function (node) {\n // @ts-ignore\n var value = node.style[camelize(this.keyName)];\n return this.canAdd(node, value) ? value : '';\n };\n return StyleAttributor;\n}(attributor_1.default));\nexports.default = StyleAttributor;\n\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _text = __webpack_require__(8);\n\nvar _text2 = _interopRequireDefault(_text);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Cursor = function (_Parchment$Embed) {\n _inherits(Cursor, _Parchment$Embed);\n\n _createClass(Cursor, null, [{\n key: 'value',\n value: function value() {\n return undefined;\n }\n }]);\n\n function Cursor(domNode, selection) {\n _classCallCheck(this, Cursor);\n\n var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode));\n\n _this.selection = selection;\n _this.textNode = document.createTextNode(Cursor.CONTENTS);\n _this.domNode.appendChild(_this.textNode);\n _this._length = 0;\n return _this;\n }\n\n _createClass(Cursor, [{\n key: 'detach',\n value: function detach() {\n // super.detach() will also clear domNode.__blot\n if (this.parent != null) this.parent.removeChild(this);\n }\n }, {\n key: 'format',\n value: function format(name, value) {\n if (this._length !== 0) {\n return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value);\n }\n var target = this,\n index = 0;\n while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) {\n index += target.offset(target.parent);\n target = target.parent;\n }\n if (target != null) {\n this._length = Cursor.CONTENTS.length;\n target.optimize();\n target.formatAt(index, Cursor.CONTENTS.length, name, value);\n this._length = 0;\n }\n }\n }, {\n key: 'index',\n value: function index(node, offset) {\n if (node === this.textNode) return 0;\n return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset);\n }\n }, {\n key: 'length',\n value: function length() {\n return this._length;\n }\n }, {\n key: 'position',\n value: function position() {\n return [this.textNode, this.textNode.data.length];\n }\n }, {\n key: 'remove',\n value: function remove() {\n _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this);\n this.parent = null;\n }\n }, {\n key: 'restore',\n value: function restore() {\n if (this.selection.composing || this.parent == null) return;\n var textNode = this.textNode;\n var range = this.selection.getNativeRange();\n var restoreText = void 0,\n start = void 0,\n end = void 0;\n if (range != null && range.start.node === textNode && range.end.node === textNode) {\n var _ref = [textNode, range.start.offset, range.end.offset];\n restoreText = _ref[0];\n start = _ref[1];\n end = _ref[2];\n }\n // Link format will insert text outside of anchor tag\n while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {\n this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);\n }\n if (this.textNode.data !== Cursor.CONTENTS) {\n var text = this.textNode.data.split(Cursor.CONTENTS).join('');\n if (this.next instanceof _text2.default) {\n restoreText = this.next.domNode;\n this.next.insertAt(0, text);\n this.textNode.data = Cursor.CONTENTS;\n } else {\n this.textNode.data = text;\n this.parent.insertBefore(_parchment2.default.create(this.textNode), this);\n this.textNode = document.createTextNode(Cursor.CONTENTS);\n this.domNode.appendChild(this.textNode);\n }\n }\n this.remove();\n if (start != null) {\n var _map = [start, end].map(function (offset) {\n return Math.max(0, Math.min(restoreText.data.length, offset - 1));\n });\n\n var _map2 = _slicedToArray(_map, 2);\n\n start = _map2[0];\n end = _map2[1];\n\n return {\n startNode: restoreText,\n startOffset: start,\n endNode: restoreText,\n endOffset: end\n };\n }\n }\n }, {\n key: 'update',\n value: function update(mutations, context) {\n var _this2 = this;\n\n if (mutations.some(function (mutation) {\n return mutation.type === 'characterData' && mutation.target === _this2.textNode;\n })) {\n var range = this.restore();\n if (range) context.range = range;\n }\n }\n }, {\n key: 'value',\n value: function value() {\n return '';\n }\n }]);\n\n return Cursor;\n}(_parchment2.default.Embed);\n\nCursor.blotName = 'cursor';\nCursor.className = 'ql-cursor';\nCursor.tagName = 'span';\nCursor.CONTENTS = '\\uFEFF'; // Zero width no break space\n\n\nexports.default = Cursor;\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Theme = function () {\n function Theme(quill, options) {\n _classCallCheck(this, Theme);\n\n this.quill = quill;\n this.options = options;\n this.modules = {};\n }\n\n _createClass(Theme, [{\n key: 'init',\n value: function init() {\n var _this = this;\n\n Object.keys(this.options.modules).forEach(function (name) {\n if (_this.modules[name] == null) {\n _this.addModule(name);\n }\n });\n }\n }, {\n key: 'addModule',\n value: function addModule(name) {\n var moduleClass = this.quill.constructor.import('modules/' + name);\n this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});\n return this.modules[name];\n }\n }]);\n\n return Theme;\n}();\n\nTheme.DEFAULTS = {\n modules: {}\n};\nTheme.themes = {\n 'default': Theme\n};\n\nexports.default = Theme;\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _text = __webpack_require__(8);\n\nvar _text2 = _interopRequireDefault(_text);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GUARD_TEXT = '\\uFEFF';\n\nvar Embed = function (_Parchment$Embed) {\n _inherits(Embed, _Parchment$Embed);\n\n function Embed(node) {\n _classCallCheck(this, Embed);\n\n var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node));\n\n _this.contentNode = document.createElement('span');\n _this.contentNode.setAttribute('contenteditable', false);\n [].slice.call(_this.domNode.childNodes).forEach(function (childNode) {\n _this.contentNode.appendChild(childNode);\n });\n _this.leftGuard = document.createTextNode(GUARD_TEXT);\n _this.rightGuard = document.createTextNode(GUARD_TEXT);\n _this.domNode.appendChild(_this.leftGuard);\n _this.domNode.appendChild(_this.contentNode);\n _this.domNode.appendChild(_this.rightGuard);\n return _this;\n }\n\n _createClass(Embed, [{\n key: 'index',\n value: function index(node, offset) {\n if (node === this.leftGuard) return 0;\n if (node === this.rightGuard) return 1;\n return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset);\n }\n }, {\n key: 'restore',\n value: function restore(node) {\n var range = void 0,\n textNode = void 0;\n var text = node.data.split(GUARD_TEXT).join('');\n if (node === this.leftGuard) {\n if (this.prev instanceof _text2.default) {\n var prevLength = this.prev.length();\n this.prev.insertAt(prevLength, text);\n range = {\n startNode: this.prev.domNode,\n startOffset: prevLength + text.length\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(_parchment2.default.create(textNode), this);\n range = {\n startNode: textNode,\n startOffset: text.length\n };\n }\n } else if (node === this.rightGuard) {\n if (this.next instanceof _text2.default) {\n this.next.insertAt(0, text);\n range = {\n startNode: this.next.domNode,\n startOffset: text.length\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(_parchment2.default.create(textNode), this.next);\n range = {\n startNode: textNode,\n startOffset: text.length\n };\n }\n }\n node.data = GUARD_TEXT;\n return range;\n }\n }, {\n key: 'update',\n value: function update(mutations, context) {\n var _this2 = this;\n\n mutations.forEach(function (mutation) {\n if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) {\n var range = _this2.restore(mutation.target);\n if (range) context.range = range;\n }\n });\n }\n }]);\n\n return Embed;\n}(_parchment2.default.Embed);\n\nexports.default = Embed;\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AlignStyle = exports.AlignClass = exports.AlignAttribute = undefined;\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar config = {\n scope: _parchment2.default.Scope.BLOCK,\n whitelist: ['right', 'center', 'justify']\n};\n\nvar AlignAttribute = new _parchment2.default.Attributor.Attribute('align', 'align', config);\nvar AlignClass = new _parchment2.default.Attributor.Class('align', 'ql-align', config);\nvar AlignStyle = new _parchment2.default.Attributor.Style('align', 'text-align', config);\n\nexports.AlignAttribute = AlignAttribute;\nexports.AlignClass = AlignClass;\nexports.AlignStyle = AlignStyle;\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.BackgroundStyle = exports.BackgroundClass = undefined;\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _color = __webpack_require__(24);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BackgroundClass = new _parchment2.default.Attributor.Class('background', 'ql-bg', {\n scope: _parchment2.default.Scope.INLINE\n});\nvar BackgroundStyle = new _color.ColorAttributor('background', 'background-color', {\n scope: _parchment2.default.Scope.INLINE\n});\n\nexports.BackgroundClass = BackgroundClass;\nexports.BackgroundStyle = BackgroundStyle;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DirectionStyle = exports.DirectionClass = exports.DirectionAttribute = undefined;\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar config = {\n scope: _parchment2.default.Scope.BLOCK,\n whitelist: ['rtl']\n};\n\nvar DirectionAttribute = new _parchment2.default.Attributor.Attribute('direction', 'dir', config);\nvar DirectionClass = new _parchment2.default.Attributor.Class('direction', 'ql-direction', config);\nvar DirectionStyle = new _parchment2.default.Attributor.Style('direction', 'direction', config);\n\nexports.DirectionAttribute = DirectionAttribute;\nexports.DirectionClass = DirectionClass;\nexports.DirectionStyle = DirectionStyle;\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.FontClass = exports.FontStyle = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar config = {\n scope: _parchment2.default.Scope.INLINE,\n whitelist: ['serif', 'monospace']\n};\n\nvar FontClass = new _parchment2.default.Attributor.Class('font', 'ql-font', config);\n\nvar FontStyleAttributor = function (_Parchment$Attributor) {\n _inherits(FontStyleAttributor, _Parchment$Attributor);\n\n function FontStyleAttributor() {\n _classCallCheck(this, FontStyleAttributor);\n\n return _possibleConstructorReturn(this, (FontStyleAttributor.__proto__ || Object.getPrototypeOf(FontStyleAttributor)).apply(this, arguments));\n }\n\n _createClass(FontStyleAttributor, [{\n key: 'value',\n value: function value(node) {\n return _get(FontStyleAttributor.prototype.__proto__ || Object.getPrototypeOf(FontStyleAttributor.prototype), 'value', this).call(this, node).replace(/[\"']/g, '');\n }\n }]);\n\n return FontStyleAttributor;\n}(_parchment2.default.Attributor.Style);\n\nvar FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\nexports.FontStyle = FontStyle;\nexports.FontClass = FontClass;\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SizeStyle = exports.SizeClass = undefined;\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SizeClass = new _parchment2.default.Attributor.Class('size', 'ql-size', {\n scope: _parchment2.default.Scope.INLINE,\n whitelist: ['small', 'large', 'huge']\n});\nvar SizeStyle = new _parchment2.default.Attributor.Style('size', 'font-size', {\n scope: _parchment2.default.Scope.INLINE,\n whitelist: ['10px', '18px', '32px']\n});\n\nexports.SizeClass = SizeClass;\nexports.SizeStyle = SizeStyle;\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Bold = function (_Inline) {\n _inherits(Bold, _Inline);\n\n function Bold() {\n _classCallCheck(this, Bold);\n\n return _possibleConstructorReturn(this, (Bold.__proto__ || Object.getPrototypeOf(Bold)).apply(this, arguments));\n }\n\n _createClass(Bold, [{\n key: 'optimize',\n value: function optimize(context) {\n _get(Bold.prototype.__proto__ || Object.getPrototypeOf(Bold.prototype), 'optimize', this).call(this, context);\n if (this.domNode.tagName !== this.statics.tagName[0]) {\n this.replaceWith(this.statics.blotName);\n }\n }\n }], [{\n key: 'create',\n value: function create() {\n return _get(Bold.__proto__ || Object.getPrototypeOf(Bold), 'create', this).call(this);\n }\n }, {\n key: 'formats',\n value: function formats() {\n return true;\n }\n }]);\n\n return Bold;\n}(_inline2.default);\n\nBold.blotName = 'bold';\nBold.tagName = ['STRONG', 'B'];\n\nexports.default = Bold;\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _picker = __webpack_require__(16);\n\nvar _picker2 = _interopRequireDefault(_picker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ColorPicker = function (_Picker) {\n _inherits(ColorPicker, _Picker);\n\n function ColorPicker(select, label) {\n _classCallCheck(this, ColorPicker);\n\n var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this, select));\n\n _this.label.innerHTML = label;\n _this.container.classList.add('ql-color-picker');\n [].slice.call(_this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function (item) {\n item.classList.add('ql-primary');\n });\n return _this;\n }\n\n _createClass(ColorPicker, [{\n key: 'buildItem',\n value: function buildItem(option) {\n var item = _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'buildItem', this).call(this, option);\n item.style.backgroundColor = option.getAttribute('value') || '';\n return item;\n }\n }, {\n key: 'selectItem',\n value: function selectItem(item, trigger) {\n _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'selectItem', this).call(this, item, trigger);\n var colorLabel = this.label.querySelector('.ql-color-label');\n var value = item ? item.getAttribute('data-value') || '' : '';\n if (colorLabel) {\n if (colorLabel.tagName === 'line') {\n colorLabel.style.stroke = value;\n } else {\n colorLabel.style.fill = value;\n }\n }\n }\n }]);\n\n return ColorPicker;\n}(_picker2.default);\n\nexports.default = ColorPicker;\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _picker = __webpack_require__(16);\n\nvar _picker2 = _interopRequireDefault(_picker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar IconPicker = function (_Picker) {\n _inherits(IconPicker, _Picker);\n\n function IconPicker(select, icons) {\n _classCallCheck(this, IconPicker);\n\n var _this = _possibleConstructorReturn(this, (IconPicker.__proto__ || Object.getPrototypeOf(IconPicker)).call(this, select));\n\n _this.container.classList.add('ql-icon-picker');\n [].forEach.call(_this.container.querySelectorAll('.ql-picker-item'), function (item) {\n item.innerHTML = icons[item.getAttribute('data-value') || ''];\n });\n _this.defaultItem = _this.container.querySelector('.ql-selected');\n _this.selectItem(_this.defaultItem);\n return _this;\n }\n\n _createClass(IconPicker, [{\n key: 'selectItem',\n value: function selectItem(item, trigger) {\n _get(IconPicker.prototype.__proto__ || Object.getPrototypeOf(IconPicker.prototype), 'selectItem', this).call(this, item, trigger);\n item = item || this.defaultItem;\n this.label.innerHTML = item.innerHTML;\n }\n }]);\n\n return IconPicker;\n}(_picker2.default);\n\nexports.default = IconPicker;\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Tooltip = function () {\n function Tooltip(quill, boundsContainer) {\n var _this = this;\n\n _classCallCheck(this, Tooltip);\n\n this.quill = quill;\n this.boundsContainer = boundsContainer || document.body;\n this.root = quill.addContainer('ql-tooltip');\n this.root.innerHTML = this.constructor.TEMPLATE;\n if (this.quill.root === this.quill.scrollingContainer) {\n this.quill.root.addEventListener('scroll', function () {\n _this.root.style.marginTop = -1 * _this.quill.root.scrollTop + 'px';\n });\n }\n this.hide();\n }\n\n _createClass(Tooltip, [{\n key: 'hide',\n value: function hide() {\n this.root.classList.add('ql-hidden');\n }\n }, {\n key: 'position',\n value: function position(reference) {\n var left = reference.left + reference.width / 2 - this.root.offsetWidth / 2;\n // root.scrollTop should be 0 if scrollContainer !== root\n var top = reference.bottom + this.quill.root.scrollTop;\n this.root.style.left = left + 'px';\n this.root.style.top = top + 'px';\n this.root.classList.remove('ql-flip');\n var containerBounds = this.boundsContainer.getBoundingClientRect();\n var rootBounds = this.root.getBoundingClientRect();\n var shift = 0;\n if (rootBounds.right > containerBounds.right) {\n shift = containerBounds.right - rootBounds.right;\n this.root.style.left = left + shift + 'px';\n }\n if (rootBounds.left < containerBounds.left) {\n shift = containerBounds.left - rootBounds.left;\n this.root.style.left = left + shift + 'px';\n }\n if (rootBounds.bottom > containerBounds.bottom) {\n var height = rootBounds.bottom - rootBounds.top;\n var verticalShift = reference.bottom - reference.top + height;\n this.root.style.top = top - verticalShift + 'px';\n this.root.classList.add('ql-flip');\n }\n return shift;\n }\n }, {\n key: 'show',\n value: function show() {\n this.root.classList.remove('ql-editing');\n this.root.classList.remove('ql-hidden');\n }\n }]);\n\n return Tooltip;\n}();\n\nexports.default = Tooltip;\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.BaseTooltip = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _emitter = __webpack_require__(9);\n\nvar _emitter2 = _interopRequireDefault(_emitter);\n\nvar _keyboard = __webpack_require__(25);\n\nvar _keyboard2 = _interopRequireDefault(_keyboard);\n\nvar _theme = __webpack_require__(32);\n\nvar _theme2 = _interopRequireDefault(_theme);\n\nvar _colorPicker = __webpack_require__(41);\n\nvar _colorPicker2 = _interopRequireDefault(_colorPicker);\n\nvar _iconPicker = __webpack_require__(42);\n\nvar _iconPicker2 = _interopRequireDefault(_iconPicker);\n\nvar _picker = __webpack_require__(16);\n\nvar _picker2 = _interopRequireDefault(_picker);\n\nvar _tooltip = __webpack_require__(43);\n\nvar _tooltip2 = _interopRequireDefault(_tooltip);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ALIGNS = [false, 'center', 'right', 'justify'];\n\nvar COLORS = [\"#000000\", \"#e60000\", \"#ff9900\", \"#ffff00\", \"#008a00\", \"#0066cc\", \"#9933ff\", \"#ffffff\", \"#facccc\", \"#ffebcc\", \"#ffffcc\", \"#cce8cc\", \"#cce0f5\", \"#ebd6ff\", \"#bbbbbb\", \"#f06666\", \"#ffc266\", \"#ffff66\", \"#66b966\", \"#66a3e0\", \"#c285ff\", \"#888888\", \"#a10000\", \"#b26b00\", \"#b2b200\", \"#006100\", \"#0047b2\", \"#6b24b2\", \"#444444\", \"#5c0000\", \"#663d00\", \"#666600\", \"#003700\", \"#002966\", \"#3d1466\"];\n\nvar FONTS = [false, 'serif', 'monospace'];\n\nvar HEADERS = ['1', '2', '3', false];\n\nvar SIZES = ['small', false, 'large', 'huge'];\n\nvar BaseTheme = function (_Theme) {\n _inherits(BaseTheme, _Theme);\n\n function BaseTheme(quill, options) {\n _classCallCheck(this, BaseTheme);\n\n var _this = _possibleConstructorReturn(this, (BaseTheme.__proto__ || Object.getPrototypeOf(BaseTheme)).call(this, quill, options));\n\n var listener = function listener(e) {\n if (!document.body.contains(quill.root)) {\n return document.body.removeEventListener('click', listener);\n }\n if (_this.tooltip != null && !_this.tooltip.root.contains(e.target) && document.activeElement !== _this.tooltip.textbox && !_this.quill.hasFocus()) {\n _this.tooltip.hide();\n }\n if (_this.pickers != null) {\n _this.pickers.forEach(function (picker) {\n if (!picker.container.contains(e.target)) {\n picker.close();\n }\n });\n }\n };\n quill.emitter.listenDOM('click', document.body, listener);\n return _this;\n }\n\n _createClass(BaseTheme, [{\n key: 'addModule',\n value: function addModule(name) {\n var module = _get(BaseTheme.prototype.__proto__ || Object.getPrototypeOf(BaseTheme.prototype), 'addModule', this).call(this, name);\n if (name === 'toolbar') {\n this.extendToolbar(module);\n }\n return module;\n }\n }, {\n key: 'buildButtons',\n value: function buildButtons(buttons, icons) {\n buttons.forEach(function (button) {\n var className = button.getAttribute('class') || '';\n className.split(/\\s+/).forEach(function (name) {\n if (!name.startsWith('ql-')) return;\n name = name.slice('ql-'.length);\n if (icons[name] == null) return;\n if (name === 'direction') {\n button.innerHTML = icons[name][''] + icons[name]['rtl'];\n } else if (typeof icons[name] === 'string') {\n button.innerHTML = icons[name];\n } else {\n var value = button.value || '';\n if (value != null && icons[name][value]) {\n button.innerHTML = icons[name][value];\n }\n }\n });\n });\n }\n }, {\n key: 'buildPickers',\n value: function buildPickers(selects, icons) {\n var _this2 = this;\n\n this.pickers = selects.map(function (select) {\n if (select.classList.contains('ql-align')) {\n if (select.querySelector('option') == null) {\n fillSelect(select, ALIGNS);\n }\n return new _iconPicker2.default(select, icons.align);\n } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {\n var format = select.classList.contains('ql-background') ? 'background' : 'color';\n if (select.querySelector('option') == null) {\n fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000');\n }\n return new _colorPicker2.default(select, icons[format]);\n } else {\n if (select.querySelector('option') == null) {\n if (select.classList.contains('ql-font')) {\n fillSelect(select, FONTS);\n } else if (select.classList.contains('ql-header')) {\n fillSelect(select, HEADERS);\n } else if (select.classList.contains('ql-size')) {\n fillSelect(select, SIZES);\n }\n }\n return new _picker2.default(select);\n }\n });\n var update = function update() {\n _this2.pickers.forEach(function (picker) {\n picker.update();\n });\n };\n this.quill.on(_emitter2.default.events.EDITOR_CHANGE, update);\n }\n }]);\n\n return BaseTheme;\n}(_theme2.default);\n\nBaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n formula: function formula() {\n this.quill.theme.tooltip.edit('formula');\n },\n image: function image() {\n var _this3 = this;\n\n var fileInput = this.container.querySelector('input.ql-image[type=file]');\n if (fileInput == null) {\n fileInput = document.createElement('input');\n fileInput.setAttribute('type', 'file');\n fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');\n fileInput.classList.add('ql-image');\n fileInput.addEventListener('change', function () {\n if (fileInput.files != null && fileInput.files[0] != null) {\n var reader = new FileReader();\n reader.onload = function (e) {\n var range = _this3.quill.getSelection(true);\n _this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER);\n _this3.quill.setSelection(range.index + 1, _emitter2.default.sources.SILENT);\n fileInput.value = \"\";\n };\n reader.readAsDataURL(fileInput.files[0]);\n }\n });\n this.container.appendChild(fileInput);\n }\n fileInput.click();\n },\n video: function video() {\n this.quill.theme.tooltip.edit('video');\n }\n }\n }\n }\n});\n\nvar BaseTooltip = function (_Tooltip) {\n _inherits(BaseTooltip, _Tooltip);\n\n function BaseTooltip(quill, boundsContainer) {\n _classCallCheck(this, BaseTooltip);\n\n var _this4 = _possibleConstructorReturn(this, (BaseTooltip.__proto__ || Object.getPrototypeOf(BaseTooltip)).call(this, quill, boundsContainer));\n\n _this4.textbox = _this4.root.querySelector('input[type=\"text\"]');\n _this4.listen();\n return _this4;\n }\n\n _createClass(BaseTooltip, [{\n key: 'listen',\n value: function listen() {\n var _this5 = this;\n\n this.textbox.addEventListener('keydown', function (event) {\n if (_keyboard2.default.match(event, 'enter')) {\n _this5.save();\n event.preventDefault();\n } else if (_keyboard2.default.match(event, 'escape')) {\n _this5.cancel();\n event.preventDefault();\n }\n });\n }\n }, {\n key: 'cancel',\n value: function cancel() {\n this.hide();\n }\n }, {\n key: 'edit',\n value: function edit() {\n var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'link';\n var preview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n this.root.classList.remove('ql-hidden');\n this.root.classList.add('ql-editing');\n if (preview != null) {\n this.textbox.value = preview;\n } else if (mode !== this.root.getAttribute('data-mode')) {\n this.textbox.value = '';\n }\n this.position(this.quill.getBounds(this.quill.selection.savedRange));\n this.textbox.select();\n this.textbox.setAttribute('placeholder', this.textbox.getAttribute('data-' + mode) || '');\n this.root.setAttribute('data-mode', mode);\n }\n }, {\n key: 'restoreFocus',\n value: function restoreFocus() {\n var scrollTop = this.quill.scrollingContainer.scrollTop;\n this.quill.focus();\n this.quill.scrollingContainer.scrollTop = scrollTop;\n }\n }, {\n key: 'save',\n value: function save() {\n var value = this.textbox.value;\n switch (this.root.getAttribute('data-mode')) {\n case 'link':\n {\n var scrollTop = this.quill.root.scrollTop;\n if (this.linkRange) {\n this.quill.formatText(this.linkRange, 'link', value, _emitter2.default.sources.USER);\n delete this.linkRange;\n } else {\n this.restoreFocus();\n this.quill.format('link', value, _emitter2.default.sources.USER);\n }\n this.quill.root.scrollTop = scrollTop;\n break;\n }\n case 'video':\n {\n value = extractVideoUrl(value);\n } // eslint-disable-next-line no-fallthrough\n case 'formula':\n {\n if (!value) break;\n var range = this.quill.getSelection(true);\n if (range != null) {\n var index = range.index + range.length;\n this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, _emitter2.default.sources.USER);\n if (this.root.getAttribute('data-mode') === 'formula') {\n this.quill.insertText(index + 1, ' ', _emitter2.default.sources.USER);\n }\n this.quill.setSelection(index + 2, _emitter2.default.sources.USER);\n }\n break;\n }\n default:\n }\n this.textbox.value = '';\n this.hide();\n }\n }]);\n\n return BaseTooltip;\n}(_tooltip2.default);\n\nfunction extractVideoUrl(url) {\n var match = url.match(/^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtube\\.com\\/watch.*v=([a-zA-Z0-9_-]+)/) || url.match(/^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtu\\.be\\/([a-zA-Z0-9_-]+)/);\n if (match) {\n return (match[1] || 'https') + '://www.youtube.com/embed/' + match[2] + '?showinfo=0';\n }\n if (match = url.match(/^(?:(https?):\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/)) {\n // eslint-disable-line no-cond-assign\n return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/';\n }\n return url;\n}\n\nfunction fillSelect(select, values) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n values.forEach(function (value) {\n var option = document.createElement('option');\n if (value === defaultValue) {\n option.setAttribute('selected', 'selected');\n } else {\n option.setAttribute('value', value);\n }\n select.appendChild(option);\n });\n}\n\nexports.BaseTooltip = BaseTooltip;\nexports.default = BaseTheme;\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _core = __webpack_require__(46);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _align = __webpack_require__(34);\n\nvar _direction = __webpack_require__(36);\n\nvar _indent = __webpack_require__(62);\n\nvar _blockquote = __webpack_require__(63);\n\nvar _blockquote2 = _interopRequireDefault(_blockquote);\n\nvar _header = __webpack_require__(64);\n\nvar _header2 = _interopRequireDefault(_header);\n\nvar _list = __webpack_require__(65);\n\nvar _list2 = _interopRequireDefault(_list);\n\nvar _background = __webpack_require__(35);\n\nvar _color = __webpack_require__(24);\n\nvar _font = __webpack_require__(37);\n\nvar _size = __webpack_require__(38);\n\nvar _bold = __webpack_require__(39);\n\nvar _bold2 = _interopRequireDefault(_bold);\n\nvar _italic = __webpack_require__(66);\n\nvar _italic2 = _interopRequireDefault(_italic);\n\nvar _link = __webpack_require__(15);\n\nvar _link2 = _interopRequireDefault(_link);\n\nvar _script = __webpack_require__(67);\n\nvar _script2 = _interopRequireDefault(_script);\n\nvar _strike = __webpack_require__(68);\n\nvar _strike2 = _interopRequireDefault(_strike);\n\nvar _underline = __webpack_require__(69);\n\nvar _underline2 = _interopRequireDefault(_underline);\n\nvar _image = __webpack_require__(70);\n\nvar _image2 = _interopRequireDefault(_image);\n\nvar _video = __webpack_require__(71);\n\nvar _video2 = _interopRequireDefault(_video);\n\nvar _code = __webpack_require__(13);\n\nvar _code2 = _interopRequireDefault(_code);\n\nvar _formula = __webpack_require__(72);\n\nvar _formula2 = _interopRequireDefault(_formula);\n\nvar _syntax = __webpack_require__(73);\n\nvar _syntax2 = _interopRequireDefault(_syntax);\n\nvar _toolbar = __webpack_require__(74);\n\nvar _toolbar2 = _interopRequireDefault(_toolbar);\n\nvar _icons = __webpack_require__(26);\n\nvar _icons2 = _interopRequireDefault(_icons);\n\nvar _picker = __webpack_require__(16);\n\nvar _picker2 = _interopRequireDefault(_picker);\n\nvar _colorPicker = __webpack_require__(41);\n\nvar _colorPicker2 = _interopRequireDefault(_colorPicker);\n\nvar _iconPicker = __webpack_require__(42);\n\nvar _iconPicker2 = _interopRequireDefault(_iconPicker);\n\nvar _tooltip = __webpack_require__(43);\n\nvar _tooltip2 = _interopRequireDefault(_tooltip);\n\nvar _bubble = __webpack_require__(107);\n\nvar _bubble2 = _interopRequireDefault(_bubble);\n\nvar _snow = __webpack_require__(108);\n\nvar _snow2 = _interopRequireDefault(_snow);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_core2.default.register({\n 'attributors/attribute/direction': _direction.DirectionAttribute,\n\n 'attributors/class/align': _align.AlignClass,\n 'attributors/class/background': _background.BackgroundClass,\n 'attributors/class/color': _color.ColorClass,\n 'attributors/class/direction': _direction.DirectionClass,\n 'attributors/class/font': _font.FontClass,\n 'attributors/class/size': _size.SizeClass,\n\n 'attributors/style/align': _align.AlignStyle,\n 'attributors/style/background': _background.BackgroundStyle,\n 'attributors/style/color': _color.ColorStyle,\n 'attributors/style/direction': _direction.DirectionStyle,\n 'attributors/style/font': _font.FontStyle,\n 'attributors/style/size': _size.SizeStyle\n}, true);\n\n_core2.default.register({\n 'formats/align': _align.AlignClass,\n 'formats/direction': _direction.DirectionClass,\n 'formats/indent': _indent.IndentClass,\n\n 'formats/background': _background.BackgroundStyle,\n 'formats/color': _color.ColorStyle,\n 'formats/font': _font.FontClass,\n 'formats/size': _size.SizeClass,\n\n 'formats/blockquote': _blockquote2.default,\n 'formats/code-block': _code2.default,\n 'formats/header': _header2.default,\n 'formats/list': _list2.default,\n\n 'formats/bold': _bold2.default,\n 'formats/code': _code.Code,\n 'formats/italic': _italic2.default,\n 'formats/link': _link2.default,\n 'formats/script': _script2.default,\n 'formats/strike': _strike2.default,\n 'formats/underline': _underline2.default,\n\n 'formats/image': _image2.default,\n 'formats/video': _video2.default,\n\n 'formats/list/item': _list.ListItem,\n\n 'modules/formula': _formula2.default,\n 'modules/syntax': _syntax2.default,\n 'modules/toolbar': _toolbar2.default,\n\n 'themes/bubble': _bubble2.default,\n 'themes/snow': _snow2.default,\n\n 'ui/icons': _icons2.default,\n 'ui/picker': _picker2.default,\n 'ui/icon-picker': _iconPicker2.default,\n 'ui/color-picker': _colorPicker2.default,\n 'ui/tooltip': _tooltip2.default\n}, true);\n\nexports.default = _core2.default;\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nvar _break = __webpack_require__(14);\n\nvar _break2 = _interopRequireDefault(_break);\n\nvar _container = __webpack_require__(23);\n\nvar _container2 = _interopRequireDefault(_container);\n\nvar _cursor = __webpack_require__(31);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _embed = __webpack_require__(33);\n\nvar _embed2 = _interopRequireDefault(_embed);\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nvar _scroll = __webpack_require__(59);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _text = __webpack_require__(8);\n\nvar _text2 = _interopRequireDefault(_text);\n\nvar _clipboard = __webpack_require__(60);\n\nvar _clipboard2 = _interopRequireDefault(_clipboard);\n\nvar _history = __webpack_require__(61);\n\nvar _history2 = _interopRequireDefault(_history);\n\nvar _keyboard = __webpack_require__(25);\n\nvar _keyboard2 = _interopRequireDefault(_keyboard);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_quill2.default.register({\n 'blots/block': _block2.default,\n 'blots/block/embed': _block.BlockEmbed,\n 'blots/break': _break2.default,\n 'blots/container': _container2.default,\n 'blots/cursor': _cursor2.default,\n 'blots/embed': _embed2.default,\n 'blots/inline': _inline2.default,\n 'blots/scroll': _scroll2.default,\n 'blots/text': _text2.default,\n\n 'modules/clipboard': _clipboard2.default,\n 'modules/history': _history2.default,\n 'modules/keyboard': _keyboard2.default\n});\n\n_parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default);\n\nexports.default = _quill2.default;\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LinkedList = /** @class */ (function () {\n function LinkedList() {\n this.head = this.tail = null;\n this.length = 0;\n }\n LinkedList.prototype.append = function () {\n var nodes = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n nodes[_i] = arguments[_i];\n }\n this.insertBefore(nodes[0], null);\n if (nodes.length > 1) {\n this.append.apply(this, nodes.slice(1));\n }\n };\n LinkedList.prototype.contains = function (node) {\n var cur, next = this.iterator();\n while ((cur = next())) {\n if (cur === node)\n return true;\n }\n return false;\n };\n LinkedList.prototype.insertBefore = function (node, refNode) {\n if (!node)\n return;\n node.next = refNode;\n if (refNode != null) {\n node.prev = refNode.prev;\n if (refNode.prev != null) {\n refNode.prev.next = node;\n }\n refNode.prev = node;\n if (refNode === this.head) {\n this.head = node;\n }\n }\n else if (this.tail != null) {\n this.tail.next = node;\n node.prev = this.tail;\n this.tail = node;\n }\n else {\n node.prev = null;\n this.head = this.tail = node;\n }\n this.length += 1;\n };\n LinkedList.prototype.offset = function (target) {\n var index = 0, cur = this.head;\n while (cur != null) {\n if (cur === target)\n return index;\n index += cur.length();\n cur = cur.next;\n }\n return -1;\n };\n LinkedList.prototype.remove = function (node) {\n if (!this.contains(node))\n return;\n if (node.prev != null)\n node.prev.next = node.next;\n if (node.next != null)\n node.next.prev = node.prev;\n if (node === this.head)\n this.head = node.next;\n if (node === this.tail)\n this.tail = node.prev;\n this.length -= 1;\n };\n LinkedList.prototype.iterator = function (curNode) {\n if (curNode === void 0) { curNode = this.head; }\n // TODO use yield when we can\n return function () {\n var ret = curNode;\n if (curNode != null)\n curNode = curNode.next;\n return ret;\n };\n };\n LinkedList.prototype.find = function (index, inclusive) {\n if (inclusive === void 0) { inclusive = false; }\n var cur, next = this.iterator();\n while ((cur = next())) {\n var length = cur.length();\n if (index < length ||\n (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) {\n return [cur, index];\n }\n index -= length;\n }\n return [null, 0];\n };\n LinkedList.prototype.forEach = function (callback) {\n var cur, next = this.iterator();\n while ((cur = next())) {\n callback(cur);\n }\n };\n LinkedList.prototype.forEachAt = function (index, length, callback) {\n if (length <= 0)\n return;\n var _a = this.find(index), startNode = _a[0], offset = _a[1];\n var cur, curIndex = index - offset, next = this.iterator(startNode);\n while ((cur = next()) && curIndex < index + length) {\n var curLength = cur.length();\n if (index > curIndex) {\n callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index));\n }\n else {\n callback(cur, 0, Math.min(curLength, index + length - curIndex));\n }\n curIndex += curLength;\n }\n };\n LinkedList.prototype.map = function (callback) {\n return this.reduce(function (memo, cur) {\n memo.push(callback(cur));\n return memo;\n }, []);\n };\n LinkedList.prototype.reduce = function (callback, memo) {\n var cur, next = this.iterator();\n while ((cur = next())) {\n memo = callback(memo, cur);\n }\n return memo;\n };\n return LinkedList;\n}());\nexports.default = LinkedList;\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar container_1 = __webpack_require__(17);\nvar Registry = __webpack_require__(1);\nvar OBSERVER_CONFIG = {\n attributes: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n};\nvar MAX_OPTIMIZE_ITERATIONS = 100;\nvar ScrollBlot = /** @class */ (function (_super) {\n __extends(ScrollBlot, _super);\n function ScrollBlot(node) {\n var _this = _super.call(this, node) || this;\n _this.scroll = _this;\n _this.observer = new MutationObserver(function (mutations) {\n _this.update(mutations);\n });\n _this.observer.observe(_this.domNode, OBSERVER_CONFIG);\n _this.attach();\n return _this;\n }\n ScrollBlot.prototype.detach = function () {\n _super.prototype.detach.call(this);\n this.observer.disconnect();\n };\n ScrollBlot.prototype.deleteAt = function (index, length) {\n this.update();\n if (index === 0 && length === this.length()) {\n this.children.forEach(function (child) {\n child.remove();\n });\n }\n else {\n _super.prototype.deleteAt.call(this, index, length);\n }\n };\n ScrollBlot.prototype.formatAt = function (index, length, name, value) {\n this.update();\n _super.prototype.formatAt.call(this, index, length, name, value);\n };\n ScrollBlot.prototype.insertAt = function (index, value, def) {\n this.update();\n _super.prototype.insertAt.call(this, index, value, def);\n };\n ScrollBlot.prototype.optimize = function (mutations, context) {\n var _this = this;\n if (mutations === void 0) { mutations = []; }\n if (context === void 0) { context = {}; }\n _super.prototype.optimize.call(this, context);\n // We must modify mutations directly, cannot make copy and then modify\n var records = [].slice.call(this.observer.takeRecords());\n // Array.push currently seems to be implemented by a non-tail recursive function\n // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());\n while (records.length > 0)\n mutations.push(records.pop());\n // TODO use WeakMap\n var mark = function (blot, markParent) {\n if (markParent === void 0) { markParent = true; }\n if (blot == null || blot === _this)\n return;\n if (blot.domNode.parentNode == null)\n return;\n // @ts-ignore\n if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations = [];\n }\n if (markParent)\n mark(blot.parent);\n };\n var optimize = function (blot) {\n // Post-order traversal\n if (\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY] == null ||\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations == null) {\n return;\n }\n if (blot instanceof container_1.default) {\n blot.children.forEach(optimize);\n }\n blot.optimize(context);\n };\n var remaining = mutations;\n for (var i = 0; remaining.length > 0; i += 1) {\n if (i >= MAX_OPTIMIZE_ITERATIONS) {\n throw new Error('[Parchment] Maximum optimize iterations reached');\n }\n remaining.forEach(function (mutation) {\n var blot = Registry.find(mutation.target, true);\n if (blot == null)\n return;\n if (blot.domNode === mutation.target) {\n if (mutation.type === 'childList') {\n mark(Registry.find(mutation.previousSibling, false));\n [].forEach.call(mutation.addedNodes, function (node) {\n var child = Registry.find(node, false);\n mark(child, false);\n if (child instanceof container_1.default) {\n child.children.forEach(function (grandChild) {\n mark(grandChild, false);\n });\n }\n });\n }\n else if (mutation.type === 'attributes') {\n mark(blot.prev);\n }\n }\n mark(blot);\n });\n this.children.forEach(optimize);\n remaining = [].slice.call(this.observer.takeRecords());\n records = remaining.slice();\n while (records.length > 0)\n mutations.push(records.pop());\n }\n };\n ScrollBlot.prototype.update = function (mutations, context) {\n var _this = this;\n if (context === void 0) { context = {}; }\n mutations = mutations || this.observer.takeRecords();\n // TODO use WeakMap\n mutations\n .map(function (mutation) {\n var blot = Registry.find(mutation.target, true);\n if (blot == null)\n return null;\n // @ts-ignore\n if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations = [mutation];\n return blot;\n }\n else {\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations.push(mutation);\n return null;\n }\n })\n .forEach(function (blot) {\n if (blot == null ||\n blot === _this ||\n //@ts-ignore\n blot.domNode[Registry.DATA_KEY] == null)\n return;\n // @ts-ignore\n blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context);\n });\n // @ts-ignore\n if (this.domNode[Registry.DATA_KEY].mutations != null) {\n // @ts-ignore\n _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context);\n }\n this.optimize(mutations, context);\n };\n ScrollBlot.blotName = 'scroll';\n ScrollBlot.defaultChild = 'block';\n ScrollBlot.scope = Registry.Scope.BLOCK_BLOT;\n ScrollBlot.tagName = 'DIV';\n return ScrollBlot;\n}(container_1.default));\nexports.default = ScrollBlot;\n\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar format_1 = __webpack_require__(18);\nvar Registry = __webpack_require__(1);\n// Shallow object comparison\nfunction isEqual(obj1, obj2) {\n if (Object.keys(obj1).length !== Object.keys(obj2).length)\n return false;\n // @ts-ignore\n for (var prop in obj1) {\n // @ts-ignore\n if (obj1[prop] !== obj2[prop])\n return false;\n }\n return true;\n}\nvar InlineBlot = /** @class */ (function (_super) {\n __extends(InlineBlot, _super);\n function InlineBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n InlineBlot.formats = function (domNode) {\n if (domNode.tagName === InlineBlot.tagName)\n return undefined;\n return _super.formats.call(this, domNode);\n };\n InlineBlot.prototype.format = function (name, value) {\n var _this = this;\n if (name === this.statics.blotName && !value) {\n this.children.forEach(function (child) {\n if (!(child instanceof format_1.default)) {\n child = child.wrap(InlineBlot.blotName, true);\n }\n _this.attributes.copy(child);\n });\n this.unwrap();\n }\n else {\n _super.prototype.format.call(this, name, value);\n }\n };\n InlineBlot.prototype.formatAt = function (index, length, name, value) {\n if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) {\n var blot = this.isolate(index, length);\n blot.format(name, value);\n }\n else {\n _super.prototype.formatAt.call(this, index, length, name, value);\n }\n };\n InlineBlot.prototype.optimize = function (context) {\n _super.prototype.optimize.call(this, context);\n var formats = this.formats();\n if (Object.keys(formats).length === 0) {\n return this.unwrap(); // unformatted span\n }\n var next = this.next;\n if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) {\n next.moveChildren(this);\n next.remove();\n }\n };\n InlineBlot.blotName = 'inline';\n InlineBlot.scope = Registry.Scope.INLINE_BLOT;\n InlineBlot.tagName = 'SPAN';\n return InlineBlot;\n}(format_1.default));\nexports.default = InlineBlot;\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar format_1 = __webpack_require__(18);\nvar Registry = __webpack_require__(1);\nvar BlockBlot = /** @class */ (function (_super) {\n __extends(BlockBlot, _super);\n function BlockBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n BlockBlot.formats = function (domNode) {\n var tagName = Registry.query(BlockBlot.blotName).tagName;\n if (domNode.tagName === tagName)\n return undefined;\n return _super.formats.call(this, domNode);\n };\n BlockBlot.prototype.format = function (name, value) {\n if (Registry.query(name, Registry.Scope.BLOCK) == null) {\n return;\n }\n else if (name === this.statics.blotName && !value) {\n this.replaceWith(BlockBlot.blotName);\n }\n else {\n _super.prototype.format.call(this, name, value);\n }\n };\n BlockBlot.prototype.formatAt = function (index, length, name, value) {\n if (Registry.query(name, Registry.Scope.BLOCK) != null) {\n this.format(name, value);\n }\n else {\n _super.prototype.formatAt.call(this, index, length, name, value);\n }\n };\n BlockBlot.prototype.insertAt = function (index, value, def) {\n if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) {\n // Insert text or inline\n _super.prototype.insertAt.call(this, index, value, def);\n }\n else {\n var after = this.split(index);\n var blot = Registry.create(value, def);\n after.parent.insertBefore(blot, after);\n }\n };\n BlockBlot.prototype.update = function (mutations, context) {\n if (navigator.userAgent.match(/Trident/)) {\n this.build();\n }\n else {\n _super.prototype.update.call(this, mutations, context);\n }\n };\n BlockBlot.blotName = 'block';\n BlockBlot.scope = Registry.Scope.BLOCK_BLOT;\n BlockBlot.tagName = 'P';\n return BlockBlot;\n}(format_1.default));\nexports.default = BlockBlot;\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar leaf_1 = __webpack_require__(19);\nvar EmbedBlot = /** @class */ (function (_super) {\n __extends(EmbedBlot, _super);\n function EmbedBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n EmbedBlot.formats = function (domNode) {\n return undefined;\n };\n EmbedBlot.prototype.format = function (name, value) {\n // super.formatAt wraps, which is what we want in general,\n // but this allows subclasses to overwrite for formats\n // that just apply to particular embeds\n _super.prototype.formatAt.call(this, 0, this.length(), name, value);\n };\n EmbedBlot.prototype.formatAt = function (index, length, name, value) {\n if (index === 0 && length === this.length()) {\n this.format(name, value);\n }\n else {\n _super.prototype.formatAt.call(this, index, length, name, value);\n }\n };\n EmbedBlot.prototype.formats = function () {\n return this.statics.formats(this.domNode);\n };\n return EmbedBlot;\n}(leaf_1.default));\nexports.default = EmbedBlot;\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar leaf_1 = __webpack_require__(19);\nvar Registry = __webpack_require__(1);\nvar TextBlot = /** @class */ (function (_super) {\n __extends(TextBlot, _super);\n function TextBlot(node) {\n var _this = _super.call(this, node) || this;\n _this.text = _this.statics.value(_this.domNode);\n return _this;\n }\n TextBlot.create = function (value) {\n return document.createTextNode(value);\n };\n TextBlot.value = function (domNode) {\n var text = domNode.data;\n // @ts-ignore\n if (text['normalize'])\n text = text['normalize']();\n return text;\n };\n TextBlot.prototype.deleteAt = function (index, length) {\n this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length);\n };\n TextBlot.prototype.index = function (node, offset) {\n if (this.domNode === node) {\n return offset;\n }\n return -1;\n };\n TextBlot.prototype.insertAt = function (index, value, def) {\n if (def == null) {\n this.text = this.text.slice(0, index) + value + this.text.slice(index);\n this.domNode.data = this.text;\n }\n else {\n _super.prototype.insertAt.call(this, index, value, def);\n }\n };\n TextBlot.prototype.length = function () {\n return this.text.length;\n };\n TextBlot.prototype.optimize = function (context) {\n _super.prototype.optimize.call(this, context);\n this.text = this.statics.value(this.domNode);\n if (this.text.length === 0) {\n this.remove();\n }\n else if (this.next instanceof TextBlot && this.next.prev === this) {\n this.insertAt(this.length(), this.next.value());\n this.next.remove();\n }\n };\n TextBlot.prototype.position = function (index, inclusive) {\n if (inclusive === void 0) { inclusive = false; }\n return [this.domNode, index];\n };\n TextBlot.prototype.split = function (index, force) {\n if (force === void 0) { force = false; }\n if (!force) {\n if (index === 0)\n return this;\n if (index === this.length())\n return this.next;\n }\n var after = Registry.create(this.domNode.splitText(index));\n this.parent.insertBefore(after, this.next);\n this.text = this.statics.value(this.domNode);\n return after;\n };\n TextBlot.prototype.update = function (mutations, context) {\n var _this = this;\n if (mutations.some(function (mutation) {\n return mutation.type === 'characterData' && mutation.target === _this.domNode;\n })) {\n this.text = this.statics.value(this.domNode);\n }\n };\n TextBlot.prototype.value = function () {\n return this.text;\n };\n TextBlot.blotName = 'text';\n TextBlot.scope = Registry.Scope.INLINE_BLOT;\n return TextBlot;\n}(leaf_1.default));\nexports.default = TextBlot;\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar elem = document.createElement('div');\nelem.classList.toggle('test-class', false);\nif (elem.classList.contains('test-class')) {\n var _toggle = DOMTokenList.prototype.toggle;\n DOMTokenList.prototype.toggle = function (token, force) {\n if (arguments.length > 1 && !this.contains(token) === !force) {\n return force;\n } else {\n return _toggle.call(this, token);\n }\n };\n}\n\nif (!String.prototype.startsWith) {\n String.prototype.startsWith = function (searchString, position) {\n position = position || 0;\n return this.substr(position, searchString.length) === searchString;\n };\n}\n\nif (!String.prototype.endsWith) {\n String.prototype.endsWith = function (searchString, position) {\n var subjectString = this.toString();\n if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {\n position = subjectString.length;\n }\n position -= searchString.length;\n var lastIndex = subjectString.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n };\n}\n\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, \"find\", {\n value: function value(predicate) {\n if (this === null) {\n throw new TypeError('Array.prototype.find called on null or undefined');\n }\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n var list = Object(this);\n var length = list.length >>> 0;\n var thisArg = arguments[1];\n var value;\n\n for (var i = 0; i < length; i++) {\n value = list[i];\n if (predicate.call(thisArg, value, i, list)) {\n return value;\n }\n }\n return undefined;\n }\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n // Disable resizing in Firefox\n document.execCommand(\"enableObjectResizing\", false, false);\n // Disable automatic linkifying in IE11\n document.execCommand(\"autoUrlDetect\", false, false);\n});\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports) {\n\n/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {Int} cursor_pos Expected edit position in text1 (optional)\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2, cursor_pos) {\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [[DIFF_EQUAL, text1]];\n }\n return [];\n }\n\n // Check cursor_pos within bounds\n if (cursor_pos < 0 || text1.length < cursor_pos) {\n cursor_pos = null;\n }\n\n // Trim off common prefix (speedup).\n var commonlength = diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = diff_compute_(text1, text2);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift([DIFF_EQUAL, commonprefix]);\n }\n if (commonsuffix) {\n diffs.push([DIFF_EQUAL, commonsuffix]);\n }\n diff_cleanupMerge(diffs);\n if (cursor_pos != null) {\n diffs = fix_cursor(diffs, cursor_pos);\n }\n diffs = fix_emoji(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [[DIFF_INSERT, text2]];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [[DIFF_DELETE, text1]];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [[DIFF_INSERT, longtext.substring(0, i)],\n [DIFF_EQUAL, shorttext],\n [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n }\n\n // Check to see if the problem can be split in two.\n var hm = diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = diff_main(text1_a, text2_a);\n var diffs_b = diff_main(text1_b, text2_b);\n // Merge the results.\n return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n }\n\n return diff_bisect_(text1, text2);\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = diff_main(text1a, text2a);\n var diffsb = diff_main(text1b, text2b);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\nfunction diff_commonPrefix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n */\nfunction diff_cleanupMerge(diffs) {\n diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, [DIFF_EQUAL,\n text_insert.substring(0, commonlength)]);\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n if (count_delete === 0) {\n diffs.splice(pointer - count_insert,\n count_delete + count_insert, [DIFF_INSERT, text_insert]);\n } else if (count_insert === 0) {\n diffs.splice(pointer - count_delete,\n count_delete + count_insert, [DIFF_DELETE, text_delete]);\n } else {\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert, [DIFF_DELETE, text_delete],\n [DIFF_INSERT, text_insert]);\n }\n pointer = pointer - count_delete - count_insert +\n (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n diff_cleanupMerge(diffs);\n }\n};\n\n\nvar diff = diff_main;\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\nmodule.exports = diff;\n\n/*\n * Modify a diff such that the cursor position points to the start of a change:\n * E.g.\n * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1)\n * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]]\n * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2)\n * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]]\n *\n * @param {Array} diffs Array of diff tuples\n * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n * @return {Array} A tuple [cursor location in the modified diff, modified diff]\n */\nfunction cursor_normalize_diff (diffs, cursor_pos) {\n if (cursor_pos === 0) {\n return [DIFF_EQUAL, diffs];\n }\n for (var current_pos = 0, i = 0; i < diffs.length; i++) {\n var d = diffs[i];\n if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) {\n var next_pos = current_pos + d[1].length;\n if (cursor_pos === next_pos) {\n return [i + 1, diffs];\n } else if (cursor_pos < next_pos) {\n // copy to prevent side effects\n diffs = diffs.slice();\n // split d into two diff changes\n var split_pos = cursor_pos - current_pos;\n var d_left = [d[0], d[1].slice(0, split_pos)];\n var d_right = [d[0], d[1].slice(split_pos)];\n diffs.splice(i, 1, d_left, d_right);\n return [i + 1, diffs];\n } else {\n current_pos = next_pos;\n }\n }\n }\n throw new Error('cursor_pos is out of bounds!')\n}\n\n/*\n * Modify a diff such that the edit position is \"shifted\" to the proposed edit location (cursor_position).\n *\n * Case 1)\n * Check if a naive shift is possible:\n * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X)\n * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result\n * Case 2)\n * Check if the following shifts are possible:\n * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix']\n * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix']\n * ^ ^\n * d d_next\n *\n * @param {Array} diffs Array of diff tuples\n * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n * @return {Array} Array of diff tuples\n */\nfunction fix_cursor (diffs, cursor_pos) {\n var norm = cursor_normalize_diff(diffs, cursor_pos);\n var ndiffs = norm[1];\n var cursor_pointer = norm[0];\n var d = ndiffs[cursor_pointer];\n var d_next = ndiffs[cursor_pointer + 1];\n\n if (d == null) {\n // Text was deleted from end of original string,\n // cursor is now out of bounds in new string\n return diffs;\n } else if (d[0] !== DIFF_EQUAL) {\n // A modification happened at the cursor location.\n // This is the expected outcome, so we can return the original diff.\n return diffs;\n } else {\n if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) {\n // Case 1)\n // It is possible to perform a naive shift\n ndiffs.splice(cursor_pointer, 2, d_next, d)\n return merge_tuples(ndiffs, cursor_pointer, 2)\n } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) {\n // Case 2)\n // d[1] is a prefix of d_next[1]\n // We can assume that d_next[0] !== 0, since d[0] === 0\n // Shift edit locations..\n ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]);\n var suffix = d_next[1].slice(d[1].length);\n if (suffix.length > 0) {\n ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]);\n }\n return merge_tuples(ndiffs, cursor_pointer, 3)\n } else {\n // Not possible to perform any modification\n return diffs;\n }\n }\n}\n\n/*\n * Check diff did not split surrogate pairs.\n * Ex. [0, '\\uD83D'], [-1, '\\uDC36'], [1, '\\uDC2F'] -> [-1, '\\uD83D\\uDC36'], [1, '\\uD83D\\uDC2F']\n * '\\uD83D\\uDC36' === '🐶', '\\uD83D\\uDC2F' === '🐯'\n *\n * @param {Array} diffs Array of diff tuples\n * @return {Array} Array of diff tuples\n */\nfunction fix_emoji (diffs) {\n var compact = false;\n var starts_with_pair_end = function(str) {\n return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF;\n }\n var ends_with_pair_start = function(str) {\n return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF;\n }\n for (var i = 2; i < diffs.length; i += 1) {\n if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) &&\n diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) &&\n diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) {\n compact = true;\n\n diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1];\n diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1];\n\n diffs[i-2][1] = diffs[i-2][1].slice(0, -1);\n }\n }\n if (!compact) {\n return diffs;\n }\n var fixed_diffs = [];\n for (var i = 0; i < diffs.length; i += 1) {\n if (diffs[i][1].length > 0) {\n fixed_diffs.push(diffs[i]);\n }\n }\n return fixed_diffs;\n}\n\n/*\n * Try to merge tuples with their neigbors in a given range.\n * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab']\n *\n * @param {Array} diffs Array of diff tuples.\n * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]).\n * @param {Int} length Number of consecutive elements to check.\n * @return {Array} Array of merged diff tuples.\n */\nfunction merge_tuples (diffs, start, length) {\n // Check from (start-1) to (start+length).\n for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) {\n if (i + 1 < diffs.length) {\n var left_d = diffs[i];\n var right_d = diffs[i+1];\n if (left_d[0] === right_d[1]) {\n diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]);\n }\n }\n }\n return diffs;\n}\n\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports) {\n\nexports = module.exports = typeof Object.keys === 'function'\n ? Object.keys : shim;\n\nexports.shim = shim;\nfunction shim (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n}\n\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports) {\n\nvar supportsArgumentsClass = (function(){\n return Object.prototype.toString.call(arguments)\n})() == '[object Arguments]';\n\nexports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\nexports.supported = supported;\nfunction supported(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n};\n\nexports.unsupported = unsupported;\nfunction unsupported(object){\n return object &&\n typeof object == 'object' &&\n typeof object.length == 'number' &&\n Object.prototype.hasOwnProperty.call(object, 'callee') &&\n !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n false;\n};\n\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _op = __webpack_require__(20);\n\nvar _op2 = _interopRequireDefault(_op);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _code = __webpack_require__(13);\n\nvar _code2 = _interopRequireDefault(_code);\n\nvar _cursor = __webpack_require__(31);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nvar _break = __webpack_require__(14);\n\nvar _break2 = _interopRequireDefault(_break);\n\nvar _clone = __webpack_require__(21);\n\nvar _clone2 = _interopRequireDefault(_clone);\n\nvar _deepEqual = __webpack_require__(12);\n\nvar _deepEqual2 = _interopRequireDefault(_deepEqual);\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ASCII = /^[ -~]*$/;\n\nvar Editor = function () {\n function Editor(scroll) {\n _classCallCheck(this, Editor);\n\n this.scroll = scroll;\n this.delta = this.getDelta();\n }\n\n _createClass(Editor, [{\n key: 'applyDelta',\n value: function applyDelta(delta) {\n var _this = this;\n\n var consumeNextNewline = false;\n this.scroll.update();\n var scrollLength = this.scroll.length();\n this.scroll.batchStart();\n delta = normalizeDelta(delta);\n delta.reduce(function (index, op) {\n var length = op.retain || op.delete || op.insert.length || 1;\n var attributes = op.attributes || {};\n if (op.insert != null) {\n if (typeof op.insert === 'string') {\n var text = op.insert;\n if (text.endsWith('\\n') && consumeNextNewline) {\n consumeNextNewline = false;\n text = text.slice(0, -1);\n }\n if (index >= scrollLength && !text.endsWith('\\n')) {\n consumeNextNewline = true;\n }\n _this.scroll.insertAt(index, text);\n\n var _scroll$line = _this.scroll.line(index),\n _scroll$line2 = _slicedToArray(_scroll$line, 2),\n line = _scroll$line2[0],\n offset = _scroll$line2[1];\n\n var formats = (0, _extend2.default)({}, (0, _block.bubbleFormats)(line));\n if (line instanceof _block2.default) {\n var _line$descendant = line.descendant(_parchment2.default.Leaf, offset),\n _line$descendant2 = _slicedToArray(_line$descendant, 1),\n leaf = _line$descendant2[0];\n\n formats = (0, _extend2.default)(formats, (0, _block.bubbleFormats)(leaf));\n }\n attributes = _op2.default.attributes.diff(formats, attributes) || {};\n } else if (_typeof(op.insert) === 'object') {\n var key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n _this.scroll.insertAt(index, key, op.insert[key]);\n }\n scrollLength += length;\n }\n Object.keys(attributes).forEach(function (name) {\n _this.scroll.formatAt(index, length, name, attributes[name]);\n });\n return index + length;\n }, 0);\n delta.reduce(function (index, op) {\n if (typeof op.delete === 'number') {\n _this.scroll.deleteAt(index, op.delete);\n return index;\n }\n return index + (op.retain || op.insert.length || 1);\n }, 0);\n this.scroll.batchEnd();\n return this.update(delta);\n }\n }, {\n key: 'deleteText',\n value: function deleteText(index, length) {\n this.scroll.deleteAt(index, length);\n return this.update(new _quillDelta2.default().retain(index).delete(length));\n }\n }, {\n key: 'formatLine',\n value: function formatLine(index, length) {\n var _this2 = this;\n\n var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n this.scroll.update();\n Object.keys(formats).forEach(function (format) {\n if (_this2.scroll.whitelist != null && !_this2.scroll.whitelist[format]) return;\n var lines = _this2.scroll.lines(index, Math.max(length, 1));\n var lengthRemaining = length;\n lines.forEach(function (line) {\n var lineLength = line.length();\n if (!(line instanceof _code2.default)) {\n line.format(format, formats[format]);\n } else {\n var codeIndex = index - line.offset(_this2.scroll);\n var codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1;\n line.formatAt(codeIndex, codeLength, format, formats[format]);\n }\n lengthRemaining -= lineLength;\n });\n });\n this.scroll.optimize();\n return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats)));\n }\n }, {\n key: 'formatText',\n value: function formatText(index, length) {\n var _this3 = this;\n\n var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n Object.keys(formats).forEach(function (format) {\n _this3.scroll.formatAt(index, length, format, formats[format]);\n });\n return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats)));\n }\n }, {\n key: 'getContents',\n value: function getContents(index, length) {\n return this.delta.slice(index, index + length);\n }\n }, {\n key: 'getDelta',\n value: function getDelta() {\n return this.scroll.lines().reduce(function (delta, line) {\n return delta.concat(line.delta());\n }, new _quillDelta2.default());\n }\n }, {\n key: 'getFormat',\n value: function getFormat(index) {\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var lines = [],\n leaves = [];\n if (length === 0) {\n this.scroll.path(index).forEach(function (path) {\n var _path = _slicedToArray(path, 1),\n blot = _path[0];\n\n if (blot instanceof _block2.default) {\n lines.push(blot);\n } else if (blot instanceof _parchment2.default.Leaf) {\n leaves.push(blot);\n }\n });\n } else {\n lines = this.scroll.lines(index, length);\n leaves = this.scroll.descendants(_parchment2.default.Leaf, index, length);\n }\n var formatsArr = [lines, leaves].map(function (blots) {\n if (blots.length === 0) return {};\n var formats = (0, _block.bubbleFormats)(blots.shift());\n while (Object.keys(formats).length > 0) {\n var blot = blots.shift();\n if (blot == null) return formats;\n formats = combineFormats((0, _block.bubbleFormats)(blot), formats);\n }\n return formats;\n });\n return _extend2.default.apply(_extend2.default, formatsArr);\n }\n }, {\n key: 'getText',\n value: function getText(index, length) {\n return this.getContents(index, length).filter(function (op) {\n return typeof op.insert === 'string';\n }).map(function (op) {\n return op.insert;\n }).join('');\n }\n }, {\n key: 'insertEmbed',\n value: function insertEmbed(index, embed, value) {\n this.scroll.insertAt(index, embed, value);\n return this.update(new _quillDelta2.default().retain(index).insert(_defineProperty({}, embed, value)));\n }\n }, {\n key: 'insertText',\n value: function insertText(index, text) {\n var _this4 = this;\n\n var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n this.scroll.insertAt(index, text);\n Object.keys(formats).forEach(function (format) {\n _this4.scroll.formatAt(index, text.length, format, formats[format]);\n });\n return this.update(new _quillDelta2.default().retain(index).insert(text, (0, _clone2.default)(formats)));\n }\n }, {\n key: 'isBlank',\n value: function isBlank() {\n if (this.scroll.children.length == 0) return true;\n if (this.scroll.children.length > 1) return false;\n var block = this.scroll.children.head;\n if (block.statics.blotName !== _block2.default.blotName) return false;\n if (block.children.length > 1) return false;\n return block.children.head instanceof _break2.default;\n }\n }, {\n key: 'removeFormat',\n value: function removeFormat(index, length) {\n var text = this.getText(index, length);\n\n var _scroll$line3 = this.scroll.line(index + length),\n _scroll$line4 = _slicedToArray(_scroll$line3, 2),\n line = _scroll$line4[0],\n offset = _scroll$line4[1];\n\n var suffixLength = 0,\n suffix = new _quillDelta2.default();\n if (line != null) {\n if (!(line instanceof _code2.default)) {\n suffixLength = line.length() - offset;\n } else {\n suffixLength = line.newlineIndex(offset) - offset + 1;\n }\n suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\\n');\n }\n var contents = this.getContents(index, length + suffixLength);\n var diff = contents.diff(new _quillDelta2.default().insert(text).concat(suffix));\n var delta = new _quillDelta2.default().retain(index).concat(diff);\n return this.applyDelta(delta);\n }\n }, {\n key: 'update',\n value: function update(change) {\n var mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var cursorIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n\n var oldDelta = this.delta;\n if (mutations.length === 1 && mutations[0].type === 'characterData' && mutations[0].target.data.match(ASCII) && _parchment2.default.find(mutations[0].target)) {\n // Optimization for character changes\n var textBlot = _parchment2.default.find(mutations[0].target);\n var formats = (0, _block.bubbleFormats)(textBlot);\n var index = textBlot.offset(this.scroll);\n var oldValue = mutations[0].oldValue.replace(_cursor2.default.CONTENTS, '');\n var oldText = new _quillDelta2.default().insert(oldValue);\n var newText = new _quillDelta2.default().insert(textBlot.value());\n var diffDelta = new _quillDelta2.default().retain(index).concat(oldText.diff(newText, cursorIndex));\n change = diffDelta.reduce(function (delta, op) {\n if (op.insert) {\n return delta.insert(op.insert, formats);\n } else {\n return delta.push(op);\n }\n }, new _quillDelta2.default());\n this.delta = oldDelta.compose(change);\n } else {\n this.delta = this.getDelta();\n if (!change || !(0, _deepEqual2.default)(oldDelta.compose(change), this.delta)) {\n change = oldDelta.diff(this.delta, cursorIndex);\n }\n }\n return change;\n }\n }]);\n\n return Editor;\n}();\n\nfunction combineFormats(formats, combined) {\n return Object.keys(combined).reduce(function (merged, name) {\n if (formats[name] == null) return merged;\n if (combined[name] === formats[name]) {\n merged[name] = combined[name];\n } else if (Array.isArray(combined[name])) {\n if (combined[name].indexOf(formats[name]) < 0) {\n merged[name] = combined[name].concat([formats[name]]);\n }\n } else {\n merged[name] = [combined[name], formats[name]];\n }\n return merged;\n }, {});\n}\n\nfunction normalizeDelta(delta) {\n return delta.reduce(function (delta, op) {\n if (op.insert === 1) {\n var attributes = (0, _clone2.default)(op.attributes);\n delete attributes['image'];\n return delta.insert({ image: op.attributes.image }, attributes);\n }\n if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) {\n op = (0, _clone2.default)(op);\n if (op.attributes.list) {\n op.attributes.list = 'ordered';\n } else {\n op.attributes.list = 'bullet';\n delete op.attributes.bullet;\n }\n }\n if (typeof op.insert === 'string') {\n var text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return delta.insert(text, op.attributes);\n }\n return delta.push(op);\n }, new _quillDelta2.default());\n}\n\nexports.default = Editor;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports) {\n\n'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn\n && (!once || listeners.once)\n && (!context || listeners.context === context)\n ) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _emitter = __webpack_require__(9);\n\nvar _emitter2 = _interopRequireDefault(_emitter);\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nvar _break = __webpack_require__(14);\n\nvar _break2 = _interopRequireDefault(_break);\n\nvar _code = __webpack_require__(13);\n\nvar _code2 = _interopRequireDefault(_code);\n\nvar _container = __webpack_require__(23);\n\nvar _container2 = _interopRequireDefault(_container);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction isLine(blot) {\n return blot instanceof _block2.default || blot instanceof _block.BlockEmbed;\n}\n\nvar Scroll = function (_Parchment$Scroll) {\n _inherits(Scroll, _Parchment$Scroll);\n\n function Scroll(domNode, config) {\n _classCallCheck(this, Scroll);\n\n var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, domNode));\n\n _this.emitter = config.emitter;\n if (Array.isArray(config.whitelist)) {\n _this.whitelist = config.whitelist.reduce(function (whitelist, format) {\n whitelist[format] = true;\n return whitelist;\n }, {});\n }\n // Some reason fixes composition issues with character languages in Windows/Chrome, Safari\n _this.domNode.addEventListener('DOMNodeInserted', function () {});\n _this.optimize();\n _this.enable();\n return _this;\n }\n\n _createClass(Scroll, [{\n key: 'batchStart',\n value: function batchStart() {\n this.batch = true;\n }\n }, {\n key: 'batchEnd',\n value: function batchEnd() {\n this.batch = false;\n this.optimize();\n }\n }, {\n key: 'deleteAt',\n value: function deleteAt(index, length) {\n var _line = this.line(index),\n _line2 = _slicedToArray(_line, 2),\n first = _line2[0],\n offset = _line2[1];\n\n var _line3 = this.line(index + length),\n _line4 = _slicedToArray(_line3, 1),\n last = _line4[0];\n\n _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'deleteAt', this).call(this, index, length);\n if (last != null && first !== last && offset > 0) {\n if (first instanceof _block.BlockEmbed || last instanceof _block.BlockEmbed) {\n this.optimize();\n return;\n }\n if (first instanceof _code2.default) {\n var newlineIndex = first.newlineIndex(first.length(), true);\n if (newlineIndex > -1) {\n first = first.split(newlineIndex + 1);\n if (first === last) {\n this.optimize();\n return;\n }\n }\n } else if (last instanceof _code2.default) {\n var _newlineIndex = last.newlineIndex(0);\n if (_newlineIndex > -1) {\n last.split(_newlineIndex + 1);\n }\n }\n var ref = last.children.head instanceof _break2.default ? null : last.children.head;\n first.moveChildren(last, ref);\n first.remove();\n }\n this.optimize();\n }\n }, {\n key: 'enable',\n value: function enable() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n this.domNode.setAttribute('contenteditable', enabled);\n }\n }, {\n key: 'formatAt',\n value: function formatAt(index, length, format, value) {\n if (this.whitelist != null && !this.whitelist[format]) return;\n _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'formatAt', this).call(this, index, length, format, value);\n this.optimize();\n }\n }, {\n key: 'insertAt',\n value: function insertAt(index, value, def) {\n if (def != null && this.whitelist != null && !this.whitelist[value]) return;\n if (index >= this.length()) {\n if (def == null || _parchment2.default.query(value, _parchment2.default.Scope.BLOCK) == null) {\n var blot = _parchment2.default.create(this.statics.defaultChild);\n this.appendChild(blot);\n if (def == null && value.endsWith('\\n')) {\n value = value.slice(0, -1);\n }\n blot.insertAt(0, value, def);\n } else {\n var embed = _parchment2.default.create(value, def);\n this.appendChild(embed);\n }\n } else {\n _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertAt', this).call(this, index, value, def);\n }\n this.optimize();\n }\n }, {\n key: 'insertBefore',\n value: function insertBefore(blot, ref) {\n if (blot.statics.scope === _parchment2.default.Scope.INLINE_BLOT) {\n var wrapper = _parchment2.default.create(this.statics.defaultChild);\n wrapper.appendChild(blot);\n blot = wrapper;\n }\n _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertBefore', this).call(this, blot, ref);\n }\n }, {\n key: 'leaf',\n value: function leaf(index) {\n return this.path(index).pop() || [null, -1];\n }\n }, {\n key: 'line',\n value: function line(index) {\n if (index === this.length()) {\n return this.line(index - 1);\n }\n return this.descendant(isLine, index);\n }\n }, {\n key: 'lines',\n value: function lines() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE;\n\n var getLines = function getLines(blot, index, length) {\n var lines = [],\n lengthLeft = length;\n blot.children.forEachAt(index, length, function (child, index, length) {\n if (isLine(child)) {\n lines.push(child);\n } else if (child instanceof _parchment2.default.Container) {\n lines = lines.concat(getLines(child, index, lengthLeft));\n }\n lengthLeft -= length;\n });\n return lines;\n };\n return getLines(this, index, length);\n }\n }, {\n key: 'optimize',\n value: function optimize() {\n var mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (this.batch === true) return;\n _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'optimize', this).call(this, mutations, context);\n if (mutations.length > 0) {\n this.emitter.emit(_emitter2.default.events.SCROLL_OPTIMIZE, mutations, context);\n }\n }\n }, {\n key: 'path',\n value: function path(index) {\n return _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'path', this).call(this, index).slice(1); // Exclude self\n }\n }, {\n key: 'update',\n value: function update(mutations) {\n if (this.batch === true) return;\n var source = _emitter2.default.sources.USER;\n if (typeof mutations === 'string') {\n source = mutations;\n }\n if (!Array.isArray(mutations)) {\n mutations = this.observer.takeRecords();\n }\n if (mutations.length > 0) {\n this.emitter.emit(_emitter2.default.events.SCROLL_BEFORE_UPDATE, source, mutations);\n }\n _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'update', this).call(this, mutations.concat([])); // pass copy\n if (mutations.length > 0) {\n this.emitter.emit(_emitter2.default.events.SCROLL_UPDATE, source, mutations);\n }\n }\n }]);\n\n return Scroll;\n}(_parchment2.default.Scroll);\n\nScroll.blotName = 'scroll';\nScroll.className = 'ql-editor';\nScroll.tagName = 'DIV';\nScroll.defaultChild = 'block';\nScroll.allowedChildren = [_block2.default, _block.BlockEmbed, _container2.default];\n\nexports.default = Scroll;\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.matchText = exports.matchSpacing = exports.matchNewline = exports.matchBlot = exports.matchAttributor = exports.default = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _extend2 = __webpack_require__(2);\n\nvar _extend3 = _interopRequireDefault(_extend2);\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _logger = __webpack_require__(10);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nvar _align = __webpack_require__(34);\n\nvar _background = __webpack_require__(35);\n\nvar _code = __webpack_require__(13);\n\nvar _code2 = _interopRequireDefault(_code);\n\nvar _color = __webpack_require__(24);\n\nvar _direction = __webpack_require__(36);\n\nvar _font = __webpack_require__(37);\n\nvar _size = __webpack_require__(38);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar debug = (0, _logger2.default)('quill:clipboard');\n\nvar DOM_KEY = '__ql-matcher';\n\nvar CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], [Node.TEXT_NODE, matchNewline], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchSpacing], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['li', matchIndent], ['b', matchAlias.bind(matchAlias, 'bold')], ['i', matchAlias.bind(matchAlias, 'italic')], ['style', matchIgnore]];\n\nvar ATTRIBUTE_ATTRIBUTORS = [_align.AlignAttribute, _direction.DirectionAttribute].reduce(function (memo, attr) {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\nvar STYLE_ATTRIBUTORS = [_align.AlignStyle, _background.BackgroundStyle, _color.ColorStyle, _direction.DirectionStyle, _font.FontStyle, _size.SizeStyle].reduce(function (memo, attr) {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\nvar Clipboard = function (_Module) {\n _inherits(Clipboard, _Module);\n\n function Clipboard(quill, options) {\n _classCallCheck(this, Clipboard);\n\n var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this, quill, options));\n\n _this.quill.root.addEventListener('paste', _this.onPaste.bind(_this));\n _this.container = _this.quill.addContainer('ql-clipboard');\n _this.container.setAttribute('contenteditable', true);\n _this.container.setAttribute('tabindex', -1);\n _this.matchers = [];\n CLIPBOARD_CONFIG.concat(_this.options.matchers).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n selector = _ref2[0],\n matcher = _ref2[1];\n\n if (!options.matchVisual && matcher === matchSpacing) return;\n _this.addMatcher(selector, matcher);\n });\n return _this;\n }\n\n _createClass(Clipboard, [{\n key: 'addMatcher',\n value: function addMatcher(selector, matcher) {\n this.matchers.push([selector, matcher]);\n }\n }, {\n key: 'convert',\n value: function convert(html) {\n if (typeof html === 'string') {\n this.container.innerHTML = html.replace(/\\>\\r?\\n +\\<'); // Remove spaces between tags\n return this.convert();\n }\n var formats = this.quill.getFormat(this.quill.selection.savedRange.index);\n if (formats[_code2.default.blotName]) {\n var text = this.container.innerText;\n this.container.innerHTML = '';\n return new _quillDelta2.default().insert(text, _defineProperty({}, _code2.default.blotName, formats[_code2.default.blotName]));\n }\n\n var _prepareMatching = this.prepareMatching(),\n _prepareMatching2 = _slicedToArray(_prepareMatching, 2),\n elementMatchers = _prepareMatching2[0],\n textMatchers = _prepareMatching2[1];\n\n var delta = traverse(this.container, elementMatchers, textMatchers);\n // Remove trailing newline\n if (deltaEndsWith(delta, '\\n') && delta.ops[delta.ops.length - 1].attributes == null) {\n delta = delta.compose(new _quillDelta2.default().retain(delta.length() - 1).delete(1));\n }\n debug.log('convert', this.container.innerHTML, delta);\n this.container.innerHTML = '';\n return delta;\n }\n }, {\n key: 'dangerouslyPasteHTML',\n value: function dangerouslyPasteHTML(index, html) {\n var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API;\n\n if (typeof index === 'string') {\n this.quill.setContents(this.convert(index), html);\n this.quill.setSelection(0, _quill2.default.sources.SILENT);\n } else {\n var paste = this.convert(html);\n this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source);\n this.quill.setSelection(index + paste.length(), _quill2.default.sources.SILENT);\n }\n }\n }, {\n key: 'onPaste',\n value: function onPaste(e) {\n var _this2 = this;\n\n if (e.defaultPrevented || !this.quill.isEnabled()) return;\n var range = this.quill.getSelection();\n var delta = new _quillDelta2.default().retain(range.index);\n var scrollTop = this.quill.scrollingContainer.scrollTop;\n this.container.focus();\n this.quill.selection.update(_quill2.default.sources.SILENT);\n setTimeout(function () {\n delta = delta.concat(_this2.convert()).delete(range.length);\n _this2.quill.updateContents(delta, _quill2.default.sources.USER);\n // range.length contributes to delta.length()\n _this2.quill.setSelection(delta.length() - range.length, _quill2.default.sources.SILENT);\n _this2.quill.scrollingContainer.scrollTop = scrollTop;\n _this2.quill.focus();\n }, 1);\n }\n }, {\n key: 'prepareMatching',\n value: function prepareMatching() {\n var _this3 = this;\n\n var elementMatchers = [],\n textMatchers = [];\n this.matchers.forEach(function (pair) {\n var _pair = _slicedToArray(pair, 2),\n selector = _pair[0],\n matcher = _pair[1];\n\n switch (selector) {\n case Node.TEXT_NODE:\n textMatchers.push(matcher);\n break;\n case Node.ELEMENT_NODE:\n elementMatchers.push(matcher);\n break;\n default:\n [].forEach.call(_this3.container.querySelectorAll(selector), function (node) {\n // TODO use weakmap\n node[DOM_KEY] = node[DOM_KEY] || [];\n node[DOM_KEY].push(matcher);\n });\n break;\n }\n });\n return [elementMatchers, textMatchers];\n }\n }]);\n\n return Clipboard;\n}(_module2.default);\n\nClipboard.DEFAULTS = {\n matchers: [],\n matchVisual: true\n};\n\nfunction applyFormat(delta, format, value) {\n if ((typeof format === 'undefined' ? 'undefined' : _typeof(format)) === 'object') {\n return Object.keys(format).reduce(function (delta, key) {\n return applyFormat(delta, key, format[key]);\n }, delta);\n } else {\n return delta.reduce(function (delta, op) {\n if (op.attributes && op.attributes[format]) {\n return delta.push(op);\n } else {\n return delta.insert(op.insert, (0, _extend3.default)({}, _defineProperty({}, format, value), op.attributes));\n }\n }, new _quillDelta2.default());\n }\n}\n\nfunction computeStyle(node) {\n if (node.nodeType !== Node.ELEMENT_NODE) return {};\n var DOM_KEY = '__ql-computed-style';\n return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node));\n}\n\nfunction deltaEndsWith(delta, text) {\n var endText = \"\";\n for (var i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) {\n var op = delta.ops[i];\n if (typeof op.insert !== 'string') break;\n endText = op.insert + endText;\n }\n return endText.slice(-1 * text.length) === text;\n}\n\nfunction isLine(node) {\n if (node.childNodes.length === 0) return false; // Exclude embed blocks\n var style = computeStyle(node);\n return ['block', 'list-item'].indexOf(style.display) > -1;\n}\n\nfunction traverse(node, elementMatchers, textMatchers) {\n // Post-order\n if (node.nodeType === node.TEXT_NODE) {\n return textMatchers.reduce(function (delta, matcher) {\n return matcher(node, delta);\n }, new _quillDelta2.default());\n } else if (node.nodeType === node.ELEMENT_NODE) {\n return [].reduce.call(node.childNodes || [], function (delta, childNode) {\n var childrenDelta = traverse(childNode, elementMatchers, textMatchers);\n if (childNode.nodeType === node.ELEMENT_NODE) {\n childrenDelta = elementMatchers.reduce(function (childrenDelta, matcher) {\n return matcher(childNode, childrenDelta);\n }, childrenDelta);\n childrenDelta = (childNode[DOM_KEY] || []).reduce(function (childrenDelta, matcher) {\n return matcher(childNode, childrenDelta);\n }, childrenDelta);\n }\n return delta.concat(childrenDelta);\n }, new _quillDelta2.default());\n } else {\n return new _quillDelta2.default();\n }\n}\n\nfunction matchAlias(format, node, delta) {\n return applyFormat(delta, format, true);\n}\n\nfunction matchAttributor(node, delta) {\n var attributes = _parchment2.default.Attributor.Attribute.keys(node);\n var classes = _parchment2.default.Attributor.Class.keys(node);\n var styles = _parchment2.default.Attributor.Style.keys(node);\n var formats = {};\n attributes.concat(classes).concat(styles).forEach(function (name) {\n var attr = _parchment2.default.query(name, _parchment2.default.Scope.ATTRIBUTE);\n if (attr != null) {\n formats[attr.attrName] = attr.value(node);\n if (formats[attr.attrName]) return;\n }\n attr = ATTRIBUTE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n attr = STYLE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n attr = STYLE_ATTRIBUTORS[name];\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n });\n if (Object.keys(formats).length > 0) {\n delta = applyFormat(delta, formats);\n }\n return delta;\n}\n\nfunction matchBlot(node, delta) {\n var match = _parchment2.default.query(node);\n if (match == null) return delta;\n if (match.prototype instanceof _parchment2.default.Embed) {\n var embed = {};\n var value = match.value(node);\n if (value != null) {\n embed[match.blotName] = value;\n delta = new _quillDelta2.default().insert(embed, match.formats(node));\n }\n } else if (typeof match.formats === 'function') {\n delta = applyFormat(delta, match.blotName, match.formats(node));\n }\n return delta;\n}\n\nfunction matchBreak(node, delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n return delta;\n}\n\nfunction matchIgnore() {\n return new _quillDelta2.default();\n}\n\nfunction matchIndent(node, delta) {\n var match = _parchment2.default.query(node);\n if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\\n')) {\n return delta;\n }\n var indent = -1,\n parent = node.parentNode;\n while (!parent.classList.contains('ql-clipboard')) {\n if ((_parchment2.default.query(parent) || {}).blotName === 'list') {\n indent += 1;\n }\n parent = parent.parentNode;\n }\n if (indent <= 0) return delta;\n return delta.compose(new _quillDelta2.default().retain(delta.length() - 1).retain(1, { indent: indent }));\n}\n\nfunction matchNewline(node, delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n if (isLine(node) || delta.length() > 0 && node.nextSibling && isLine(node.nextSibling)) {\n delta.insert('\\n');\n }\n }\n return delta;\n}\n\nfunction matchSpacing(node, delta) {\n if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\\n\\n')) {\n var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom);\n if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) {\n delta.insert('\\n');\n }\n }\n return delta;\n}\n\nfunction matchStyles(node, delta) {\n var formats = {};\n var style = node.style || {};\n if (style.fontStyle && computeStyle(node).fontStyle === 'italic') {\n formats.italic = true;\n }\n if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') || parseInt(computeStyle(node).fontWeight) >= 700)) {\n formats.bold = true;\n }\n if (Object.keys(formats).length > 0) {\n delta = applyFormat(delta, formats);\n }\n if (parseFloat(style.textIndent || 0) > 0) {\n // Could be 0.5in\n delta = new _quillDelta2.default().insert('\\t').concat(delta);\n }\n return delta;\n}\n\nfunction matchText(node, delta) {\n var text = node.data;\n // Word represents empty line with  \n if (node.parentNode.tagName === 'O:P') {\n return delta.insert(text.trim());\n }\n if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) {\n return delta;\n }\n if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) {\n // eslint-disable-next-line func-style\n var replacer = function replacer(collapse, match) {\n match = match.replace(/[^\\u00a0]/g, ''); // \\u00a0 is nbsp;\n return match.length < 1 && collapse ? ' ' : match;\n };\n text = text.replace(/\\r\\n/g, ' ').replace(/\\n/g, ' ');\n text = text.replace(/\\s\\s+/g, replacer.bind(replacer, true)); // collapse whitespace\n if (node.previousSibling == null && isLine(node.parentNode) || node.previousSibling != null && isLine(node.previousSibling)) {\n text = text.replace(/^\\s+/, replacer.bind(replacer, false));\n }\n if (node.nextSibling == null && isLine(node.parentNode) || node.nextSibling != null && isLine(node.nextSibling)) {\n text = text.replace(/\\s+$/, replacer.bind(replacer, false));\n }\n }\n return delta.insert(text);\n}\n\nexports.default = Clipboard;\nexports.matchAttributor = matchAttributor;\nexports.matchBlot = matchBlot;\nexports.matchNewline = matchNewline;\nexports.matchSpacing = matchSpacing;\nexports.matchText = matchText;\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getLastChangeIndex = exports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar History = function (_Module) {\n _inherits(History, _Module);\n\n function History(quill, options) {\n _classCallCheck(this, History);\n\n var _this = _possibleConstructorReturn(this, (History.__proto__ || Object.getPrototypeOf(History)).call(this, quill, options));\n\n _this.lastRecorded = 0;\n _this.ignoreChange = false;\n _this.clear();\n _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (eventName, delta, oldDelta, source) {\n if (eventName !== _quill2.default.events.TEXT_CHANGE || _this.ignoreChange) return;\n if (!_this.options.userOnly || source === _quill2.default.sources.USER) {\n _this.record(delta, oldDelta);\n } else {\n _this.transform(delta);\n }\n });\n _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, _this.undo.bind(_this));\n _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, _this.redo.bind(_this));\n if (/Win/i.test(navigator.platform)) {\n _this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, _this.redo.bind(_this));\n }\n return _this;\n }\n\n _createClass(History, [{\n key: 'change',\n value: function change(source, dest) {\n if (this.stack[source].length === 0) return;\n var delta = this.stack[source].pop();\n this.stack[dest].push(delta);\n this.lastRecorded = 0;\n this.ignoreChange = true;\n this.quill.updateContents(delta[source], _quill2.default.sources.USER);\n this.ignoreChange = false;\n var index = getLastChangeIndex(delta[source]);\n this.quill.setSelection(index);\n }\n }, {\n key: 'clear',\n value: function clear() {\n this.stack = { undo: [], redo: [] };\n }\n }, {\n key: 'cutoff',\n value: function cutoff() {\n this.lastRecorded = 0;\n }\n }, {\n key: 'record',\n value: function record(changeDelta, oldDelta) {\n if (changeDelta.ops.length === 0) return;\n this.stack.redo = [];\n var undoDelta = this.quill.getContents().diff(oldDelta);\n var timestamp = Date.now();\n if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) {\n var delta = this.stack.undo.pop();\n undoDelta = undoDelta.compose(delta.undo);\n changeDelta = delta.redo.compose(changeDelta);\n } else {\n this.lastRecorded = timestamp;\n }\n this.stack.undo.push({\n redo: changeDelta,\n undo: undoDelta\n });\n if (this.stack.undo.length > this.options.maxStack) {\n this.stack.undo.shift();\n }\n }\n }, {\n key: 'redo',\n value: function redo() {\n this.change('redo', 'undo');\n }\n }, {\n key: 'transform',\n value: function transform(delta) {\n this.stack.undo.forEach(function (change) {\n change.undo = delta.transform(change.undo, true);\n change.redo = delta.transform(change.redo, true);\n });\n this.stack.redo.forEach(function (change) {\n change.undo = delta.transform(change.undo, true);\n change.redo = delta.transform(change.redo, true);\n });\n }\n }, {\n key: 'undo',\n value: function undo() {\n this.change('undo', 'redo');\n }\n }]);\n\n return History;\n}(_module2.default);\n\nHistory.DEFAULTS = {\n delay: 1000,\n maxStack: 100,\n userOnly: false\n};\n\nfunction endsWithNewlineChange(delta) {\n var lastOp = delta.ops[delta.ops.length - 1];\n if (lastOp == null) return false;\n if (lastOp.insert != null) {\n return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n }\n if (lastOp.attributes != null) {\n return Object.keys(lastOp.attributes).some(function (attr) {\n return _parchment2.default.query(attr, _parchment2.default.Scope.BLOCK) != null;\n });\n }\n return false;\n}\n\nfunction getLastChangeIndex(delta) {\n var deleteLength = delta.reduce(function (length, op) {\n length += op.delete || 0;\n return length;\n }, 0);\n var changeIndex = delta.length() - deleteLength;\n if (endsWithNewlineChange(delta)) {\n changeIndex -= 1;\n }\n return changeIndex;\n}\n\nexports.default = History;\nexports.getLastChangeIndex = getLastChangeIndex;\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.IndentClass = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar IdentAttributor = function (_Parchment$Attributor) {\n _inherits(IdentAttributor, _Parchment$Attributor);\n\n function IdentAttributor() {\n _classCallCheck(this, IdentAttributor);\n\n return _possibleConstructorReturn(this, (IdentAttributor.__proto__ || Object.getPrototypeOf(IdentAttributor)).apply(this, arguments));\n }\n\n _createClass(IdentAttributor, [{\n key: 'add',\n value: function add(node, value) {\n if (value === '+1' || value === '-1') {\n var indent = this.value(node) || 0;\n value = value === '+1' ? indent + 1 : indent - 1;\n }\n if (value === 0) {\n this.remove(node);\n return true;\n } else {\n return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'add', this).call(this, node, value);\n }\n }\n }, {\n key: 'canAdd',\n value: function canAdd(node, value) {\n return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, value) || _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, parseInt(value));\n }\n }, {\n key: 'value',\n value: function value(node) {\n return parseInt(_get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'value', this).call(this, node)) || undefined; // Don't return NaN\n }\n }]);\n\n return IdentAttributor;\n}(_parchment2.default.Attributor.Class);\n\nvar IndentClass = new IdentAttributor('indent', 'ql-indent', {\n scope: _parchment2.default.Scope.BLOCK,\n whitelist: [1, 2, 3, 4, 5, 6, 7, 8]\n});\n\nexports.IndentClass = IndentClass;\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Blockquote = function (_Block) {\n _inherits(Blockquote, _Block);\n\n function Blockquote() {\n _classCallCheck(this, Blockquote);\n\n return _possibleConstructorReturn(this, (Blockquote.__proto__ || Object.getPrototypeOf(Blockquote)).apply(this, arguments));\n }\n\n return Blockquote;\n}(_block2.default);\n\nBlockquote.blotName = 'blockquote';\nBlockquote.tagName = 'blockquote';\n\nexports.default = Blockquote;\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Header = function (_Block) {\n _inherits(Header, _Block);\n\n function Header() {\n _classCallCheck(this, Header);\n\n return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments));\n }\n\n _createClass(Header, null, [{\n key: 'formats',\n value: function formats(domNode) {\n return this.tagName.indexOf(domNode.tagName) + 1;\n }\n }]);\n\n return Header;\n}(_block2.default);\n\nHeader.blotName = 'header';\nHeader.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n\nexports.default = Header;\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.ListItem = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _block = __webpack_require__(3);\n\nvar _block2 = _interopRequireDefault(_block);\n\nvar _container = __webpack_require__(23);\n\nvar _container2 = _interopRequireDefault(_container);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ListItem = function (_Block) {\n _inherits(ListItem, _Block);\n\n function ListItem() {\n _classCallCheck(this, ListItem);\n\n return _possibleConstructorReturn(this, (ListItem.__proto__ || Object.getPrototypeOf(ListItem)).apply(this, arguments));\n }\n\n _createClass(ListItem, [{\n key: 'format',\n value: function format(name, value) {\n if (name === List.blotName && !value) {\n this.replaceWith(_parchment2.default.create(this.statics.scope));\n } else {\n _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'format', this).call(this, name, value);\n }\n }\n }, {\n key: 'remove',\n value: function remove() {\n if (this.prev == null && this.next == null) {\n this.parent.remove();\n } else {\n _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'remove', this).call(this);\n }\n }\n }, {\n key: 'replaceWith',\n value: function replaceWith(name, value) {\n this.parent.isolate(this.offset(this.parent), this.length());\n if (name === this.parent.statics.blotName) {\n this.parent.replaceWith(name, value);\n return this;\n } else {\n this.parent.unwrap();\n return _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'replaceWith', this).call(this, name, value);\n }\n }\n }], [{\n key: 'formats',\n value: function formats(domNode) {\n return domNode.tagName === this.tagName ? undefined : _get(ListItem.__proto__ || Object.getPrototypeOf(ListItem), 'formats', this).call(this, domNode);\n }\n }]);\n\n return ListItem;\n}(_block2.default);\n\nListItem.blotName = 'list-item';\nListItem.tagName = 'LI';\n\nvar List = function (_Container) {\n _inherits(List, _Container);\n\n _createClass(List, null, [{\n key: 'create',\n value: function create(value) {\n var tagName = value === 'ordered' ? 'OL' : 'UL';\n var node = _get(List.__proto__ || Object.getPrototypeOf(List), 'create', this).call(this, tagName);\n if (value === 'checked' || value === 'unchecked') {\n node.setAttribute('data-checked', value === 'checked');\n }\n return node;\n }\n }, {\n key: 'formats',\n value: function formats(domNode) {\n if (domNode.tagName === 'OL') return 'ordered';\n if (domNode.tagName === 'UL') {\n if (domNode.hasAttribute('data-checked')) {\n return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked';\n } else {\n return 'bullet';\n }\n }\n return undefined;\n }\n }]);\n\n function List(domNode) {\n _classCallCheck(this, List);\n\n var _this2 = _possibleConstructorReturn(this, (List.__proto__ || Object.getPrototypeOf(List)).call(this, domNode));\n\n var listEventHandler = function listEventHandler(e) {\n if (e.target.parentNode !== domNode) return;\n var format = _this2.statics.formats(domNode);\n var blot = _parchment2.default.find(e.target);\n if (format === 'checked') {\n blot.format('list', 'unchecked');\n } else if (format === 'unchecked') {\n blot.format('list', 'checked');\n }\n };\n\n domNode.addEventListener('touchstart', listEventHandler);\n domNode.addEventListener('mousedown', listEventHandler);\n return _this2;\n }\n\n _createClass(List, [{\n key: 'format',\n value: function format(name, value) {\n if (this.children.length > 0) {\n this.children.tail.format(name, value);\n }\n }\n }, {\n key: 'formats',\n value: function formats() {\n // We don't inherit from FormatBlot\n return _defineProperty({}, this.statics.blotName, this.statics.formats(this.domNode));\n }\n }, {\n key: 'insertBefore',\n value: function insertBefore(blot, ref) {\n if (blot instanceof ListItem) {\n _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'insertBefore', this).call(this, blot, ref);\n } else {\n var index = ref == null ? this.length() : ref.offset(this);\n var after = this.split(index);\n after.parent.insertBefore(blot, after);\n }\n }\n }, {\n key: 'optimize',\n value: function optimize(context) {\n _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'optimize', this).call(this, context);\n var next = this.next;\n if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && next.domNode.tagName === this.domNode.tagName && next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) {\n next.moveChildren(this);\n next.remove();\n }\n }\n }, {\n key: 'replace',\n value: function replace(target) {\n if (target.statics.blotName !== this.statics.blotName) {\n var item = _parchment2.default.create(this.statics.defaultChild);\n target.moveChildren(item);\n this.appendChild(item);\n }\n _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'replace', this).call(this, target);\n }\n }]);\n\n return List;\n}(_container2.default);\n\nList.blotName = 'list';\nList.scope = _parchment2.default.Scope.BLOCK_BLOT;\nList.tagName = ['OL', 'UL'];\nList.defaultChild = 'list-item';\nList.allowedChildren = [ListItem];\n\nexports.ListItem = ListItem;\nexports.default = List;\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _bold = __webpack_require__(39);\n\nvar _bold2 = _interopRequireDefault(_bold);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Italic = function (_Bold) {\n _inherits(Italic, _Bold);\n\n function Italic() {\n _classCallCheck(this, Italic);\n\n return _possibleConstructorReturn(this, (Italic.__proto__ || Object.getPrototypeOf(Italic)).apply(this, arguments));\n }\n\n return Italic;\n}(_bold2.default);\n\nItalic.blotName = 'italic';\nItalic.tagName = ['EM', 'I'];\n\nexports.default = Italic;\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Script = function (_Inline) {\n _inherits(Script, _Inline);\n\n function Script() {\n _classCallCheck(this, Script);\n\n return _possibleConstructorReturn(this, (Script.__proto__ || Object.getPrototypeOf(Script)).apply(this, arguments));\n }\n\n _createClass(Script, null, [{\n key: 'create',\n value: function create(value) {\n if (value === 'super') {\n return document.createElement('sup');\n } else if (value === 'sub') {\n return document.createElement('sub');\n } else {\n return _get(Script.__proto__ || Object.getPrototypeOf(Script), 'create', this).call(this, value);\n }\n }\n }, {\n key: 'formats',\n value: function formats(domNode) {\n if (domNode.tagName === 'SUB') return 'sub';\n if (domNode.tagName === 'SUP') return 'super';\n return undefined;\n }\n }]);\n\n return Script;\n}(_inline2.default);\n\nScript.blotName = 'script';\nScript.tagName = ['SUB', 'SUP'];\n\nexports.default = Script;\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Strike = function (_Inline) {\n _inherits(Strike, _Inline);\n\n function Strike() {\n _classCallCheck(this, Strike);\n\n return _possibleConstructorReturn(this, (Strike.__proto__ || Object.getPrototypeOf(Strike)).apply(this, arguments));\n }\n\n return Strike;\n}(_inline2.default);\n\nStrike.blotName = 'strike';\nStrike.tagName = 'S';\n\nexports.default = Strike;\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _inline = __webpack_require__(5);\n\nvar _inline2 = _interopRequireDefault(_inline);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Underline = function (_Inline) {\n _inherits(Underline, _Inline);\n\n function Underline() {\n _classCallCheck(this, Underline);\n\n return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).apply(this, arguments));\n }\n\n return Underline;\n}(_inline2.default);\n\nUnderline.blotName = 'underline';\nUnderline.tagName = 'U';\n\nexports.default = Underline;\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _link = __webpack_require__(15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ATTRIBUTES = ['alt', 'height', 'width'];\n\nvar Image = function (_Parchment$Embed) {\n _inherits(Image, _Parchment$Embed);\n\n function Image() {\n _classCallCheck(this, Image);\n\n return _possibleConstructorReturn(this, (Image.__proto__ || Object.getPrototypeOf(Image)).apply(this, arguments));\n }\n\n _createClass(Image, [{\n key: 'format',\n value: function format(name, value) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n _get(Image.prototype.__proto__ || Object.getPrototypeOf(Image.prototype), 'format', this).call(this, name, value);\n }\n }\n }], [{\n key: 'create',\n value: function create(value) {\n var node = _get(Image.__proto__ || Object.getPrototypeOf(Image), 'create', this).call(this, value);\n if (typeof value === 'string') {\n node.setAttribute('src', this.sanitize(value));\n }\n return node;\n }\n }, {\n key: 'formats',\n value: function formats(domNode) {\n return ATTRIBUTES.reduce(function (formats, attribute) {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n }, {});\n }\n }, {\n key: 'match',\n value: function match(url) {\n return (/\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url)\n );\n }\n }, {\n key: 'sanitize',\n value: function sanitize(url) {\n return (0, _link.sanitize)(url, ['http', 'https', 'data']) ? url : '//:0';\n }\n }, {\n key: 'value',\n value: function value(domNode) {\n return domNode.getAttribute('src');\n }\n }]);\n\n return Image;\n}(_parchment2.default.Embed);\n\nImage.blotName = 'image';\nImage.tagName = 'IMG';\n\nexports.default = Image;\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _block = __webpack_require__(3);\n\nvar _link = __webpack_require__(15);\n\nvar _link2 = _interopRequireDefault(_link);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ATTRIBUTES = ['height', 'width'];\n\nvar Video = function (_BlockEmbed) {\n _inherits(Video, _BlockEmbed);\n\n function Video() {\n _classCallCheck(this, Video);\n\n return _possibleConstructorReturn(this, (Video.__proto__ || Object.getPrototypeOf(Video)).apply(this, arguments));\n }\n\n _createClass(Video, [{\n key: 'format',\n value: function format(name, value) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n _get(Video.prototype.__proto__ || Object.getPrototypeOf(Video.prototype), 'format', this).call(this, name, value);\n }\n }\n }], [{\n key: 'create',\n value: function create(value) {\n var node = _get(Video.__proto__ || Object.getPrototypeOf(Video), 'create', this).call(this, value);\n node.setAttribute('frameborder', '0');\n node.setAttribute('allowfullscreen', true);\n node.setAttribute('src', this.sanitize(value));\n return node;\n }\n }, {\n key: 'formats',\n value: function formats(domNode) {\n return ATTRIBUTES.reduce(function (formats, attribute) {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n }, {});\n }\n }, {\n key: 'sanitize',\n value: function sanitize(url) {\n return _link2.default.sanitize(url);\n }\n }, {\n key: 'value',\n value: function value(domNode) {\n return domNode.getAttribute('src');\n }\n }]);\n\n return Video;\n}(_block.BlockEmbed);\n\nVideo.blotName = 'video';\nVideo.className = 'ql-video';\nVideo.tagName = 'IFRAME';\n\nexports.default = Video;\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.FormulaBlot = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _embed = __webpack_require__(33);\n\nvar _embed2 = _interopRequireDefault(_embed);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FormulaBlot = function (_Embed) {\n _inherits(FormulaBlot, _Embed);\n\n function FormulaBlot() {\n _classCallCheck(this, FormulaBlot);\n\n return _possibleConstructorReturn(this, (FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot)).apply(this, arguments));\n }\n\n _createClass(FormulaBlot, null, [{\n key: 'create',\n value: function create(value) {\n var node = _get(FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot), 'create', this).call(this, value);\n if (typeof value === 'string') {\n window.katex.render(value, node, {\n throwOnError: false,\n errorColor: '#f00'\n });\n node.setAttribute('data-value', value);\n }\n return node;\n }\n }, {\n key: 'value',\n value: function value(domNode) {\n return domNode.getAttribute('data-value');\n }\n }]);\n\n return FormulaBlot;\n}(_embed2.default);\n\nFormulaBlot.blotName = 'formula';\nFormulaBlot.className = 'ql-formula';\nFormulaBlot.tagName = 'SPAN';\n\nvar Formula = function (_Module) {\n _inherits(Formula, _Module);\n\n _createClass(Formula, null, [{\n key: 'register',\n value: function register() {\n _quill2.default.register(FormulaBlot, true);\n }\n }]);\n\n function Formula() {\n _classCallCheck(this, Formula);\n\n var _this2 = _possibleConstructorReturn(this, (Formula.__proto__ || Object.getPrototypeOf(Formula)).call(this));\n\n if (window.katex == null) {\n throw new Error('Formula module requires KaTeX.');\n }\n return _this2;\n }\n\n return Formula;\n}(_module2.default);\n\nexports.FormulaBlot = FormulaBlot;\nexports.default = Formula;\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.CodeToken = exports.CodeBlock = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nvar _code = __webpack_require__(13);\n\nvar _code2 = _interopRequireDefault(_code);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SyntaxCodeBlock = function (_CodeBlock) {\n _inherits(SyntaxCodeBlock, _CodeBlock);\n\n function SyntaxCodeBlock() {\n _classCallCheck(this, SyntaxCodeBlock);\n\n return _possibleConstructorReturn(this, (SyntaxCodeBlock.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock)).apply(this, arguments));\n }\n\n _createClass(SyntaxCodeBlock, [{\n key: 'replaceWith',\n value: function replaceWith(block) {\n this.domNode.textContent = this.domNode.textContent;\n this.attach();\n _get(SyntaxCodeBlock.prototype.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock.prototype), 'replaceWith', this).call(this, block);\n }\n }, {\n key: 'highlight',\n value: function highlight(_highlight) {\n var text = this.domNode.textContent;\n if (this.cachedText !== text) {\n if (text.trim().length > 0 || this.cachedText == null) {\n this.domNode.innerHTML = _highlight(text);\n this.domNode.normalize();\n this.attach();\n }\n this.cachedText = text;\n }\n }\n }]);\n\n return SyntaxCodeBlock;\n}(_code2.default);\n\nSyntaxCodeBlock.className = 'ql-syntax';\n\nvar CodeToken = new _parchment2.default.Attributor.Class('token', 'hljs', {\n scope: _parchment2.default.Scope.INLINE\n});\n\nvar Syntax = function (_Module) {\n _inherits(Syntax, _Module);\n\n _createClass(Syntax, null, [{\n key: 'register',\n value: function register() {\n _quill2.default.register(CodeToken, true);\n _quill2.default.register(SyntaxCodeBlock, true);\n }\n }]);\n\n function Syntax(quill, options) {\n _classCallCheck(this, Syntax);\n\n var _this2 = _possibleConstructorReturn(this, (Syntax.__proto__ || Object.getPrototypeOf(Syntax)).call(this, quill, options));\n\n if (typeof _this2.options.highlight !== 'function') {\n throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.');\n }\n var timer = null;\n _this2.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () {\n clearTimeout(timer);\n timer = setTimeout(function () {\n _this2.highlight();\n timer = null;\n }, _this2.options.interval);\n });\n _this2.highlight();\n return _this2;\n }\n\n _createClass(Syntax, [{\n key: 'highlight',\n value: function highlight() {\n var _this3 = this;\n\n if (this.quill.selection.composing) return;\n this.quill.update(_quill2.default.sources.USER);\n var range = this.quill.getSelection();\n this.quill.scroll.descendants(SyntaxCodeBlock).forEach(function (code) {\n code.highlight(_this3.options.highlight);\n });\n this.quill.update(_quill2.default.sources.SILENT);\n if (range != null) {\n this.quill.setSelection(range, _quill2.default.sources.SILENT);\n }\n }\n }]);\n\n return Syntax;\n}(_module2.default);\n\nSyntax.DEFAULTS = {\n highlight: function () {\n if (window.hljs == null) return null;\n return function (text) {\n var result = window.hljs.highlightAuto(text);\n return result.value;\n };\n }(),\n interval: 1000\n};\n\nexports.CodeBlock = SyntaxCodeBlock;\nexports.CodeToken = CodeToken;\nexports.default = Syntax;\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addControls = exports.default = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _quillDelta = __webpack_require__(4);\n\nvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\nvar _parchment = __webpack_require__(0);\n\nvar _parchment2 = _interopRequireDefault(_parchment);\n\nvar _quill = __webpack_require__(6);\n\nvar _quill2 = _interopRequireDefault(_quill);\n\nvar _logger = __webpack_require__(10);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _module = __webpack_require__(7);\n\nvar _module2 = _interopRequireDefault(_module);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar debug = (0, _logger2.default)('quill:toolbar');\n\nvar Toolbar = function (_Module) {\n _inherits(Toolbar, _Module);\n\n function Toolbar(quill, options) {\n _classCallCheck(this, Toolbar);\n\n var _this = _possibleConstructorReturn(this, (Toolbar.__proto__ || Object.getPrototypeOf(Toolbar)).call(this, quill, options));\n\n if (Array.isArray(_this.options.container)) {\n var container = document.createElement('div');\n addControls(container, _this.options.container);\n quill.container.parentNode.insertBefore(container, quill.container);\n _this.container = container;\n } else if (typeof _this.options.container === 'string') {\n _this.container = document.querySelector(_this.options.container);\n } else {\n _this.container = _this.options.container;\n }\n if (!(_this.container instanceof HTMLElement)) {\n var _ret;\n\n return _ret = debug.error('Container required for toolbar', _this.options), _possibleConstructorReturn(_this, _ret);\n }\n _this.container.classList.add('ql-toolbar');\n _this.controls = [];\n _this.handlers = {};\n Object.keys(_this.options.handlers).forEach(function (format) {\n _this.addHandler(format, _this.options.handlers[format]);\n });\n [].forEach.call(_this.container.querySelectorAll('button, select'), function (input) {\n _this.attach(input);\n });\n _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (type, range) {\n if (type === _quill2.default.events.SELECTION_CHANGE) {\n _this.update(range);\n }\n });\n _this.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () {\n var _this$quill$selection = _this.quill.selection.getRange(),\n _this$quill$selection2 = _slicedToArray(_this$quill$selection, 1),\n range = _this$quill$selection2[0]; // quill.getSelection triggers update\n\n\n _this.update(range);\n });\n return _this;\n }\n\n _createClass(Toolbar, [{\n key: 'addHandler',\n value: function addHandler(format, handler) {\n this.handlers[format] = handler;\n }\n }, {\n key: 'attach',\n value: function attach(input) {\n var _this2 = this;\n\n var format = [].find.call(input.classList, function (className) {\n return className.indexOf('ql-') === 0;\n });\n if (!format) return;\n format = format.slice('ql-'.length);\n if (input.tagName === 'BUTTON') {\n input.setAttribute('type', 'button');\n }\n if (this.handlers[format] == null) {\n if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) {\n debug.warn('ignoring attaching to disabled format', format, input);\n return;\n }\n if (_parchment2.default.query(format) == null) {\n debug.warn('ignoring attaching to nonexistent format', format, input);\n return;\n }\n }\n var eventName = input.tagName === 'SELECT' ? 'change' : 'click';\n input.addEventListener(eventName, function (e) {\n var value = void 0;\n if (input.tagName === 'SELECT') {\n if (input.selectedIndex < 0) return;\n var selected = input.options[input.selectedIndex];\n if (selected.hasAttribute('selected')) {\n value = false;\n } else {\n value = selected.value || false;\n }\n } else {\n if (input.classList.contains('ql-active')) {\n value = false;\n } else {\n value = input.value || !input.hasAttribute('value');\n }\n e.preventDefault();\n }\n _this2.quill.focus();\n\n var _quill$selection$getR = _this2.quill.selection.getRange(),\n _quill$selection$getR2 = _slicedToArray(_quill$selection$getR, 1),\n range = _quill$selection$getR2[0];\n\n if (_this2.handlers[format] != null) {\n _this2.handlers[format].call(_this2, value);\n } else if (_parchment2.default.query(format).prototype instanceof _parchment2.default.Embed) {\n value = prompt('Enter ' + format);\n if (!value) return;\n _this2.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert(_defineProperty({}, format, value)), _quill2.default.sources.USER);\n } else {\n _this2.quill.format(format, value, _quill2.default.sources.USER);\n }\n _this2.update(range);\n });\n // TODO use weakmap\n this.controls.push([format, input]);\n }\n }, {\n key: 'update',\n value: function update(range) {\n var formats = range == null ? {} : this.quill.getFormat(range);\n this.controls.forEach(function (pair) {\n var _pair = _slicedToArray(pair, 2),\n format = _pair[0],\n input = _pair[1];\n\n if (input.tagName === 'SELECT') {\n var option = void 0;\n if (range == null) {\n option = null;\n } else if (formats[format] == null) {\n option = input.querySelector('option[selected]');\n } else if (!Array.isArray(formats[format])) {\n var value = formats[format];\n if (typeof value === 'string') {\n value = value.replace(/\\\"/g, '\\\\\"');\n }\n option = input.querySelector('option[value=\"' + value + '\"]');\n }\n if (option == null) {\n input.value = ''; // TODO make configurable?\n input.selectedIndex = -1;\n } else {\n option.selected = true;\n }\n } else {\n if (range == null) {\n input.classList.remove('ql-active');\n } else if (input.hasAttribute('value')) {\n // both being null should match (default values)\n // '1' should match with 1 (headers)\n var isActive = formats[format] === input.getAttribute('value') || formats[format] != null && formats[format].toString() === input.getAttribute('value') || formats[format] == null && !input.getAttribute('value');\n input.classList.toggle('ql-active', isActive);\n } else {\n input.classList.toggle('ql-active', formats[format] != null);\n }\n }\n });\n }\n }]);\n\n return Toolbar;\n}(_module2.default);\n\nToolbar.DEFAULTS = {};\n\nfunction addButton(container, format, value) {\n var input = document.createElement('button');\n input.setAttribute('type', 'button');\n input.classList.add('ql-' + format);\n if (value != null) {\n input.value = value;\n }\n container.appendChild(input);\n}\n\nfunction addControls(container, groups) {\n if (!Array.isArray(groups[0])) {\n groups = [groups];\n }\n groups.forEach(function (controls) {\n var group = document.createElement('span');\n group.classList.add('ql-formats');\n controls.forEach(function (control) {\n if (typeof control === 'string') {\n addButton(group, control);\n } else {\n var format = Object.keys(control)[0];\n var value = control[format];\n if (Array.isArray(value)) {\n addSelect(group, format, value);\n } else {\n addButton(group, format, value);\n }\n }\n });\n container.appendChild(group);\n });\n}\n\nfunction addSelect(container, format, values) {\n var input = document.createElement('select');\n input.classList.add('ql-' + format);\n values.forEach(function (value) {\n var option = document.createElement('option');\n if (value !== false) {\n option.setAttribute('value', value);\n } else {\n option.setAttribute('selected', 'selected');\n }\n input.appendChild(option);\n });\n container.appendChild(input);\n}\n\nToolbar.DEFAULTS = {\n container: null,\n handlers: {\n clean: function clean() {\n var _this3 = this;\n\n var range = this.quill.getSelection();\n if (range == null) return;\n if (range.length == 0) {\n var formats = this.quill.getFormat();\n Object.keys(formats).forEach(function (name) {\n // Clean functionality in existing apps only clean inline formats\n if (_parchment2.default.query(name, _parchment2.default.Scope.INLINE) != null) {\n _this3.quill.format(name, false);\n }\n });\n } else {\n this.quill.removeFormat(range, _quill2.default.sources.USER);\n }\n },\n direction: function direction(value) {\n var align = this.quill.getFormat()['align'];\n if (value === 'rtl' && align == null) {\n this.quill.format('align', 'right', _quill2.default.sources.USER);\n } else if (!value && align === 'right') {\n this.quill.format('align', false, _quill2.default.sources.USER);\n }\n this.quill.format('direction', value, _quill2.default.sources.USER);\n },\n indent: function indent(value) {\n var range = this.quill.getSelection();\n var formats = this.quill.getFormat(range);\n var indent = parseInt(formats.indent || 0);\n if (value === '+1' || value === '-1') {\n var modifier = value === '+1' ? 1 : -1;\n if (formats.direction === 'rtl') modifier *= -1;\n this.quill.format('indent', indent + modifier, _quill2.default.sources.USER);\n }\n },\n link: function link(value) {\n if (value === true) {\n value = prompt('Enter link URL:');\n }\n this.quill.format('link', value, _quill2.default.sources.USER);\n },\n list: function list(value) {\n var range = this.quill.getSelection();\n var formats = this.quill.getFormat(range);\n if (value === 'check') {\n if (formats['list'] === 'checked' || formats['list'] === 'unchecked') {\n this.quill.format('list', false, _quill2.default.sources.USER);\n } else {\n this.quill.format('list', 'unchecked', _quill2.default.sources.USER);\n }\n } else {\n this.quill.format('list', value, _quill2.default.sources.USER);\n }\n }\n }\n};\n\nexports.default = Toolbar;\nexports.addControls = addControls;\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports) {\n\nmodule.exports = \" \";\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.BubbleTooltip = undefined;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nvar _emitter = __webpack_require__(9);\n\nvar _emitter2 = _interopRequireDefault(_emitter);\n\nvar _base = __webpack_require__(44);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _selection = __webpack_require__(22);\n\nvar _icons = __webpack_require__(26);\n\nvar _icons2 = _interopRequireDefault(_icons);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TOOLBAR_CONFIG = [['bold', 'italic', 'link'], [{ header: 1 }, { header: 2 }, 'blockquote']];\n\nvar BubbleTheme = function (_BaseTheme) {\n _inherits(BubbleTheme, _BaseTheme);\n\n function BubbleTheme(quill, options) {\n _classCallCheck(this, BubbleTheme);\n\n if (options.modules.toolbar != null && options.modules.toolbar.container == null) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n\n var _this = _possibleConstructorReturn(this, (BubbleTheme.__proto__ || Object.getPrototypeOf(BubbleTheme)).call(this, quill, options));\n\n _this.quill.container.classList.add('ql-bubble');\n return _this;\n }\n\n _createClass(BubbleTheme, [{\n key: 'extendToolbar',\n value: function extendToolbar(toolbar) {\n this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);\n this.tooltip.root.appendChild(toolbar.container);\n this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default);\n this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default);\n }\n }]);\n\n return BubbleTheme;\n}(_base2.default);\n\nBubbleTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link: function link(value) {\n if (!value) {\n this.quill.format('link', false);\n } else {\n this.quill.theme.tooltip.edit();\n }\n }\n }\n }\n }\n});\n\nvar BubbleTooltip = function (_BaseTooltip) {\n _inherits(BubbleTooltip, _BaseTooltip);\n\n function BubbleTooltip(quill, bounds) {\n _classCallCheck(this, BubbleTooltip);\n\n var _this2 = _possibleConstructorReturn(this, (BubbleTooltip.__proto__ || Object.getPrototypeOf(BubbleTooltip)).call(this, quill, bounds));\n\n _this2.quill.on(_emitter2.default.events.EDITOR_CHANGE, function (type, range, oldRange, source) {\n if (type !== _emitter2.default.events.SELECTION_CHANGE) return;\n if (range != null && range.length > 0 && source === _emitter2.default.sources.USER) {\n _this2.show();\n // Lock our width so we will expand beyond our offsetParent boundaries\n _this2.root.style.left = '0px';\n _this2.root.style.width = '';\n _this2.root.style.width = _this2.root.offsetWidth + 'px';\n var lines = _this2.quill.getLines(range.index, range.length);\n if (lines.length === 1) {\n _this2.position(_this2.quill.getBounds(range));\n } else {\n var lastLine = lines[lines.length - 1];\n var index = _this2.quill.getIndex(lastLine);\n var length = Math.min(lastLine.length() - 1, range.index + range.length - index);\n var _bounds = _this2.quill.getBounds(new _selection.Range(index, length));\n _this2.position(_bounds);\n }\n } else if (document.activeElement !== _this2.textbox && _this2.quill.hasFocus()) {\n _this2.hide();\n }\n });\n return _this2;\n }\n\n _createClass(BubbleTooltip, [{\n key: 'listen',\n value: function listen() {\n var _this3 = this;\n\n _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'listen', this).call(this);\n this.root.querySelector('.ql-close').addEventListener('click', function () {\n _this3.root.classList.remove('ql-editing');\n });\n this.quill.on(_emitter2.default.events.SCROLL_OPTIMIZE, function () {\n // Let selection be restored by toolbar handlers before repositioning\n setTimeout(function () {\n if (_this3.root.classList.contains('ql-hidden')) return;\n var range = _this3.quill.getSelection();\n if (range != null) {\n _this3.position(_this3.quill.getBounds(range));\n }\n }, 1);\n });\n }\n }, {\n key: 'cancel',\n value: function cancel() {\n this.show();\n }\n }, {\n key: 'position',\n value: function position(reference) {\n var shift = _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'position', this).call(this, reference);\n var arrow = this.root.querySelector('.ql-tooltip-arrow');\n arrow.style.marginLeft = '';\n if (shift === 0) return shift;\n arrow.style.marginLeft = -1 * shift - arrow.offsetWidth / 2 + 'px';\n }\n }]);\n\n return BubbleTooltip;\n}(_base.BaseTooltip);\n\nBubbleTooltip.TEMPLATE = ['', '
', '', '', '
'].join('');\n\nexports.BubbleTooltip = BubbleTooltip;\nexports.default = BubbleTheme;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _extend = __webpack_require__(2);\n\nvar _extend2 = _interopRequireDefault(_extend);\n\nvar _emitter = __webpack_require__(9);\n\nvar _emitter2 = _interopRequireDefault(_emitter);\n\nvar _base = __webpack_require__(44);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _link = __webpack_require__(15);\n\nvar _link2 = _interopRequireDefault(_link);\n\nvar _selection = __webpack_require__(22);\n\nvar _icons = __webpack_require__(26);\n\nvar _icons2 = _interopRequireDefault(_icons);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TOOLBAR_CONFIG = [[{ header: ['1', '2', '3', false] }], ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean']];\n\nvar SnowTheme = function (_BaseTheme) {\n _inherits(SnowTheme, _BaseTheme);\n\n function SnowTheme(quill, options) {\n _classCallCheck(this, SnowTheme);\n\n if (options.modules.toolbar != null && options.modules.toolbar.container == null) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n\n var _this = _possibleConstructorReturn(this, (SnowTheme.__proto__ || Object.getPrototypeOf(SnowTheme)).call(this, quill, options));\n\n _this.quill.container.classList.add('ql-snow');\n return _this;\n }\n\n _createClass(SnowTheme, [{\n key: 'extendToolbar',\n value: function extendToolbar(toolbar) {\n toolbar.container.classList.add('ql-snow');\n this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default);\n this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default);\n this.tooltip = new SnowTooltip(this.quill, this.options.bounds);\n if (toolbar.container.querySelector('.ql-link')) {\n this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function (range, context) {\n toolbar.handlers['link'].call(toolbar, !context.format.link);\n });\n }\n }\n }]);\n\n return SnowTheme;\n}(_base2.default);\n\nSnowTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link: function link(value) {\n if (value) {\n var range = this.quill.getSelection();\n if (range == null || range.length == 0) return;\n var preview = this.quill.getText(range);\n if (/^\\S+@\\S+\\.\\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) {\n preview = 'mailto:' + preview;\n }\n var tooltip = this.quill.theme.tooltip;\n tooltip.edit('link', preview);\n } else {\n this.quill.format('link', false);\n }\n }\n }\n }\n }\n});\n\nvar SnowTooltip = function (_BaseTooltip) {\n _inherits(SnowTooltip, _BaseTooltip);\n\n function SnowTooltip(quill, bounds) {\n _classCallCheck(this, SnowTooltip);\n\n var _this2 = _possibleConstructorReturn(this, (SnowTooltip.__proto__ || Object.getPrototypeOf(SnowTooltip)).call(this, quill, bounds));\n\n _this2.preview = _this2.root.querySelector('a.ql-preview');\n return _this2;\n }\n\n _createClass(SnowTooltip, [{\n key: 'listen',\n value: function listen() {\n var _this3 = this;\n\n _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'listen', this).call(this);\n this.root.querySelector('a.ql-action').addEventListener('click', function (event) {\n if (_this3.root.classList.contains('ql-editing')) {\n _this3.save();\n } else {\n _this3.edit('link', _this3.preview.textContent);\n }\n event.preventDefault();\n });\n this.root.querySelector('a.ql-remove').addEventListener('click', function (event) {\n if (_this3.linkRange != null) {\n var range = _this3.linkRange;\n _this3.restoreFocus();\n _this3.quill.formatText(range, 'link', false, _emitter2.default.sources.USER);\n delete _this3.linkRange;\n }\n event.preventDefault();\n _this3.hide();\n });\n this.quill.on(_emitter2.default.events.SELECTION_CHANGE, function (range, oldRange, source) {\n if (range == null) return;\n if (range.length === 0 && source === _emitter2.default.sources.USER) {\n var _quill$scroll$descend = _this3.quill.scroll.descendant(_link2.default, range.index),\n _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),\n link = _quill$scroll$descend2[0],\n offset = _quill$scroll$descend2[1];\n\n if (link != null) {\n _this3.linkRange = new _selection.Range(range.index - offset, link.length());\n var preview = _link2.default.formats(link.domNode);\n _this3.preview.textContent = preview;\n _this3.preview.setAttribute('href', preview);\n _this3.show();\n _this3.position(_this3.quill.getBounds(_this3.linkRange));\n return;\n }\n } else {\n delete _this3.linkRange;\n }\n _this3.hide();\n });\n }\n }, {\n key: 'show',\n value: function show() {\n _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'show', this).call(this);\n this.root.removeAttribute('data-mode');\n }\n }]);\n\n return SnowTooltip;\n}(_base.BaseTooltip);\n\nSnowTooltip.TEMPLATE = ['', '', '', ''].join('');\n\nexports.default = SnowTheme;\n\n/***/ })\n/******/ ])[\"default\"];\n});\n\n\n// WEBPACK FOOTER //\n// quill.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 45);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bc1e3bc04ac5f71cbeee","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar container_1 = require(\"./blot/abstract/container\");\nvar format_1 = require(\"./blot/abstract/format\");\nvar leaf_1 = require(\"./blot/abstract/leaf\");\nvar scroll_1 = require(\"./blot/scroll\");\nvar inline_1 = require(\"./blot/inline\");\nvar block_1 = require(\"./blot/block\");\nvar embed_1 = require(\"./blot/embed\");\nvar text_1 = require(\"./blot/text\");\nvar attributor_1 = require(\"./attributor/attributor\");\nvar class_1 = require(\"./attributor/class\");\nvar style_1 = require(\"./attributor/style\");\nvar store_1 = require(\"./attributor/store\");\nvar Registry = require(\"./registry\");\nvar Parchment = {\n Scope: Registry.Scope,\n create: Registry.create,\n find: Registry.find,\n query: Registry.query,\n register: Registry.register,\n Container: container_1.default,\n Format: format_1.default,\n Leaf: leaf_1.default,\n Embed: embed_1.default,\n Scroll: scroll_1.default,\n Block: block_1.default,\n Inline: inline_1.default,\n Text: text_1.default,\n Attributor: {\n Attribute: attributor_1.default,\n Class: class_1.default,\n Style: style_1.default,\n Store: store_1.default,\n },\n};\nexports.default = Parchment;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/parchment.ts\n// module id = 0\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ParchmentError = /** @class */ (function (_super) {\n __extends(ParchmentError, _super);\n function ParchmentError(message) {\n var _this = this;\n message = '[Parchment] ' + message;\n _this = _super.call(this, message) || this;\n _this.message = message;\n _this.name = _this.constructor.name;\n return _this;\n }\n return ParchmentError;\n}(Error));\nexports.ParchmentError = ParchmentError;\nvar attributes = {};\nvar classes = {};\nvar tags = {};\nvar types = {};\nexports.DATA_KEY = '__blot';\nvar Scope;\n(function (Scope) {\n Scope[Scope[\"TYPE\"] = 3] = \"TYPE\";\n Scope[Scope[\"LEVEL\"] = 12] = \"LEVEL\";\n Scope[Scope[\"ATTRIBUTE\"] = 13] = \"ATTRIBUTE\";\n Scope[Scope[\"BLOT\"] = 14] = \"BLOT\";\n Scope[Scope[\"INLINE\"] = 7] = \"INLINE\";\n Scope[Scope[\"BLOCK\"] = 11] = \"BLOCK\";\n Scope[Scope[\"BLOCK_BLOT\"] = 10] = \"BLOCK_BLOT\";\n Scope[Scope[\"INLINE_BLOT\"] = 6] = \"INLINE_BLOT\";\n Scope[Scope[\"BLOCK_ATTRIBUTE\"] = 9] = \"BLOCK_ATTRIBUTE\";\n Scope[Scope[\"INLINE_ATTRIBUTE\"] = 5] = \"INLINE_ATTRIBUTE\";\n Scope[Scope[\"ANY\"] = 15] = \"ANY\";\n})(Scope = exports.Scope || (exports.Scope = {}));\nfunction create(input, value) {\n var match = query(input);\n if (match == null) {\n throw new ParchmentError(\"Unable to create \" + input + \" blot\");\n }\n var BlotClass = match;\n var node = \n // @ts-ignore\n input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value);\n return new BlotClass(node, value);\n}\nexports.create = create;\nfunction find(node, bubble) {\n if (bubble === void 0) { bubble = false; }\n if (node == null)\n return null;\n // @ts-ignore\n if (node[exports.DATA_KEY] != null)\n return node[exports.DATA_KEY].blot;\n if (bubble)\n return find(node.parentNode, bubble);\n return null;\n}\nexports.find = find;\nfunction query(query, scope) {\n if (scope === void 0) { scope = Scope.ANY; }\n var match;\n if (typeof query === 'string') {\n match = types[query] || attributes[query];\n // @ts-ignore\n }\n else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) {\n match = types['text'];\n }\n else if (typeof query === 'number') {\n if (query & Scope.LEVEL & Scope.BLOCK) {\n match = types['block'];\n }\n else if (query & Scope.LEVEL & Scope.INLINE) {\n match = types['inline'];\n }\n }\n else if (query instanceof HTMLElement) {\n var names = (query.getAttribute('class') || '').split(/\\s+/);\n for (var i in names) {\n match = classes[names[i]];\n if (match)\n break;\n }\n match = match || tags[query.tagName];\n }\n if (match == null)\n return null;\n // @ts-ignore\n if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope)\n return match;\n return null;\n}\nexports.query = query;\nfunction register() {\n var Definitions = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n Definitions[_i] = arguments[_i];\n }\n if (Definitions.length > 1) {\n return Definitions.map(function (d) {\n return register(d);\n });\n }\n var Definition = Definitions[0];\n if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') {\n throw new ParchmentError('Invalid definition');\n }\n else if (Definition.blotName === 'abstract') {\n throw new ParchmentError('Cannot register abstract class');\n }\n types[Definition.blotName || Definition.attrName] = Definition;\n if (typeof Definition.keyName === 'string') {\n attributes[Definition.keyName] = Definition;\n }\n else {\n if (Definition.className != null) {\n classes[Definition.className] = Definition;\n }\n if (Definition.tagName != null) {\n if (Array.isArray(Definition.tagName)) {\n Definition.tagName = Definition.tagName.map(function (tagName) {\n return tagName.toUpperCase();\n });\n }\n else {\n Definition.tagName = Definition.tagName.toUpperCase();\n }\n var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName];\n tagNames.forEach(function (tag) {\n if (tags[tag] == null || Definition.className == null) {\n tags[tag] = Definition;\n }\n });\n }\n }\n return Definition;\n}\nexports.register = register;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/registry.ts\n// module id = 1\n// module chunks = 0","'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = target[name];\n\t\t\t\tcopy = options[name];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\ttarget[name] = extend(deep, clone, copy);\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\ttarget[name] = copy;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/extend/index.js\n// module id = 2\n// module chunks = 0","import extend from 'extend';\nimport Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Break from './break';\nimport Inline from './inline';\nimport TextBlot from './text';\n\n\nconst NEWLINE_LENGTH = 1;\n\n\nclass BlockEmbed extends Parchment.Embed {\n attach() {\n super.attach();\n this.attributes = new Parchment.Attributor.Store(this.domNode);\n }\n\n delta() {\n return new Delta().insert(this.value(), extend(this.formats(), this.attributes.values()));\n }\n\n format(name, value) {\n let attribute = Parchment.query(name, Parchment.Scope.BLOCK_ATTRIBUTE);\n if (attribute != null) {\n this.attributes.attribute(attribute, value);\n }\n }\n\n formatAt(index, length, name, value) {\n this.format(name, value);\n }\n\n insertAt(index, value, def) {\n if (typeof value === 'string' && value.endsWith('\\n')) {\n let block = Parchment.create(Block.blotName);\n this.parent.insertBefore(block, index === 0 ? this : this.next);\n block.insertAt(0, value.slice(0, -1));\n } else {\n super.insertAt(index, value, def);\n }\n }\n}\nBlockEmbed.scope = Parchment.Scope.BLOCK_BLOT;\n// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\n\nclass Block extends Parchment.Block {\n constructor(domNode) {\n super(domNode);\n this.cache = {};\n }\n\n delta() {\n if (this.cache.delta == null) {\n this.cache.delta = this.descendants(Parchment.Leaf).reduce((delta, leaf) => {\n if (leaf.length() === 0) {\n return delta;\n } else {\n return delta.insert(leaf.value(), bubbleFormats(leaf));\n }\n }, new Delta()).insert('\\n', bubbleFormats(this));\n }\n return this.cache.delta;\n }\n\n deleteAt(index, length) {\n super.deleteAt(index, length);\n this.cache = {};\n }\n\n formatAt(index, length, name, value) {\n if (length <= 0) return;\n if (Parchment.query(name, Parchment.Scope.BLOCK)) {\n if (index + length === this.length()) {\n this.format(name, value);\n }\n } else {\n super.formatAt(index, Math.min(length, this.length() - index - 1), name, value);\n }\n this.cache = {};\n }\n\n insertAt(index, value, def) {\n if (def != null) return super.insertAt(index, value, def);\n if (value.length === 0) return;\n let lines = value.split('\\n');\n let text = lines.shift();\n if (text.length > 0) {\n if (index < this.length() - 1 || this.children.tail == null) {\n super.insertAt(Math.min(index, this.length() - 1), text);\n } else {\n this.children.tail.insertAt(this.children.tail.length(), text);\n }\n this.cache = {};\n }\n let block = this;\n lines.reduce(function(index, line) {\n block = block.split(index, true);\n block.insertAt(0, line);\n return line.length;\n }, index + text.length);\n }\n\n insertBefore(blot, ref) {\n let head = this.children.head;\n super.insertBefore(blot, ref);\n if (head instanceof Break) {\n head.remove();\n }\n this.cache = {};\n }\n\n length() {\n if (this.cache.length == null) {\n this.cache.length = super.length() + NEWLINE_LENGTH;\n }\n return this.cache.length;\n }\n\n moveChildren(target, ref) {\n super.moveChildren(target, ref);\n this.cache = {};\n }\n\n optimize(context) {\n super.optimize(context);\n this.cache = {};\n }\n\n path(index) {\n return super.path(index, true);\n }\n\n removeChild(child) {\n super.removeChild(child);\n this.cache = {};\n }\n\n split(index, force = false) {\n if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n let clone = this.clone();\n if (index === 0) {\n this.parent.insertBefore(clone, this);\n return this;\n } else {\n this.parent.insertBefore(clone, this.next);\n return clone;\n }\n } else {\n let next = super.split(index, force);\n this.cache = {};\n return next;\n }\n }\n}\nBlock.blotName = 'block';\nBlock.tagName = 'P';\nBlock.defaultChild = 'break';\nBlock.allowedChildren = [Inline, Parchment.Embed, TextBlot];\n\n\nfunction bubbleFormats(blot, formats = {}) {\n if (blot == null) return formats;\n if (typeof blot.formats === 'function') {\n formats = extend(formats, blot.formats());\n }\n if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {\n return formats;\n }\n return bubbleFormats(blot.parent, formats);\n}\n\n\nexport { bubbleFormats, BlockEmbed, Block as default };\n\n\n\n// WEBPACK FOOTER //\n// ./blots/block.js","var diff = require('fast-diff');\nvar equal = require('deep-equal');\nvar extend = require('extend');\nvar op = require('./op');\n\n\nvar NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()\n\n\nvar Delta = function (ops) {\n // Assume we are given a well formed ops\n if (Array.isArray(ops)) {\n this.ops = ops;\n } else if (ops != null && Array.isArray(ops.ops)) {\n this.ops = ops.ops;\n } else {\n this.ops = [];\n }\n};\n\n\nDelta.prototype.insert = function (text, attributes) {\n var newOp = {};\n if (text.length === 0) return this;\n newOp.insert = text;\n if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n};\n\nDelta.prototype['delete'] = function (length) {\n if (length <= 0) return this;\n return this.push({ 'delete': length });\n};\n\nDelta.prototype.retain = function (length, attributes) {\n if (length <= 0) return this;\n var newOp = { retain: length };\n if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n};\n\nDelta.prototype.push = function (newOp) {\n var index = this.ops.length;\n var lastOp = this.ops[index - 1];\n newOp = extend(true, {}, newOp);\n if (typeof lastOp === 'object') {\n if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') {\n this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] };\n return this;\n }\n // Since it does not matter if we insert before or after deleting at the same index,\n // always prefer to insert first\n if (typeof lastOp['delete'] === 'number' && newOp.insert != null) {\n index -= 1;\n lastOp = this.ops[index - 1];\n if (typeof lastOp !== 'object') {\n this.ops.unshift(newOp);\n return this;\n }\n }\n if (equal(newOp.attributes, lastOp.attributes)) {\n if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') {\n this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n return this;\n } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') {\n this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n return this;\n }\n }\n }\n if (index === this.ops.length) {\n this.ops.push(newOp);\n } else {\n this.ops.splice(index, 0, newOp);\n }\n return this;\n};\n\nDelta.prototype.chop = function () {\n var lastOp = this.ops[this.ops.length - 1];\n if (lastOp && lastOp.retain && !lastOp.attributes) {\n this.ops.pop();\n }\n return this;\n};\n\nDelta.prototype.filter = function (predicate) {\n return this.ops.filter(predicate);\n};\n\nDelta.prototype.forEach = function (predicate) {\n this.ops.forEach(predicate);\n};\n\nDelta.prototype.map = function (predicate) {\n return this.ops.map(predicate);\n};\n\nDelta.prototype.partition = function (predicate) {\n var passed = [], failed = [];\n this.forEach(function(op) {\n var target = predicate(op) ? passed : failed;\n target.push(op);\n });\n return [passed, failed];\n};\n\nDelta.prototype.reduce = function (predicate, initial) {\n return this.ops.reduce(predicate, initial);\n};\n\nDelta.prototype.changeLength = function () {\n return this.reduce(function (length, elem) {\n if (elem.insert) {\n return length + op.length(elem);\n } else if (elem.delete) {\n return length - elem.delete;\n }\n return length;\n }, 0);\n};\n\nDelta.prototype.length = function () {\n return this.reduce(function (length, elem) {\n return length + op.length(elem);\n }, 0);\n};\n\nDelta.prototype.slice = function (start, end) {\n start = start || 0;\n if (typeof end !== 'number') end = Infinity;\n var ops = [];\n var iter = op.iterator(this.ops);\n var index = 0;\n while (index < end && iter.hasNext()) {\n var nextOp;\n if (index < start) {\n nextOp = iter.next(start - index);\n } else {\n nextOp = iter.next(end - index);\n ops.push(nextOp);\n }\n index += op.length(nextOp);\n }\n return new Delta(ops);\n};\n\n\nDelta.prototype.compose = function (other) {\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n var delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else if (thisIter.peekType() === 'delete') {\n delta.push(thisIter.next());\n } else {\n var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n var thisOp = thisIter.next(length);\n var otherOp = otherIter.next(length);\n if (typeof otherOp.retain === 'number') {\n var newOp = {};\n if (typeof thisOp.retain === 'number') {\n newOp.retain = length;\n } else {\n newOp.insert = thisOp.insert;\n }\n // Preserve null when composing with a retain, otherwise remove it for inserts\n var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number');\n if (attributes) newOp.attributes = attributes;\n delta.push(newOp);\n // Other op should be delete, we could be an insert or retain\n // Insert + delete cancels out\n } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') {\n delta.push(otherOp);\n }\n }\n }\n return delta.chop();\n};\n\nDelta.prototype.concat = function (other) {\n var delta = new Delta(this.ops.slice());\n if (other.ops.length > 0) {\n delta.push(other.ops[0]);\n delta.ops = delta.ops.concat(other.ops.slice(1));\n }\n return delta;\n};\n\nDelta.prototype.diff = function (other, index) {\n if (this.ops === other.ops) {\n return new Delta();\n }\n var strings = [this, other].map(function (delta) {\n return delta.map(function (op) {\n if (op.insert != null) {\n return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;\n }\n var prep = (delta === other) ? 'on' : 'with';\n throw new Error('diff() called ' + prep + ' non-document');\n }).join('');\n });\n var delta = new Delta();\n var diffResult = diff(strings[0], strings[1], index);\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n diffResult.forEach(function (component) {\n var length = component[1].length;\n while (length > 0) {\n var opLength = 0;\n switch (component[0]) {\n case diff.INSERT:\n opLength = Math.min(otherIter.peekLength(), length);\n delta.push(otherIter.next(opLength));\n break;\n case diff.DELETE:\n opLength = Math.min(length, thisIter.peekLength());\n thisIter.next(opLength);\n delta['delete'](opLength);\n break;\n case diff.EQUAL:\n opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length);\n var thisOp = thisIter.next(opLength);\n var otherOp = otherIter.next(opLength);\n if (equal(thisOp.insert, otherOp.insert)) {\n delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes));\n } else {\n delta.push(otherOp)['delete'](opLength);\n }\n break;\n }\n length -= opLength;\n }\n });\n return delta.chop();\n};\n\nDelta.prototype.eachLine = function (predicate, newline) {\n newline = newline || '\\n';\n var iter = op.iterator(this.ops);\n var line = new Delta();\n var i = 0;\n while (iter.hasNext()) {\n if (iter.peekType() !== 'insert') return;\n var thisOp = iter.peek();\n var start = op.length(thisOp) - iter.peekLength();\n var index = typeof thisOp.insert === 'string' ?\n thisOp.insert.indexOf(newline, start) - start : -1;\n if (index < 0) {\n line.push(iter.next());\n } else if (index > 0) {\n line.push(iter.next(index));\n } else {\n if (predicate(line, iter.next(1).attributes || {}, i) === false) {\n return;\n }\n i += 1;\n line = new Delta();\n }\n }\n if (line.length() > 0) {\n predicate(line, {}, i);\n }\n};\n\nDelta.prototype.transform = function (other, priority) {\n priority = !!priority;\n if (typeof other === 'number') {\n return this.transformPosition(other, priority);\n }\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n var delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) {\n delta.retain(op.length(thisIter.next()));\n } else if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else {\n var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n var thisOp = thisIter.next(length);\n var otherOp = otherIter.next(length);\n if (thisOp['delete']) {\n // Our delete either makes their delete redundant or removes their retain\n continue;\n } else if (otherOp['delete']) {\n delta.push(otherOp);\n } else {\n // We retain either their retain or insert\n delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority));\n }\n }\n }\n return delta.chop();\n};\n\nDelta.prototype.transformPosition = function (index, priority) {\n priority = !!priority;\n var thisIter = op.iterator(this.ops);\n var offset = 0;\n while (thisIter.hasNext() && offset <= index) {\n var length = thisIter.peekLength();\n var nextType = thisIter.peekType();\n thisIter.next();\n if (nextType === 'delete') {\n index -= Math.min(length, index - offset);\n continue;\n } else if (nextType === 'insert' && (offset < index || !priority)) {\n index += length;\n }\n offset += length;\n }\n return index;\n};\n\n\nmodule.exports = Delta;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/quill-delta/lib/delta.js\n// module id = 4\n// module chunks = 0","import Text from './text';\nimport Parchment from 'parchment';\n\n\nclass Inline extends Parchment.Inline {\n static compare(self, other) {\n let selfIndex = Inline.order.indexOf(self);\n let otherIndex = Inline.order.indexOf(other);\n if (selfIndex >= 0 || otherIndex >= 0) {\n return selfIndex - otherIndex;\n } else if (self === other) {\n return 0;\n } else if (self < other) {\n return -1;\n } else {\n return 1;\n }\n }\n\n formatAt(index, length, name, value) {\n if (Inline.compare(this.statics.blotName, name) < 0 && Parchment.query(name, Parchment.Scope.BLOT)) {\n let blot = this.isolate(index, length);\n if (value) {\n blot.wrap(name, value);\n }\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n optimize(context) {\n super.optimize(context);\n if (this.parent instanceof Inline &&\n Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) {\n let parent = this.parent.isolate(this.offset(), this.length());\n this.moveChildren(parent);\n parent.wrap(this);\n }\n }\n}\nInline.allowedChildren = [Inline, Parchment.Embed, Text];\n// Lower index means deeper in the DOM tree, since not found (-1) is for embeds\nInline.order = [\n 'cursor', 'inline', // Must be lower\n 'underline', 'strike', 'italic', 'bold', 'script',\n 'link', 'code' // Must be higher\n];\n\n\nexport default Inline;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/inline.js","import './polyfill';\nimport Delta from 'quill-delta';\nimport Editor from './editor';\nimport Emitter from './emitter';\nimport Module from './module';\nimport Parchment from 'parchment';\nimport Selection, { Range } from './selection';\nimport extend from 'extend';\nimport logger from './logger';\nimport Theme from './theme';\n\nlet debug = logger('quill');\n\n\nclass Quill {\n static debug(limit) {\n if (limit === true) {\n limit = 'log';\n }\n logger.level(limit);\n }\n\n static find(node) {\n return node.__quill || Parchment.find(node);\n }\n\n static import(name) {\n if (this.imports[name] == null) {\n debug.error(`Cannot import ${name}. Are you sure it was registered?`);\n }\n return this.imports[name];\n }\n\n static register(path, target, overwrite = false) {\n if (typeof path !== 'string') {\n let name = path.attrName || path.blotName;\n if (typeof name === 'string') {\n // register(Blot | Attributor, overwrite)\n this.register('formats/' + name, path, target);\n } else {\n Object.keys(path).forEach((key) => {\n this.register(key, path[key], target);\n });\n }\n } else {\n if (this.imports[path] != null && !overwrite) {\n debug.warn(`Overwriting ${path} with`, target);\n }\n this.imports[path] = target;\n if ((path.startsWith('blots/') || path.startsWith('formats/')) &&\n target.blotName !== 'abstract') {\n Parchment.register(target);\n } else if (path.startsWith('modules') && typeof target.register === 'function') {\n target.register();\n }\n }\n }\n\n constructor(container, options = {}) {\n this.options = expandConfig(container, options);\n this.container = this.options.container;\n if (this.container == null) {\n return debug.error('Invalid Quill container', container);\n }\n if (this.options.debug) {\n Quill.debug(this.options.debug);\n }\n let html = this.container.innerHTML.trim();\n this.container.classList.add('ql-container');\n this.container.innerHTML = '';\n this.container.__quill = this;\n this.root = this.addContainer('ql-editor');\n this.root.classList.add('ql-blank');\n this.root.setAttribute('data-gramm', false);\n this.scrollingContainer = this.options.scrollingContainer || this.root;\n this.emitter = new Emitter();\n this.scroll = Parchment.create(this.root, {\n emitter: this.emitter,\n whitelist: this.options.formats\n });\n this.editor = new Editor(this.scroll);\n this.selection = new Selection(this.scroll, this.emitter);\n this.theme = new this.options.theme(this, this.options);\n this.keyboard = this.theme.addModule('keyboard');\n this.clipboard = this.theme.addModule('clipboard');\n this.history = this.theme.addModule('history');\n this.theme.init();\n this.emitter.on(Emitter.events.EDITOR_CHANGE, (type) => {\n if (type === Emitter.events.TEXT_CHANGE) {\n this.root.classList.toggle('ql-blank', this.editor.isBlank());\n }\n });\n this.emitter.on(Emitter.events.SCROLL_UPDATE, (source, mutations) => {\n let range = this.selection.lastRange;\n let index = range && range.length === 0 ? range.index : undefined;\n modify.call(this, () => {\n return this.editor.update(null, mutations, index);\n }, source);\n });\n let contents = this.clipboard.convert(`
${html}


`);\n this.setContents(contents);\n this.history.clear();\n if (this.options.placeholder) {\n this.root.setAttribute('data-placeholder', this.options.placeholder);\n }\n if (this.options.readOnly) {\n this.disable();\n }\n }\n\n addContainer(container, refNode = null) {\n if (typeof container === 'string') {\n let className = container;\n container = document.createElement('div');\n container.classList.add(className);\n }\n this.container.insertBefore(container, refNode);\n return container;\n }\n\n blur() {\n this.selection.setRange(null);\n }\n\n deleteText(index, length, source) {\n [index, length, , source] = overload(index, length, source);\n return modify.call(this, () => {\n return this.editor.deleteText(index, length);\n }, source, index, -1*length);\n }\n\n disable() {\n this.enable(false);\n }\n\n enable(enabled = true) {\n this.scroll.enable(enabled);\n this.container.classList.toggle('ql-disabled', !enabled);\n }\n\n focus() {\n let scrollTop = this.scrollingContainer.scrollTop;\n this.selection.focus();\n this.scrollingContainer.scrollTop = scrollTop;\n this.scrollIntoView();\n }\n\n format(name, value, source = Emitter.sources.API) {\n return modify.call(this, () => {\n let range = this.getSelection(true);\n let change = new Delta();\n if (range == null) {\n return change;\n } else if (Parchment.query(name, Parchment.Scope.BLOCK)) {\n change = this.editor.formatLine(range.index, range.length, { [name]: value });\n } else if (range.length === 0) {\n this.selection.format(name, value);\n return change;\n } else {\n change = this.editor.formatText(range.index, range.length, { [name]: value });\n }\n this.setSelection(range, Emitter.sources.SILENT);\n return change;\n }, source);\n }\n\n formatLine(index, length, name, value, source) {\n let formats;\n [index, length, formats, source] = overload(index, length, name, value, source);\n return modify.call(this, () => {\n return this.editor.formatLine(index, length, formats);\n }, source, index, 0);\n }\n\n formatText(index, length, name, value, source) {\n let formats;\n [index, length, formats, source] = overload(index, length, name, value, source);\n return modify.call(this, () => {\n return this.editor.formatText(index, length, formats);\n }, source, index, 0);\n }\n\n getBounds(index, length = 0) {\n let bounds;\n if (typeof index === 'number') {\n bounds = this.selection.getBounds(index, length);\n } else {\n bounds = this.selection.getBounds(index.index, index.length);\n }\n let containerBounds = this.container.getBoundingClientRect();\n return {\n bottom: bounds.bottom - containerBounds.top,\n height: bounds.height,\n left: bounds.left - containerBounds.left,\n right: bounds.right - containerBounds.left,\n top: bounds.top - containerBounds.top,\n width: bounds.width\n };\n }\n\n getContents(index = 0, length = this.getLength() - index) {\n [index, length] = overload(index, length);\n return this.editor.getContents(index, length);\n }\n\n getFormat(index = this.getSelection(true), length = 0) {\n if (typeof index === 'number') {\n return this.editor.getFormat(index, length);\n } else {\n return this.editor.getFormat(index.index, index.length);\n }\n }\n\n getIndex(blot) {\n return blot.offset(this.scroll);\n }\n\n getLength() {\n return this.scroll.length();\n }\n\n getLeaf(index) {\n return this.scroll.leaf(index);\n }\n\n getLine(index) {\n return this.scroll.line(index);\n }\n\n getLines(index = 0, length = Number.MAX_VALUE) {\n if (typeof index !== 'number') {\n return this.scroll.lines(index.index, index.length);\n } else {\n return this.scroll.lines(index, length);\n }\n }\n\n getModule(name) {\n return this.theme.modules[name];\n }\n\n getSelection(focus = false) {\n if (focus) this.focus();\n this.update(); // Make sure we access getRange with editor in consistent state\n return this.selection.getRange()[0];\n }\n\n getText(index = 0, length = this.getLength() - index) {\n [index, length] = overload(index, length);\n return this.editor.getText(index, length);\n }\n\n hasFocus() {\n return this.selection.hasFocus();\n }\n\n insertEmbed(index, embed, value, source = Quill.sources.API) {\n return modify.call(this, () => {\n return this.editor.insertEmbed(index, embed, value);\n }, source, index);\n }\n\n insertText(index, text, name, value, source) {\n let formats;\n [index, , formats, source] = overload(index, 0, name, value, source);\n return modify.call(this, () => {\n return this.editor.insertText(index, text, formats);\n }, source, index, text.length);\n }\n\n isEnabled() {\n return !this.container.classList.contains('ql-disabled');\n }\n\n off() {\n return this.emitter.off.apply(this.emitter, arguments);\n }\n\n on() {\n return this.emitter.on.apply(this.emitter, arguments);\n }\n\n once() {\n return this.emitter.once.apply(this.emitter, arguments);\n }\n\n pasteHTML(index, html, source) {\n this.clipboard.dangerouslyPasteHTML(index, html, source);\n }\n\n removeFormat(index, length, source) {\n [index, length, , source] = overload(index, length, source);\n return modify.call(this, () => {\n return this.editor.removeFormat(index, length);\n }, source, index);\n }\n\n scrollIntoView() {\n this.selection.scrollIntoView(this.scrollingContainer);\n }\n\n setContents(delta, source = Emitter.sources.API) {\n return modify.call(this, () => {\n delta = new Delta(delta);\n let length = this.getLength();\n let deleted = this.editor.deleteText(0, length);\n let applied = this.editor.applyDelta(delta);\n let lastOp = applied.ops[applied.ops.length - 1];\n if (lastOp != null && typeof(lastOp.insert) === 'string' && lastOp.insert[lastOp.insert.length-1] === '\\n') {\n this.editor.deleteText(this.getLength() - 1, 1);\n applied.delete(1);\n }\n let ret = deleted.compose(applied);\n return ret;\n }, source);\n }\n\n setSelection(index, length, source) {\n if (index == null) {\n this.selection.setRange(null, length || Quill.sources.API);\n } else {\n [index, length, , source] = overload(index, length, source);\n this.selection.setRange(new Range(index, length), source);\n if (source !== Emitter.sources.SILENT) {\n this.selection.scrollIntoView(this.scrollingContainer);\n }\n }\n }\n\n setText(text, source = Emitter.sources.API) {\n let delta = new Delta().insert(text);\n return this.setContents(delta, source);\n }\n\n update(source = Emitter.sources.USER) {\n let change = this.scroll.update(source); // Will update selection before selection.update() does if text changes\n this.selection.update(source);\n return change;\n }\n\n updateContents(delta, source = Emitter.sources.API) {\n return modify.call(this, () => {\n delta = new Delta(delta);\n return this.editor.applyDelta(delta, source);\n }, source, true);\n }\n}\nQuill.DEFAULTS = {\n bounds: null,\n formats: null,\n modules: {},\n placeholder: '',\n readOnly: false,\n scrollingContainer: null,\n strict: true,\n theme: 'default'\n};\nQuill.events = Emitter.events;\nQuill.sources = Emitter.sources;\n// eslint-disable-next-line no-undef\nQuill.version = typeof(QUILL_VERSION) === 'undefined' ? 'dev' : QUILL_VERSION;\n\nQuill.imports = {\n 'delta' : Delta,\n 'parchment' : Parchment,\n 'core/module' : Module,\n 'core/theme' : Theme\n};\n\n\nfunction expandConfig(container, userConfig) {\n userConfig = extend(true, {\n container: container,\n modules: {\n clipboard: true,\n keyboard: true,\n history: true\n }\n }, userConfig);\n if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) {\n userConfig.theme = Theme;\n } else {\n userConfig.theme = Quill.import(`themes/${userConfig.theme}`);\n if (userConfig.theme == null) {\n throw new Error(`Invalid theme ${userConfig.theme}. Did you register it?`);\n }\n }\n let themeConfig = extend(true, {}, userConfig.theme.DEFAULTS);\n [themeConfig, userConfig].forEach(function(config) {\n config.modules = config.modules || {};\n Object.keys(config.modules).forEach(function(module) {\n if (config.modules[module] === true) {\n config.modules[module] = {};\n }\n });\n });\n let moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules));\n let moduleConfig = moduleNames.reduce(function(config, name) {\n let moduleClass = Quill.import(`modules/${name}`);\n if (moduleClass == null) {\n debug.error(`Cannot load ${name} module. Are you sure you registered it?`);\n } else {\n config[name] = moduleClass.DEFAULTS || {};\n }\n return config;\n }, {});\n // Special case toolbar shorthand\n if (userConfig.modules != null && userConfig.modules.toolbar &&\n userConfig.modules.toolbar.constructor !== Object) {\n userConfig.modules.toolbar = {\n container: userConfig.modules.toolbar\n };\n }\n userConfig = extend(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig);\n ['bounds', 'container', 'scrollingContainer'].forEach(function(key) {\n if (typeof userConfig[key] === 'string') {\n userConfig[key] = document.querySelector(userConfig[key]);\n }\n });\n userConfig.modules = Object.keys(userConfig.modules).reduce(function(config, name) {\n if (userConfig.modules[name]) {\n config[name] = userConfig.modules[name];\n }\n return config;\n }, {});\n return userConfig;\n}\n\n// Handle selection preservation and TEXT_CHANGE emission\n// common to modification APIs\nfunction modify(modifier, source, index, shift) {\n if (this.options.strict && !this.isEnabled() && source === Emitter.sources.USER) {\n return new Delta();\n }\n let range = index == null ? null : this.getSelection();\n let oldDelta = this.editor.delta;\n let change = modifier();\n if (range != null) {\n if (index === true) index = range.index;\n if (shift == null) {\n range = shiftRange(range, change, source);\n } else if (shift !== 0) {\n range = shiftRange(range, index, shift, source);\n }\n this.setSelection(range, Emitter.sources.SILENT);\n }\n if (change.length() > 0) {\n let args = [Emitter.events.TEXT_CHANGE, change, oldDelta, source];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n return change;\n}\n\nfunction overload(index, length, name, value, source) {\n let formats = {};\n if (typeof index.index === 'number' && typeof index.length === 'number') {\n // Allow for throwaway end (used by insertText/insertEmbed)\n if (typeof length !== 'number') {\n source = value, value = name, name = length, length = index.length, index = index.index;\n } else {\n length = index.length, index = index.index;\n }\n } else if (typeof length !== 'number') {\n source = value, value = name, name = length, length = 0;\n }\n // Handle format being object, two format name/value strings or excluded\n if (typeof name === 'object') {\n formats = name;\n source = value;\n } else if (typeof name === 'string') {\n if (value != null) {\n formats[name] = value;\n } else {\n source = name;\n }\n }\n // Handle optional source\n source = source || Emitter.sources.API;\n return [index, length, formats, source];\n}\n\nfunction shiftRange(range, index, length, source) {\n if (range == null) return null;\n let start, end;\n if (index instanceof Delta) {\n [start, end] = [range.index, range.index + range.length].map(function(pos) {\n return index.transformPosition(pos, source !== Emitter.sources.USER);\n });\n } else {\n [start, end] = [range.index, range.index + range.length].map(function(pos) {\n if (pos < index || (pos === index && source === Emitter.sources.USER)) return pos;\n if (length >= 0) {\n return pos + length;\n } else {\n return Math.max(index, pos + length);\n }\n });\n }\n return new Range(start, end - start);\n}\n\n\nexport { expandConfig, overload, Quill as default };\n\n\n\n// WEBPACK FOOTER //\n// ./core/quill.js","class Module {\n constructor(quill, options = {}) {\n this.quill = quill;\n this.options = options;\n }\n}\nModule.DEFAULTS = {};\n\n\nexport default Module;\n\n\n\n// WEBPACK FOOTER //\n// ./core/module.js","import Parchment from 'parchment';\n\nclass TextBlot extends Parchment.Text { }\n\nexport default TextBlot;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/text.js","import EventEmitter from 'eventemitter3';\nimport logger from './logger';\n\nlet debug = logger('quill:events');\n\nconst EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];\n\nEVENTS.forEach(function(eventName) {\n document.addEventListener(eventName, (...args) => {\n [].slice.call(document.querySelectorAll('.ql-container')).forEach((node) => {\n // TODO use WeakMap\n if (node.__quill && node.__quill.emitter) {\n node.__quill.emitter.handleDOM(...args);\n }\n });\n });\n});\n\n\nclass Emitter extends EventEmitter {\n constructor() {\n super();\n this.listeners = {};\n this.on('error', debug.error);\n }\n\n emit() {\n debug.log.apply(debug, arguments);\n super.emit.apply(this, arguments);\n }\n\n handleDOM(event, ...args) {\n (this.listeners[event.type] || []).forEach(function({ node, handler }) {\n if (event.target === node || node.contains(event.target)) {\n handler(event, ...args);\n }\n });\n }\n\n listenDOM(eventName, node, handler) {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName].push({ node, handler })\n }\n}\n\nEmitter.events = {\n EDITOR_CHANGE : 'editor-change',\n SCROLL_BEFORE_UPDATE : 'scroll-before-update',\n SCROLL_OPTIMIZE : 'scroll-optimize',\n SCROLL_UPDATE : 'scroll-update',\n SELECTION_CHANGE : 'selection-change',\n TEXT_CHANGE : 'text-change'\n};\nEmitter.sources = {\n API : 'api',\n SILENT : 'silent',\n USER : 'user'\n};\n\n\nexport default Emitter;\n\n\n\n// WEBPACK FOOTER //\n// ./core/emitter.js","let levels = ['error', 'warn', 'log', 'info'];\nlet level = 'warn';\n\nfunction debug(method, ...args) {\n if (levels.indexOf(method) <= levels.indexOf(level)) {\n console[method](...args); // eslint-disable-line no-console\n }\n}\n\nfunction namespace(ns) {\n return levels.reduce(function(logger, method) {\n logger[method] = debug.bind(console, method, ns);\n return logger;\n }, {});\n}\n\ndebug.level = namespace.level = function(newLevel) {\n level = newLevel;\n};\n\n\nexport default namespace;\n\n\n\n// WEBPACK FOOTER //\n// ./core/logger.js","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registry = require(\"../registry\");\nvar Attributor = /** @class */ (function () {\n function Attributor(attrName, keyName, options) {\n if (options === void 0) { options = {}; }\n this.attrName = attrName;\n this.keyName = keyName;\n var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE;\n if (options.scope != null) {\n // Ignore type bits, force attribute bit\n this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit;\n }\n else {\n this.scope = Registry.Scope.ATTRIBUTE;\n }\n if (options.whitelist != null)\n this.whitelist = options.whitelist;\n }\n Attributor.keys = function (node) {\n return [].map.call(node.attributes, function (item) {\n return item.name;\n });\n };\n Attributor.prototype.add = function (node, value) {\n if (!this.canAdd(node, value))\n return false;\n node.setAttribute(this.keyName, value);\n return true;\n };\n Attributor.prototype.canAdd = function (node, value) {\n var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));\n if (match == null)\n return false;\n if (this.whitelist == null)\n return true;\n if (typeof value === 'string') {\n return this.whitelist.indexOf(value.replace(/[\"']/g, '')) > -1;\n }\n else {\n return this.whitelist.indexOf(value) > -1;\n }\n };\n Attributor.prototype.remove = function (node) {\n node.removeAttribute(this.keyName);\n };\n Attributor.prototype.value = function (node) {\n var value = node.getAttribute(this.keyName);\n if (this.canAdd(node, value) && value) {\n return value;\n }\n return '';\n };\n return Attributor;\n}());\nexports.default = Attributor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/attributor/attributor.ts\n// module id = 11\n// module chunks = 0","var pSlice = Array.prototype.slice;\nvar objectKeys = require('./lib/keys.js');\nvar isArguments = require('./lib/is_arguments.js');\n\nvar deepEqual = module.exports = function (actual, expected, opts) {\n if (!opts) opts = {};\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n\n // 7.3. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n return opts.strict ? actual === expected : actual == expected;\n\n // 7.4. For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected, opts);\n }\n}\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer (x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') return false;\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n var i, key;\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n //~~~I've managed to break Object.keys through screwy arguments passing.\n // Converting to array solves the problem.\n if (isArguments(a)) {\n if (!isArguments(b)) {\n return false;\n }\n a = pSlice.call(a);\n b = pSlice.call(b);\n return deepEqual(a, b, opts);\n }\n if (isBuffer(a)) {\n if (!isBuffer(b)) {\n return false;\n }\n if (a.length !== b.length) return false;\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n try {\n var ka = objectKeys(a),\n kb = objectKeys(b);\n } catch (e) {//happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) return false;\n }\n return typeof a === typeof b;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/deep-equal/index.js\n// module id = 12\n// module chunks = 0","import Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Block from '../blots/block';\nimport Inline from '../blots/inline';\nimport TextBlot from '../blots/text';\n\n\nclass Code extends Inline {}\nCode.blotName = 'code';\nCode.tagName = 'CODE';\n\n\nclass CodeBlock extends Block {\n static create(value) {\n let domNode = super.create(value);\n domNode.setAttribute('spellcheck', false);\n return domNode;\n }\n\n static formats() {\n return true;\n }\n\n delta() {\n let text = this.domNode.textContent;\n if (text.endsWith('\\n')) { // Should always be true\n text = text.slice(0, -1);\n }\n return text.split('\\n').reduce((delta, frag) => {\n return delta.insert(frag).insert('\\n', this.formats());\n }, new Delta());\n }\n\n format(name, value) {\n if (name === this.statics.blotName && value) return;\n let [text, ] = this.descendant(TextBlot, this.length() - 1);\n if (text != null) {\n text.deleteAt(text.length() - 1, 1);\n }\n super.format(name, value);\n }\n\n formatAt(index, length, name, value) {\n if (length === 0) return;\n if (Parchment.query(name, Parchment.Scope.BLOCK) == null ||\n (name === this.statics.blotName && value === this.statics.formats(this.domNode))) {\n return;\n }\n let nextNewline = this.newlineIndex(index);\n if (nextNewline < 0 || nextNewline >= index + length) return;\n let prevNewline = this.newlineIndex(index, true) + 1;\n let isolateLength = nextNewline - prevNewline + 1;\n let blot = this.isolate(prevNewline, isolateLength);\n let next = blot.next;\n blot.format(name, value);\n if (next instanceof CodeBlock) {\n next.formatAt(0, index - prevNewline + length - isolateLength, name, value);\n }\n }\n\n insertAt(index, value, def) {\n if (def != null) return;\n let [text, offset] = this.descendant(TextBlot, index);\n text.insertAt(offset, value);\n }\n\n length() {\n let length = this.domNode.textContent.length;\n if (!this.domNode.textContent.endsWith('\\n')) {\n return length + 1;\n }\n return length;\n }\n\n newlineIndex(searchIndex, reverse = false) {\n if (!reverse) {\n let offset = this.domNode.textContent.slice(searchIndex).indexOf('\\n');\n return offset > -1 ? searchIndex + offset : -1;\n } else {\n return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\\n');\n }\n }\n\n optimize(context) {\n if (!this.domNode.textContent.endsWith('\\n')) {\n this.appendChild(Parchment.create('text', '\\n'));\n }\n super.optimize(context);\n let next = this.next;\n if (next != null && next.prev === this &&\n next.statics.blotName === this.statics.blotName &&\n this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) {\n next.optimize(context);\n next.moveChildren(this);\n next.remove();\n }\n }\n\n replace(target) {\n super.replace(target);\n [].slice.call(this.domNode.querySelectorAll('*')).forEach(function(node) {\n let blot = Parchment.find(node);\n if (blot == null) {\n node.parentNode.removeChild(node);\n } else if (blot instanceof Parchment.Embed) {\n blot.remove();\n } else {\n blot.unwrap();\n }\n });\n }\n}\nCodeBlock.blotName = 'code-block';\nCodeBlock.tagName = 'PRE';\nCodeBlock.TAB = ' ';\n\n\nexport { Code, CodeBlock as default };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/code.js","import Parchment from 'parchment';\n\n\nclass Break extends Parchment.Embed {\n static value() {\n return undefined;\n }\n\n insertInto(parent, ref) {\n if (parent.children.length === 0) {\n super.insertInto(parent, ref);\n } else {\n this.remove();\n }\n }\n\n length() {\n return 0;\n }\n\n value() {\n return '';\n }\n}\nBreak.blotName = 'break';\nBreak.tagName = 'BR';\n\n\nexport default Break;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/break.js","import Inline from '../blots/inline';\n\n\nclass Link extends Inline {\n static create(value) {\n let node = super.create(value);\n value = this.sanitize(value);\n node.setAttribute('href', value);\n node.setAttribute('target', '_blank');\n return node;\n }\n\n static formats(domNode) {\n return domNode.getAttribute('href');\n }\n\n static sanitize(url) {\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL;\n }\n\n format(name, value) {\n if (name !== this.statics.blotName || !value) return super.format(name, value);\n value = this.constructor.sanitize(value);\n this.domNode.setAttribute('href', value);\n }\n}\nLink.blotName = 'link';\nLink.tagName = 'A';\nLink.SANITIZED_URL = 'about:blank';\nLink.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel'];\n\n\nfunction sanitize(url, protocols) {\n let anchor = document.createElement('a');\n anchor.href = url;\n let protocol = anchor.href.slice(0, anchor.href.indexOf(':'));\n return protocols.indexOf(protocol) > -1;\n}\n\n\nexport { Link as default, sanitize };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/link.js","import Keyboard from '../modules/keyboard';\nimport DropdownIcon from '../assets/icons/dropdown.svg';\n\nlet optionsCounter = 0;\n\nfunction toggleAriaAttribute(element, attribute) {\n element.setAttribute(attribute, !(element.getAttribute(attribute) === 'true'));\n}\n\nclass Picker {\n constructor(select) {\n this.select = select;\n this.container = document.createElement('span');\n this.buildPicker();\n this.select.style.display = 'none';\n this.select.parentNode.insertBefore(this.container, this.select);\n\n this.label.addEventListener('mousedown', () => {\n this.togglePicker();\n });\n this.label.addEventListener('keydown', (event) => {\n switch(event.keyCode) {\n // Allows the \"Enter\" key to open the picker\n case Keyboard.keys.ENTER:\n this.togglePicker();\n break;\n\n // Allows the \"Escape\" key to close the picker\n case Keyboard.keys.ESCAPE:\n this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n this.select.addEventListener('change', this.update.bind(this));\n }\n\n togglePicker() {\n this.container.classList.toggle('ql-expanded');\n // Toggle aria-expanded and aria-hidden to make the picker accessible\n toggleAriaAttribute(this.label, 'aria-expanded');\n toggleAriaAttribute(this.options, 'aria-hidden');\n }\n\n buildItem(option) {\n let item = document.createElement('span');\n item.tabIndex = '0';\n item.setAttribute('role', 'button');\n\n item.classList.add('ql-picker-item');\n if (option.hasAttribute('value')) {\n item.setAttribute('data-value', option.getAttribute('value'));\n }\n if (option.textContent) {\n item.setAttribute('data-label', option.textContent);\n }\n item.addEventListener('click', () => {\n this.selectItem(item, true);\n });\n item.addEventListener('keydown', (event) => {\n switch(event.keyCode) {\n // Allows the \"Enter\" key to select an item\n case Keyboard.keys.ENTER:\n this.selectItem(item, true);\n event.preventDefault();\n break;\n\n // Allows the \"Escape\" key to close the picker\n case Keyboard.keys.ESCAPE:\n this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n\n return item;\n }\n\n buildLabel() {\n let label = document.createElement('span');\n label.classList.add('ql-picker-label');\n label.innerHTML = DropdownIcon;\n label.tabIndex = '0';\n label.setAttribute('role', 'button');\n label.setAttribute('aria-expanded', 'false');\n this.container.appendChild(label);\n return label;\n }\n\n buildOptions() {\n let options = document.createElement('span');\n options.classList.add('ql-picker-options');\n\n // Don't want screen readers to read this until options are visible\n options.setAttribute('aria-hidden', 'true');\n options.tabIndex = '-1';\n\n // Need a unique id for aria-controls\n options.id = `ql-picker-options-${optionsCounter}`;\n optionsCounter += 1;\n this.label.setAttribute('aria-controls', options.id);\n\n this.options = options;\n\n [].slice.call(this.select.options).forEach((option) => {\n let item = this.buildItem(option);\n options.appendChild(item);\n if (option.selected === true) {\n this.selectItem(item);\n }\n });\n this.container.appendChild(options);\n }\n\n buildPicker() {\n [].slice.call(this.select.attributes).forEach((item) => {\n this.container.setAttribute(item.name, item.value);\n });\n this.container.classList.add('ql-picker');\n this.label = this.buildLabel();\n this.buildOptions();\n }\n\n escape() {\n // Close menu and return focus to trigger label\n this.close();\n // Need setTimeout for accessibility to ensure that the browser executes\n // focus on the next process thread and after any DOM content changes\n setTimeout(() => this.label.focus(), 1);\n }\n\n close() {\n this.container.classList.remove('ql-expanded');\n this.label.setAttribute('aria-expanded', 'false');\n this.options.setAttribute('aria-hidden', 'true');\n }\n\n selectItem(item, trigger = false) {\n let selected = this.container.querySelector('.ql-selected');\n if (item === selected) return;\n if (selected != null) {\n selected.classList.remove('ql-selected');\n }\n if (item == null) return;\n item.classList.add('ql-selected');\n this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item);\n if (item.hasAttribute('data-value')) {\n this.label.setAttribute('data-value', item.getAttribute('data-value'));\n } else {\n this.label.removeAttribute('data-value');\n }\n if (item.hasAttribute('data-label')) {\n this.label.setAttribute('data-label', item.getAttribute('data-label'));\n } else {\n this.label.removeAttribute('data-label');\n }\n if (trigger) {\n if (typeof Event === 'function') {\n this.select.dispatchEvent(new Event('change'));\n } else if (typeof Event === 'object') { // IE11\n let event = document.createEvent('Event');\n event.initEvent('change', true, true);\n this.select.dispatchEvent(event);\n }\n this.close();\n }\n }\n\n update() {\n let option;\n if (this.select.selectedIndex > -1) {\n let item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex];\n option = this.select.options[this.select.selectedIndex];\n this.selectItem(item);\n } else {\n this.selectItem(null);\n }\n let isActive = option != null && option !== this.select.querySelector('option[selected]');\n this.label.classList.toggle('ql-active', isActive);\n }\n}\n\n\nexport default Picker;\n\n\n\n// WEBPACK FOOTER //\n// ./ui/picker.js","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar linked_list_1 = require(\"../../collection/linked-list\");\nvar shadow_1 = require(\"./shadow\");\nvar Registry = require(\"../../registry\");\nvar ContainerBlot = /** @class */ (function (_super) {\n __extends(ContainerBlot, _super);\n function ContainerBlot(domNode) {\n var _this = _super.call(this, domNode) || this;\n _this.build();\n return _this;\n }\n ContainerBlot.prototype.appendChild = function (other) {\n this.insertBefore(other);\n };\n ContainerBlot.prototype.attach = function () {\n _super.prototype.attach.call(this);\n this.children.forEach(function (child) {\n child.attach();\n });\n };\n ContainerBlot.prototype.build = function () {\n var _this = this;\n this.children = new linked_list_1.default();\n // Need to be reversed for if DOM nodes already in order\n [].slice\n .call(this.domNode.childNodes)\n .reverse()\n .forEach(function (node) {\n try {\n var child = makeBlot(node);\n _this.insertBefore(child, _this.children.head || undefined);\n }\n catch (err) {\n if (err instanceof Registry.ParchmentError)\n return;\n else\n throw err;\n }\n });\n };\n ContainerBlot.prototype.deleteAt = function (index, length) {\n if (index === 0 && length === this.length()) {\n return this.remove();\n }\n this.children.forEachAt(index, length, function (child, offset, length) {\n child.deleteAt(offset, length);\n });\n };\n ContainerBlot.prototype.descendant = function (criteria, index) {\n var _a = this.children.find(index), child = _a[0], offset = _a[1];\n if ((criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)) {\n return [child, offset];\n }\n else if (child instanceof ContainerBlot) {\n return child.descendant(criteria, offset);\n }\n else {\n return [null, -1];\n }\n };\n ContainerBlot.prototype.descendants = function (criteria, index, length) {\n if (index === void 0) { index = 0; }\n if (length === void 0) { length = Number.MAX_VALUE; }\n var descendants = [];\n var lengthLeft = length;\n this.children.forEachAt(index, length, function (child, index, length) {\n if ((criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)) {\n descendants.push(child);\n }\n if (child instanceof ContainerBlot) {\n descendants = descendants.concat(child.descendants(criteria, index, lengthLeft));\n }\n lengthLeft -= length;\n });\n return descendants;\n };\n ContainerBlot.prototype.detach = function () {\n this.children.forEach(function (child) {\n child.detach();\n });\n _super.prototype.detach.call(this);\n };\n ContainerBlot.prototype.formatAt = function (index, length, name, value) {\n this.children.forEachAt(index, length, function (child, offset, length) {\n child.formatAt(offset, length, name, value);\n });\n };\n ContainerBlot.prototype.insertAt = function (index, value, def) {\n var _a = this.children.find(index), child = _a[0], offset = _a[1];\n if (child) {\n child.insertAt(offset, value, def);\n }\n else {\n var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);\n this.appendChild(blot);\n }\n };\n ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) {\n if (this.statics.allowedChildren != null &&\n !this.statics.allowedChildren.some(function (child) {\n return childBlot instanceof child;\n })) {\n throw new Registry.ParchmentError(\"Cannot insert \" + childBlot.statics.blotName + \" into \" + this.statics.blotName);\n }\n childBlot.insertInto(this, refBlot);\n };\n ContainerBlot.prototype.length = function () {\n return this.children.reduce(function (memo, child) {\n return memo + child.length();\n }, 0);\n };\n ContainerBlot.prototype.moveChildren = function (targetParent, refNode) {\n this.children.forEach(function (child) {\n targetParent.insertBefore(child, refNode);\n });\n };\n ContainerBlot.prototype.optimize = function (context) {\n _super.prototype.optimize.call(this, context);\n if (this.children.length === 0) {\n if (this.statics.defaultChild != null) {\n var child = Registry.create(this.statics.defaultChild);\n this.appendChild(child);\n child.optimize(context);\n }\n else {\n this.remove();\n }\n }\n };\n ContainerBlot.prototype.path = function (index, inclusive) {\n if (inclusive === void 0) { inclusive = false; }\n var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1];\n var position = [[this, index]];\n if (child instanceof ContainerBlot) {\n return position.concat(child.path(offset, inclusive));\n }\n else if (child != null) {\n position.push([child, offset]);\n }\n return position;\n };\n ContainerBlot.prototype.removeChild = function (child) {\n this.children.remove(child);\n };\n ContainerBlot.prototype.replace = function (target) {\n if (target instanceof ContainerBlot) {\n target.moveChildren(this);\n }\n _super.prototype.replace.call(this, target);\n };\n ContainerBlot.prototype.split = function (index, force) {\n if (force === void 0) { force = false; }\n if (!force) {\n if (index === 0)\n return this;\n if (index === this.length())\n return this.next;\n }\n var after = this.clone();\n this.parent.insertBefore(after, this.next);\n this.children.forEachAt(index, this.length(), function (child, offset, length) {\n child = child.split(offset, force);\n after.appendChild(child);\n });\n return after;\n };\n ContainerBlot.prototype.unwrap = function () {\n this.moveChildren(this.parent, this.next);\n this.remove();\n };\n ContainerBlot.prototype.update = function (mutations, context) {\n var _this = this;\n var addedNodes = [];\n var removedNodes = [];\n mutations.forEach(function (mutation) {\n if (mutation.target === _this.domNode && mutation.type === 'childList') {\n addedNodes.push.apply(addedNodes, mutation.addedNodes);\n removedNodes.push.apply(removedNodes, mutation.removedNodes);\n }\n });\n removedNodes.forEach(function (node) {\n // Check node has actually been removed\n // One exception is Chrome does not immediately remove IFRAMEs\n // from DOM but MutationRecord is correct in its reported removal\n if (node.parentNode != null &&\n // @ts-ignore\n node.tagName !== 'IFRAME' &&\n document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return;\n }\n var blot = Registry.find(node);\n if (blot == null)\n return;\n if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) {\n blot.detach();\n }\n });\n addedNodes\n .filter(function (node) {\n return node.parentNode == _this.domNode;\n })\n .sort(function (a, b) {\n if (a === b)\n return 0;\n if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {\n return 1;\n }\n return -1;\n })\n .forEach(function (node) {\n var refBlot = null;\n if (node.nextSibling != null) {\n refBlot = Registry.find(node.nextSibling);\n }\n var blot = makeBlot(node);\n if (blot.next != refBlot || blot.next == null) {\n if (blot.parent != null) {\n blot.parent.removeChild(_this);\n }\n _this.insertBefore(blot, refBlot || undefined);\n }\n });\n };\n return ContainerBlot;\n}(shadow_1.default));\nfunction makeBlot(node) {\n var blot = Registry.find(node);\n if (blot == null) {\n try {\n blot = Registry.create(node);\n }\n catch (e) {\n blot = Registry.create(Registry.Scope.INLINE);\n [].slice.call(node.childNodes).forEach(function (child) {\n // @ts-ignore\n blot.domNode.appendChild(child);\n });\n if (node.parentNode) {\n node.parentNode.replaceChild(blot.domNode, node);\n }\n blot.attach();\n }\n }\n return blot;\n}\nexports.default = ContainerBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/abstract/container.ts\n// module id = 17\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = require(\"../../attributor/attributor\");\nvar store_1 = require(\"../../attributor/store\");\nvar container_1 = require(\"./container\");\nvar Registry = require(\"../../registry\");\nvar FormatBlot = /** @class */ (function (_super) {\n __extends(FormatBlot, _super);\n function FormatBlot(domNode) {\n var _this = _super.call(this, domNode) || this;\n _this.attributes = new store_1.default(_this.domNode);\n return _this;\n }\n FormatBlot.formats = function (domNode) {\n if (typeof this.tagName === 'string') {\n return true;\n }\n else if (Array.isArray(this.tagName)) {\n return domNode.tagName.toLowerCase();\n }\n return undefined;\n };\n FormatBlot.prototype.format = function (name, value) {\n var format = Registry.query(name);\n if (format instanceof attributor_1.default) {\n this.attributes.attribute(format, value);\n }\n else if (value) {\n if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) {\n this.replaceWith(name, value);\n }\n }\n };\n FormatBlot.prototype.formats = function () {\n var formats = this.attributes.values();\n var format = this.statics.formats(this.domNode);\n if (format != null) {\n formats[this.statics.blotName] = format;\n }\n return formats;\n };\n FormatBlot.prototype.replaceWith = function (name, value) {\n var replacement = _super.prototype.replaceWith.call(this, name, value);\n this.attributes.copy(replacement);\n return replacement;\n };\n FormatBlot.prototype.update = function (mutations, context) {\n var _this = this;\n _super.prototype.update.call(this, mutations, context);\n if (mutations.some(function (mutation) {\n return mutation.target === _this.domNode && mutation.type === 'attributes';\n })) {\n this.attributes.build();\n }\n };\n FormatBlot.prototype.wrap = function (name, value) {\n var wrapper = _super.prototype.wrap.call(this, name, value);\n if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) {\n this.attributes.move(wrapper);\n }\n return wrapper;\n };\n return FormatBlot;\n}(container_1.default));\nexports.default = FormatBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/abstract/format.ts\n// module id = 18\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar shadow_1 = require(\"./shadow\");\nvar Registry = require(\"../../registry\");\nvar LeafBlot = /** @class */ (function (_super) {\n __extends(LeafBlot, _super);\n function LeafBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n LeafBlot.value = function (domNode) {\n return true;\n };\n LeafBlot.prototype.index = function (node, offset) {\n if (this.domNode === node ||\n this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return Math.min(offset, 1);\n }\n return -1;\n };\n LeafBlot.prototype.position = function (index, inclusive) {\n var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode);\n if (index > 0)\n offset += 1;\n return [this.parent.domNode, offset];\n };\n LeafBlot.prototype.value = function () {\n return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;\n var _a;\n };\n LeafBlot.scope = Registry.Scope.INLINE_BLOT;\n return LeafBlot;\n}(shadow_1.default));\nexports.default = LeafBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/abstract/leaf.ts\n// module id = 19\n// module chunks = 0","var equal = require('deep-equal');\nvar extend = require('extend');\n\n\nvar lib = {\n attributes: {\n compose: function (a, b, keepNull) {\n if (typeof a !== 'object') a = {};\n if (typeof b !== 'object') b = {};\n var attributes = extend(true, {}, b);\n if (!keepNull) {\n attributes = Object.keys(attributes).reduce(function (copy, key) {\n if (attributes[key] != null) {\n copy[key] = attributes[key];\n }\n return copy;\n }, {});\n }\n for (var key in a) {\n if (a[key] !== undefined && b[key] === undefined) {\n attributes[key] = a[key];\n }\n }\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n },\n\n diff: function(a, b) {\n if (typeof a !== 'object') a = {};\n if (typeof b !== 'object') b = {};\n var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) {\n if (!equal(a[key], b[key])) {\n attributes[key] = b[key] === undefined ? null : b[key];\n }\n return attributes;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n },\n\n transform: function (a, b, priority) {\n if (typeof a !== 'object') return b;\n if (typeof b !== 'object') return undefined;\n if (!priority) return b; // b simply overwrites us without priority\n var attributes = Object.keys(b).reduce(function (attributes, key) {\n if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value\n return attributes;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n },\n\n iterator: function (ops) {\n return new Iterator(ops);\n },\n\n length: function (op) {\n if (typeof op['delete'] === 'number') {\n return op['delete'];\n } else if (typeof op.retain === 'number') {\n return op.retain;\n } else {\n return typeof op.insert === 'string' ? op.insert.length : 1;\n }\n }\n};\n\n\nfunction Iterator(ops) {\n this.ops = ops;\n this.index = 0;\n this.offset = 0;\n};\n\nIterator.prototype.hasNext = function () {\n return this.peekLength() < Infinity;\n};\n\nIterator.prototype.next = function (length) {\n if (!length) length = Infinity;\n var nextOp = this.ops[this.index];\n if (nextOp) {\n var offset = this.offset;\n var opLength = lib.length(nextOp)\n if (length >= opLength - offset) {\n length = opLength - offset;\n this.index += 1;\n this.offset = 0;\n } else {\n this.offset += length;\n }\n if (typeof nextOp['delete'] === 'number') {\n return { 'delete': length };\n } else {\n var retOp = {};\n if (nextOp.attributes) {\n retOp.attributes = nextOp.attributes;\n }\n if (typeof nextOp.retain === 'number') {\n retOp.retain = length;\n } else if (typeof nextOp.insert === 'string') {\n retOp.insert = nextOp.insert.substr(offset, length);\n } else {\n // offset should === 0, length should === 1\n retOp.insert = nextOp.insert;\n }\n return retOp;\n }\n } else {\n return { retain: Infinity };\n }\n};\n\nIterator.prototype.peek = function () {\n return this.ops[this.index];\n};\n\nIterator.prototype.peekLength = function () {\n if (this.ops[this.index]) {\n // Should never return 0 if our index is being managed correctly\n return lib.length(this.ops[this.index]) - this.offset;\n } else {\n return Infinity;\n }\n};\n\nIterator.prototype.peekType = function () {\n if (this.ops[this.index]) {\n if (typeof this.ops[this.index]['delete'] === 'number') {\n return 'delete';\n } else if (typeof this.ops[this.index].retain === 'number') {\n return 'retain';\n } else {\n return 'insert';\n }\n }\n return 'retain';\n};\n\n\nmodule.exports = lib;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/quill-delta/lib/op.js\n// module id = 20\n// module chunks = 0","var clone = (function() {\n'use strict';\n\nfunction _instanceof(obj, type) {\n return type != null && obj instanceof type;\n}\n\nvar nativeMap;\ntry {\n nativeMap = Map;\n} catch(_) {\n // maybe a reference error because no `Map`. Give it a dummy value that no\n // value will ever be an instanceof.\n nativeMap = function() {};\n}\n\nvar nativeSet;\ntry {\n nativeSet = Set;\n} catch(_) {\n nativeSet = function() {};\n}\n\nvar nativePromise;\ntry {\n nativePromise = Promise;\n} catch(_) {\n nativePromise = function() {};\n}\n\n/**\n * Clones (copies) an Object using deep copying.\n *\n * This function supports circular references by default, but if you are certain\n * there are no circular references in your object, you can save some CPU time\n * by calling clone(obj, false).\n *\n * Caution: if `circular` is false and `parent` contains circular references,\n * your program may enter an infinite loop and crash.\n *\n * @param `parent` - the object to be cloned\n * @param `circular` - set to true if the object to be cloned may contain\n * circular references. (optional - true by default)\n * @param `depth` - set to a number if the object is only to be cloned to\n * a particular depth. (optional - defaults to Infinity)\n * @param `prototype` - sets the prototype to be used when cloning an object.\n * (optional - defaults to parent prototype).\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n * should be cloned as well. Non-enumerable properties on the prototype\n * chain will be ignored. (optional - false by default)\n*/\nfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n if (typeof circular === 'object') {\n depth = circular.depth;\n prototype = circular.prototype;\n includeNonEnumerable = circular.includeNonEnumerable;\n circular = circular.circular;\n }\n // maintain two arrays for circular references, where corresponding parents\n // and children have the same index\n var allParents = [];\n var allChildren = [];\n\n var useBuffer = typeof Buffer != 'undefined';\n\n if (typeof circular == 'undefined')\n circular = true;\n\n if (typeof depth == 'undefined')\n depth = Infinity;\n\n // recurse this function so we don't reset allParents and allChildren\n function _clone(parent, depth) {\n // cloning null always returns null\n if (parent === null)\n return null;\n\n if (depth === 0)\n return parent;\n\n var child;\n var proto;\n if (typeof parent != 'object') {\n return parent;\n }\n\n if (_instanceof(parent, nativeMap)) {\n child = new nativeMap();\n } else if (_instanceof(parent, nativeSet)) {\n child = new nativeSet();\n } else if (_instanceof(parent, nativePromise)) {\n child = new nativePromise(function (resolve, reject) {\n parent.then(function(value) {\n resolve(_clone(value, depth - 1));\n }, function(err) {\n reject(_clone(err, depth - 1));\n });\n });\n } else if (clone.__isArray(parent)) {\n child = [];\n } else if (clone.__isRegExp(parent)) {\n child = new RegExp(parent.source, __getRegExpFlags(parent));\n if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n } else if (clone.__isDate(parent)) {\n child = new Date(parent.getTime());\n } else if (useBuffer && Buffer.isBuffer(parent)) {\n child = new Buffer(parent.length);\n parent.copy(child);\n return child;\n } else if (_instanceof(parent, Error)) {\n child = Object.create(parent);\n } else {\n if (typeof prototype == 'undefined') {\n proto = Object.getPrototypeOf(parent);\n child = Object.create(proto);\n }\n else {\n child = Object.create(prototype);\n proto = prototype;\n }\n }\n\n if (circular) {\n var index = allParents.indexOf(parent);\n\n if (index != -1) {\n return allChildren[index];\n }\n allParents.push(parent);\n allChildren.push(child);\n }\n\n if (_instanceof(parent, nativeMap)) {\n parent.forEach(function(value, key) {\n var keyChild = _clone(key, depth - 1);\n var valueChild = _clone(value, depth - 1);\n child.set(keyChild, valueChild);\n });\n }\n if (_instanceof(parent, nativeSet)) {\n parent.forEach(function(value) {\n var entryChild = _clone(value, depth - 1);\n child.add(entryChild);\n });\n }\n\n for (var i in parent) {\n var attrs;\n if (proto) {\n attrs = Object.getOwnPropertyDescriptor(proto, i);\n }\n\n if (attrs && attrs.set == null) {\n continue;\n }\n child[i] = _clone(parent[i], depth - 1);\n }\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(parent);\n for (var i = 0; i < symbols.length; i++) {\n // Don't need to worry about cloning a symbol because it is a primitive,\n // like a number or string.\n var symbol = symbols[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n continue;\n }\n child[symbol] = _clone(parent[symbol], depth - 1);\n if (!descriptor.enumerable) {\n Object.defineProperty(child, symbol, {\n enumerable: false\n });\n }\n }\n }\n\n if (includeNonEnumerable) {\n var allPropertyNames = Object.getOwnPropertyNames(parent);\n for (var i = 0; i < allPropertyNames.length; i++) {\n var propertyName = allPropertyNames[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n if (descriptor && descriptor.enumerable) {\n continue;\n }\n child[propertyName] = _clone(parent[propertyName], depth - 1);\n Object.defineProperty(child, propertyName, {\n enumerable: false\n });\n }\n }\n\n return child;\n }\n\n return _clone(parent, depth);\n}\n\n/**\n * Simple flat clone using prototype, accepts only objects, usefull for property\n * override on FLAT configuration object (no nested props).\n *\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n * works.\n */\nclone.clonePrototype = function clonePrototype(parent) {\n if (parent === null)\n return null;\n\n var c = function () {};\n c.prototype = parent;\n return new c();\n};\n\n// private utility functions\n\nfunction __objToStr(o) {\n return Object.prototype.toString.call(o);\n}\nclone.__objToStr = __objToStr;\n\nfunction __isDate(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Date]';\n}\nclone.__isDate = __isDate;\n\nfunction __isArray(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Array]';\n}\nclone.__isArray = __isArray;\n\nfunction __isRegExp(o) {\n return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n}\nclone.__isRegExp = __isRegExp;\n\nfunction __getRegExpFlags(re) {\n var flags = '';\n if (re.global) flags += 'g';\n if (re.ignoreCase) flags += 'i';\n if (re.multiline) flags += 'm';\n return flags;\n}\nclone.__getRegExpFlags = __getRegExpFlags;\n\nreturn clone;\n})();\n\nif (typeof module === 'object' && module.exports) {\n module.exports = clone;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/clone/clone.js\n// module id = 21\n// module chunks = 0","import Parchment from 'parchment';\nimport clone from 'clone';\nimport equal from 'deep-equal';\nimport Emitter from './emitter';\nimport logger from './logger';\n\nlet debug = logger('quill:selection');\n\n\nclass Range {\n constructor(index, length = 0) {\n this.index = index;\n this.length = length;\n }\n}\n\n\nclass Selection {\n constructor(scroll, emitter) {\n this.emitter = emitter;\n this.scroll = scroll;\n this.composing = false;\n this.mouseDown = false;\n this.root = this.scroll.domNode;\n this.cursor = Parchment.create('cursor', this);\n // savedRange is last non-null range\n this.lastRange = this.savedRange = new Range(0, 0);\n this.handleComposition();\n this.handleDragging();\n this.emitter.listenDOM('selectionchange', document, () => {\n if (!this.mouseDown) {\n setTimeout(this.update.bind(this, Emitter.sources.USER), 1);\n }\n });\n this.emitter.on(Emitter.events.EDITOR_CHANGE, (type, delta) => {\n if (type === Emitter.events.TEXT_CHANGE && delta.length() > 0) {\n this.update(Emitter.sources.SILENT);\n }\n });\n this.emitter.on(Emitter.events.SCROLL_BEFORE_UPDATE, () => {\n if (!this.hasFocus()) return;\n let native = this.getNativeRange();\n if (native == null) return;\n if (native.start.node === this.cursor.textNode) return; // cursor.restore() will handle\n // TODO unclear if this has negative side effects\n this.emitter.once(Emitter.events.SCROLL_UPDATE, () => {\n try {\n this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset);\n } catch (ignored) {}\n });\n });\n this.emitter.on(Emitter.events.SCROLL_OPTIMIZE, (mutations, context) => {\n if (context.range) {\n const { startNode, startOffset, endNode, endOffset } = context.range;\n this.setNativeRange(startNode, startOffset, endNode, endOffset);\n }\n });\n this.update(Emitter.sources.SILENT);\n }\n\n handleComposition() {\n this.root.addEventListener('compositionstart', () => {\n this.composing = true;\n });\n this.root.addEventListener('compositionend', () => {\n this.composing = false;\n if (this.cursor.parent) {\n const range = this.cursor.restore();\n if (!range) return;\n setTimeout(() => {\n this.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset);\n }, 1);\n }\n });\n }\n\n handleDragging() {\n this.emitter.listenDOM('mousedown', document.body, () => {\n this.mouseDown = true;\n });\n this.emitter.listenDOM('mouseup', document.body, () => {\n this.mouseDown = false;\n this.update(Emitter.sources.USER);\n });\n }\n\n focus() {\n if (this.hasFocus()) return;\n this.root.focus();\n this.setRange(this.savedRange);\n }\n\n format(format, value) {\n if (this.scroll.whitelist != null && !this.scroll.whitelist[format]) return;\n this.scroll.update();\n let nativeRange = this.getNativeRange();\n if (nativeRange == null || !nativeRange.native.collapsed || Parchment.query(format, Parchment.Scope.BLOCK)) return;\n if (nativeRange.start.node !== this.cursor.textNode) {\n let blot = Parchment.find(nativeRange.start.node, false);\n if (blot == null) return;\n // TODO Give blot ability to not split\n if (blot instanceof Parchment.Leaf) {\n let after = blot.split(nativeRange.start.offset);\n blot.parent.insertBefore(this.cursor, after);\n } else {\n blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen\n }\n this.cursor.attach();\n }\n this.cursor.format(format, value);\n this.scroll.optimize();\n this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n this.update();\n }\n\n getBounds(index, length = 0) {\n let scrollLength = this.scroll.length();\n index = Math.min(index, scrollLength - 1);\n length = Math.min(index + length, scrollLength - 1) - index;\n let node, [leaf, offset] = this.scroll.leaf(index);\n if (leaf == null) return null;\n [node, offset] = leaf.position(offset, true);\n let range = document.createRange();\n if (length > 0) {\n range.setStart(node, offset);\n [leaf, offset] = this.scroll.leaf(index + length);\n if (leaf == null) return null;\n [node, offset] = leaf.position(offset, true);\n range.setEnd(node, offset);\n return range.getBoundingClientRect();\n } else {\n let side = 'left';\n let rect;\n if (node instanceof Text) {\n if (offset < node.data.length) {\n range.setStart(node, offset);\n range.setEnd(node, offset + 1);\n } else {\n range.setStart(node, offset - 1);\n range.setEnd(node, offset);\n side = 'right';\n }\n rect = range.getBoundingClientRect();\n } else {\n rect = leaf.domNode.getBoundingClientRect();\n if (offset > 0) side = 'right';\n }\n return {\n bottom: rect.top + rect.height,\n height: rect.height,\n left: rect[side],\n right: rect[side],\n top: rect.top,\n width: 0\n };\n }\n }\n\n getNativeRange() {\n let selection = document.getSelection();\n if (selection == null || selection.rangeCount <= 0) return null;\n let nativeRange = selection.getRangeAt(0);\n if (nativeRange == null) return null;\n let range = this.normalizeNative(nativeRange);\n debug.info('getNativeRange', range);\n return range;\n }\n\n getRange() {\n let normalized = this.getNativeRange();\n if (normalized == null) return [null, null];\n let range = this.normalizedToRange(normalized);\n return [range, normalized];\n }\n\n hasFocus() {\n return document.activeElement === this.root;\n }\n\n normalizedToRange(range) {\n let positions = [[range.start.node, range.start.offset]];\n if (!range.native.collapsed) {\n positions.push([range.end.node, range.end.offset]);\n }\n let indexes = positions.map((position) => {\n let [node, offset] = position;\n let blot = Parchment.find(node, true);\n let index = blot.offset(this.scroll);\n if (offset === 0) {\n return index;\n } else if (blot instanceof Parchment.Container) {\n return index + blot.length();\n } else {\n return index + blot.index(node, offset);\n }\n });\n let end = Math.min(Math.max(...indexes), this.scroll.length() - 1);\n let start = Math.min(end, ...indexes);\n return new Range(start, end-start);\n }\n\n normalizeNative(nativeRange) {\n if (!contains(this.root, nativeRange.startContainer) ||\n (!nativeRange.collapsed && !contains(this.root, nativeRange.endContainer))) {\n return null;\n }\n let range = {\n start: { node: nativeRange.startContainer, offset: nativeRange.startOffset },\n end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n native: nativeRange\n };\n [range.start, range.end].forEach(function(position) {\n let node = position.node, offset = position.offset;\n while (!(node instanceof Text) && node.childNodes.length > 0) {\n if (node.childNodes.length > offset) {\n node = node.childNodes[offset];\n offset = 0;\n } else if (node.childNodes.length === offset) {\n node = node.lastChild;\n offset = node instanceof Text ? node.data.length : node.childNodes.length + 1;\n } else {\n break;\n }\n }\n position.node = node, position.offset = offset;\n });\n return range;\n }\n\n rangeToNative(range) {\n let indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length];\n let args = [];\n let scrollLength = this.scroll.length();\n indexes.forEach((index, i) => {\n index = Math.min(scrollLength - 1, index);\n let node, [leaf, offset] = this.scroll.leaf(index);\n [node, offset] = leaf.position(offset, i !== 0);\n args.push(node, offset);\n });\n if (args.length < 2) {\n args = args.concat(args);\n }\n return args;\n }\n\n scrollIntoView(scrollingContainer) {\n let range = this.lastRange;\n if (range == null) return;\n let bounds = this.getBounds(range.index, range.length);\n if (bounds == null) return;\n let limit = this.scroll.length()-1;\n let [first, ] = this.scroll.line(Math.min(range.index, limit));\n let last = first;\n if (range.length > 0) {\n [last, ] = this.scroll.line(Math.min(range.index + range.length, limit));\n }\n if (first == null || last == null) return;\n let scrollBounds = scrollingContainer.getBoundingClientRect();\n if (bounds.top < scrollBounds.top) {\n scrollingContainer.scrollTop -= (scrollBounds.top - bounds.top);\n } else if (bounds.bottom > scrollBounds.bottom) {\n scrollingContainer.scrollTop += (bounds.bottom - scrollBounds.bottom);\n }\n }\n\n setNativeRange(startNode, startOffset, endNode = startNode, endOffset = startOffset, force = false) {\n debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) {\n return;\n }\n let selection = document.getSelection();\n if (selection == null) return;\n if (startNode != null) {\n if (!this.hasFocus()) this.root.focus();\n let native = (this.getNativeRange() || {}).native;\n if (native == null || force ||\n startNode !== native.startContainer ||\n startOffset !== native.startOffset ||\n endNode !== native.endContainer ||\n endOffset !== native.endOffset) {\n\n if (startNode.tagName == \"BR\") {\n startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode);\n startNode = startNode.parentNode;\n }\n if (endNode.tagName == \"BR\") {\n endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode);\n endNode = endNode.parentNode;\n }\n let range = document.createRange();\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n } else {\n selection.removeAllRanges();\n this.root.blur();\n document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs)\n }\n }\n\n setRange(range, force = false, source = Emitter.sources.API) {\n if (typeof force === 'string') {\n source = force;\n force = false;\n }\n debug.info('setRange', range);\n if (range != null) {\n let args = this.rangeToNative(range);\n this.setNativeRange(...args, force);\n } else {\n this.setNativeRange(null);\n }\n this.update(source);\n }\n\n update(source = Emitter.sources.USER) {\n let oldRange = this.lastRange;\n let [lastRange, nativeRange] = this.getRange();\n this.lastRange = lastRange;\n if (this.lastRange != null) {\n this.savedRange = this.lastRange;\n }\n if (!equal(oldRange, this.lastRange)) {\n if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) {\n this.cursor.restore();\n }\n let args = [Emitter.events.SELECTION_CHANGE, clone(this.lastRange), clone(oldRange), source];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n }\n}\n\n\nfunction contains(parent, descendant) {\n try {\n // Firefox inserts inaccessible nodes around video elements\n descendant.parentNode;\n } catch (e) {\n return false;\n }\n // IE11 has bug with Text nodes\n // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect\n if (descendant instanceof Text) {\n descendant = descendant.parentNode;\n }\n return parent.contains(descendant);\n}\n\n\nexport { Range, Selection as default };\n\n\n\n// WEBPACK FOOTER //\n// ./core/selection.js","import Parchment from 'parchment';\nimport Block, { BlockEmbed } from './block';\n\n\nclass Container extends Parchment.Container { }\nContainer.allowedChildren = [Block, BlockEmbed, Container];\n\n\nexport default Container;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/container.js","import Parchment from 'parchment';\n\nclass ColorAttributor extends Parchment.Attributor.Style {\n value(domNode) {\n let value = super.value(domNode);\n if (!value.startsWith('rgb(')) return value;\n value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n return '#' + value.split(',').map(function(component) {\n return ('00' + parseInt(component).toString(16)).slice(-2);\n }).join('');\n }\n}\n\nlet ColorClass = new Parchment.Attributor.Class('color', 'ql-color', {\n scope: Parchment.Scope.INLINE\n});\nlet ColorStyle = new ColorAttributor('color', 'color', {\n scope: Parchment.Scope.INLINE\n});\n\nexport { ColorAttributor, ColorClass, ColorStyle };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/color.js","import clone from 'clone';\nimport equal from 'deep-equal';\nimport extend from 'extend';\nimport Delta from 'quill-delta';\nimport DeltaOp from 'quill-delta/lib/op';\nimport Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport logger from '../core/logger';\nimport Module from '../core/module';\n\nlet debug = logger('quill:keyboard');\n\nconst SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\n\nclass Keyboard extends Module {\n static match(evt, binding) {\n binding = normalize(binding);\n if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function(key) {\n return (!!binding[key] !== evt[key] && binding[key] !== null);\n })) {\n return false;\n }\n return binding.key === (evt.which || evt.keyCode);\n }\n\n constructor(quill, options) {\n super(quill, options);\n this.bindings = {};\n Object.keys(this.options.bindings).forEach((name) => {\n if (name === 'list autofill' &&\n quill.scroll.whitelist != null &&\n !quill.scroll.whitelist['list']) {\n return;\n }\n if (this.options.bindings[name]) {\n this.addBinding(this.options.bindings[name]);\n }\n });\n this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);\n this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function() {});\n if (/Firefox/i.test(navigator.userAgent)) {\n // Need to handle delete and backspace for Firefox in the general case #1171\n this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);\n this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);\n } else {\n this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);\n this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);\n }\n this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);\n this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);\n this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null },\n { collapsed: true, offset: 0 },\n handleBackspace);\n this.listen();\n }\n\n addBinding(key, context = {}, handler = {}) {\n let binding = normalize(key);\n if (binding == null || binding.key == null) {\n return debug.warn('Attempted to add invalid keyboard binding', binding);\n }\n if (typeof context === 'function') {\n context = { handler: context };\n }\n if (typeof handler === 'function') {\n handler = { handler: handler };\n }\n binding = extend(binding, context, handler);\n this.bindings[binding.key] = this.bindings[binding.key] || [];\n this.bindings[binding.key].push(binding);\n }\n\n listen() {\n this.quill.root.addEventListener('keydown', (evt) => {\n if (evt.defaultPrevented) return;\n let which = evt.which || evt.keyCode;\n let bindings = (this.bindings[which] || []).filter(function(binding) {\n return Keyboard.match(evt, binding);\n });\n if (bindings.length === 0) return;\n let range = this.quill.getSelection();\n if (range == null || !this.quill.hasFocus()) return;\n let [line, offset] = this.quill.getLine(range.index);\n let [leafStart, offsetStart] = this.quill.getLeaf(range.index);\n let [leafEnd, offsetEnd] = range.length === 0 ? [leafStart, offsetStart] : this.quill.getLeaf(range.index + range.length);\n let prefixText = leafStart instanceof Parchment.Text ? leafStart.value().slice(0, offsetStart) : '';\n let suffixText = leafEnd instanceof Parchment.Text ? leafEnd.value().slice(offsetEnd) : '';\n let curContext = {\n collapsed: range.length === 0,\n empty: range.length === 0 && line.length() <= 1,\n format: this.quill.getFormat(range),\n offset: offset,\n prefix: prefixText,\n suffix: suffixText\n };\n let prevented = bindings.some((binding) => {\n if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;\n if (binding.empty != null && binding.empty !== curContext.empty) return false;\n if (binding.offset != null && binding.offset !== curContext.offset) return false;\n if (Array.isArray(binding.format)) {\n // any format is present\n if (binding.format.every(function(name) {\n return curContext.format[name] == null;\n })) {\n return false;\n }\n } else if (typeof binding.format === 'object') {\n // all formats must match\n if (!Object.keys(binding.format).every(function(name) {\n if (binding.format[name] === true) return curContext.format[name] != null;\n if (binding.format[name] === false) return curContext.format[name] == null;\n return equal(binding.format[name], curContext.format[name]);\n })) {\n return false;\n }\n }\n if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;\n if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;\n return binding.handler.call(this, range, curContext) !== true;\n });\n if (prevented) {\n evt.preventDefault();\n }\n });\n }\n}\n\nKeyboard.keys = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESCAPE: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n DELETE: 46\n};\n\nKeyboard.DEFAULTS = {\n bindings: {\n 'bold' : makeFormatHandler('bold'),\n 'italic' : makeFormatHandler('italic'),\n 'underline' : makeFormatHandler('underline'),\n 'indent': {\n // highlight tab or tab at beginning of list, indent or blockquote\n key: Keyboard.keys.TAB,\n format: ['blockquote', 'indent', 'list'],\n handler: function(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '+1', Quill.sources.USER);\n }\n },\n 'outdent': {\n key: Keyboard.keys.TAB,\n shiftKey: true,\n format: ['blockquote', 'indent', 'list'],\n // highlight tab or tab at beginning of list, indent or blockquote\n handler: function(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '-1', Quill.sources.USER);\n }\n },\n 'outdent backspace': {\n key: Keyboard.keys.BACKSPACE,\n collapsed: true,\n shiftKey: null,\n metaKey: null,\n ctrlKey: null,\n altKey: null,\n format: ['indent', 'list'],\n offset: 0,\n handler: function(range, context) {\n if (context.format.indent != null) {\n this.quill.format('indent', '-1', Quill.sources.USER);\n } else if (context.format.list != null) {\n this.quill.format('list', false, Quill.sources.USER);\n }\n }\n },\n 'indent code-block': makeCodeBlockHandler(true),\n 'outdent code-block': makeCodeBlockHandler(false),\n 'remove tab': {\n key: Keyboard.keys.TAB,\n shiftKey: true,\n collapsed: true,\n prefix: /\\t$/,\n handler: function(range) {\n this.quill.deleteText(range.index - 1, 1, Quill.sources.USER);\n }\n },\n 'tab': {\n key: Keyboard.keys.TAB,\n handler: function(range) {\n this.quill.history.cutoff();\n let delta = new Delta().retain(range.index)\n .delete(range.length)\n .insert('\\t');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n }\n },\n 'list empty enter': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: ['list'],\n empty: true,\n handler: function(range, context) {\n this.quill.format('list', false, Quill.sources.USER);\n if (context.format.indent) {\n this.quill.format('indent', false, Quill.sources.USER);\n }\n }\n },\n 'checklist enter': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: { list: 'checked' },\n handler: function(range) {\n let [line, offset] = this.quill.getLine(range.index);\n let formats = extend({}, line.formats(), { list: 'checked' });\n let delta = new Delta().retain(range.index)\n .insert('\\n', formats)\n .retain(line.length() - offset - 1)\n .retain(1, { list: 'unchecked' });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollIntoView();\n }\n },\n 'header enter': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: ['header'],\n suffix: /^$/,\n handler: function(range, context) {\n let [line, offset] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index)\n .insert('\\n', context.format)\n .retain(line.length() - offset - 1)\n .retain(1, { header: null });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollIntoView();\n }\n },\n 'list autofill': {\n key: ' ',\n collapsed: true,\n format: { list: false },\n prefix: /^\\s*?(\\d+\\.|-|\\*|\\[ ?\\]|\\[x\\])$/,\n handler: function(range, context) {\n let length = context.prefix.length;\n let [line, offset] = this.quill.getLine(range.index);\n if (offset > length) return true;\n let value;\n switch (context.prefix.trim()) {\n case '[]': case '[ ]':\n value = 'unchecked';\n break;\n case '[x]':\n value = 'checked';\n break;\n case '-': case '*':\n value = 'bullet';\n break;\n default:\n value = 'ordered';\n }\n this.quill.insertText(range.index, ' ', Quill.sources.USER);\n this.quill.history.cutoff();\n let delta = new Delta().retain(range.index - offset)\n .delete(length + 1)\n .retain(line.length() - 2 - offset)\n .retain(1, { list: value });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index - length, Quill.sources.SILENT);\n }\n },\n 'code exit': {\n key: Keyboard.keys.ENTER,\n collapsed: true,\n format: ['code-block'],\n prefix: /\\n\\n$/,\n suffix: /^\\s+$/,\n handler: function(range) {\n const [line, offset] = this.quill.getLine(range.index);\n const delta = new Delta()\n .retain(range.index + line.length() - offset - 2)\n .retain(1, { 'code-block': null })\n .delete(1);\n this.quill.updateContents(delta, Quill.sources.USER);\n }\n },\n 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false),\n 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true),\n 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false),\n 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true)\n }\n};\n\nfunction makeEmbedArrowHandler(key, shiftKey) {\n const where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix';\n return {\n key,\n shiftKey,\n altKey: null,\n [where]: /^$/,\n handler: function(range) {\n let index = range.index;\n if (key === Keyboard.keys.RIGHT) {\n index += (range.length + 1);\n }\n const [leaf, ] = this.quill.getLeaf(index);\n if (!(leaf instanceof Parchment.Embed)) return true;\n if (key === Keyboard.keys.LEFT) {\n if (shiftKey) {\n this.quill.setSelection(range.index - 1, range.length + 1, Quill.sources.USER);\n } else {\n this.quill.setSelection(range.index - 1, Quill.sources.USER);\n }\n } else {\n if (shiftKey) {\n this.quill.setSelection(range.index, range.length + 1, Quill.sources.USER);\n } else {\n this.quill.setSelection(range.index + range.length + 1, Quill.sources.USER);\n }\n }\n return false;\n }\n };\n}\n\n\nfunction handleBackspace(range, context) {\n if (range.index === 0 || this.quill.getLength() <= 1) return;\n let [line, ] = this.quill.getLine(range.index);\n let formats = {};\n if (context.offset === 0) {\n let [prev, ] = this.quill.getLine(range.index - 1);\n if (prev != null && prev.length() > 1) {\n let curFormats = line.formats();\n let prevFormats = this.quill.getFormat(range.index-1, 1);\n formats = DeltaOp.attributes.diff(curFormats, prevFormats) || {};\n }\n }\n // Check for astral symbols\n let length = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$/.test(context.prefix) ? 2 : 1;\n this.quill.deleteText(range.index-length, length, Quill.sources.USER);\n if (Object.keys(formats).length > 0) {\n this.quill.formatLine(range.index-length, length, formats, Quill.sources.USER);\n }\n this.quill.focus();\n}\n\nfunction handleDelete(range, context) {\n // Check for astral symbols\n let length = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(context.suffix) ? 2 : 1;\n if (range.index >= this.quill.getLength() - length) return;\n let formats = {}, nextLength = 0;\n let [line, ] = this.quill.getLine(range.index);\n if (context.offset >= line.length() - 1) {\n let [next, ] = this.quill.getLine(range.index + 1);\n if (next) {\n let curFormats = line.formats();\n let nextFormats = this.quill.getFormat(range.index, 1);\n formats = DeltaOp.attributes.diff(curFormats, nextFormats) || {};\n nextLength = next.length();\n }\n }\n this.quill.deleteText(range.index, length, Quill.sources.USER);\n if (Object.keys(formats).length > 0) {\n this.quill.formatLine(range.index + nextLength - 1, length, formats, Quill.sources.USER);\n }\n}\n\nfunction handleDeleteRange(range) {\n let lines = this.quill.getLines(range);\n let formats = {};\n if (lines.length > 1) {\n let firstFormats = lines[0].formats();\n let lastFormats = lines[lines.length - 1].formats();\n formats = DeltaOp.attributes.diff(lastFormats, firstFormats) || {};\n }\n this.quill.deleteText(range, Quill.sources.USER);\n if (Object.keys(formats).length > 0) {\n this.quill.formatLine(range.index, 1, formats, Quill.sources.USER);\n }\n this.quill.setSelection(range.index, Quill.sources.SILENT);\n this.quill.focus();\n}\n\nfunction handleEnter(range, context) {\n if (range.length > 0) {\n this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change\n }\n let lineFormats = Object.keys(context.format).reduce(function(lineFormats, format) {\n if (Parchment.query(format, Parchment.Scope.BLOCK) && !Array.isArray(context.format[format])) {\n lineFormats[format] = context.format[format];\n }\n return lineFormats;\n }, {});\n this.quill.insertText(range.index, '\\n', lineFormats, Quill.sources.USER);\n // Earlier scroll.deleteAt might have messed up our selection,\n // so insertText's built in selection preservation is not reliable\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.focus();\n Object.keys(context.format).forEach((name) => {\n if (lineFormats[name] != null) return;\n if (Array.isArray(context.format[name])) return;\n if (name === 'link') return;\n this.quill.format(name, context.format[name], Quill.sources.USER);\n });\n}\n\nfunction makeCodeBlockHandler(indent) {\n return {\n key: Keyboard.keys.TAB,\n shiftKey: !indent,\n format: {'code-block': true },\n handler: function(range) {\n let CodeBlock = Parchment.query('code-block');\n let index = range.index, length = range.length;\n let [block, offset] = this.quill.scroll.descendant(CodeBlock, index);\n if (block == null) return;\n let scrollIndex = this.quill.getIndex(block);\n let start = block.newlineIndex(offset, true) + 1;\n let end = block.newlineIndex(scrollIndex + offset + length);\n let lines = block.domNode.textContent.slice(start, end).split('\\n');\n offset = 0;\n lines.forEach((line, i) => {\n if (indent) {\n block.insertAt(start + offset, CodeBlock.TAB);\n offset += CodeBlock.TAB.length;\n if (i === 0) {\n index += CodeBlock.TAB.length;\n } else {\n length += CodeBlock.TAB.length;\n }\n } else if (line.startsWith(CodeBlock.TAB)) {\n block.deleteAt(start + offset, CodeBlock.TAB.length);\n offset -= CodeBlock.TAB.length;\n if (i === 0) {\n index -= CodeBlock.TAB.length;\n } else {\n length -= CodeBlock.TAB.length;\n }\n }\n offset += line.length + 1;\n });\n this.quill.update(Quill.sources.USER);\n this.quill.setSelection(index, length, Quill.sources.SILENT);\n }\n };\n}\n\nfunction makeFormatHandler(format) {\n return {\n key: format[0].toUpperCase(),\n shortKey: true,\n handler: function(range, context) {\n this.quill.format(format, !context.format[format], Quill.sources.USER);\n }\n };\n}\n\nfunction normalize(binding) {\n if (typeof binding === 'string' || typeof binding === 'number') {\n return normalize({ key: binding });\n }\n if (typeof binding === 'object') {\n binding = clone(binding, false);\n }\n if (typeof binding.key === 'string') {\n if (Keyboard.keys[binding.key.toUpperCase()] != null) {\n binding.key = Keyboard.keys[binding.key.toUpperCase()];\n } else if (binding.key.length === 1) {\n binding.key = binding.key.toUpperCase().charCodeAt(0);\n } else {\n return null;\n }\n }\n if (binding.shortKey) {\n binding[SHORTKEY] = binding.shortKey;\n delete binding.shortKey;\n }\n return binding;\n}\n\n\nexport { Keyboard as default, SHORTKEY };\n\n\n\n// WEBPACK FOOTER //\n// ./modules/keyboard.js","module.exports = {\n 'align': {\n '' : require('../assets/icons/align-left.svg'),\n 'center' : require('../assets/icons/align-center.svg'),\n 'right' : require('../assets/icons/align-right.svg'),\n 'justify' : require('../assets/icons/align-justify.svg')\n },\n 'background': require('../assets/icons/background.svg'),\n 'blockquote': require('../assets/icons/blockquote.svg'),\n 'bold' : require('../assets/icons/bold.svg'),\n 'clean' : require('../assets/icons/clean.svg'),\n 'code' : require('../assets/icons/code.svg'),\n 'code-block': require('../assets/icons/code.svg'),\n 'color' : require('../assets/icons/color.svg'),\n 'direction' : {\n '' : require('../assets/icons/direction-ltr.svg'),\n 'rtl' : require('../assets/icons/direction-rtl.svg')\n },\n 'float': {\n 'center' : require('../assets/icons/float-center.svg'),\n 'full' : require('../assets/icons/float-full.svg'),\n 'left' : require('../assets/icons/float-left.svg'),\n 'right' : require('../assets/icons/float-right.svg')\n },\n 'formula' : require('../assets/icons/formula.svg'),\n 'header': {\n '1' : require('../assets/icons/header.svg'),\n '2' : require('../assets/icons/header-2.svg')\n },\n 'italic' : require('../assets/icons/italic.svg'),\n 'image' : require('../assets/icons/image.svg'),\n 'indent': {\n '+1' : require('../assets/icons/indent.svg'),\n '-1' : require('../assets/icons/outdent.svg')\n },\n 'link' : require('../assets/icons/link.svg'),\n 'list': {\n 'ordered' : require('../assets/icons/list-ordered.svg'),\n 'bullet' : require('../assets/icons/list-bullet.svg'),\n 'check' : require('../assets/icons/list-check.svg')\n },\n 'script': {\n 'sub' : require('../assets/icons/subscript.svg'),\n 'super' : require('../assets/icons/superscript.svg'),\n },\n 'strike' : require('../assets/icons/strike.svg'),\n 'underline' : require('../assets/icons/underline.svg'),\n 'video' : require('../assets/icons/video.svg')\n};\n\n\n\n// WEBPACK FOOTER //\n// ./ui/icons.js","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registry = require(\"../../registry\");\nvar ShadowBlot = /** @class */ (function () {\n function ShadowBlot(domNode) {\n this.domNode = domNode;\n // @ts-ignore\n this.domNode[Registry.DATA_KEY] = { blot: this };\n }\n Object.defineProperty(ShadowBlot.prototype, \"statics\", {\n // Hack for accessing inherited static methods\n get: function () {\n return this.constructor;\n },\n enumerable: true,\n configurable: true\n });\n ShadowBlot.create = function (value) {\n if (this.tagName == null) {\n throw new Registry.ParchmentError('Blot definition missing tagName');\n }\n var node;\n if (Array.isArray(this.tagName)) {\n if (typeof value === 'string') {\n value = value.toUpperCase();\n if (parseInt(value).toString() === value) {\n value = parseInt(value);\n }\n }\n if (typeof value === 'number') {\n node = document.createElement(this.tagName[value - 1]);\n }\n else if (this.tagName.indexOf(value) > -1) {\n node = document.createElement(value);\n }\n else {\n node = document.createElement(this.tagName[0]);\n }\n }\n else {\n node = document.createElement(this.tagName);\n }\n if (this.className) {\n node.classList.add(this.className);\n }\n return node;\n };\n ShadowBlot.prototype.attach = function () {\n if (this.parent != null) {\n this.scroll = this.parent.scroll;\n }\n };\n ShadowBlot.prototype.clone = function () {\n var domNode = this.domNode.cloneNode(false);\n return Registry.create(domNode);\n };\n ShadowBlot.prototype.detach = function () {\n if (this.parent != null)\n this.parent.removeChild(this);\n // @ts-ignore\n delete this.domNode[Registry.DATA_KEY];\n };\n ShadowBlot.prototype.deleteAt = function (index, length) {\n var blot = this.isolate(index, length);\n blot.remove();\n };\n ShadowBlot.prototype.formatAt = function (index, length, name, value) {\n var blot = this.isolate(index, length);\n if (Registry.query(name, Registry.Scope.BLOT) != null && value) {\n blot.wrap(name, value);\n }\n else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) {\n var parent = Registry.create(this.statics.scope);\n blot.wrap(parent);\n parent.format(name, value);\n }\n };\n ShadowBlot.prototype.insertAt = function (index, value, def) {\n var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);\n var ref = this.split(index);\n this.parent.insertBefore(blot, ref);\n };\n ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) {\n if (refBlot === void 0) { refBlot = null; }\n if (this.parent != null) {\n this.parent.children.remove(this);\n }\n var refDomNode = null;\n parentBlot.children.insertBefore(this, refBlot);\n if (refBlot != null) {\n refDomNode = refBlot.domNode;\n }\n if (this.domNode.parentNode != parentBlot.domNode ||\n this.domNode.nextSibling != refDomNode) {\n parentBlot.domNode.insertBefore(this.domNode, refDomNode);\n }\n this.parent = parentBlot;\n this.attach();\n };\n ShadowBlot.prototype.isolate = function (index, length) {\n var target = this.split(index);\n target.split(length);\n return target;\n };\n ShadowBlot.prototype.length = function () {\n return 1;\n };\n ShadowBlot.prototype.offset = function (root) {\n if (root === void 0) { root = this.parent; }\n if (this.parent == null || this == root)\n return 0;\n return this.parent.children.offset(this) + this.parent.offset(root);\n };\n ShadowBlot.prototype.optimize = function (context) {\n // TODO clean up once we use WeakMap\n // @ts-ignore\n if (this.domNode[Registry.DATA_KEY] != null) {\n // @ts-ignore\n delete this.domNode[Registry.DATA_KEY].mutations;\n }\n };\n ShadowBlot.prototype.remove = function () {\n if (this.domNode.parentNode != null) {\n this.domNode.parentNode.removeChild(this.domNode);\n }\n this.detach();\n };\n ShadowBlot.prototype.replace = function (target) {\n if (target.parent == null)\n return;\n target.parent.insertBefore(this, target.next);\n target.remove();\n };\n ShadowBlot.prototype.replaceWith = function (name, value) {\n var replacement = typeof name === 'string' ? Registry.create(name, value) : name;\n replacement.replace(this);\n return replacement;\n };\n ShadowBlot.prototype.split = function (index, force) {\n return index === 0 ? this : this.next;\n };\n ShadowBlot.prototype.update = function (mutations, context) {\n // Nothing to do by default\n };\n ShadowBlot.prototype.wrap = function (name, value) {\n var wrapper = typeof name === 'string' ? Registry.create(name, value) : name;\n if (this.parent != null) {\n this.parent.insertBefore(wrapper, this.next);\n }\n wrapper.appendChild(this);\n return wrapper;\n };\n ShadowBlot.blotName = 'abstract';\n return ShadowBlot;\n}());\nexports.default = ShadowBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/abstract/shadow.ts\n// module id = 27\n// module chunks = 0","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = require(\"./attributor\");\nvar class_1 = require(\"./class\");\nvar style_1 = require(\"./style\");\nvar Registry = require(\"../registry\");\nvar AttributorStore = /** @class */ (function () {\n function AttributorStore(domNode) {\n this.attributes = {};\n this.domNode = domNode;\n this.build();\n }\n AttributorStore.prototype.attribute = function (attribute, value) {\n // verb\n if (value) {\n if (attribute.add(this.domNode, value)) {\n if (attribute.value(this.domNode) != null) {\n this.attributes[attribute.attrName] = attribute;\n }\n else {\n delete this.attributes[attribute.attrName];\n }\n }\n }\n else {\n attribute.remove(this.domNode);\n delete this.attributes[attribute.attrName];\n }\n };\n AttributorStore.prototype.build = function () {\n var _this = this;\n this.attributes = {};\n var attributes = attributor_1.default.keys(this.domNode);\n var classes = class_1.default.keys(this.domNode);\n var styles = style_1.default.keys(this.domNode);\n attributes\n .concat(classes)\n .concat(styles)\n .forEach(function (name) {\n var attr = Registry.query(name, Registry.Scope.ATTRIBUTE);\n if (attr instanceof attributor_1.default) {\n _this.attributes[attr.attrName] = attr;\n }\n });\n };\n AttributorStore.prototype.copy = function (target) {\n var _this = this;\n Object.keys(this.attributes).forEach(function (key) {\n var value = _this.attributes[key].value(_this.domNode);\n target.format(key, value);\n });\n };\n AttributorStore.prototype.move = function (target) {\n var _this = this;\n this.copy(target);\n Object.keys(this.attributes).forEach(function (key) {\n _this.attributes[key].remove(_this.domNode);\n });\n this.attributes = {};\n };\n AttributorStore.prototype.values = function () {\n var _this = this;\n return Object.keys(this.attributes).reduce(function (attributes, name) {\n attributes[name] = _this.attributes[name].value(_this.domNode);\n return attributes;\n }, {});\n };\n return AttributorStore;\n}());\nexports.default = AttributorStore;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/attributor/store.ts\n// module id = 28\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = require(\"./attributor\");\nfunction match(node, prefix) {\n var className = node.getAttribute('class') || '';\n return className.split(/\\s+/).filter(function (name) {\n return name.indexOf(prefix + \"-\") === 0;\n });\n}\nvar ClassAttributor = /** @class */ (function (_super) {\n __extends(ClassAttributor, _super);\n function ClassAttributor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ClassAttributor.keys = function (node) {\n return (node.getAttribute('class') || '').split(/\\s+/).map(function (name) {\n return name\n .split('-')\n .slice(0, -1)\n .join('-');\n });\n };\n ClassAttributor.prototype.add = function (node, value) {\n if (!this.canAdd(node, value))\n return false;\n this.remove(node);\n node.classList.add(this.keyName + \"-\" + value);\n return true;\n };\n ClassAttributor.prototype.remove = function (node) {\n var matches = match(node, this.keyName);\n matches.forEach(function (name) {\n node.classList.remove(name);\n });\n if (node.classList.length === 0) {\n node.removeAttribute('class');\n }\n };\n ClassAttributor.prototype.value = function (node) {\n var result = match(node, this.keyName)[0] || '';\n var value = result.slice(this.keyName.length + 1); // +1 for hyphen\n return this.canAdd(node, value) ? value : '';\n };\n return ClassAttributor;\n}(attributor_1.default));\nexports.default = ClassAttributor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/attributor/class.ts\n// module id = 29\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = require(\"./attributor\");\nfunction camelize(name) {\n var parts = name.split('-');\n var rest = parts\n .slice(1)\n .map(function (part) {\n return part[0].toUpperCase() + part.slice(1);\n })\n .join('');\n return parts[0] + rest;\n}\nvar StyleAttributor = /** @class */ (function (_super) {\n __extends(StyleAttributor, _super);\n function StyleAttributor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n StyleAttributor.keys = function (node) {\n return (node.getAttribute('style') || '').split(';').map(function (value) {\n var arr = value.split(':');\n return arr[0].trim();\n });\n };\n StyleAttributor.prototype.add = function (node, value) {\n if (!this.canAdd(node, value))\n return false;\n // @ts-ignore\n node.style[camelize(this.keyName)] = value;\n return true;\n };\n StyleAttributor.prototype.remove = function (node) {\n // @ts-ignore\n node.style[camelize(this.keyName)] = '';\n if (!node.getAttribute('style')) {\n node.removeAttribute('style');\n }\n };\n StyleAttributor.prototype.value = function (node) {\n // @ts-ignore\n var value = node.style[camelize(this.keyName)];\n return this.canAdd(node, value) ? value : '';\n };\n return StyleAttributor;\n}(attributor_1.default));\nexports.default = StyleAttributor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/attributor/style.ts\n// module id = 30\n// module chunks = 0","import Parchment from 'parchment';\nimport TextBlot from './text';\n\n\nclass Cursor extends Parchment.Embed {\n static value() {\n return undefined;\n }\n\n constructor(domNode, selection) {\n super(domNode);\n this.selection = selection;\n this.textNode = document.createTextNode(Cursor.CONTENTS);\n this.domNode.appendChild(this.textNode);\n this._length = 0;\n }\n\n detach() {\n // super.detach() will also clear domNode.__blot\n if (this.parent != null) this.parent.removeChild(this);\n }\n\n format(name, value) {\n if (this._length !== 0) {\n return super.format(name, value);\n }\n let target = this, index = 0;\n while (target != null && target.statics.scope !== Parchment.Scope.BLOCK_BLOT) {\n index += target.offset(target.parent);\n target = target.parent;\n }\n if (target != null) {\n this._length = Cursor.CONTENTS.length;\n target.optimize();\n target.formatAt(index, Cursor.CONTENTS.length, name, value);\n this._length = 0;\n }\n }\n\n index(node, offset) {\n if (node === this.textNode) return 0;\n return super.index(node, offset);\n }\n\n length() {\n return this._length;\n }\n\n position() {\n return [this.textNode, this.textNode.data.length];\n }\n\n remove() {\n super.remove();\n this.parent = null;\n }\n\n restore() {\n if (this.selection.composing || this.parent == null) return;\n let textNode = this.textNode;\n let range = this.selection.getNativeRange();\n let restoreText, start, end;\n if (range != null && range.start.node === textNode && range.end.node === textNode) {\n [restoreText, start, end] = [textNode, range.start.offset, range.end.offset];\n }\n // Link format will insert text outside of anchor tag\n while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {\n this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);\n }\n if (this.textNode.data !== Cursor.CONTENTS) {\n let text = this.textNode.data.split(Cursor.CONTENTS).join('');\n if (this.next instanceof TextBlot) {\n restoreText = this.next.domNode;\n this.next.insertAt(0, text);\n this.textNode.data = Cursor.CONTENTS;\n } else {\n this.textNode.data = text;\n this.parent.insertBefore(Parchment.create(this.textNode), this);\n this.textNode = document.createTextNode(Cursor.CONTENTS);\n this.domNode.appendChild(this.textNode);\n }\n }\n this.remove();\n if (start != null) {\n [start, end] = [start, end].map(function(offset) {\n return Math.max(0, Math.min(restoreText.data.length, offset - 1));\n });\n return {\n startNode: restoreText,\n startOffset: start,\n endNode: restoreText,\n endOffset: end\n };\n }\n }\n\n update(mutations, context) {\n if (mutations.some((mutation) => {\n return mutation.type === 'characterData' && mutation.target === this.textNode;\n })) {\n let range = this.restore();\n if (range) context.range = range;\n }\n }\n\n value() {\n return '';\n }\n}\nCursor.blotName = 'cursor';\nCursor.className = 'ql-cursor';\nCursor.tagName = 'span';\nCursor.CONTENTS = \"\\uFEFF\"; // Zero width no break space\n\n\nexport default Cursor;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/cursor.js","class Theme {\n constructor(quill, options) {\n this.quill = quill;\n this.options = options;\n this.modules = {};\n }\n\n init() {\n Object.keys(this.options.modules).forEach((name) => {\n if (this.modules[name] == null) {\n this.addModule(name);\n }\n });\n }\n\n addModule(name) {\n let moduleClass = this.quill.constructor.import(`modules/${name}`);\n this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});\n return this.modules[name];\n }\n}\nTheme.DEFAULTS = {\n modules: {}\n};\nTheme.themes = {\n 'default': Theme\n};\n\n\nexport default Theme;\n\n\n\n// WEBPACK FOOTER //\n// ./core/theme.js","import Parchment from 'parchment';\nimport TextBlot from './text';\n\nconst GUARD_TEXT = \"\\uFEFF\";\n\n\nclass Embed extends Parchment.Embed {\n constructor(node) {\n super(node);\n this.contentNode = document.createElement('span');\n this.contentNode.setAttribute('contenteditable', false);\n [].slice.call(this.domNode.childNodes).forEach((childNode) => {\n this.contentNode.appendChild(childNode);\n });\n this.leftGuard = document.createTextNode(GUARD_TEXT);\n this.rightGuard = document.createTextNode(GUARD_TEXT);\n this.domNode.appendChild(this.leftGuard);\n this.domNode.appendChild(this.contentNode);\n this.domNode.appendChild(this.rightGuard);\n }\n\n index(node, offset) {\n if (node === this.leftGuard) return 0;\n if (node === this.rightGuard) return 1;\n return super.index(node, offset);\n }\n\n restore(node) {\n let range, textNode;\n let text = node.data.split(GUARD_TEXT).join('');\n if (node === this.leftGuard) {\n if (this.prev instanceof TextBlot) {\n let prevLength = this.prev.length();\n this.prev.insertAt(prevLength, text);\n range = {\n startNode: this.prev.domNode,\n startOffset: prevLength + text.length\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(Parchment.create(textNode), this);\n range = {\n startNode: textNode,\n startOffset: text.length\n };\n }\n } else if (node === this.rightGuard) {\n if (this.next instanceof TextBlot) {\n this.next.insertAt(0, text);\n range = {\n startNode: this.next.domNode,\n startOffset: text.length\n }\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(Parchment.create(textNode), this.next);\n range = {\n startNode: textNode,\n startOffset: text.length\n };\n }\n }\n node.data = GUARD_TEXT;\n return range;\n }\n\n update(mutations, context) {\n mutations.forEach((mutation) => {\n if (mutation.type === 'characterData' &&\n (mutation.target === this.leftGuard || mutation.target === this.rightGuard)) {\n let range = this.restore(mutation.target);\n if (range) context.range = range;\n }\n });\n }\n}\n\n\nexport default Embed;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/embed.js","import Parchment from 'parchment';\n\nlet config = {\n scope: Parchment.Scope.BLOCK,\n whitelist: ['right', 'center', 'justify']\n};\n\nlet AlignAttribute = new Parchment.Attributor.Attribute('align', 'align', config);\nlet AlignClass = new Parchment.Attributor.Class('align', 'ql-align', config);\nlet AlignStyle = new Parchment.Attributor.Style('align', 'text-align', config);\n\nexport { AlignAttribute, AlignClass, AlignStyle };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/align.js","import Parchment from 'parchment';\nimport { ColorAttributor } from './color';\n\nlet BackgroundClass = new Parchment.Attributor.Class('background', 'ql-bg', {\n scope: Parchment.Scope.INLINE\n});\nlet BackgroundStyle = new ColorAttributor('background', 'background-color', {\n scope: Parchment.Scope.INLINE\n});\n\nexport { BackgroundClass, BackgroundStyle };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/background.js","import Parchment from 'parchment';\n\nlet config = {\n scope: Parchment.Scope.BLOCK,\n whitelist: ['rtl']\n};\n\nlet DirectionAttribute = new Parchment.Attributor.Attribute('direction', 'dir', config);\nlet DirectionClass = new Parchment.Attributor.Class('direction', 'ql-direction', config);\nlet DirectionStyle = new Parchment.Attributor.Style('direction', 'direction', config);\n\nexport { DirectionAttribute, DirectionClass, DirectionStyle };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/direction.js","import Parchment from 'parchment';\n\nlet config = {\n scope: Parchment.Scope.INLINE,\n whitelist: ['serif', 'monospace']\n};\n\nlet FontClass = new Parchment.Attributor.Class('font', 'ql-font', config);\n\nclass FontStyleAttributor extends Parchment.Attributor.Style {\n value(node) {\n return super.value(node).replace(/[\"']/g, '');\n }\n}\n\nlet FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\nexport { FontStyle, FontClass };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/font.js","import Parchment from 'parchment';\n\nlet SizeClass = new Parchment.Attributor.Class('size', 'ql-size', {\n scope: Parchment.Scope.INLINE,\n whitelist: ['small', 'large', 'huge']\n});\nlet SizeStyle = new Parchment.Attributor.Style('size', 'font-size', {\n scope: Parchment.Scope.INLINE,\n whitelist: ['10px', '18px', '32px']\n});\n\nexport { SizeClass, SizeStyle };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/size.js","import Inline from '../blots/inline';\n\nclass Bold extends Inline {\n static create() {\n return super.create();\n }\n\n static formats() {\n return true;\n }\n\n optimize(context) {\n super.optimize(context);\n if (this.domNode.tagName !== this.statics.tagName[0]) {\n this.replaceWith(this.statics.blotName);\n }\n }\n}\nBold.blotName = 'bold';\nBold.tagName = ['STRONG', 'B'];\n\nexport default Bold;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/bold.js","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/code.svg\n// module id = 40\n// module chunks = 0","import Picker from './picker';\n\n\nclass ColorPicker extends Picker {\n constructor(select, label) {\n super(select);\n this.label.innerHTML = label;\n this.container.classList.add('ql-color-picker');\n [].slice.call(this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function(item) {\n item.classList.add('ql-primary');\n });\n }\n\n buildItem(option) {\n let item = super.buildItem(option);\n item.style.backgroundColor = option.getAttribute('value') || '';\n return item;\n }\n\n selectItem(item, trigger) {\n super.selectItem(item, trigger);\n let colorLabel = this.label.querySelector('.ql-color-label');\n let value = item ? item.getAttribute('data-value') || '' : '';\n if (colorLabel) {\n if (colorLabel.tagName === 'line') {\n colorLabel.style.stroke = value;\n } else {\n colorLabel.style.fill = value;\n }\n }\n }\n}\n\n\nexport default ColorPicker;\n\n\n\n// WEBPACK FOOTER //\n// ./ui/color-picker.js","import Picker from './picker';\n\n\nclass IconPicker extends Picker {\n constructor(select, icons) {\n super(select);\n this.container.classList.add('ql-icon-picker');\n [].forEach.call(this.container.querySelectorAll('.ql-picker-item'), (item) => {\n item.innerHTML = icons[item.getAttribute('data-value') || ''];\n });\n this.defaultItem = this.container.querySelector('.ql-selected');\n this.selectItem(this.defaultItem);\n }\n\n selectItem(item, trigger) {\n super.selectItem(item, trigger);\n item = item || this.defaultItem;\n this.label.innerHTML = item.innerHTML;\n }\n}\n\n\nexport default IconPicker;\n\n\n\n// WEBPACK FOOTER //\n// ./ui/icon-picker.js","class Tooltip {\n constructor(quill, boundsContainer) {\n this.quill = quill;\n this.boundsContainer = boundsContainer || document.body;\n this.root = quill.addContainer('ql-tooltip');\n this.root.innerHTML = this.constructor.TEMPLATE;\n if (this.quill.root === this.quill.scrollingContainer) {\n this.quill.root.addEventListener('scroll', () => {\n this.root.style.marginTop = (-1*this.quill.root.scrollTop) + 'px';\n });\n }\n this.hide();\n }\n\n hide() {\n this.root.classList.add('ql-hidden');\n }\n\n position(reference) {\n let left = reference.left + reference.width/2 - this.root.offsetWidth/2;\n // root.scrollTop should be 0 if scrollContainer !== root\n let top = reference.bottom + this.quill.root.scrollTop;\n this.root.style.left = left + 'px';\n this.root.style.top = top + 'px';\n this.root.classList.remove('ql-flip');\n let containerBounds = this.boundsContainer.getBoundingClientRect();\n let rootBounds = this.root.getBoundingClientRect();\n let shift = 0;\n if (rootBounds.right > containerBounds.right) {\n shift = containerBounds.right - rootBounds.right;\n this.root.style.left = (left + shift) + 'px';\n }\n if (rootBounds.left < containerBounds.left) {\n shift = containerBounds.left - rootBounds.left;\n this.root.style.left = (left + shift) + 'px';\n }\n if (rootBounds.bottom > containerBounds.bottom) {\n let height = rootBounds.bottom - rootBounds.top;\n let verticalShift = reference.bottom - reference.top + height;\n this.root.style.top = (top - verticalShift) + 'px';\n this.root.classList.add('ql-flip');\n }\n return shift;\n }\n\n show() {\n this.root.classList.remove('ql-editing');\n this.root.classList.remove('ql-hidden');\n }\n}\n\n\nexport default Tooltip;\n\n\n\n// WEBPACK FOOTER //\n// ./ui/tooltip.js","import extend from 'extend';\nimport Delta from 'quill-delta';\nimport Emitter from '../core/emitter';\nimport Keyboard from '../modules/keyboard';\nimport Theme from '../core/theme';\nimport ColorPicker from '../ui/color-picker';\nimport IconPicker from '../ui/icon-picker';\nimport Picker from '../ui/picker';\nimport Tooltip from '../ui/tooltip';\n\n\nconst ALIGNS = [ false, 'center', 'right', 'justify' ];\n\nconst COLORS = [\n \"#000000\", \"#e60000\", \"#ff9900\", \"#ffff00\", \"#008a00\", \"#0066cc\", \"#9933ff\",\n \"#ffffff\", \"#facccc\", \"#ffebcc\", \"#ffffcc\", \"#cce8cc\", \"#cce0f5\", \"#ebd6ff\",\n \"#bbbbbb\", \"#f06666\", \"#ffc266\", \"#ffff66\", \"#66b966\", \"#66a3e0\", \"#c285ff\",\n \"#888888\", \"#a10000\", \"#b26b00\", \"#b2b200\", \"#006100\", \"#0047b2\", \"#6b24b2\",\n \"#444444\", \"#5c0000\", \"#663d00\", \"#666600\", \"#003700\", \"#002966\", \"#3d1466\"\n];\n\nconst FONTS = [ false, 'serif', 'monospace' ];\n\nconst HEADERS = [ '1', '2', '3', false ];\n\nconst SIZES = [ 'small', false, 'large', 'huge' ];\n\n\nclass BaseTheme extends Theme {\n constructor(quill, options) {\n super(quill, options);\n let listener = (e) => {\n if (!document.body.contains(quill.root)) {\n return document.body.removeEventListener('click', listener);\n }\n if (this.tooltip != null && !this.tooltip.root.contains(e.target) &&\n document.activeElement !== this.tooltip.textbox && !this.quill.hasFocus()) {\n this.tooltip.hide();\n }\n if (this.pickers != null) {\n this.pickers.forEach(function(picker) {\n if (!picker.container.contains(e.target)) {\n picker.close();\n }\n });\n }\n };\n quill.emitter.listenDOM('click', document.body, listener);\n }\n\n addModule(name) {\n let module = super.addModule(name);\n if (name === 'toolbar') {\n this.extendToolbar(module);\n }\n return module;\n }\n\n buildButtons(buttons, icons) {\n buttons.forEach((button) => {\n let className = button.getAttribute('class') || '';\n className.split(/\\s+/).forEach((name) => {\n if (!name.startsWith('ql-')) return;\n name = name.slice('ql-'.length);\n if (icons[name] == null) return;\n if (name === 'direction') {\n button.innerHTML = icons[name][''] + icons[name]['rtl'];\n } else if (typeof icons[name] === 'string') {\n button.innerHTML = icons[name];\n } else {\n let value = button.value || '';\n if (value != null && icons[name][value]) {\n button.innerHTML = icons[name][value];\n }\n }\n });\n });\n }\n\n buildPickers(selects, icons) {\n this.pickers = selects.map((select) => {\n if (select.classList.contains('ql-align')) {\n if (select.querySelector('option') == null) {\n fillSelect(select, ALIGNS);\n }\n return new IconPicker(select, icons.align);\n } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {\n let format = select.classList.contains('ql-background') ? 'background' : 'color';\n if (select.querySelector('option') == null) {\n fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000');\n }\n return new ColorPicker(select, icons[format]);\n } else {\n if (select.querySelector('option') == null) {\n if (select.classList.contains('ql-font')) {\n fillSelect(select, FONTS);\n } else if (select.classList.contains('ql-header')) {\n fillSelect(select, HEADERS);\n } else if (select.classList.contains('ql-size')) {\n fillSelect(select, SIZES);\n }\n }\n return new Picker(select);\n }\n });\n let update = () => {\n this.pickers.forEach(function(picker) {\n picker.update();\n });\n };\n this.quill.on(Emitter.events.EDITOR_CHANGE, update);\n }\n}\nBaseTheme.DEFAULTS = extend(true, {}, Theme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n formula: function() {\n this.quill.theme.tooltip.edit('formula');\n },\n image: function() {\n let fileInput = this.container.querySelector('input.ql-image[type=file]');\n if (fileInput == null) {\n fileInput = document.createElement('input');\n fileInput.setAttribute('type', 'file');\n fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');\n fileInput.classList.add('ql-image');\n fileInput.addEventListener('change', () => {\n if (fileInput.files != null && fileInput.files[0] != null) {\n let reader = new FileReader();\n reader.onload = (e) => {\n let range = this.quill.getSelection(true);\n this.quill.updateContents(new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert({ image: e.target.result })\n , Emitter.sources.USER);\n this.quill.setSelection(range.index + 1, Emitter.sources.SILENT);\n fileInput.value = \"\";\n }\n reader.readAsDataURL(fileInput.files[0]);\n }\n });\n this.container.appendChild(fileInput);\n }\n fileInput.click();\n },\n video: function() {\n this.quill.theme.tooltip.edit('video');\n }\n }\n }\n }\n});\n\n\nclass BaseTooltip extends Tooltip {\n constructor(quill, boundsContainer) {\n super(quill, boundsContainer);\n this.textbox = this.root.querySelector('input[type=\"text\"]');\n this.listen();\n }\n\n listen() {\n this.textbox.addEventListener('keydown', (event) => {\n if (Keyboard.match(event, 'enter')) {\n this.save();\n event.preventDefault();\n } else if (Keyboard.match(event, 'escape')) {\n this.cancel();\n event.preventDefault();\n }\n });\n }\n\n cancel() {\n this.hide();\n }\n\n edit(mode = 'link', preview = null) {\n this.root.classList.remove('ql-hidden');\n this.root.classList.add('ql-editing');\n if (preview != null) {\n this.textbox.value = preview;\n } else if (mode !== this.root.getAttribute('data-mode')) {\n this.textbox.value = '';\n }\n this.position(this.quill.getBounds(this.quill.selection.savedRange));\n this.textbox.select();\n this.textbox.setAttribute('placeholder', this.textbox.getAttribute(`data-${mode}`) || '');\n this.root.setAttribute('data-mode', mode);\n }\n\n restoreFocus() {\n let scrollTop = this.quill.scrollingContainer.scrollTop;\n this.quill.focus();\n this.quill.scrollingContainer.scrollTop = scrollTop;\n }\n\n save() {\n let value = this.textbox.value;\n switch(this.root.getAttribute('data-mode')) {\n case 'link': {\n let scrollTop = this.quill.root.scrollTop;\n if (this.linkRange) {\n this.quill.formatText(this.linkRange, 'link', value, Emitter.sources.USER);\n delete this.linkRange;\n } else {\n this.restoreFocus();\n this.quill.format('link', value, Emitter.sources.USER);\n }\n this.quill.root.scrollTop = scrollTop;\n break;\n }\n case 'video': {\n value = extractVideoUrl(value);\n } // eslint-disable-next-line no-fallthrough\n case 'formula': {\n if (!value) break;\n let range = this.quill.getSelection(true);\n if (range != null) {\n let index = range.index + range.length;\n this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, Emitter.sources.USER);\n if (this.root.getAttribute('data-mode') === 'formula') {\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER);\n }\n this.quill.setSelection(index + 2, Emitter.sources.USER);\n }\n break;\n }\n default:\n }\n this.textbox.value = '';\n this.hide();\n }\n}\n\n\nfunction extractVideoUrl(url) {\n let match = url.match(/^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtube\\.com\\/watch.*v=([a-zA-Z0-9_-]+)/) ||\n url.match(/^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtu\\.be\\/([a-zA-Z0-9_-]+)/);\n if (match) {\n return (match[1] || 'https') + '://www.youtube.com/embed/' + match[2] + '?showinfo=0';\n }\n if (match = url.match(/^(?:(https?):\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/)) { // eslint-disable-line no-cond-assign\n return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/';\n }\n return url;\n}\n\nfunction fillSelect(select, values, defaultValue = false) {\n values.forEach(function(value) {\n let option = document.createElement('option');\n if (value === defaultValue) {\n option.setAttribute('selected', 'selected');\n } else {\n option.setAttribute('value', value);\n }\n select.appendChild(option);\n });\n}\n\n\nexport { BaseTooltip, BaseTheme as default };\n\n\n\n// WEBPACK FOOTER //\n// ./themes/base.js","import Quill from './core';\n\nimport { AlignClass, AlignStyle } from './formats/align';\nimport { DirectionAttribute, DirectionClass, DirectionStyle } from './formats/direction';\nimport { IndentClass as Indent } from './formats/indent';\n\nimport Blockquote from './formats/blockquote';\nimport Header from './formats/header';\nimport List, { ListItem } from './formats/list';\n\nimport { BackgroundClass, BackgroundStyle } from './formats/background';\nimport { ColorClass, ColorStyle } from './formats/color';\nimport { FontClass, FontStyle } from './formats/font';\nimport { SizeClass, SizeStyle } from './formats/size';\n\nimport Bold from './formats/bold';\nimport Italic from './formats/italic';\nimport Link from './formats/link';\nimport Script from './formats/script';\nimport Strike from './formats/strike';\nimport Underline from './formats/underline';\n\nimport Image from './formats/image';\nimport Video from './formats/video';\n\nimport CodeBlock, { Code as InlineCode } from './formats/code';\n\nimport Formula from './modules/formula';\nimport Syntax from './modules/syntax';\nimport Toolbar from './modules/toolbar';\n\nimport Icons from './ui/icons';\nimport Picker from './ui/picker';\nimport ColorPicker from './ui/color-picker';\nimport IconPicker from './ui/icon-picker';\nimport Tooltip from './ui/tooltip';\n\nimport BubbleTheme from './themes/bubble';\nimport SnowTheme from './themes/snow';\n\n\nQuill.register({\n 'attributors/attribute/direction': DirectionAttribute,\n\n 'attributors/class/align': AlignClass,\n 'attributors/class/background': BackgroundClass,\n 'attributors/class/color': ColorClass,\n 'attributors/class/direction': DirectionClass,\n 'attributors/class/font': FontClass,\n 'attributors/class/size': SizeClass,\n\n 'attributors/style/align': AlignStyle,\n 'attributors/style/background': BackgroundStyle,\n 'attributors/style/color': ColorStyle,\n 'attributors/style/direction': DirectionStyle,\n 'attributors/style/font': FontStyle,\n 'attributors/style/size': SizeStyle\n}, true);\n\n\nQuill.register({\n 'formats/align': AlignClass,\n 'formats/direction': DirectionClass,\n 'formats/indent': Indent,\n\n 'formats/background': BackgroundStyle,\n 'formats/color': ColorStyle,\n 'formats/font': FontClass,\n 'formats/size': SizeClass,\n\n 'formats/blockquote': Blockquote,\n 'formats/code-block': CodeBlock,\n 'formats/header': Header,\n 'formats/list': List,\n\n 'formats/bold': Bold,\n 'formats/code': InlineCode,\n 'formats/italic': Italic,\n 'formats/link': Link,\n 'formats/script': Script,\n 'formats/strike': Strike,\n 'formats/underline': Underline,\n\n 'formats/image': Image,\n 'formats/video': Video,\n\n 'formats/list/item': ListItem,\n\n 'modules/formula': Formula,\n 'modules/syntax': Syntax,\n 'modules/toolbar': Toolbar,\n\n 'themes/bubble': BubbleTheme,\n 'themes/snow': SnowTheme,\n\n 'ui/icons': Icons,\n 'ui/picker': Picker,\n 'ui/icon-picker': IconPicker,\n 'ui/color-picker': ColorPicker,\n 'ui/tooltip': Tooltip\n}, true);\n\n\nexport default Quill;\n\n\n\n// WEBPACK FOOTER //\n// ./quill.js","import Parchment from 'parchment';\nimport Quill from './core/quill';\n\nimport Block, { BlockEmbed } from './blots/block';\nimport Break from './blots/break';\nimport Container from './blots/container';\nimport Cursor from './blots/cursor';\nimport Embed from './blots/embed';\nimport Inline from './blots/inline';\nimport Scroll from './blots/scroll';\nimport TextBlot from './blots/text';\n\nimport Clipboard from './modules/clipboard';\nimport History from './modules/history';\nimport Keyboard from './modules/keyboard';\n\nQuill.register({\n 'blots/block' : Block,\n 'blots/block/embed' : BlockEmbed,\n 'blots/break' : Break,\n 'blots/container' : Container,\n 'blots/cursor' : Cursor,\n 'blots/embed' : Embed,\n 'blots/inline' : Inline,\n 'blots/scroll' : Scroll,\n 'blots/text' : TextBlot,\n\n 'modules/clipboard' : Clipboard,\n 'modules/history' : History,\n 'modules/keyboard' : Keyboard\n});\n\nParchment.register(Block, Break, Cursor, Inline, Scroll, TextBlot);\n\n\nexport default Quill;\n\n\n\n// WEBPACK FOOTER //\n// ./core.js","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LinkedList = /** @class */ (function () {\n function LinkedList() {\n this.head = this.tail = null;\n this.length = 0;\n }\n LinkedList.prototype.append = function () {\n var nodes = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n nodes[_i] = arguments[_i];\n }\n this.insertBefore(nodes[0], null);\n if (nodes.length > 1) {\n this.append.apply(this, nodes.slice(1));\n }\n };\n LinkedList.prototype.contains = function (node) {\n var cur, next = this.iterator();\n while ((cur = next())) {\n if (cur === node)\n return true;\n }\n return false;\n };\n LinkedList.prototype.insertBefore = function (node, refNode) {\n if (!node)\n return;\n node.next = refNode;\n if (refNode != null) {\n node.prev = refNode.prev;\n if (refNode.prev != null) {\n refNode.prev.next = node;\n }\n refNode.prev = node;\n if (refNode === this.head) {\n this.head = node;\n }\n }\n else if (this.tail != null) {\n this.tail.next = node;\n node.prev = this.tail;\n this.tail = node;\n }\n else {\n node.prev = null;\n this.head = this.tail = node;\n }\n this.length += 1;\n };\n LinkedList.prototype.offset = function (target) {\n var index = 0, cur = this.head;\n while (cur != null) {\n if (cur === target)\n return index;\n index += cur.length();\n cur = cur.next;\n }\n return -1;\n };\n LinkedList.prototype.remove = function (node) {\n if (!this.contains(node))\n return;\n if (node.prev != null)\n node.prev.next = node.next;\n if (node.next != null)\n node.next.prev = node.prev;\n if (node === this.head)\n this.head = node.next;\n if (node === this.tail)\n this.tail = node.prev;\n this.length -= 1;\n };\n LinkedList.prototype.iterator = function (curNode) {\n if (curNode === void 0) { curNode = this.head; }\n // TODO use yield when we can\n return function () {\n var ret = curNode;\n if (curNode != null)\n curNode = curNode.next;\n return ret;\n };\n };\n LinkedList.prototype.find = function (index, inclusive) {\n if (inclusive === void 0) { inclusive = false; }\n var cur, next = this.iterator();\n while ((cur = next())) {\n var length = cur.length();\n if (index < length ||\n (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) {\n return [cur, index];\n }\n index -= length;\n }\n return [null, 0];\n };\n LinkedList.prototype.forEach = function (callback) {\n var cur, next = this.iterator();\n while ((cur = next())) {\n callback(cur);\n }\n };\n LinkedList.prototype.forEachAt = function (index, length, callback) {\n if (length <= 0)\n return;\n var _a = this.find(index), startNode = _a[0], offset = _a[1];\n var cur, curIndex = index - offset, next = this.iterator(startNode);\n while ((cur = next()) && curIndex < index + length) {\n var curLength = cur.length();\n if (index > curIndex) {\n callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index));\n }\n else {\n callback(cur, 0, Math.min(curLength, index + length - curIndex));\n }\n curIndex += curLength;\n }\n };\n LinkedList.prototype.map = function (callback) {\n return this.reduce(function (memo, cur) {\n memo.push(callback(cur));\n return memo;\n }, []);\n };\n LinkedList.prototype.reduce = function (callback, memo) {\n var cur, next = this.iterator();\n while ((cur = next())) {\n memo = callback(memo, cur);\n }\n return memo;\n };\n return LinkedList;\n}());\nexports.default = LinkedList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/collection/linked-list.ts\n// module id = 47\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar container_1 = require(\"./abstract/container\");\nvar Registry = require(\"../registry\");\nvar OBSERVER_CONFIG = {\n attributes: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n};\nvar MAX_OPTIMIZE_ITERATIONS = 100;\nvar ScrollBlot = /** @class */ (function (_super) {\n __extends(ScrollBlot, _super);\n function ScrollBlot(node) {\n var _this = _super.call(this, node) || this;\n _this.scroll = _this;\n _this.observer = new MutationObserver(function (mutations) {\n _this.update(mutations);\n });\n _this.observer.observe(_this.domNode, OBSERVER_CONFIG);\n _this.attach();\n return _this;\n }\n ScrollBlot.prototype.detach = function () {\n _super.prototype.detach.call(this);\n this.observer.disconnect();\n };\n ScrollBlot.prototype.deleteAt = function (index, length) {\n this.update();\n if (index === 0 && length === this.length()) {\n this.children.forEach(function (child) {\n child.remove();\n });\n }\n else {\n _super.prototype.deleteAt.call(this, index, length);\n }\n };\n ScrollBlot.prototype.formatAt = function (index, length, name, value) {\n this.update();\n _super.prototype.formatAt.call(this, index, length, name, value);\n };\n ScrollBlot.prototype.insertAt = function (index, value, def) {\n this.update();\n _super.prototype.insertAt.call(this, index, value, def);\n };\n ScrollBlot.prototype.optimize = function (mutations, context) {\n var _this = this;\n if (mutations === void 0) { mutations = []; }\n if (context === void 0) { context = {}; }\n _super.prototype.optimize.call(this, context);\n // We must modify mutations directly, cannot make copy and then modify\n var records = [].slice.call(this.observer.takeRecords());\n // Array.push currently seems to be implemented by a non-tail recursive function\n // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());\n while (records.length > 0)\n mutations.push(records.pop());\n // TODO use WeakMap\n var mark = function (blot, markParent) {\n if (markParent === void 0) { markParent = true; }\n if (blot == null || blot === _this)\n return;\n if (blot.domNode.parentNode == null)\n return;\n // @ts-ignore\n if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations = [];\n }\n if (markParent)\n mark(blot.parent);\n };\n var optimize = function (blot) {\n // Post-order traversal\n if (\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY] == null ||\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations == null) {\n return;\n }\n if (blot instanceof container_1.default) {\n blot.children.forEach(optimize);\n }\n blot.optimize(context);\n };\n var remaining = mutations;\n for (var i = 0; remaining.length > 0; i += 1) {\n if (i >= MAX_OPTIMIZE_ITERATIONS) {\n throw new Error('[Parchment] Maximum optimize iterations reached');\n }\n remaining.forEach(function (mutation) {\n var blot = Registry.find(mutation.target, true);\n if (blot == null)\n return;\n if (blot.domNode === mutation.target) {\n if (mutation.type === 'childList') {\n mark(Registry.find(mutation.previousSibling, false));\n [].forEach.call(mutation.addedNodes, function (node) {\n var child = Registry.find(node, false);\n mark(child, false);\n if (child instanceof container_1.default) {\n child.children.forEach(function (grandChild) {\n mark(grandChild, false);\n });\n }\n });\n }\n else if (mutation.type === 'attributes') {\n mark(blot.prev);\n }\n }\n mark(blot);\n });\n this.children.forEach(optimize);\n remaining = [].slice.call(this.observer.takeRecords());\n records = remaining.slice();\n while (records.length > 0)\n mutations.push(records.pop());\n }\n };\n ScrollBlot.prototype.update = function (mutations, context) {\n var _this = this;\n if (context === void 0) { context = {}; }\n mutations = mutations || this.observer.takeRecords();\n // TODO use WeakMap\n mutations\n .map(function (mutation) {\n var blot = Registry.find(mutation.target, true);\n if (blot == null)\n return null;\n // @ts-ignore\n if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations = [mutation];\n return blot;\n }\n else {\n // @ts-ignore\n blot.domNode[Registry.DATA_KEY].mutations.push(mutation);\n return null;\n }\n })\n .forEach(function (blot) {\n if (blot == null ||\n blot === _this ||\n //@ts-ignore\n blot.domNode[Registry.DATA_KEY] == null)\n return;\n // @ts-ignore\n blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context);\n });\n // @ts-ignore\n if (this.domNode[Registry.DATA_KEY].mutations != null) {\n // @ts-ignore\n _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context);\n }\n this.optimize(mutations, context);\n };\n ScrollBlot.blotName = 'scroll';\n ScrollBlot.defaultChild = 'block';\n ScrollBlot.scope = Registry.Scope.BLOCK_BLOT;\n ScrollBlot.tagName = 'DIV';\n return ScrollBlot;\n}(container_1.default));\nexports.default = ScrollBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/scroll.ts\n// module id = 48\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar format_1 = require(\"./abstract/format\");\nvar Registry = require(\"../registry\");\n// Shallow object comparison\nfunction isEqual(obj1, obj2) {\n if (Object.keys(obj1).length !== Object.keys(obj2).length)\n return false;\n // @ts-ignore\n for (var prop in obj1) {\n // @ts-ignore\n if (obj1[prop] !== obj2[prop])\n return false;\n }\n return true;\n}\nvar InlineBlot = /** @class */ (function (_super) {\n __extends(InlineBlot, _super);\n function InlineBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n InlineBlot.formats = function (domNode) {\n if (domNode.tagName === InlineBlot.tagName)\n return undefined;\n return _super.formats.call(this, domNode);\n };\n InlineBlot.prototype.format = function (name, value) {\n var _this = this;\n if (name === this.statics.blotName && !value) {\n this.children.forEach(function (child) {\n if (!(child instanceof format_1.default)) {\n child = child.wrap(InlineBlot.blotName, true);\n }\n _this.attributes.copy(child);\n });\n this.unwrap();\n }\n else {\n _super.prototype.format.call(this, name, value);\n }\n };\n InlineBlot.prototype.formatAt = function (index, length, name, value) {\n if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) {\n var blot = this.isolate(index, length);\n blot.format(name, value);\n }\n else {\n _super.prototype.formatAt.call(this, index, length, name, value);\n }\n };\n InlineBlot.prototype.optimize = function (context) {\n _super.prototype.optimize.call(this, context);\n var formats = this.formats();\n if (Object.keys(formats).length === 0) {\n return this.unwrap(); // unformatted span\n }\n var next = this.next;\n if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) {\n next.moveChildren(this);\n next.remove();\n }\n };\n InlineBlot.blotName = 'inline';\n InlineBlot.scope = Registry.Scope.INLINE_BLOT;\n InlineBlot.tagName = 'SPAN';\n return InlineBlot;\n}(format_1.default));\nexports.default = InlineBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/inline.ts\n// module id = 49\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar format_1 = require(\"./abstract/format\");\nvar Registry = require(\"../registry\");\nvar BlockBlot = /** @class */ (function (_super) {\n __extends(BlockBlot, _super);\n function BlockBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n BlockBlot.formats = function (domNode) {\n var tagName = Registry.query(BlockBlot.blotName).tagName;\n if (domNode.tagName === tagName)\n return undefined;\n return _super.formats.call(this, domNode);\n };\n BlockBlot.prototype.format = function (name, value) {\n if (Registry.query(name, Registry.Scope.BLOCK) == null) {\n return;\n }\n else if (name === this.statics.blotName && !value) {\n this.replaceWith(BlockBlot.blotName);\n }\n else {\n _super.prototype.format.call(this, name, value);\n }\n };\n BlockBlot.prototype.formatAt = function (index, length, name, value) {\n if (Registry.query(name, Registry.Scope.BLOCK) != null) {\n this.format(name, value);\n }\n else {\n _super.prototype.formatAt.call(this, index, length, name, value);\n }\n };\n BlockBlot.prototype.insertAt = function (index, value, def) {\n if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) {\n // Insert text or inline\n _super.prototype.insertAt.call(this, index, value, def);\n }\n else {\n var after = this.split(index);\n var blot = Registry.create(value, def);\n after.parent.insertBefore(blot, after);\n }\n };\n BlockBlot.prototype.update = function (mutations, context) {\n if (navigator.userAgent.match(/Trident/)) {\n this.build();\n }\n else {\n _super.prototype.update.call(this, mutations, context);\n }\n };\n BlockBlot.blotName = 'block';\n BlockBlot.scope = Registry.Scope.BLOCK_BLOT;\n BlockBlot.tagName = 'P';\n return BlockBlot;\n}(format_1.default));\nexports.default = BlockBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/block.ts\n// module id = 50\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar leaf_1 = require(\"./abstract/leaf\");\nvar EmbedBlot = /** @class */ (function (_super) {\n __extends(EmbedBlot, _super);\n function EmbedBlot() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n EmbedBlot.formats = function (domNode) {\n return undefined;\n };\n EmbedBlot.prototype.format = function (name, value) {\n // super.formatAt wraps, which is what we want in general,\n // but this allows subclasses to overwrite for formats\n // that just apply to particular embeds\n _super.prototype.formatAt.call(this, 0, this.length(), name, value);\n };\n EmbedBlot.prototype.formatAt = function (index, length, name, value) {\n if (index === 0 && length === this.length()) {\n this.format(name, value);\n }\n else {\n _super.prototype.formatAt.call(this, index, length, name, value);\n }\n };\n EmbedBlot.prototype.formats = function () {\n return this.statics.formats(this.domNode);\n };\n return EmbedBlot;\n}(leaf_1.default));\nexports.default = EmbedBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/embed.ts\n// module id = 51\n// module chunks = 0","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar leaf_1 = require(\"./abstract/leaf\");\nvar Registry = require(\"../registry\");\nvar TextBlot = /** @class */ (function (_super) {\n __extends(TextBlot, _super);\n function TextBlot(node) {\n var _this = _super.call(this, node) || this;\n _this.text = _this.statics.value(_this.domNode);\n return _this;\n }\n TextBlot.create = function (value) {\n return document.createTextNode(value);\n };\n TextBlot.value = function (domNode) {\n var text = domNode.data;\n // @ts-ignore\n if (text['normalize'])\n text = text['normalize']();\n return text;\n };\n TextBlot.prototype.deleteAt = function (index, length) {\n this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length);\n };\n TextBlot.prototype.index = function (node, offset) {\n if (this.domNode === node) {\n return offset;\n }\n return -1;\n };\n TextBlot.prototype.insertAt = function (index, value, def) {\n if (def == null) {\n this.text = this.text.slice(0, index) + value + this.text.slice(index);\n this.domNode.data = this.text;\n }\n else {\n _super.prototype.insertAt.call(this, index, value, def);\n }\n };\n TextBlot.prototype.length = function () {\n return this.text.length;\n };\n TextBlot.prototype.optimize = function (context) {\n _super.prototype.optimize.call(this, context);\n this.text = this.statics.value(this.domNode);\n if (this.text.length === 0) {\n this.remove();\n }\n else if (this.next instanceof TextBlot && this.next.prev === this) {\n this.insertAt(this.length(), this.next.value());\n this.next.remove();\n }\n };\n TextBlot.prototype.position = function (index, inclusive) {\n if (inclusive === void 0) { inclusive = false; }\n return [this.domNode, index];\n };\n TextBlot.prototype.split = function (index, force) {\n if (force === void 0) { force = false; }\n if (!force) {\n if (index === 0)\n return this;\n if (index === this.length())\n return this.next;\n }\n var after = Registry.create(this.domNode.splitText(index));\n this.parent.insertBefore(after, this.next);\n this.text = this.statics.value(this.domNode);\n return after;\n };\n TextBlot.prototype.update = function (mutations, context) {\n var _this = this;\n if (mutations.some(function (mutation) {\n return mutation.type === 'characterData' && mutation.target === _this.domNode;\n })) {\n this.text = this.statics.value(this.domNode);\n }\n };\n TextBlot.prototype.value = function () {\n return this.text;\n };\n TextBlot.blotName = 'text';\n TextBlot.scope = Registry.Scope.INLINE_BLOT;\n return TextBlot;\n}(leaf_1.default));\nexports.default = TextBlot;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/parchment/src/blot/text.ts\n// module id = 52\n// module chunks = 0","let elem = document.createElement('div');\nelem.classList.toggle('test-class', false);\nif (elem.classList.contains('test-class')) {\n let _toggle = DOMTokenList.prototype.toggle;\n DOMTokenList.prototype.toggle = function(token, force) {\n if (arguments.length > 1 && !this.contains(token) === !force) {\n return force;\n } else {\n return _toggle.call(this, token);\n }\n };\n}\n\nif (!String.prototype.startsWith) {\n String.prototype.startsWith = function(searchString, position){\n position = position || 0;\n return this.substr(position, searchString.length) === searchString;\n };\n}\n\nif (!String.prototype.endsWith) {\n String.prototype.endsWith = function(searchString, position) {\n var subjectString = this.toString();\n if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {\n position = subjectString.length;\n }\n position -= searchString.length;\n var lastIndex = subjectString.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n };\n}\n\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, \"find\", {\n value: function(predicate) {\n if (this === null) {\n throw new TypeError('Array.prototype.find called on null or undefined');\n }\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n var list = Object(this);\n var length = list.length >>> 0;\n var thisArg = arguments[1];\n var value;\n\n for (var i = 0; i < length; i++) {\n value = list[i];\n if (predicate.call(thisArg, value, i, list)) {\n return value;\n }\n }\n return undefined;\n }\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n // Disable resizing in Firefox\n document.execCommand(\"enableObjectResizing\", false, false);\n // Disable automatic linkifying in IE11\n document.execCommand(\"autoUrlDetect\", false, false);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./core/polyfill.js","/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {Int} cursor_pos Expected edit position in text1 (optional)\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2, cursor_pos) {\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [[DIFF_EQUAL, text1]];\n }\n return [];\n }\n\n // Check cursor_pos within bounds\n if (cursor_pos < 0 || text1.length < cursor_pos) {\n cursor_pos = null;\n }\n\n // Trim off common prefix (speedup).\n var commonlength = diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = diff_compute_(text1, text2);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift([DIFF_EQUAL, commonprefix]);\n }\n if (commonsuffix) {\n diffs.push([DIFF_EQUAL, commonsuffix]);\n }\n diff_cleanupMerge(diffs);\n if (cursor_pos != null) {\n diffs = fix_cursor(diffs, cursor_pos);\n }\n diffs = fix_emoji(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [[DIFF_INSERT, text2]];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [[DIFF_DELETE, text1]];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [[DIFF_INSERT, longtext.substring(0, i)],\n [DIFF_EQUAL, shorttext],\n [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n }\n\n // Check to see if the problem can be split in two.\n var hm = diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = diff_main(text1_a, text2_a);\n var diffs_b = diff_main(text1_b, text2_b);\n // Merge the results.\n return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n }\n\n return diff_bisect_(text1, text2);\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = diff_main(text1a, text2a);\n var diffsb = diff_main(text1b, text2b);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\nfunction diff_commonPrefix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n */\nfunction diff_cleanupMerge(diffs) {\n diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, [DIFF_EQUAL,\n text_insert.substring(0, commonlength)]);\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n if (count_delete === 0) {\n diffs.splice(pointer - count_insert,\n count_delete + count_insert, [DIFF_INSERT, text_insert]);\n } else if (count_insert === 0) {\n diffs.splice(pointer - count_delete,\n count_delete + count_insert, [DIFF_DELETE, text_delete]);\n } else {\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert, [DIFF_DELETE, text_delete],\n [DIFF_INSERT, text_insert]);\n }\n pointer = pointer - count_delete - count_insert +\n (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n diff_cleanupMerge(diffs);\n }\n};\n\n\nvar diff = diff_main;\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\nmodule.exports = diff;\n\n/*\n * Modify a diff such that the cursor position points to the start of a change:\n * E.g.\n * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1)\n * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]]\n * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2)\n * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]]\n *\n * @param {Array} diffs Array of diff tuples\n * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n * @return {Array} A tuple [cursor location in the modified diff, modified diff]\n */\nfunction cursor_normalize_diff (diffs, cursor_pos) {\n if (cursor_pos === 0) {\n return [DIFF_EQUAL, diffs];\n }\n for (var current_pos = 0, i = 0; i < diffs.length; i++) {\n var d = diffs[i];\n if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) {\n var next_pos = current_pos + d[1].length;\n if (cursor_pos === next_pos) {\n return [i + 1, diffs];\n } else if (cursor_pos < next_pos) {\n // copy to prevent side effects\n diffs = diffs.slice();\n // split d into two diff changes\n var split_pos = cursor_pos - current_pos;\n var d_left = [d[0], d[1].slice(0, split_pos)];\n var d_right = [d[0], d[1].slice(split_pos)];\n diffs.splice(i, 1, d_left, d_right);\n return [i + 1, diffs];\n } else {\n current_pos = next_pos;\n }\n }\n }\n throw new Error('cursor_pos is out of bounds!')\n}\n\n/*\n * Modify a diff such that the edit position is \"shifted\" to the proposed edit location (cursor_position).\n *\n * Case 1)\n * Check if a naive shift is possible:\n * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X)\n * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result\n * Case 2)\n * Check if the following shifts are possible:\n * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix']\n * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix']\n * ^ ^\n * d d_next\n *\n * @param {Array} diffs Array of diff tuples\n * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n * @return {Array} Array of diff tuples\n */\nfunction fix_cursor (diffs, cursor_pos) {\n var norm = cursor_normalize_diff(diffs, cursor_pos);\n var ndiffs = norm[1];\n var cursor_pointer = norm[0];\n var d = ndiffs[cursor_pointer];\n var d_next = ndiffs[cursor_pointer + 1];\n\n if (d == null) {\n // Text was deleted from end of original string,\n // cursor is now out of bounds in new string\n return diffs;\n } else if (d[0] !== DIFF_EQUAL) {\n // A modification happened at the cursor location.\n // This is the expected outcome, so we can return the original diff.\n return diffs;\n } else {\n if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) {\n // Case 1)\n // It is possible to perform a naive shift\n ndiffs.splice(cursor_pointer, 2, d_next, d)\n return merge_tuples(ndiffs, cursor_pointer, 2)\n } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) {\n // Case 2)\n // d[1] is a prefix of d_next[1]\n // We can assume that d_next[0] !== 0, since d[0] === 0\n // Shift edit locations..\n ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]);\n var suffix = d_next[1].slice(d[1].length);\n if (suffix.length > 0) {\n ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]);\n }\n return merge_tuples(ndiffs, cursor_pointer, 3)\n } else {\n // Not possible to perform any modification\n return diffs;\n }\n }\n}\n\n/*\n * Check diff did not split surrogate pairs.\n * Ex. [0, '\\uD83D'], [-1, '\\uDC36'], [1, '\\uDC2F'] -> [-1, '\\uD83D\\uDC36'], [1, '\\uD83D\\uDC2F']\n * '\\uD83D\\uDC36' === '🐶', '\\uD83D\\uDC2F' === '🐯'\n *\n * @param {Array} diffs Array of diff tuples\n * @return {Array} Array of diff tuples\n */\nfunction fix_emoji (diffs) {\n var compact = false;\n var starts_with_pair_end = function(str) {\n return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF;\n }\n var ends_with_pair_start = function(str) {\n return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF;\n }\n for (var i = 2; i < diffs.length; i += 1) {\n if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) &&\n diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) &&\n diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) {\n compact = true;\n\n diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1];\n diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1];\n\n diffs[i-2][1] = diffs[i-2][1].slice(0, -1);\n }\n }\n if (!compact) {\n return diffs;\n }\n var fixed_diffs = [];\n for (var i = 0; i < diffs.length; i += 1) {\n if (diffs[i][1].length > 0) {\n fixed_diffs.push(diffs[i]);\n }\n }\n return fixed_diffs;\n}\n\n/*\n * Try to merge tuples with their neigbors in a given range.\n * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab']\n *\n * @param {Array} diffs Array of diff tuples.\n * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]).\n * @param {Int} length Number of consecutive elements to check.\n * @return {Array} Array of merged diff tuples.\n */\nfunction merge_tuples (diffs, start, length) {\n // Check from (start-1) to (start+length).\n for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) {\n if (i + 1 < diffs.length) {\n var left_d = diffs[i];\n var right_d = diffs[i+1];\n if (left_d[0] === right_d[1]) {\n diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]);\n }\n }\n }\n return diffs;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fast-diff/diff.js\n// module id = 54\n// module chunks = 0","exports = module.exports = typeof Object.keys === 'function'\n ? Object.keys : shim;\n\nexports.shim = shim;\nfunction shim (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/deep-equal/lib/keys.js\n// module id = 55\n// module chunks = 0","var supportsArgumentsClass = (function(){\n return Object.prototype.toString.call(arguments)\n})() == '[object Arguments]';\n\nexports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\nexports.supported = supported;\nfunction supported(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n};\n\nexports.unsupported = unsupported;\nfunction unsupported(object){\n return object &&\n typeof object == 'object' &&\n typeof object.length == 'number' &&\n Object.prototype.hasOwnProperty.call(object, 'callee') &&\n !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n false;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/deep-equal/lib/is_arguments.js\n// module id = 56\n// module chunks = 0","import Delta from 'quill-delta';\nimport DeltaOp from 'quill-delta/lib/op';\nimport Parchment from 'parchment';\nimport CodeBlock from '../formats/code';\nimport CursorBlot from '../blots/cursor';\nimport Block, { bubbleFormats } from '../blots/block';\nimport Break from '../blots/break';\nimport clone from 'clone';\nimport equal from 'deep-equal';\nimport extend from 'extend';\n\n\nconst ASCII = /^[ -~]*$/;\n\n\nclass Editor {\n constructor(scroll) {\n this.scroll = scroll;\n this.delta = this.getDelta();\n }\n\n applyDelta(delta) {\n let consumeNextNewline = false;\n this.scroll.update();\n let scrollLength = this.scroll.length();\n this.scroll.batchStart();\n delta = normalizeDelta(delta);\n delta.reduce((index, op) => {\n let length = op.retain || op.delete || op.insert.length || 1;\n let attributes = op.attributes || {};\n if (op.insert != null) {\n if (typeof op.insert === 'string') {\n let text = op.insert;\n if (text.endsWith('\\n') && consumeNextNewline) {\n consumeNextNewline = false;\n text = text.slice(0, -1);\n }\n if (index >= scrollLength && !text.endsWith('\\n')) {\n consumeNextNewline = true;\n }\n this.scroll.insertAt(index, text);\n let [line, offset] = this.scroll.line(index);\n let formats = extend({}, bubbleFormats(line));\n if (line instanceof Block) {\n let [leaf, ] = line.descendant(Parchment.Leaf, offset);\n formats = extend(formats, bubbleFormats(leaf));\n }\n attributes = DeltaOp.attributes.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n let key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n this.scroll.insertAt(index, key, op.insert[key]);\n }\n scrollLength += length;\n }\n Object.keys(attributes).forEach((name) => {\n this.scroll.formatAt(index, length, name, attributes[name]);\n });\n return index + length;\n }, 0);\n delta.reduce((index, op) => {\n if (typeof op.delete === 'number') {\n this.scroll.deleteAt(index, op.delete);\n return index;\n }\n return index + (op.retain || op.insert.length || 1);\n }, 0);\n this.scroll.batchEnd();\n return this.update(delta);\n }\n\n deleteText(index, length) {\n this.scroll.deleteAt(index, length);\n return this.update(new Delta().retain(index).delete(length));\n }\n\n formatLine(index, length, formats = {}) {\n this.scroll.update();\n Object.keys(formats).forEach((format) => {\n if (this.scroll.whitelist != null && !this.scroll.whitelist[format]) return;\n let lines = this.scroll.lines(index, Math.max(length, 1));\n let lengthRemaining = length;\n lines.forEach((line) => {\n let lineLength = line.length();\n if (!(line instanceof CodeBlock)) {\n line.format(format, formats[format]);\n } else {\n let codeIndex = index - line.offset(this.scroll);\n let codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1;\n line.formatAt(codeIndex, codeLength, format, formats[format]);\n }\n lengthRemaining -= lineLength;\n });\n });\n this.scroll.optimize();\n return this.update(new Delta().retain(index).retain(length, clone(formats)));\n }\n\n formatText(index, length, formats = {}) {\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, length, format, formats[format]);\n });\n return this.update(new Delta().retain(index).retain(length, clone(formats)));\n }\n\n getContents(index, length) {\n return this.delta.slice(index, index + length);\n }\n\n getDelta() {\n return this.scroll.lines().reduce((delta, line) => {\n return delta.concat(line.delta());\n }, new Delta());\n }\n\n getFormat(index, length = 0) {\n let lines = [], leaves = [];\n if (length === 0) {\n this.scroll.path(index).forEach(function(path) {\n let [blot, ] = path;\n if (blot instanceof Block) {\n lines.push(blot);\n } else if (blot instanceof Parchment.Leaf) {\n leaves.push(blot);\n }\n });\n } else {\n lines = this.scroll.lines(index, length);\n leaves = this.scroll.descendants(Parchment.Leaf, index, length);\n }\n let formatsArr = [lines, leaves].map(function(blots) {\n if (blots.length === 0) return {};\n let formats = bubbleFormats(blots.shift());\n while (Object.keys(formats).length > 0) {\n let blot = blots.shift();\n if (blot == null) return formats;\n formats = combineFormats(bubbleFormats(blot), formats);\n }\n return formats;\n });\n return extend.apply(extend, formatsArr);\n }\n\n getText(index, length) {\n return this.getContents(index, length).filter(function(op) {\n return typeof op.insert === 'string';\n }).map(function(op) {\n return op.insert;\n }).join('');\n }\n\n insertEmbed(index, embed, value) {\n this.scroll.insertAt(index, embed, value);\n return this.update(new Delta().retain(index).insert({ [embed]: value }));\n }\n\n insertText(index, text, formats = {}) {\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n this.scroll.insertAt(index, text);\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, text.length, format, formats[format]);\n });\n return this.update(new Delta().retain(index).insert(text, clone(formats)));\n }\n\n isBlank() {\n if (this.scroll.children.length == 0) return true;\n if (this.scroll.children.length > 1) return false;\n let block = this.scroll.children.head;\n if (block.statics.blotName !== Block.blotName) return false;\n if (block.children.length > 1) return false;\n return block.children.head instanceof Break;\n }\n\n removeFormat(index, length) {\n let text = this.getText(index, length);\n let [line, offset] = this.scroll.line(index + length);\n let suffixLength = 0, suffix = new Delta();\n if (line != null) {\n if (!(line instanceof CodeBlock)) {\n suffixLength = line.length() - offset;\n } else {\n suffixLength = line.newlineIndex(offset) - offset + 1;\n }\n suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\\n');\n }\n let contents = this.getContents(index, length + suffixLength);\n let diff = contents.diff(new Delta().insert(text).concat(suffix));\n let delta = new Delta().retain(index).concat(diff);\n return this.applyDelta(delta);\n }\n\n update(change, mutations = [], cursorIndex = undefined) {\n let oldDelta = this.delta;\n if (mutations.length === 1 &&\n mutations[0].type === 'characterData' &&\n mutations[0].target.data.match(ASCII) &&\n Parchment.find(mutations[0].target)) {\n // Optimization for character changes\n let textBlot = Parchment.find(mutations[0].target);\n let formats = bubbleFormats(textBlot);\n let index = textBlot.offset(this.scroll);\n let oldValue = mutations[0].oldValue.replace(CursorBlot.CONTENTS, '');\n let oldText = new Delta().insert(oldValue);\n let newText = new Delta().insert(textBlot.value());\n let diffDelta = new Delta().retain(index).concat(oldText.diff(newText, cursorIndex));\n change = diffDelta.reduce(function(delta, op) {\n if (op.insert) {\n return delta.insert(op.insert, formats);\n } else {\n return delta.push(op);\n }\n }, new Delta());\n this.delta = oldDelta.compose(change);\n } else {\n this.delta = this.getDelta();\n if (!change || !equal(oldDelta.compose(change), this.delta)) {\n change = oldDelta.diff(this.delta, cursorIndex);\n }\n }\n return change;\n }\n}\n\n\nfunction combineFormats(formats, combined) {\n return Object.keys(combined).reduce(function(merged, name) {\n if (formats[name] == null) return merged;\n if (combined[name] === formats[name]) {\n merged[name] = combined[name];\n } else if (Array.isArray(combined[name])) {\n if (combined[name].indexOf(formats[name]) < 0) {\n merged[name] = combined[name].concat([formats[name]]);\n }\n } else {\n merged[name] = [combined[name], formats[name]];\n }\n return merged;\n }, {});\n}\n\nfunction normalizeDelta(delta) {\n return delta.reduce(function(delta, op) {\n if (op.insert === 1) {\n let attributes = clone(op.attributes);\n delete attributes['image'];\n return delta.insert({ image: op.attributes.image }, attributes);\n }\n if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) {\n op = clone(op);\n if (op.attributes.list) {\n op.attributes.list = 'ordered';\n } else {\n op.attributes.list = 'bullet';\n delete op.attributes.bullet;\n }\n }\n if (typeof op.insert === 'string') {\n let text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return delta.insert(text, op.attributes);\n }\n return delta.push(op);\n }, new Delta());\n}\n\n\nexport default Editor;\n\n\n\n// WEBPACK FOOTER //\n// ./core/editor.js","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn\n && (!once || listeners.once)\n && (!context || listeners.context === context)\n ) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/eventemitter3/index.js\n// module id = 58\n// module chunks = 0","import Parchment from 'parchment';\nimport Emitter from '../core/emitter';\nimport Block, { BlockEmbed } from './block';\nimport Break from './break';\nimport CodeBlock from '../formats/code';\nimport Container from './container';\n\n\nfunction isLine(blot) {\n return (blot instanceof Block || blot instanceof BlockEmbed);\n}\n\n\nclass Scroll extends Parchment.Scroll {\n constructor(domNode, config) {\n super(domNode);\n this.emitter = config.emitter;\n if (Array.isArray(config.whitelist)) {\n this.whitelist = config.whitelist.reduce(function(whitelist, format) {\n whitelist[format] = true;\n return whitelist;\n }, {});\n }\n // Some reason fixes composition issues with character languages in Windows/Chrome, Safari\n this.domNode.addEventListener('DOMNodeInserted', function() {});\n this.optimize();\n this.enable();\n }\n\n batchStart() {\n this.batch = true;\n }\n\n batchEnd() {\n this.batch = false;\n this.optimize();\n }\n\n deleteAt(index, length) {\n let [first, offset] = this.line(index);\n let [last, ] = this.line(index + length);\n super.deleteAt(index, length);\n if (last != null && first !== last && offset > 0) {\n if (first instanceof BlockEmbed || last instanceof BlockEmbed) {\n this.optimize();\n return;\n }\n if (first instanceof CodeBlock) {\n let newlineIndex = first.newlineIndex(first.length(), true);\n if (newlineIndex > -1) {\n first = first.split(newlineIndex + 1);\n if (first === last) {\n this.optimize();\n return;\n }\n }\n } else if (last instanceof CodeBlock) {\n let newlineIndex = last.newlineIndex(0);\n if (newlineIndex > -1) {\n last.split(newlineIndex + 1);\n }\n }\n let ref = last.children.head instanceof Break ? null : last.children.head;\n first.moveChildren(last, ref);\n first.remove();\n }\n this.optimize();\n }\n\n enable(enabled = true) {\n this.domNode.setAttribute('contenteditable', enabled);\n }\n\n formatAt(index, length, format, value) {\n if (this.whitelist != null && !this.whitelist[format]) return;\n super.formatAt(index, length, format, value);\n this.optimize();\n }\n\n insertAt(index, value, def) {\n if (def != null && this.whitelist != null && !this.whitelist[value]) return;\n if (index >= this.length()) {\n if (def == null || Parchment.query(value, Parchment.Scope.BLOCK) == null) {\n let blot = Parchment.create(this.statics.defaultChild);\n this.appendChild(blot);\n if (def == null && value.endsWith('\\n')) {\n value = value.slice(0, -1);\n }\n blot.insertAt(0, value, def);\n } else {\n let embed = Parchment.create(value, def);\n this.appendChild(embed);\n }\n } else {\n super.insertAt(index, value, def);\n }\n this.optimize();\n }\n\n insertBefore(blot, ref) {\n if (blot.statics.scope === Parchment.Scope.INLINE_BLOT) {\n let wrapper = Parchment.create(this.statics.defaultChild);\n wrapper.appendChild(blot);\n blot = wrapper;\n }\n super.insertBefore(blot, ref);\n }\n\n leaf(index) {\n return this.path(index).pop() || [null, -1];\n }\n\n line(index) {\n if (index === this.length()) {\n return this.line(index - 1);\n }\n return this.descendant(isLine, index);\n }\n\n lines(index = 0, length = Number.MAX_VALUE) {\n let getLines = (blot, index, length) => {\n let lines = [], lengthLeft = length;\n blot.children.forEachAt(index, length, function(child, index, length) {\n if (isLine(child)) {\n lines.push(child);\n } else if (child instanceof Parchment.Container) {\n lines = lines.concat(getLines(child, index, lengthLeft));\n }\n lengthLeft -= length;\n });\n return lines;\n };\n return getLines(this, index, length);\n }\n\n optimize(mutations = [], context = {}) {\n if (this.batch === true) return;\n super.optimize(mutations, context);\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_OPTIMIZE, mutations, context);\n }\n }\n\n path(index) {\n return super.path(index).slice(1); // Exclude self\n }\n\n update(mutations) {\n if (this.batch === true) return;\n let source = Emitter.sources.USER;\n if (typeof mutations === 'string') {\n source = mutations;\n }\n if (!Array.isArray(mutations)) {\n mutations = this.observer.takeRecords();\n }\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_BEFORE_UPDATE, source, mutations);\n }\n super.update(mutations.concat([])); // pass copy\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_UPDATE, source, mutations);\n }\n }\n}\nScroll.blotName = 'scroll';\nScroll.className = 'ql-editor';\nScroll.tagName = 'DIV';\nScroll.defaultChild = 'block';\nScroll.allowedChildren = [Block, BlockEmbed, Container];\n\n\nexport default Scroll;\n\n\n\n// WEBPACK FOOTER //\n// ./blots/scroll.js","import extend from 'extend';\nimport Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport logger from '../core/logger';\nimport Module from '../core/module';\n\nimport { AlignAttribute, AlignStyle } from '../formats/align';\nimport { BackgroundStyle } from '../formats/background';\nimport CodeBlock from '../formats/code';\nimport { ColorStyle } from '../formats/color';\nimport { DirectionAttribute, DirectionStyle } from '../formats/direction';\nimport { FontStyle } from '../formats/font';\nimport { SizeStyle } from '../formats/size';\n\nlet debug = logger('quill:clipboard');\n\n\nconst DOM_KEY = '__ql-matcher';\n\nconst CLIPBOARD_CONFIG = [\n [Node.TEXT_NODE, matchText],\n [Node.TEXT_NODE, matchNewline],\n ['br', matchBreak],\n [Node.ELEMENT_NODE, matchNewline],\n [Node.ELEMENT_NODE, matchBlot],\n [Node.ELEMENT_NODE, matchSpacing],\n [Node.ELEMENT_NODE, matchAttributor],\n [Node.ELEMENT_NODE, matchStyles],\n ['li', matchIndent],\n ['b', matchAlias.bind(matchAlias, 'bold')],\n ['i', matchAlias.bind(matchAlias, 'italic')],\n ['style', matchIgnore]\n];\n\nconst ATTRIBUTE_ATTRIBUTORS = [\n AlignAttribute,\n DirectionAttribute\n].reduce(function(memo, attr) {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\nconst STYLE_ATTRIBUTORS = [\n AlignStyle,\n BackgroundStyle,\n ColorStyle,\n DirectionStyle,\n FontStyle,\n SizeStyle\n].reduce(function(memo, attr) {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\n\nclass Clipboard extends Module {\n constructor(quill, options) {\n super(quill, options);\n this.quill.root.addEventListener('paste', this.onPaste.bind(this));\n this.container = this.quill.addContainer('ql-clipboard');\n this.container.setAttribute('contenteditable', true);\n this.container.setAttribute('tabindex', -1);\n this.matchers = [];\n CLIPBOARD_CONFIG.concat(this.options.matchers).forEach(([selector, matcher]) => {\n if (!options.matchVisual && matcher === matchSpacing) return;\n this.addMatcher(selector, matcher);\n });\n }\n\n addMatcher(selector, matcher) {\n this.matchers.push([selector, matcher]);\n }\n\n convert(html) {\n if (typeof html === 'string') {\n this.container.innerHTML = html.replace(/\\>\\r?\\n +\\<'); // Remove spaces between tags\n return this.convert();\n }\n const formats = this.quill.getFormat(this.quill.selection.savedRange.index);\n if (formats[CodeBlock.blotName]) {\n const text = this.container.innerText;\n this.container.innerHTML = '';\n return new Delta().insert(text, { [CodeBlock.blotName]: formats[CodeBlock.blotName] });\n }\n let [elementMatchers, textMatchers] = this.prepareMatching();\n let delta = traverse(this.container, elementMatchers, textMatchers);\n // Remove trailing newline\n if (deltaEndsWith(delta, '\\n') && delta.ops[delta.ops.length - 1].attributes == null) {\n delta = delta.compose(new Delta().retain(delta.length() - 1).delete(1));\n }\n debug.log('convert', this.container.innerHTML, delta);\n this.container.innerHTML = '';\n return delta;\n }\n\n dangerouslyPasteHTML(index, html, source = Quill.sources.API) {\n if (typeof index === 'string') {\n this.quill.setContents(this.convert(index), html);\n this.quill.setSelection(0, Quill.sources.SILENT);\n } else {\n let paste = this.convert(html);\n this.quill.updateContents(new Delta().retain(index).concat(paste), source);\n this.quill.setSelection(index + paste.length(), Quill.sources.SILENT);\n }\n }\n\n onPaste(e) {\n if (e.defaultPrevented || !this.quill.isEnabled()) return;\n let range = this.quill.getSelection();\n let delta = new Delta().retain(range.index);\n let scrollTop = this.quill.scrollingContainer.scrollTop;\n this.container.focus();\n this.quill.selection.update(Quill.sources.SILENT);\n setTimeout(() => {\n delta = delta.concat(this.convert()).delete(range.length);\n this.quill.updateContents(delta, Quill.sources.USER);\n // range.length contributes to delta.length()\n this.quill.setSelection(delta.length() - range.length, Quill.sources.SILENT);\n this.quill.scrollingContainer.scrollTop = scrollTop;\n this.quill.focus();\n }, 1);\n }\n\n prepareMatching() {\n let elementMatchers = [], textMatchers = [];\n this.matchers.forEach((pair) => {\n let [selector, matcher] = pair;\n switch (selector) {\n case Node.TEXT_NODE:\n textMatchers.push(matcher);\n break;\n case Node.ELEMENT_NODE:\n elementMatchers.push(matcher);\n break;\n default:\n [].forEach.call(this.container.querySelectorAll(selector), (node) => {\n // TODO use weakmap\n node[DOM_KEY] = node[DOM_KEY] || [];\n node[DOM_KEY].push(matcher);\n });\n break;\n }\n });\n return [elementMatchers, textMatchers];\n }\n}\nClipboard.DEFAULTS = {\n matchers: [],\n matchVisual: true\n};\n\n\nfunction applyFormat(delta, format, value) {\n if (typeof format === 'object') {\n return Object.keys(format).reduce(function(delta, key) {\n return applyFormat(delta, key, format[key]);\n }, delta);\n } else {\n return delta.reduce(function(delta, op) {\n if (op.attributes && op.attributes[format]) {\n return delta.push(op);\n } else {\n return delta.insert(op.insert, extend({}, {[format]: value}, op.attributes));\n }\n }, new Delta());\n }\n}\n\nfunction computeStyle(node) {\n if (node.nodeType !== Node.ELEMENT_NODE) return {};\n const DOM_KEY = '__ql-computed-style';\n return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node));\n}\n\nfunction deltaEndsWith(delta, text) {\n let endText = \"\";\n for (let i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) {\n let op = delta.ops[i];\n if (typeof op.insert !== 'string') break;\n endText = op.insert + endText;\n }\n return endText.slice(-1*text.length) === text;\n}\n\nfunction isLine(node) {\n if (node.childNodes.length === 0) return false; // Exclude embed blocks\n let style = computeStyle(node);\n return ['block', 'list-item'].indexOf(style.display) > -1;\n}\n\nfunction traverse(node, elementMatchers, textMatchers) { // Post-order\n if (node.nodeType === node.TEXT_NODE) {\n return textMatchers.reduce(function(delta, matcher) {\n return matcher(node, delta);\n }, new Delta());\n } else if (node.nodeType === node.ELEMENT_NODE) {\n return [].reduce.call(node.childNodes || [], (delta, childNode) => {\n let childrenDelta = traverse(childNode, elementMatchers, textMatchers);\n if (childNode.nodeType === node.ELEMENT_NODE) {\n childrenDelta = elementMatchers.reduce(function(childrenDelta, matcher) {\n return matcher(childNode, childrenDelta);\n }, childrenDelta);\n childrenDelta = (childNode[DOM_KEY] || []).reduce(function(childrenDelta, matcher) {\n return matcher(childNode, childrenDelta);\n }, childrenDelta);\n }\n return delta.concat(childrenDelta);\n }, new Delta());\n } else {\n return new Delta();\n }\n}\n\n\nfunction matchAlias(format, node, delta) {\n return applyFormat(delta, format, true);\n}\n\nfunction matchAttributor(node, delta) {\n let attributes = Parchment.Attributor.Attribute.keys(node);\n let classes = Parchment.Attributor.Class.keys(node);\n let styles = Parchment.Attributor.Style.keys(node);\n let formats = {};\n attributes.concat(classes).concat(styles).forEach((name) => {\n let attr = Parchment.query(name, Parchment.Scope.ATTRIBUTE);\n if (attr != null) {\n formats[attr.attrName] = attr.value(node);\n if (formats[attr.attrName]) return;\n }\n attr = ATTRIBUTE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n attr = STYLE_ATTRIBUTORS[name]\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n attr = STYLE_ATTRIBUTORS[name];\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n });\n if (Object.keys(formats).length > 0) {\n delta = applyFormat(delta, formats);\n }\n return delta;\n}\n\nfunction matchBlot(node, delta) {\n let match = Parchment.query(node);\n if (match == null) return delta;\n if (match.prototype instanceof Parchment.Embed) {\n let embed = {};\n let value = match.value(node);\n if (value != null) {\n embed[match.blotName] = value;\n delta = new Delta().insert(embed, match.formats(node));\n }\n } else if (typeof match.formats === 'function') {\n delta = applyFormat(delta, match.blotName, match.formats(node));\n }\n return delta;\n}\n\nfunction matchBreak(node, delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n return delta;\n}\n\nfunction matchIgnore() {\n return new Delta();\n}\n\nfunction matchIndent(node, delta) {\n let match = Parchment.query(node);\n if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\\n')) {\n return delta;\n }\n let indent = -1, parent = node.parentNode;\n while (!parent.classList.contains('ql-clipboard')) {\n if ((Parchment.query(parent) || {}).blotName === 'list') {\n indent += 1;\n }\n parent = parent.parentNode;\n }\n if (indent <= 0) return delta;\n return delta.compose(new Delta().retain(delta.length() - 1).retain(1, { indent: indent}));\n}\n\nfunction matchNewline(node, delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n if (isLine(node) || (delta.length() > 0 && node.nextSibling && isLine(node.nextSibling))) {\n delta.insert('\\n');\n }\n }\n return delta;\n}\n\nfunction matchSpacing(node, delta) {\n if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\\n\\n')) {\n let nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom);\n if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight*1.5) {\n delta.insert('\\n');\n }\n }\n return delta;\n}\n\nfunction matchStyles(node, delta) {\n let formats = {};\n let style = node.style || {};\n if (style.fontStyle && computeStyle(node).fontStyle === 'italic') {\n formats.italic = true;\n }\n if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') ||\n parseInt(computeStyle(node).fontWeight) >= 700)) {\n formats.bold = true;\n }\n if (Object.keys(formats).length > 0) {\n delta = applyFormat(delta, formats);\n }\n if (parseFloat(style.textIndent || 0) > 0) { // Could be 0.5in\n delta = new Delta().insert('\\t').concat(delta);\n }\n return delta;\n}\n\nfunction matchText(node, delta) {\n let text = node.data;\n // Word represents empty line with  \n if (node.parentNode.tagName === 'O:P') {\n return delta.insert(text.trim());\n }\n if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) {\n return delta;\n }\n if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) {\n // eslint-disable-next-line func-style\n let replacer = function(collapse, match) {\n match = match.replace(/[^\\u00a0]/g, ''); // \\u00a0 is nbsp;\n return match.length < 1 && collapse ? ' ' : match;\n };\n text = text.replace(/\\r\\n/g, ' ').replace(/\\n/g, ' ');\n text = text.replace(/\\s\\s+/g, replacer.bind(replacer, true)); // collapse whitespace\n if ((node.previousSibling == null && isLine(node.parentNode)) ||\n (node.previousSibling != null && isLine(node.previousSibling))) {\n text = text.replace(/^\\s+/, replacer.bind(replacer, false));\n }\n if ((node.nextSibling == null && isLine(node.parentNode)) ||\n (node.nextSibling != null && isLine(node.nextSibling))) {\n text = text.replace(/\\s+$/, replacer.bind(replacer, false));\n }\n }\n return delta.insert(text);\n}\n\n\nexport { Clipboard as default, matchAttributor, matchBlot, matchNewline, matchSpacing, matchText };\n\n\n\n// WEBPACK FOOTER //\n// ./modules/clipboard.js","import Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport Module from '../core/module';\n\n\nclass History extends Module {\n constructor(quill, options) {\n super(quill, options);\n this.lastRecorded = 0;\n this.ignoreChange = false;\n this.clear();\n this.quill.on(Quill.events.EDITOR_CHANGE, (eventName, delta, oldDelta, source) => {\n if (eventName !== Quill.events.TEXT_CHANGE || this.ignoreChange) return;\n if (!this.options.userOnly || source === Quill.sources.USER) {\n this.record(delta, oldDelta);\n } else {\n this.transform(delta);\n }\n });\n this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, this.undo.bind(this));\n this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, this.redo.bind(this));\n if (/Win/i.test(navigator.platform)) {\n this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, this.redo.bind(this));\n }\n }\n\n change(source, dest) {\n if (this.stack[source].length === 0) return;\n let delta = this.stack[source].pop();\n this.stack[dest].push(delta);\n this.lastRecorded = 0;\n this.ignoreChange = true;\n this.quill.updateContents(delta[source], Quill.sources.USER);\n this.ignoreChange = false;\n let index = getLastChangeIndex(delta[source]);\n this.quill.setSelection(index);\n }\n\n clear() {\n this.stack = { undo: [], redo: [] };\n }\n\n cutoff() {\n this.lastRecorded = 0;\n }\n\n record(changeDelta, oldDelta) {\n if (changeDelta.ops.length === 0) return;\n this.stack.redo = [];\n let undoDelta = this.quill.getContents().diff(oldDelta);\n let timestamp = Date.now();\n if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) {\n let delta = this.stack.undo.pop();\n undoDelta = undoDelta.compose(delta.undo);\n changeDelta = delta.redo.compose(changeDelta);\n } else {\n this.lastRecorded = timestamp;\n }\n this.stack.undo.push({\n redo: changeDelta,\n undo: undoDelta\n });\n if (this.stack.undo.length > this.options.maxStack) {\n this.stack.undo.shift();\n }\n }\n\n redo() {\n this.change('redo', 'undo');\n }\n\n transform(delta) {\n this.stack.undo.forEach(function(change) {\n change.undo = delta.transform(change.undo, true);\n change.redo = delta.transform(change.redo, true);\n });\n this.stack.redo.forEach(function(change) {\n change.undo = delta.transform(change.undo, true);\n change.redo = delta.transform(change.redo, true);\n });\n }\n\n undo() {\n this.change('undo', 'redo');\n }\n}\nHistory.DEFAULTS = {\n delay: 1000,\n maxStack: 100,\n userOnly: false\n};\n\nfunction endsWithNewlineChange(delta) {\n let lastOp = delta.ops[delta.ops.length - 1];\n if (lastOp == null) return false;\n if (lastOp.insert != null) {\n return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n }\n if (lastOp.attributes != null) {\n return Object.keys(lastOp.attributes).some(function(attr) {\n return Parchment.query(attr, Parchment.Scope.BLOCK) != null;\n });\n }\n return false;\n}\n\nfunction getLastChangeIndex(delta) {\n let deleteLength = delta.reduce(function(length, op) {\n length += (op.delete || 0);\n return length;\n }, 0);\n let changeIndex = delta.length() - deleteLength;\n if (endsWithNewlineChange(delta)) {\n changeIndex -= 1;\n }\n return changeIndex;\n}\n\n\nexport { History as default, getLastChangeIndex };\n\n\n\n// WEBPACK FOOTER //\n// ./modules/history.js","import Parchment from 'parchment';\n\nclass IdentAttributor extends Parchment.Attributor.Class {\n add(node, value) {\n if (value === '+1' || value === '-1') {\n let indent = this.value(node) || 0;\n value = (value === '+1' ? (indent + 1) : (indent - 1));\n }\n if (value === 0) {\n this.remove(node);\n return true;\n } else {\n return super.add(node, value);\n }\n }\n\n canAdd(node, value) {\n return super.canAdd(node, value) || super.canAdd(node, parseInt(value));\n }\n\n value(node) {\n return parseInt(super.value(node)) || undefined; // Don't return NaN\n }\n}\n\nlet IndentClass = new IdentAttributor('indent', 'ql-indent', {\n scope: Parchment.Scope.BLOCK,\n whitelist: [1, 2, 3, 4, 5, 6, 7, 8]\n});\n\nexport { IndentClass };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/indent.js","import Block from '../blots/block';\n\n\nclass Blockquote extends Block {}\nBlockquote.blotName = 'blockquote';\nBlockquote.tagName = 'blockquote';\n\n\nexport default Blockquote;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/blockquote.js","import Block from '../blots/block';\n\n\nclass Header extends Block {\n static formats(domNode) {\n return this.tagName.indexOf(domNode.tagName) + 1;\n }\n}\nHeader.blotName = 'header';\nHeader.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n\n\nexport default Header;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/header.js","import Parchment from 'parchment';\nimport Block from '../blots/block';\nimport Container from '../blots/container';\n\n\nclass ListItem extends Block {\n static formats(domNode) {\n return domNode.tagName === this.tagName ? undefined : super.formats(domNode);\n }\n\n format(name, value) {\n if (name === List.blotName && !value) {\n this.replaceWith(Parchment.create(this.statics.scope));\n } else {\n super.format(name, value);\n }\n }\n\n remove() {\n if (this.prev == null && this.next == null) {\n this.parent.remove();\n } else {\n super.remove();\n }\n }\n\n replaceWith(name, value) {\n this.parent.isolate(this.offset(this.parent), this.length());\n if (name === this.parent.statics.blotName) {\n this.parent.replaceWith(name, value);\n return this;\n } else {\n this.parent.unwrap();\n return super.replaceWith(name, value);\n }\n }\n}\nListItem.blotName = 'list-item';\nListItem.tagName = 'LI';\n\n\nclass List extends Container {\n static create(value) {\n let tagName = value === 'ordered' ? 'OL' : 'UL';\n let node = super.create(tagName);\n if (value === 'checked' || value === 'unchecked') {\n node.setAttribute('data-checked', value === 'checked');\n }\n return node;\n }\n\n static formats(domNode) {\n if (domNode.tagName === 'OL') return 'ordered';\n if (domNode.tagName === 'UL') {\n if (domNode.hasAttribute('data-checked')) {\n return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked';\n } else {\n return 'bullet';\n }\n }\n return undefined;\n }\n\n constructor(domNode) {\n super(domNode);\n const listEventHandler = (e) => {\n if (e.target.parentNode !== domNode) return;\n let format = this.statics.formats(domNode);\n let blot = Parchment.find(e.target);\n if (format === 'checked') {\n blot.format('list', 'unchecked');\n } else if(format === 'unchecked') {\n blot.format('list', 'checked');\n }\n }\n\n domNode.addEventListener('touchstart', listEventHandler);\n domNode.addEventListener('mousedown', listEventHandler);\n }\n\n format(name, value) {\n if (this.children.length > 0) {\n this.children.tail.format(name, value);\n }\n }\n\n formats() {\n // We don't inherit from FormatBlot\n return { [this.statics.blotName]: this.statics.formats(this.domNode) };\n }\n\n insertBefore(blot, ref) {\n if (blot instanceof ListItem) {\n super.insertBefore(blot, ref);\n } else {\n let index = ref == null ? this.length() : ref.offset(this);\n let after = this.split(index);\n after.parent.insertBefore(blot, after);\n }\n }\n\n optimize(context) {\n super.optimize(context);\n let next = this.next;\n if (next != null && next.prev === this &&\n next.statics.blotName === this.statics.blotName &&\n next.domNode.tagName === this.domNode.tagName &&\n next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) {\n next.moveChildren(this);\n next.remove();\n }\n }\n\n replace(target) {\n if (target.statics.blotName !== this.statics.blotName) {\n let item = Parchment.create(this.statics.defaultChild);\n target.moveChildren(item);\n this.appendChild(item);\n }\n super.replace(target);\n }\n}\nList.blotName = 'list';\nList.scope = Parchment.Scope.BLOCK_BLOT;\nList.tagName = ['OL', 'UL'];\nList.defaultChild = 'list-item';\nList.allowedChildren = [ListItem];\n\n\nexport { ListItem, List as default };\n\n\n\n// WEBPACK FOOTER //\n// ./formats/list.js","import Bold from './bold';\n\nclass Italic extends Bold { }\nItalic.blotName = 'italic';\nItalic.tagName = ['EM', 'I'];\n\nexport default Italic;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/italic.js","import Inline from '../blots/inline';\n\nclass Script extends Inline {\n static create(value) {\n if (value === 'super') {\n return document.createElement('sup');\n } else if (value === 'sub') {\n return document.createElement('sub');\n } else {\n return super.create(value);\n }\n }\n\n static formats(domNode) {\n if (domNode.tagName === 'SUB') return 'sub';\n if (domNode.tagName === 'SUP') return 'super';\n return undefined;\n }\n}\nScript.blotName = 'script';\nScript.tagName = ['SUB', 'SUP'];\n\nexport default Script;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/script.js","import Inline from '../blots/inline';\n\nclass Strike extends Inline { }\nStrike.blotName = 'strike';\nStrike.tagName = 'S';\n\nexport default Strike;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/strike.js","import Inline from '../blots/inline';\n\nclass Underline extends Inline { }\nUnderline.blotName = 'underline';\nUnderline.tagName = 'U';\n\nexport default Underline;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/underline.js","import Parchment from 'parchment';\nimport { sanitize } from '../formats/link';\n\nconst ATTRIBUTES = [\n 'alt',\n 'height',\n 'width'\n];\n\n\nclass Image extends Parchment.Embed {\n static create(value) {\n let node = super.create(value);\n if (typeof value === 'string') {\n node.setAttribute('src', this.sanitize(value));\n }\n return node;\n }\n\n static formats(domNode) {\n return ATTRIBUTES.reduce(function(formats, attribute) {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n }, {});\n }\n\n static match(url) {\n return /\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url);\n }\n\n static sanitize(url) {\n return sanitize(url, ['http', 'https', 'data']) ? url : '//:0';\n }\n\n static value(domNode) {\n return domNode.getAttribute('src');\n }\n\n format(name, value) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n super.format(name, value);\n }\n }\n}\nImage.blotName = 'image';\nImage.tagName = 'IMG';\n\n\nexport default Image;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/image.js","import { BlockEmbed } from '../blots/block';\nimport Link from '../formats/link';\n\nconst ATTRIBUTES = [\n 'height',\n 'width'\n];\n\n\nclass Video extends BlockEmbed {\n static create(value) {\n let node = super.create(value);\n node.setAttribute('frameborder', '0');\n node.setAttribute('allowfullscreen', true);\n node.setAttribute('src', this.sanitize(value));\n return node;\n }\n\n static formats(domNode) {\n return ATTRIBUTES.reduce(function(formats, attribute) {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n }, {});\n }\n\n static sanitize(url) {\n return Link.sanitize(url);\n }\n\n static value(domNode) {\n return domNode.getAttribute('src');\n }\n\n format(name, value) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n super.format(name, value);\n }\n }\n}\nVideo.blotName = 'video';\nVideo.className = 'ql-video';\nVideo.tagName = 'IFRAME';\n\n\nexport default Video;\n\n\n\n// WEBPACK FOOTER //\n// ./formats/video.js","import Embed from '../blots/embed';\nimport Quill from '../core/quill';\nimport Module from '../core/module';\n\n\nclass FormulaBlot extends Embed {\n static create(value) {\n let node = super.create(value);\n if (typeof value === 'string') {\n window.katex.render(value, node, {\n throwOnError: false,\n errorColor: '#f00'\n });\n node.setAttribute('data-value', value);\n }\n return node;\n }\n\n static value(domNode) {\n return domNode.getAttribute('data-value');\n }\n}\nFormulaBlot.blotName = 'formula';\nFormulaBlot.className = 'ql-formula';\nFormulaBlot.tagName = 'SPAN';\n\n\nclass Formula extends Module {\n static register() {\n Quill.register(FormulaBlot, true);\n }\n\n constructor() {\n super();\n if (window.katex == null) {\n throw new Error('Formula module requires KaTeX.');\n }\n }\n}\n\n\nexport { FormulaBlot, Formula as default };\n\n\n\n// WEBPACK FOOTER //\n// ./modules/formula.js","import Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport Module from '../core/module';\nimport CodeBlock from '../formats/code';\n\n\nclass SyntaxCodeBlock extends CodeBlock {\n replaceWith(block) {\n this.domNode.textContent = this.domNode.textContent;\n this.attach();\n super.replaceWith(block);\n }\n\n highlight(highlight) {\n let text = this.domNode.textContent;\n if (this.cachedText !== text) {\n if (text.trim().length > 0 || this.cachedText == null) {\n this.domNode.innerHTML = highlight(text);\n this.domNode.normalize();\n this.attach();\n }\n this.cachedText = text;\n }\n }\n}\nSyntaxCodeBlock.className = 'ql-syntax';\n\n\nlet CodeToken = new Parchment.Attributor.Class('token', 'hljs', {\n scope: Parchment.Scope.INLINE\n});\n\n\nclass Syntax extends Module {\n static register() {\n Quill.register(CodeToken, true);\n Quill.register(SyntaxCodeBlock, true);\n }\n\n constructor(quill, options) {\n super(quill, options);\n if (typeof this.options.highlight !== 'function') {\n throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.');\n }\n let timer = null;\n this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n this.highlight();\n timer = null;\n }, this.options.interval);\n });\n this.highlight();\n }\n\n highlight() {\n if (this.quill.selection.composing) return;\n this.quill.update(Quill.sources.USER);\n let range = this.quill.getSelection();\n this.quill.scroll.descendants(SyntaxCodeBlock).forEach((code) => {\n code.highlight(this.options.highlight);\n });\n this.quill.update(Quill.sources.SILENT);\n if (range != null) {\n this.quill.setSelection(range, Quill.sources.SILENT);\n }\n }\n}\nSyntax.DEFAULTS = {\n highlight: (function() {\n if (window.hljs == null) return null;\n return function(text) {\n let result = window.hljs.highlightAuto(text);\n return result.value;\n };\n })(),\n interval: 1000\n};\n\n\nexport { SyntaxCodeBlock as CodeBlock, CodeToken, Syntax as default};\n\n\n\n// WEBPACK FOOTER //\n// ./modules/syntax.js","import Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport logger from '../core/logger';\nimport Module from '../core/module';\n\nlet debug = logger('quill:toolbar');\n\n\nclass Toolbar extends Module {\n constructor(quill, options) {\n super(quill, options);\n if (Array.isArray(this.options.container)) {\n let container = document.createElement('div');\n addControls(container, this.options.container);\n quill.container.parentNode.insertBefore(container, quill.container);\n this.container = container;\n } else if (typeof this.options.container === 'string') {\n this.container = document.querySelector(this.options.container);\n } else {\n this.container = this.options.container;\n }\n if (!(this.container instanceof HTMLElement)) {\n return debug.error('Container required for toolbar', this.options);\n }\n this.container.classList.add('ql-toolbar');\n this.controls = [];\n this.handlers = {};\n Object.keys(this.options.handlers).forEach((format) => {\n this.addHandler(format, this.options.handlers[format]);\n });\n [].forEach.call(this.container.querySelectorAll('button, select'), (input) => {\n this.attach(input);\n });\n this.quill.on(Quill.events.EDITOR_CHANGE, (type, range) => {\n if (type === Quill.events.SELECTION_CHANGE) {\n this.update(range);\n }\n });\n this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => {\n let [range, ] = this.quill.selection.getRange(); // quill.getSelection triggers update\n this.update(range);\n });\n }\n\n addHandler(format, handler) {\n this.handlers[format] = handler;\n }\n\n attach(input) {\n let format = [].find.call(input.classList, (className) => {\n return className.indexOf('ql-') === 0;\n });\n if (!format) return;\n format = format.slice('ql-'.length);\n if (input.tagName === 'BUTTON') {\n input.setAttribute('type', 'button');\n }\n if (this.handlers[format] == null) {\n if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) {\n debug.warn('ignoring attaching to disabled format', format, input);\n return;\n }\n if (Parchment.query(format) == null) {\n debug.warn('ignoring attaching to nonexistent format', format, input);\n return;\n }\n }\n let eventName = input.tagName === 'SELECT' ? 'change' : 'click';\n input.addEventListener(eventName, (e) => {\n let value;\n if (input.tagName === 'SELECT') {\n if (input.selectedIndex < 0) return;\n let selected = input.options[input.selectedIndex];\n if (selected.hasAttribute('selected')) {\n value = false;\n } else {\n value = selected.value || false;\n }\n } else {\n if (input.classList.contains('ql-active')) {\n value = false;\n } else {\n value = input.value || !input.hasAttribute('value');\n }\n e.preventDefault();\n }\n this.quill.focus();\n let [range, ] = this.quill.selection.getRange();\n if (this.handlers[format] != null) {\n this.handlers[format].call(this, value);\n } else if (Parchment.query(format).prototype instanceof Parchment.Embed) {\n value = prompt(`Enter ${format}`);\n if (!value) return;\n this.quill.updateContents(new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert({ [format]: value })\n , Quill.sources.USER);\n } else {\n this.quill.format(format, value, Quill.sources.USER);\n }\n this.update(range);\n });\n // TODO use weakmap\n this.controls.push([format, input]);\n }\n\n update(range) {\n let formats = range == null ? {} : this.quill.getFormat(range);\n this.controls.forEach(function(pair) {\n let [format, input] = pair;\n if (input.tagName === 'SELECT') {\n let option;\n if (range == null) {\n option = null;\n } else if (formats[format] == null) {\n option = input.querySelector('option[selected]');\n } else if (!Array.isArray(formats[format])) {\n let value = formats[format];\n if (typeof value === 'string') {\n value = value.replace(/\\\"/g, '\\\\\"');\n }\n option = input.querySelector(`option[value=\"${value}\"]`);\n }\n if (option == null) {\n input.value = ''; // TODO make configurable?\n input.selectedIndex = -1;\n } else {\n option.selected = true;\n }\n } else {\n if (range == null) {\n input.classList.remove('ql-active');\n } else if (input.hasAttribute('value')) {\n // both being null should match (default values)\n // '1' should match with 1 (headers)\n let isActive = formats[format] === input.getAttribute('value') ||\n (formats[format] != null && formats[format].toString() === input.getAttribute('value')) ||\n (formats[format] == null && !input.getAttribute('value'));\n input.classList.toggle('ql-active', isActive);\n } else {\n input.classList.toggle('ql-active', formats[format] != null);\n }\n }\n });\n }\n}\nToolbar.DEFAULTS = {};\n\n\nfunction addButton(container, format, value) {\n let input = document.createElement('button');\n input.setAttribute('type', 'button');\n input.classList.add('ql-' + format);\n if (value != null) {\n input.value = value;\n }\n container.appendChild(input);\n}\n\nfunction addControls(container, groups) {\n if (!Array.isArray(groups[0])) {\n groups = [groups];\n }\n groups.forEach(function(controls) {\n let group = document.createElement('span');\n group.classList.add('ql-formats');\n controls.forEach(function(control) {\n if (typeof control === 'string') {\n addButton(group, control);\n } else {\n let format = Object.keys(control)[0];\n let value = control[format];\n if (Array.isArray(value)) {\n addSelect(group, format, value);\n } else {\n addButton(group, format, value);\n }\n }\n });\n container.appendChild(group);\n });\n}\n\nfunction addSelect(container, format, values) {\n let input = document.createElement('select');\n input.classList.add('ql-' + format);\n values.forEach(function(value) {\n let option = document.createElement('option');\n if (value !== false) {\n option.setAttribute('value', value);\n } else {\n option.setAttribute('selected', 'selected');\n }\n input.appendChild(option);\n });\n container.appendChild(input);\n}\n\nToolbar.DEFAULTS = {\n container: null,\n handlers: {\n clean: function() {\n let range = this.quill.getSelection();\n if (range == null) return;\n if (range.length == 0) {\n let formats = this.quill.getFormat();\n Object.keys(formats).forEach((name) => {\n // Clean functionality in existing apps only clean inline formats\n if (Parchment.query(name, Parchment.Scope.INLINE) != null) {\n this.quill.format(name, false);\n }\n });\n } else {\n this.quill.removeFormat(range, Quill.sources.USER);\n }\n },\n direction: function(value) {\n let align = this.quill.getFormat()['align'];\n if (value === 'rtl' && align == null) {\n this.quill.format('align', 'right', Quill.sources.USER);\n } else if (!value && align === 'right') {\n this.quill.format('align', false, Quill.sources.USER);\n }\n this.quill.format('direction', value, Quill.sources.USER);\n },\n indent: function(value) {\n let range = this.quill.getSelection();\n let formats = this.quill.getFormat(range);\n let indent = parseInt(formats.indent || 0);\n if (value === '+1' || value === '-1') {\n let modifier = (value === '+1') ? 1 : -1;\n if (formats.direction === 'rtl') modifier *= -1;\n this.quill.format('indent', indent + modifier, Quill.sources.USER);\n }\n },\n link: function(value) {\n if (value === true) {\n value = prompt('Enter link URL:');\n }\n this.quill.format('link', value, Quill.sources.USER);\n },\n list: function(value) {\n let range = this.quill.getSelection();\n let formats = this.quill.getFormat(range);\n if (value === 'check') {\n if (formats['list'] === 'checked' || formats['list'] === 'unchecked') {\n this.quill.format('list', false, Quill.sources.USER);\n } else {\n this.quill.format('list', 'unchecked', Quill.sources.USER);\n }\n } else {\n this.quill.format('list', value, Quill.sources.USER);\n }\n }\n }\n}\n\n\nexport { Toolbar as default, addControls };\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar.js","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/align-left.svg\n// module id = 75\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/align-center.svg\n// module id = 76\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/align-right.svg\n// module id = 77\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/align-justify.svg\n// module id = 78\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/background.svg\n// module id = 79\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/blockquote.svg\n// module id = 80\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/bold.svg\n// module id = 81\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/clean.svg\n// module id = 82\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/color.svg\n// module id = 83\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/direction-ltr.svg\n// module id = 84\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/direction-rtl.svg\n// module id = 85\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/float-center.svg\n// module id = 86\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/float-full.svg\n// module id = 87\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/float-left.svg\n// module id = 88\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/float-right.svg\n// module id = 89\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/formula.svg\n// module id = 90\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/header.svg\n// module id = 91\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/header-2.svg\n// module id = 92\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/italic.svg\n// module id = 93\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/image.svg\n// module id = 94\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/indent.svg\n// module id = 95\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/outdent.svg\n// module id = 96\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/link.svg\n// module id = 97\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/list-ordered.svg\n// module id = 98\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/list-bullet.svg\n// module id = 99\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/list-check.svg\n// module id = 100\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/subscript.svg\n// module id = 101\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/superscript.svg\n// module id = 102\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/strike.svg\n// module id = 103\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/underline.svg\n// module id = 104\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/video.svg\n// module id = 105\n// module chunks = 0","module.exports = \" \";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./assets/icons/dropdown.svg\n// module id = 106\n// module chunks = 0","import extend from 'extend';\nimport Emitter from '../core/emitter';\nimport BaseTheme, { BaseTooltip } from './base';\nimport { Range } from '../core/selection';\nimport icons from '../ui/icons';\n\n\nconst TOOLBAR_CONFIG = [\n ['bold', 'italic', 'link'],\n [{ header: 1 }, { header: 2 }, 'blockquote']\n];\n\nclass BubbleTheme extends BaseTheme {\n constructor(quill, options) {\n if (options.modules.toolbar != null && options.modules.toolbar.container == null) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n super(quill, options);\n this.quill.container.classList.add('ql-bubble');\n }\n\n extendToolbar(toolbar) {\n this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);\n this.tooltip.root.appendChild(toolbar.container);\n this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), icons);\n this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), icons);\n }\n}\nBubbleTheme.DEFAULTS = extend(true, {}, BaseTheme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link: function(value) {\n if (!value) {\n this.quill.format('link', false);\n } else {\n this.quill.theme.tooltip.edit();\n }\n }\n }\n }\n }\n});\n\n\nclass BubbleTooltip extends BaseTooltip {\n constructor(quill, bounds) {\n super(quill, bounds);\n this.quill.on(Emitter.events.EDITOR_CHANGE, (type, range, oldRange, source) => {\n if (type !== Emitter.events.SELECTION_CHANGE) return;\n if (range != null && range.length > 0 && source === Emitter.sources.USER) {\n this.show();\n // Lock our width so we will expand beyond our offsetParent boundaries\n this.root.style.left = '0px';\n this.root.style.width = '';\n this.root.style.width = this.root.offsetWidth + 'px';\n let lines = this.quill.getLines(range.index, range.length);\n if (lines.length === 1) {\n this.position(this.quill.getBounds(range));\n } else {\n let lastLine = lines[lines.length - 1];\n let index = this.quill.getIndex(lastLine);\n let length = Math.min(lastLine.length() - 1, range.index + range.length - index);\n let bounds = this.quill.getBounds(new Range(index, length));\n this.position(bounds);\n }\n } else if (document.activeElement !== this.textbox && this.quill.hasFocus()) {\n this.hide();\n }\n });\n }\n\n listen() {\n super.listen();\n this.root.querySelector('.ql-close').addEventListener('click', () => {\n this.root.classList.remove('ql-editing');\n });\n this.quill.on(Emitter.events.SCROLL_OPTIMIZE, () => {\n // Let selection be restored by toolbar handlers before repositioning\n setTimeout(() => {\n if (this.root.classList.contains('ql-hidden')) return;\n let range = this.quill.getSelection();\n if (range != null) {\n this.position(this.quill.getBounds(range));\n }\n }, 1);\n });\n }\n\n cancel() {\n this.show();\n }\n\n position(reference) {\n let shift = super.position(reference);\n let arrow = this.root.querySelector('.ql-tooltip-arrow');\n arrow.style.marginLeft = '';\n if (shift === 0) return shift;\n arrow.style.marginLeft = (-1*shift - arrow.offsetWidth/2) + 'px';\n }\n}\nBubbleTooltip.TEMPLATE = [\n '',\n '
',\n '',\n '',\n '
'\n].join('');\n\n\nexport { BubbleTooltip, BubbleTheme as default };\n\n\n\n// WEBPACK FOOTER //\n// ./themes/bubble.js","import extend from 'extend';\nimport Emitter from '../core/emitter';\nimport BaseTheme, { BaseTooltip } from './base';\nimport LinkBlot from '../formats/link';\nimport { Range } from '../core/selection';\nimport icons from '../ui/icons';\n\n\nconst TOOLBAR_CONFIG = [\n [{ header: ['1', '2', '3', false] }],\n ['bold', 'italic', 'underline', 'link'],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['clean']\n];\n\nclass SnowTheme extends BaseTheme {\n constructor(quill, options) {\n if (options.modules.toolbar != null && options.modules.toolbar.container == null) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n super(quill, options);\n this.quill.container.classList.add('ql-snow');\n }\n\n extendToolbar(toolbar) {\n toolbar.container.classList.add('ql-snow');\n this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), icons);\n this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), icons);\n this.tooltip = new SnowTooltip(this.quill, this.options.bounds);\n if (toolbar.container.querySelector('.ql-link')) {\n this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function(range, context) {\n toolbar.handlers['link'].call(toolbar, !context.format.link);\n });\n }\n }\n}\nSnowTheme.DEFAULTS = extend(true, {}, BaseTheme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link: function(value) {\n if (value) {\n let range = this.quill.getSelection();\n if (range == null || range.length == 0) return;\n let preview = this.quill.getText(range);\n if (/^\\S+@\\S+\\.\\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) {\n preview = 'mailto:' + preview;\n }\n let tooltip = this.quill.theme.tooltip;\n tooltip.edit('link', preview);\n } else {\n this.quill.format('link', false);\n }\n }\n }\n }\n }\n});\n\n\nclass SnowTooltip extends BaseTooltip {\n constructor(quill, bounds) {\n super(quill, bounds);\n this.preview = this.root.querySelector('a.ql-preview');\n }\n\n listen() {\n super.listen();\n this.root.querySelector('a.ql-action').addEventListener('click', (event) => {\n if (this.root.classList.contains('ql-editing')) {\n this.save();\n } else {\n this.edit('link', this.preview.textContent);\n }\n event.preventDefault();\n });\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\n if (this.linkRange != null) {\n let range = this.linkRange;\n this.restoreFocus();\n this.quill.formatText(range, 'link', false, Emitter.sources.USER);\n delete this.linkRange;\n }\n event.preventDefault();\n this.hide();\n });\n this.quill.on(Emitter.events.SELECTION_CHANGE, (range, oldRange, source) => {\n if (range == null) return;\n if (range.length === 0 && source === Emitter.sources.USER) {\n let [link, offset] = this.quill.scroll.descendant(LinkBlot, range.index);\n if (link != null) {\n this.linkRange = new Range(range.index - offset, link.length());\n let preview = LinkBlot.formats(link.domNode);\n this.preview.textContent = preview;\n this.preview.setAttribute('href', preview);\n this.show();\n this.position(this.quill.getBounds(this.linkRange));\n return;\n }\n } else {\n delete this.linkRange;\n }\n this.hide();\n });\n }\n\n show() {\n super.show();\n this.root.removeAttribute('data-mode');\n }\n}\nSnowTooltip.TEMPLATE = [\n '',\n '',\n '',\n ''\n].join('');\n\n\nexport default SnowTheme;\n\n\n\n// WEBPACK FOOTER //\n// ./themes/snow.js"],"sourceRoot":""} \ No newline at end of file diff --git a/Wino.Mail/JS/Quill/quill.snow.css b/Wino.Mail/JS/Quill/quill.snow.css new file mode 100644 index 00000000..c4792697 --- /dev/null +++ b/Wino.Mail/JS/Quill/quill.snow.css @@ -0,0 +1,947 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 1000px !important; + resize: vertical; + margin: 0px; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + line-height: 1.40; + height: 100%; + outline: none; + overflow-y: auto; + padding: 4px 4px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* Reply Border */ +.ql-container.ql-snow { + /* border: solid #636e72; */ +} + +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + left: 4px; + pointer-events: none; + position: absolute; + right: 4px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + box-sizing: border-box; +} +.ql-snow * { + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} + diff --git a/Wino.Mail/JS/Quill/reader.css b/Wino.Mail/JS/Quill/reader.css new file mode 100644 index 00000000..1fbed5bc --- /dev/null +++ b/Wino.Mail/JS/Quill/reader.css @@ -0,0 +1,10 @@ +#readerDiv { + font-family: Arial, Helvetica, sans-serif; + background-color: transparent !important; +} + +/*@font-face { + font-family: Starborn; + src: url(Fonts/Starborn.ttf); +} +*/ diff --git a/Wino.Mail/JS/Quill/reader.html b/Wino.Mail/JS/Quill/reader.html new file mode 100644 index 00000000..30adca81 --- /dev/null +++ b/Wino.Mail/JS/Quill/reader.html @@ -0,0 +1,32 @@ + + + + + + + + + +
+
+ + diff --git a/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs b/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs new file mode 100644 index 00000000..134623f1 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/AccountSelectorFlyout.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Windows.UI.Xaml.Controls; +using Wino.Controls; +using Wino.Core.Domain.Entities; +using Wino.Helpers; + +namespace Wino.MenuFlyouts +{ + public class AccountSelectorFlyout : MenuFlyout, IDisposable + { + private readonly IEnumerable _accounts; + private readonly Func _onItemSelection; + + public AccountSelectorFlyout(IEnumerable accounts, Func onItemSelection) + { + _accounts = accounts; + _onItemSelection = onItemSelection; + + foreach (var account in _accounts) + { + var pathData = new WinoFontIcon() { Icon = XamlHelpers.GetProviderIcon(account.ProviderType) }; + var menuItem = new MenuFlyoutItem() { Tag = account.Address, Icon = pathData, Text = $"{account.Name} ({account.Address})", MinHeight = 55 }; + + menuItem.Click += AccountClicked; + Items.Add(menuItem); + } + } + + public void Dispose() + { + foreach (var menuItem in Items) + { + if (menuItem is MenuFlyoutItem flyoutItem) + { + flyoutItem.Click -= AccountClicked; + } + } + } + + private async void AccountClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) + { + if (sender is MenuFlyoutItem menuItem && menuItem.Tag is string accountAddress) + { + var selectedMenuItem = _accounts.FirstOrDefault(a => a.Address == accountAddress); + + if (selectedMenuItem != null) + { + await _onItemSelection(selectedMenuItem); + } + } + + Dispose(); + Hide(); + } + } +} diff --git a/Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs b/Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs new file mode 100644 index 00000000..67530eb6 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs @@ -0,0 +1,220 @@ +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Mvvm.Input; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Controls; +using Wino.Core.Domain.Models.Reader; +using Wino.Helpers; + +namespace Wino.MenuFlyouts +{ + public class FilterMenuFlyout : MenuFlyout + { + public static readonly DependencyProperty SelectedFilterChangedCommandProperty = DependencyProperty.Register(nameof(SelectedFilterChangedCommand), typeof(IRelayCommand), typeof(FilterMenuFlyout), new PropertyMetadata(null)); + public static readonly DependencyProperty FilterOptionsProperty = DependencyProperty.Register(nameof(FilterOptions), typeof(List), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged))); + public static readonly DependencyProperty SelectedFilterOptionProperty = DependencyProperty.Register(nameof(SelectedFilterOption), typeof(FilterOption), typeof(FilterMenuFlyout), new PropertyMetadata(null, OnSelectedFilterOptionChanged)); + public static readonly DependencyProperty SelectedSortingOptionProperty = DependencyProperty.Register(nameof(SelectedSortingOption), typeof(SortingOption), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedSortingOptionChanged))); + public static readonly DependencyProperty SortingOptionsProperty = DependencyProperty.Register(nameof(SortingOptions), typeof(List), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged))); + public static readonly DependencyProperty SelectedSortingOptionChangedCommandProperty = DependencyProperty.Register(nameof(SelectedSortingOptionChangedCommand), typeof(IRelayCommand), typeof(FilterMenuFlyout), new PropertyMetadata(null)); + + public IRelayCommand SelectedFilterChangedCommand + { + get { return (IRelayCommand)GetValue(SelectedFilterChangedCommandProperty); } + set { SetValue(SelectedFilterChangedCommandProperty, value); } + } + + public IRelayCommand SelectedSortingOptionChangedCommand + { + get { return (IRelayCommand)GetValue(SelectedSortingOptionChangedCommandProperty); } + set { SetValue(SelectedSortingOptionChangedCommandProperty, value); } + } + + public List FilterOptions + { + get { return (List)GetValue(FilterOptionsProperty); } + set { SetValue(FilterOptionsProperty, value); } + } + + public List SortingOptions + { + get { return (List)GetValue(SortingOptionsProperty); } + set { SetValue(SortingOptionsProperty, value); } + } + + public FilterOption SelectedFilterOption + { + get { return (FilterOption)GetValue(SelectedFilterOptionProperty); } + set { SetValue(SelectedFilterOptionProperty, value); } + } + + public SortingOption SelectedSortingOption + { + get { return (SortingOption)GetValue(SelectedSortingOptionProperty); } + set { SetValue(SelectedSortingOptionProperty, value); } + } + + private static void OnSelectedFilterOptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is FilterMenuFlyout bar) + { + bar.SelectFilterOption(bar.SelectedFilterOption); + bar.SelectedFilterChangedCommand?.Execute(bar.SelectedFilterOption); + } + } + + private static void OnSelectedSortingOptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is FilterMenuFlyout bar) + { + bar.SelectSortingOption(bar.SelectedSortingOption); + bar.SelectedSortingOptionChangedCommand?.Execute(bar.SelectedSortingOption); + } + } + + private ToggleMenuFlyoutItem CreateFilterToggleButton(FilterOption option) + { + var button = new ToggleMenuFlyoutItem() + { + Text = option.Title, + Tag = option, + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(option.Type) }, + IsChecked = option == SelectedFilterOption + }; + + button.Click += FilterToggleChecked; + + return button; + } + + private ToggleMenuFlyoutItem CreateSortingToggleButton(SortingOption option) + { + var button = new ToggleMenuFlyoutItem() + { + Text = option.Title, + Tag = option, + IsChecked = option == SelectedSortingOption + }; + + button.Click += SortingOptionChecked; + + return button; + } + + private void SortingOptionChecked(object sender, RoutedEventArgs e) + { + if (sender is ToggleMenuFlyoutItem button) + { + button.IsHitTestVisible = false; + + var optionModel = button.Tag as SortingOption; + + SelectSortingOption(optionModel); + } + } + + + + private void FilterToggleChecked(object sender, RoutedEventArgs e) + { + if (sender is ToggleMenuFlyoutItem button) + { + button.IsHitTestVisible = false; + + var optionModel = button.Tag as FilterOption; + + SelectFilterOption(optionModel); + } + } + + private void SelectFilterOption(FilterOption option) + { + SelectedFilterOption = option; + + UncheckOtherFilterOptions(); + } + + private void SelectSortingOption(SortingOption option) + { + SelectedSortingOption = option; + + UncheckOtherSortingOptions(); + } + + private void UnregisterCheckedHandler(ToggleMenuFlyoutItem button) + { + button.Click -= FilterToggleChecked; + } + + private void UncheckOtherFilterOptions() + { + if (Items.Any()) + { + foreach (var item in Items) + { + if (item is ToggleMenuFlyoutItem toggleButton && toggleButton.Tag is FilterOption option && option != SelectedFilterOption) + { + toggleButton.IsChecked = false; + toggleButton.IsHitTestVisible = true; + } + } + } + } + + private void UncheckOtherSortingOptions() + { + if (Items.Any()) + { + foreach (var item in Items) + { + if (item is ToggleMenuFlyoutItem toggleButton && toggleButton.Tag is SortingOption option && option != SelectedSortingOption) + { + toggleButton.IsChecked = false; + toggleButton.IsHitTestVisible = true; + } + } + } + } + + public void Dispose() + { + foreach (var item in Items) + { + if (item is ToggleMenuFlyoutItem toggleButton) + { + UnregisterCheckedHandler(toggleButton); + } + } + } + + private static void OnOptionsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is FilterMenuFlyout bar && bar.SortingOptions != null && bar.FilterOptions != null) + { + bar.Dispose(); + + bar.Items.Clear(); + + if (bar.FilterOptions != null) + { + foreach (var item in bar.FilterOptions) + { + bar.Items.Add(bar.CreateFilterToggleButton(item)); + } + } + + bar.Items.Add(new MenuFlyoutSeparator()); + + // Sorting options. + + if (bar.SortingOptions != null) + { + foreach (var item in bar.SortingOptions) + { + bar.Items.Add(bar.CreateSortingToggleButton(item)); + } + } + } + } + } +} diff --git a/Wino.Mail/MenuFlyouts/FolderOperationFlyout.cs b/Wino.Mail/MenuFlyouts/FolderOperationFlyout.cs new file mode 100644 index 00000000..c3ef1f51 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/FolderOperationFlyout.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.MenuFlyouts.Context +{ + public class FolderOperationFlyout : WinoOperationFlyout + { + public FolderOperationFlyout(IEnumerable availableActions, TaskCompletionSource completionSource) : base(availableActions, completionSource) + { + if (AvailableActions == null) return; + + foreach (var action in AvailableActions) + { + if (action.Operation == FolderOperation.Seperator) + Items.Add(new MenuFlyoutSeparator()); + else + { + var menuFlyoutItem = new FolderOperationMenuFlyoutItem(action, (c) => MenuItemClicked(c)); + + Items.Add(menuFlyoutItem); + } + } + } + } +} diff --git a/Wino.Mail/MenuFlyouts/FolderOperationMenuFlyoutItem.cs b/Wino.Mail/MenuFlyouts/FolderOperationMenuFlyoutItem.cs new file mode 100644 index 00000000..c6b788c6 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/FolderOperationMenuFlyoutItem.cs @@ -0,0 +1,12 @@ +using System; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.MenuFlyouts +{ + public class FolderOperationMenuFlyoutItem : WinoOperationFlyoutItem + { + public FolderOperationMenuFlyoutItem(FolderOperationMenuItem operationMenuItem, Action clicked) : base(operationMenuItem, clicked) + { + } + } +} diff --git a/Wino.Mail/MenuFlyouts/MailOperationFlyout.cs b/Wino.Mail/MenuFlyouts/MailOperationFlyout.cs new file mode 100644 index 00000000..a5982881 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/MailOperationFlyout.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.MenuFlyouts.Context +{ + public class MailOperationFlyout : WinoOperationFlyout + { + public MailOperationFlyout(IEnumerable availableActions, TaskCompletionSource completionSource) : base(availableActions, completionSource) + { + if (AvailableActions == null) return; + + foreach (var action in AvailableActions) + { + if (action.Operation == MailOperation.Seperator) + Items.Add(new MenuFlyoutSeparator()); + else + { + var menuFlyoutItem = new MailOperationMenuFlyoutItem(action, (c) => MenuItemClicked(c)); + + Items.Add(menuFlyoutItem); + } + } + } + } +} diff --git a/Wino.Mail/MenuFlyouts/MailOperationMenuFlyoutItem.cs b/Wino.Mail/MenuFlyouts/MailOperationMenuFlyoutItem.cs new file mode 100644 index 00000000..51c1953b --- /dev/null +++ b/Wino.Mail/MenuFlyouts/MailOperationMenuFlyoutItem.cs @@ -0,0 +1,12 @@ +using System; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.MenuFlyouts.Context +{ + public class MailOperationMenuFlyoutItem : WinoOperationFlyoutItem + { + public MailOperationMenuFlyoutItem(MailOperationMenuItem operationMenuItem, Action clicked) : base(operationMenuItem, clicked) + { + } + } +} diff --git a/Wino.Mail/MenuFlyouts/MoveButtonFlyout.cs b/Wino.Mail/MenuFlyouts/MoveButtonFlyout.cs new file mode 100644 index 00000000..cee02589 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/MoveButtonFlyout.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Entities; + +namespace Wino.MenuFlyouts +{ + public class MoveButtonMenuItemClickedEventArgs + { + public Guid ClickedFolderId { get; set; } + } + + public class MoveButtonFlyout : MenuFlyout + { + public event TypedEventHandler MenuItemClick; + public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register(nameof(Folders), typeof(List), typeof(MoveButtonFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnFoldersChanged))); + + public List Folders + { + get { return (List)GetValue(FoldersProperty); } + set { SetValue(FoldersProperty, value); } + } + + private static void OnFoldersChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MoveButtonFlyout menu) + { + menu.InitializeMenu(); + } + + + } + + private void InitializeMenu() + { + Dispose(); + + Items.Clear(); + + if (Folders == null || !Folders.Any()) + return; + + // TODO: Child folders. + + foreach (var item in Folders) + { + // We don't expect this, but it crashes startup. + // Just to be on the safe side. + if (item.FolderName != null) + { + var folderMenuItem = new MenuFlyoutItem() + { + Tag = item, + Text = item.FolderName + }; + + folderMenuItem.Click += MenuItemClicked; + + Items.Add(folderMenuItem); + } + } + } + + private void MenuItemClicked(object sender, RoutedEventArgs e) + { + var clickedFolder = (sender as MenuFlyoutItem).Tag as MailItemFolder; + + MenuItemClick?.Invoke(this, new MoveButtonMenuItemClickedEventArgs() + { + ClickedFolderId = clickedFolder.Id + }); + } + + public void Dispose() + { + foreach (var item in Items) + { + if (item is MenuFlyoutItem menuItem) + { + menuItem.Click -= MenuItemClicked; + } + } + } + } +} diff --git a/Wino.Mail/MenuFlyouts/RendererCommandBarItem.cs b/Wino.Mail/MenuFlyouts/RendererCommandBarItem.cs new file mode 100644 index 00000000..7e4b20d4 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/RendererCommandBarItem.cs @@ -0,0 +1,39 @@ +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Controls; +using Wino.Core.Domain.Enums; +using Wino.Helpers; + +namespace Wino.MenuFlyouts +{ + public class RendererCommandBarItem : AppBarButton, IDisposable + { + public MailOperation Operation { get; set; } + Action Clicked { get; set; } + + public RendererCommandBarItem(MailOperation operation, Action clicked) + { + Margin = new Thickness(6, 0, 6, 0); + CornerRadius = new CornerRadius(6); + + Operation = operation; + Clicked = clicked; + + Label = XamlHelpers.GetOperationString(operation); + Icon = new WinoFontIcon() { Icon = WinoIconGlyph.Archive }; + + Click += MenuClicked; + } + + private void MenuClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) + { + Clicked(Operation); + } + + public void Dispose() + { + Click -= MenuClicked; + } + } +} diff --git a/Wino.Mail/MenuFlyouts/WinoOperationFlyout.cs b/Wino.Mail/MenuFlyouts/WinoOperationFlyout.cs new file mode 100644 index 00000000..6ecd9996 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/WinoOperationFlyout.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Windows.UI.Xaml.Controls; + +namespace Wino.MenuFlyouts +{ + public class WinoOperationFlyout : MenuFlyout, IDisposable where TActionType : class + { + public TActionType ClickedOperation { get; set; } + + protected readonly IEnumerable AvailableActions; + + private readonly TaskCompletionSource _completionSource; + + public WinoOperationFlyout(IEnumerable availableActions, TaskCompletionSource completionSource) + { + _completionSource = completionSource; + + AvailableActions = availableActions; + + Closing += FlyoutClosing; + } + + private void FlyoutClosing(Windows.UI.Xaml.Controls.Primitives.FlyoutBase sender, Windows.UI.Xaml.Controls.Primitives.FlyoutBaseClosingEventArgs args) + { + Closing -= FlyoutClosing; + + _completionSource.TrySetResult(ClickedOperation); + } + + protected void MenuItemClicked(TActionType operation) + { + ClickedOperation = operation; + + Hide(); + } + + public void Dispose() + { + foreach (var item in Items) + { + if (item is IDisposable disposableItem) + { + disposableItem.Dispose(); + } + } + } + } +} diff --git a/Wino.Mail/MenuFlyouts/WinoOperationFlyoutItem.cs b/Wino.Mail/MenuFlyouts/WinoOperationFlyoutItem.cs new file mode 100644 index 00000000..ab0fdc04 --- /dev/null +++ b/Wino.Mail/MenuFlyouts/WinoOperationFlyoutItem.cs @@ -0,0 +1,58 @@ +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Controls; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.Menus; +using Wino.Helpers; + +namespace Wino.MenuFlyouts +{ + public class WinoOperationFlyoutItem : MenuFlyoutItem, IDisposable where TOperationMenuItem : IMenuOperation + { + private const double CustomHeight = 35; + + public TOperationMenuItem Operation { get; set; } + Action Clicked { get; set; } + + public WinoOperationFlyoutItem(TOperationMenuItem operationMenuItem, Action clicked) + { + Margin = new Thickness(4, 2, 4, 2); + CornerRadius = new CornerRadius(6, 6, 6, 6); + + MinHeight = CustomHeight; + + Operation = operationMenuItem; + IsEnabled = operationMenuItem.IsEnabled; + + if (Operation is FolderOperationMenuItem folderOperationMenuItem) + { + var internalOperation = folderOperationMenuItem.Operation; + + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetPathGeometry(internalOperation) }; + Text = XamlHelpers.GetOperationString(internalOperation); + } + else if (Operation is MailOperationMenuItem mailOperationMenuItem) + { + var internalOperation = mailOperationMenuItem.Operation; + + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(internalOperation) }; + Text = XamlHelpers.GetOperationString(internalOperation); + } + + Clicked = clicked; + Click += MenuClicked; + } + + private void MenuClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) + { + Clicked(Operation); + } + + public void Dispose() + { + Click -= MenuClicked; + } + } +} diff --git a/Wino.Mail/Package.appxmanifest b/Wino.Mail/Package.appxmanifest new file mode 100644 index 00000000..0ce91ba0 --- /dev/null +++ b/Wino.Mail/Package.appxmanifest @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + Wino Mail + Burak KÖSE + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Google Auth Protocol + + + + + + + EML\eml.png + + .eml + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Properties/AssemblyInfo.cs b/Wino.Mail/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c05af972 --- /dev/null +++ b/Wino.Mail/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Wino")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Wino")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] diff --git a/Wino.Mail/Properties/Default.rd.xml b/Wino.Mail/Properties/Default.rd.xml new file mode 100644 index 00000000..3f89a13a --- /dev/null +++ b/Wino.Mail/Properties/Default.rd.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Selectors/AccountProviderViewModelTemplateSelector.cs b/Wino.Mail/Selectors/AccountProviderViewModelTemplateSelector.cs new file mode 100644 index 00000000..73b71c4e --- /dev/null +++ b/Wino.Mail/Selectors/AccountProviderViewModelTemplateSelector.cs @@ -0,0 +1,20 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Selectors +{ + public class AccountProviderViewModelTemplateSelector : DataTemplateSelector + { + public DataTemplate RootAccountTemplate { get; set; } + public DataTemplate MergedAccountTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MergedAccountProviderDetailViewModel) + return MergedAccountTemplate; + else + return RootAccountTemplate; + } + } +} diff --git a/Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs b/Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs new file mode 100644 index 00000000..f3afe31e --- /dev/null +++ b/Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs @@ -0,0 +1,25 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.UWP.Models.Personalization; + +namespace Wino.Selectors +{ + public class AppThemePreviewTemplateSelector : DataTemplateSelector + { + public DataTemplate SystemThemeTemplate { get; set; } + public DataTemplate PreDefinedThemeTemplate { get; set; } + public DataTemplate CustomAppTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item) + { + if (item is SystemAppTheme) + return SystemThemeTemplate; + else if (item is PreDefinedAppTheme) + return PreDefinedThemeTemplate; + else if (item is CustomAppTheme) + return CustomAppTemplate; + + return base.SelectTemplateCore(item); + } + } +} diff --git a/Wino.Mail/Selectors/FileAttachmentTypeSelector.cs b/Wino.Mail/Selectors/FileAttachmentTypeSelector.cs new file mode 100644 index 00000000..e117fcd2 --- /dev/null +++ b/Wino.Mail/Selectors/FileAttachmentTypeSelector.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; + +namespace Wino.Selectors +{ + public class FileAttachmentTypeSelector : DataTemplateSelector + { + public DataTemplate None { get; set; } + public DataTemplate Executable { get; set; } + public DataTemplate Image { get; set; } + public DataTemplate Audio { get; set; } + public DataTemplate Video { get; set; } + public DataTemplate PDF { get; set; } + public DataTemplate HTML { get; set; } + public DataTemplate RarArchive { get; set; } + public DataTemplate Archive { get; set; } + public DataTemplate Other { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item == null) + return None; + + var type = (MailAttachmentType)item; + + switch (type) + { + case MailAttachmentType.None: + return None; + case MailAttachmentType.Executable: + return Executable; + case MailAttachmentType.Image: + return Image; + case MailAttachmentType.Audio: + return Audio; + case MailAttachmentType.Video: + return Video; + case MailAttachmentType.PDF: + return PDF; + case MailAttachmentType.HTML: + return HTML; + case MailAttachmentType.RarArchive: + return RarArchive; + case MailAttachmentType.Archive: + return Archive; + default: + return Other; + } + } + } +} diff --git a/Wino.Mail/Selectors/MailItemContainerStyleSelector.cs b/Wino.Mail/Selectors/MailItemContainerStyleSelector.cs new file mode 100644 index 00000000..17959c3f --- /dev/null +++ b/Wino.Mail/Selectors/MailItemContainerStyleSelector.cs @@ -0,0 +1,19 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Selectors +{ + public class MailItemContainerStyleSelector : StyleSelector + { + public Style Thread { get; set; } + + protected override Style SelectStyleCore(object item, DependencyObject container) + { + if (item is ThreadMailItemViewModel) + return Thread; + else + return base.SelectStyleCore(item, container); + } + } +} diff --git a/Wino.Mail/Selectors/MailItemDisplayModePreviewTemplateSelector.cs b/Wino.Mail/Selectors/MailItemDisplayModePreviewTemplateSelector.cs new file mode 100644 index 00000000..55949830 --- /dev/null +++ b/Wino.Mail/Selectors/MailItemDisplayModePreviewTemplateSelector.cs @@ -0,0 +1,34 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; + +namespace Wino.Selectors +{ + /// + /// Template selector for previewing mail item display modes in Settings->Personalization page. + /// + public class MailItemDisplayModePreviewTemplateSelector : DataTemplateSelector + { + public DataTemplate CompactTemplate { get; set; } + public DataTemplate MediumTemplate { get; set; } + public DataTemplate SpaciousTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MailListDisplayMode mode) + { + switch (mode) + { + case MailListDisplayMode.Spacious: + return SpaciousTemplate; + case MailListDisplayMode.Medium: + return MediumTemplate; + case MailListDisplayMode.Compact: + return CompactTemplate; + } + } + + return base.SelectTemplateCore(item, container); + } + } +} diff --git a/Wino.Mail/Selectors/MailItemDisplaySelector.cs b/Wino.Mail/Selectors/MailItemDisplaySelector.cs new file mode 100644 index 00000000..fe7a3cf1 --- /dev/null +++ b/Wino.Mail/Selectors/MailItemDisplaySelector.cs @@ -0,0 +1,22 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Selectors +{ + public class MailItemDisplaySelector : DataTemplateSelector + { + public DataTemplate SingleMailItemTemplate { get; set; } + public DataTemplate ThreadMailItemTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MailItemViewModel) + return SingleMailItemTemplate; + else if (item is ThreadMailItemViewModel) + return ThreadMailItemTemplate; + + return base.SelectTemplateCore(item, container); + } + } +} diff --git a/Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs b/Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs new file mode 100644 index 00000000..f04e0bd5 --- /dev/null +++ b/Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs @@ -0,0 +1,60 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.MenuItems; + +namespace Wino.Selectors +{ + public class NavigationMenuTemplateSelector : DataTemplateSelector + { + public DataTemplate MenuItemTemplate { get; set; } + public DataTemplate AccountManagementTemplate { get; set; } + public DataTemplate NestedAccountMenuTemplate { get; set; } + public DataTemplate ClickableAccountMenuTemplate { get; set; } + public DataTemplate MergedAccountTemplate { get; set; } + public DataTemplate MergedAccountFolderTemplate { get; set; } + public DataTemplate MergedAccountMoreExpansionItemTemplate { get; set; } + public DataTemplate FolderMenuTemplate { get; set; } + public DataTemplate SettingsItemTemplate { get; set; } + public DataTemplate MoreItemsFolderTemplate { get; set; } + public DataTemplate RatingItemTemplate { get; set; } + public DataTemplate CreateNewFolderTemplate { get; set; } + public DataTemplate SeperatorTemplate { get; set; } + public DataTemplate NewMailTemplate { get; set; } + public DataTemplate CategoryItemsTemplate { get; set; } + public DataTemplate FixAuthenticationIssueTemplate { get; set; } + public DataTemplate FixMissingFolderConfigTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item) + { + if (item is NewMailMenuItem) + return NewMailTemplate; + else if (item is SettingsItem) + return SettingsItemTemplate; + else if (item is SeperatorItem) + return SeperatorTemplate; + else if (item is AccountMenuItem accountMenuItem) + // Merged inbox account menu items must be nested. + return accountMenuItem.Parameter.MergedInboxId != null ? NestedAccountMenuTemplate : ClickableAccountMenuTemplate; + else if (item is ManageAccountsMenuItem) + return AccountManagementTemplate; + else if (item is RateMenuItem) + return RatingItemTemplate; + else if (item is MergedAccountMenuItem) + return MergedAccountTemplate; + else if (item is MergedAccountMoreFolderMenuItem) + return MergedAccountMoreExpansionItemTemplate; + else if (item is MergedAccountFolderMenuItem) + return MergedAccountFolderTemplate; + else if (item is FolderMenuItem) + return FolderMenuTemplate; + else if (item is FixAccountIssuesMenuItem fixAccountIssuesMenuItem) + return fixAccountIssuesMenuItem.Account.AttentionReason == Core.Domain.Enums.AccountAttentionReason.MissingSystemFolderConfiguration + ? FixMissingFolderConfigTemplate : FixAuthenticationIssueTemplate; + else + { + var type = item.GetType(); + return null; + } + } + } +} diff --git a/Wino.Mail/Selectors/RendererCommandBarItemTemplateSelector.cs b/Wino.Mail/Selectors/RendererCommandBarItemTemplateSelector.cs new file mode 100644 index 00000000..2ad2dd67 --- /dev/null +++ b/Wino.Mail/Selectors/RendererCommandBarItemTemplateSelector.cs @@ -0,0 +1,84 @@ +using Windows.Graphics.Printing.OptionDetails; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.Selectors +{ + public class RendererCommandBarItemTemplateSelector : DataTemplateSelector + { + public DataTemplate Reply { get; set; } + public DataTemplate ReplyAll { get; set; } + public DataTemplate Archive { get; set; } + public DataTemplate Unarchive { get; set; } + public DataTemplate SetFlag { get; set; } + public DataTemplate ClearFlag { get; set; } + public DataTemplate MarkAsRead { get; set; } + public DataTemplate MarkAsUnread { get; set; } + public DataTemplate Delete { get; set; } + public DataTemplate Move { get; set; } + public DataTemplate MoveToJunk { get; set; } + public DataTemplate SaveAs { get; set; } + public DataTemplate Zoom { get; set; } + public DataTemplate Forward { get; set; } + public DataTemplate DarkEditor { get; set; } + public DataTemplate LightEditor { get; set; } + public DataTemplate SeperatorTemplate { get; set; } + public DataTemplate Find { get; set; } + public DataTemplate Print { get; set; } + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MailOperationMenuItem mailOperationItem) + { + switch (mailOperationItem.Operation) + { + case MailOperation.None: + break; + case MailOperation.Archive: + return Archive; + case MailOperation.UnArchive: + return Unarchive; + case MailOperation.SoftDelete: + return Delete; + case MailOperation.Move: + return Move; + case MailOperation.MoveToJunk: + return MoveToJunk; + case MailOperation.SetFlag: + return SetFlag; + case MailOperation.ClearFlag: + return ClearFlag; + case MailOperation.MarkAsRead: + return MarkAsRead; + case MailOperation.MarkAsUnread: + return MarkAsUnread; + case MailOperation.Reply: + return Reply; + case MailOperation.ReplyAll: + return ReplyAll; + case MailOperation.Zoom: + return Zoom; + case MailOperation.SaveAs: + return SaveAs; + case MailOperation.Find: + return Find; + case MailOperation.Forward: + return Forward; + case MailOperation.DarkEditor: + return DarkEditor; + case MailOperation.LightEditor: + return LightEditor; + case MailOperation.Seperator: + return SeperatorTemplate; + case MailOperation.Print: + return Print; + default: + break; + } + } + + return base.SelectTemplateCore(item, container); + } + } +} diff --git a/Wino.Mail/Services/ApplicationResourceManager.cs b/Wino.Mail/Services/ApplicationResourceManager.cs new file mode 100644 index 00000000..24ef610b --- /dev/null +++ b/Wino.Mail/Services/ApplicationResourceManager.cs @@ -0,0 +1,23 @@ +using System.Linq; +using Windows.UI.Xaml; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Services +{ + public class ApplicationResourceManager : IApplicationResourceManager + { + public void AddResource(ResourceDictionary resource) + => App.Current.Resources.MergedDictionaries.Add(resource); + public void RemoveResource(ResourceDictionary resource) + => App.Current.Resources.MergedDictionaries.Remove(resource); + + public bool ContainsResourceKey(string resourceKey) + => App.Current.Resources.ContainsKey(resourceKey); + + public ResourceDictionary GetLastResource() + => App.Current.Resources.MergedDictionaries.LastOrDefault(); + + public void ReplaceResource(string resourceKey, object resource) + => App.Current.Resources[resourceKey] = resource; + } +} diff --git a/Wino.Mail/Services/DialogService.cs b/Wino.Mail/Services/DialogService.cs new file mode 100644 index 00000000..8f134a09 --- /dev/null +++ b/Wino.Mail/Services/DialogService.cs @@ -0,0 +1,335 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Toolkit.Uwp.Helpers; +using Serilog; +using Windows.Storage; +using Windows.Storage.Pickers; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Messages.Shell; +using Wino.Core.Messages.Synchronization; +using Wino.Core.Requests; +using Wino.Core.UWP.Extensions; +using Wino.Dialogs; + +namespace Wino.Services +{ + public class DialogService : IDialogService + { + private SemaphoreSlim _presentationSemaphore = new SemaphoreSlim(1); + + private readonly IThemeService _themeService; + + public DialogService(IThemeService themeService) + { + _themeService = themeService; + } + + public void ShowNotSupportedMessage() + { + InfoBarMessage(Translator.Info_UnsupportedFunctionalityTitle, Translator.Info_UnsupportedFunctionalityDescription, InfoBarMessageType.Error); + } + + public async Task ShowMessageAsync(string message, string title) + { + var dialog = new WinoMessageDialog() + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentation(() => dialog.ShowDialogAsync(title, message)); + } + + /// + /// Waits for PopupRoot to be available before presenting the dialog and returns the result after presentation. + /// + /// Dialog to present and wait for closing. + /// Dialog result from WinRT. + private async Task HandleDialogPresentationAsync(ContentDialog dialog) + { + await _presentationSemaphore.WaitAsync(); + + try + { + return await dialog.ShowAsync(); + } + catch (Exception ex) + { + Log.Error(ex, $"Handling dialog service failed. Dialog was {dialog.GetType().Name}"); + } + finally + { + _presentationSemaphore.Release(); + } + + return ContentDialogResult.None; + } + + /// + /// Waits for PopupRoot to be available before executing the given Task that returns customized result. + /// + /// Task that presents the dialog and returns result. + /// Dialog result from the custom dialog. + private async Task HandleDialogPresentation(Func> executionTask) + { + await _presentationSemaphore.WaitAsync(); + + try + { + return await executionTask(); + } + catch (Exception ex) + { + Log.Error(ex, "Handling dialog service failed."); + } + finally + { + _presentationSemaphore.Release(); + } + + return false; + } + + public async Task ShowConfirmationDialogAsync(string question, string title, string confirmationButtonTitle) + { + var dialog = new ConfirmationDialog() + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + return await HandleDialogPresentation(() => dialog.ShowDialogAsync(title, question, confirmationButtonTitle)); + } + + public async Task> ShowNewAccountMailProviderDialogAsync(List availableProviders) + { + var dialog = new NewAccountDialog + { + Providers = availableProviders, + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(dialog); + + return dialog.AccountInformationTuple; + } + + public IAccountCreationDialog GetAccountCreationDialog(MailProviderType type) + { + IAccountCreationDialog dialog = null; + + if (type == MailProviderType.IMAP4) + { + dialog = new NewImapSetupDialog + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + } + else + { + dialog = new AccountCreationDialog + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + } + + return dialog; + } + + public void InfoBarMessage(string title, string message, InfoBarMessageType messageType) + => WeakReferenceMessenger.Default.Send(new InfoBarMessageRequested(messageType, title, message)); + + public void InfoBarMessage(string title, string message, InfoBarMessageType messageType, string actionButtonText, Action action) + => WeakReferenceMessenger.Default.Send(new InfoBarMessageRequested(messageType, title, message, actionButtonText, action)); + + public async Task ShowTextInputDialogAsync(string currentInput, string dialogTitle, string dialogDescription) + { + var inputDialog = new TextInputDialog() + { + CurrentInput = currentInput, + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme(), + Title = dialogTitle + }; + + inputDialog.SetDescription(dialogDescription); + + await HandleDialogPresentationAsync(inputDialog); + + if (inputDialog.HasInput.GetValueOrDefault() && !currentInput.Equals(inputDialog.CurrentInput)) + return inputDialog.CurrentInput; + + return string.Empty; + } + + public async Task PickWindowsFolderAsync() + { + var picker = new FolderPicker + { + SuggestedStartLocation = PickerLocationId.DocumentsLibrary + }; + + picker.FileTypeFilter.Add("*"); + + var pickedFolder = await picker.PickSingleFolderAsync(); + + if (pickedFolder != null) + { + Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("FolderPickerToken", pickedFolder); + + return pickedFolder.Path; + } + + return string.Empty; + } + + public async Task ShowEditAccountDialogAsync(MailAccount account) + { + var editAccountDialog = new AccountEditDialog(account) + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(editAccountDialog); + + return editAccountDialog.IsSaved ? editAccountDialog.Account : null; + } + + public async Task ShowRatingDialogAsync() + { + var storeDialog = new StoreRatingDialog() + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(storeDialog); + + return storeDialog; + } + + public async Task HandleSystemFolderConfigurationDialogAsync(Guid accountId, IFolderService folderService) + { + try + { + var configurableFolder = await folderService.GetFoldersAsync(accountId); + + var systemFolderConfigurationDialog = new SystemFolderConfigurationDialog(configurableFolder) + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(systemFolderConfigurationDialog); + + var configuration = systemFolderConfigurationDialog.Configuration; + + if (configuration != null) + { + var updatedAccount = await folderService.UpdateSystemFolderConfigurationAsync(accountId, configuration); + + // Update account menu item and force re-synchronization. + WeakReferenceMessenger.Default.Send(new AccountUpdatedMessage(updatedAccount)); + + var options = new SynchronizationOptions() + { + AccountId = updatedAccount.Id, + Type = SynchronizationType.Full, + }; + + WeakReferenceMessenger.Default.Send(new NewSynchronizationRequested(options)); + } + + if (configuration != null) + { + InfoBarMessage(Translator.SystemFolderConfigSetupSuccess_Title, Translator.SystemFolderConfigSetupSuccess_Message, InfoBarMessageType.Success); + } + } + catch (Exception ex) + { + InfoBarMessage(Translator.Error_FailedToSetupSystemFolders_Title, ex.Message, InfoBarMessageType.Error); + } + } + + public async Task ShowMoveMailFolderDialogAsync(List availableFolders) + { + var moveDialog = new MoveMailDialog(availableFolders) + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(moveDialog); + + return moveDialog.SelectedFolder; + } + + public async Task PickFolderAsync(Guid accountId, PickFolderReason reason, IFolderService folderService) + { + var allFolders = await folderService.GetFolderStructureForAccountAsync(accountId, true); + + return await ShowMoveMailFolderDialogAsync(allFolders.Folders); + } + + public async Task ShowCustomThemeBuilderDialogAsync() + { + var themeBuilderDialog = new CustomThemeBuilderDialog() + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + var dialogResult = await HandleDialogPresentationAsync(themeBuilderDialog); + + return dialogResult == ContentDialogResult.Primary; + } + + private async Task PickFileAsync(params object[] typeFilters) + { + var picker = new FileOpenPicker + { + ViewMode = PickerViewMode.Thumbnail + }; + + foreach (var filter in typeFilters) + { + picker.FileTypeFilter.Add(filter.ToString()); + } + + var file = await picker.PickSingleFileAsync(); + + if (file == null) return null; + + Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("FilePickerPath", file); + + return file; + } + + public async Task PickWindowsFileContentAsync(params object[] typeFilters) + { + var file = await PickFileAsync(typeFilters); + + if (file == null) return Array.Empty(); + + return await file.ReadBytesAsync(); + } + + public Task ShowHardDeleteConfirmationAsync() => ShowConfirmationDialogAsync(Translator.DialogMessage_HardDeleteConfirmationMessage, Translator.DialogMessage_HardDeleteConfirmationTitle, Translator.Buttons_Yes); + + public async Task ShowAccountPickerDialogAsync(List availableAccounts) + { + var accountPicker = new AccountPickerDialog(availableAccounts) + { + RequestedTheme = _themeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(accountPicker); + + return accountPicker.PickedAccount; + } + + + } +} diff --git a/Wino.Mail/Services/LaunchProtocolService.cs b/Wino.Mail/Services/LaunchProtocolService.cs new file mode 100644 index 00000000..40a699ed --- /dev/null +++ b/Wino.Mail/Services/LaunchProtocolService.cs @@ -0,0 +1,11 @@ +using System.Collections.Specialized; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP.Services +{ + public class LaunchProtocolService : ILaunchProtocolService + { + public object LaunchParameter { get; set; } + public NameValueCollection MailtoParameters { get; set; } + } +} diff --git a/Wino.Mail/Services/PreferencesService.cs b/Wino.Mail/Services/PreferencesService.cs new file mode 100644 index 00000000..7b2fe0fa --- /dev/null +++ b/Wino.Mail/Services/PreferencesService.cs @@ -0,0 +1,193 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.Services; + +namespace Wino.Services +{ + public class PreferencesService : ObservableObject, IPreferencesService + { + private readonly IConfigurationService _configurationService; + + public event EventHandler PreferenceChanged; + + public PreferencesService(IConfigurationService configurationService) + { + _configurationService = configurationService; + } + + protected override void OnPropertyChanged(PropertyChangedEventArgs e) + { + base.OnPropertyChanged(e); + + PreferenceChanged?.Invoke(this, e.PropertyName); + } + + private void SaveProperty(string propertyName, object value) => _configurationService.Set(propertyName, value); + + private void SetPropertyAndSave(string propertyName, object value) + { + _configurationService.Set(propertyName, value); + + OnPropertyChanged(propertyName); + Debug.WriteLine($"PreferencesService -> {propertyName}:{value?.ToString()}"); + } + + public MailRenderingOptions GetRenderingOptions() + => new MailRenderingOptions() { LoadImages = RenderImages, LoadStyles = RenderStyles }; + + public MailListDisplayMode MailItemDisplayMode + { + get => _configurationService.Get(nameof(MailItemDisplayMode), MailListDisplayMode.Spacious); + set => SetPropertyAndSave(nameof(MailItemDisplayMode), value); + } + + public bool IsSemanticZoomEnabled + { + get => _configurationService.Get(nameof(IsSemanticZoomEnabled), true); + set => SetPropertyAndSave(nameof(IsSemanticZoomEnabled), value); + } + + public bool IsHardDeleteProtectionEnabled + { + get => _configurationService.Get(nameof(IsHardDeleteProtectionEnabled), true); + set => SetPropertyAndSave(nameof(IsHardDeleteProtectionEnabled), value); + } + + public bool IsThreadingEnabled + { + get => _configurationService.Get(nameof(IsThreadingEnabled), true); + set => SetPropertyAndSave(nameof(IsThreadingEnabled), value); + } + + public bool IsShowSenderPicturesEnabled + { + get => _configurationService.Get(nameof(IsShowSenderPicturesEnabled), true); + set => SetPropertyAndSave(nameof(IsShowSenderPicturesEnabled), value); + } + + public bool IsShowPreviewEnabled + { + get => _configurationService.Get(nameof(IsShowPreviewEnabled), true); + set => SetPropertyAndSave(nameof(IsShowPreviewEnabled), value); + } + + public bool RenderStyles + { + get => _configurationService.Get(nameof(RenderStyles), true); + set => SetPropertyAndSave(nameof(RenderStyles), value); + } + + public bool RenderImages + { + get => _configurationService.Get(nameof(RenderImages), true); + set => SetPropertyAndSave(nameof(RenderImages), value); + } + + public bool Prefer24HourTimeFormat + { + get => _configurationService.Get(nameof(Prefer24HourTimeFormat), false); + set => SetPropertyAndSave(nameof(Prefer24HourTimeFormat), value); + } + + public MailMarkAsOption MarkAsPreference + { + get => _configurationService.Get(nameof(MarkAsPreference), MailMarkAsOption.WhenSelected); + set => SetPropertyAndSave(nameof(MarkAsPreference), value); + } + + public int MarkAsDelay + { + get => _configurationService.Get(nameof(MarkAsDelay), 5); + set => SetPropertyAndSave(nameof(MarkAsDelay), value); + } + + public MailOperation RightSwipeOperation + { + get => _configurationService.Get(nameof(RightSwipeOperation), MailOperation.MarkAsRead); + set => SetPropertyAndSave(nameof(RightSwipeOperation), value); + } + + public MailOperation LeftSwipeOperation + { + get => _configurationService.Get(nameof(LeftSwipeOperation), MailOperation.SoftDelete); + set => SetPropertyAndSave(nameof(LeftSwipeOperation), value); + } + + public bool IsHoverActionsEnabled + { + get => _configurationService.Get(nameof(IsHoverActionsEnabled), true); + set => SetPropertyAndSave(nameof(IsHoverActionsEnabled), value); + } + + public MailOperation LeftHoverAction + { + get => _configurationService.Get(nameof(LeftHoverAction), MailOperation.Archive); + set => SetPropertyAndSave(nameof(LeftHoverAction), value); + } + + public MailOperation CenterHoverAction + { + get => _configurationService.Get(nameof(CenterHoverAction), MailOperation.SoftDelete); + set => SetPropertyAndSave(nameof(CenterHoverAction), value); + } + + public MailOperation RightHoverAction + { + get => _configurationService.Get(nameof(RightHoverAction), MailOperation.SetFlag); + set => SetPropertyAndSave(nameof(RightHoverAction), value); + } + + public bool IsLoggingEnabled + { + get => _configurationService.Get(nameof(IsLoggingEnabled), true); + set => SetPropertyAndSave(nameof(IsLoggingEnabled), value); + } + + public bool IsMailkitProtocolLoggerEnabled + { + get => _configurationService.Get(nameof(IsMailkitProtocolLoggerEnabled), false); + set => SetPropertyAndSave(nameof(IsMailkitProtocolLoggerEnabled), value); + } + + public Guid? StartupEntityId + { + get => _configurationService.Get(nameof(StartupEntityId), null); + set => SaveProperty(propertyName: nameof(StartupEntityId), value); + } + + public AppLanguage CurrentLanguage + { + get => _configurationService.Get(nameof(CurrentLanguage), TranslationService.DefaultAppLanguage); + set => SaveProperty(propertyName: nameof(CurrentLanguage), value); + } + + public ReaderFont ReaderFont + { + get => _configurationService.Get(nameof(ReaderFont), ReaderFont.Calibri); + set => SaveProperty(propertyName: nameof(ReaderFont), value); + } + + public int ReaderFontSize + { + get => _configurationService.Get(nameof(ReaderFontSize), 14); + set => SaveProperty(propertyName: nameof(ReaderFontSize), value); + } + + public bool IsNavigationPaneOpened + { + get => _configurationService.Get(nameof(IsNavigationPaneOpened), true); + set => SaveProperty(propertyName: nameof(IsNavigationPaneOpened), value); + } + + public bool AutoSelectNextItem + { + get => _configurationService.Get(nameof(AutoSelectNextItem), true); + set => SaveProperty(propertyName: nameof(AutoSelectNextItem), value); + } + } +} diff --git a/Wino.Mail/Services/StatePersistenceService.cs b/Wino.Mail/Services/StatePersistenceService.cs new file mode 100644 index 00000000..4c995ef9 --- /dev/null +++ b/Wino.Mail/Services/StatePersistenceService.cs @@ -0,0 +1,132 @@ +using System; +using System.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.AppCenter.Crashes; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Messages.Shell; + +namespace Wino.Services +{ + public class StatePersistenceService : ObservableObject, IStatePersistanceService + { + public event EventHandler StatePropertyChanged; + + private const string OpenPaneLengthKey = nameof(OpenPaneLengthKey); + private const string MailListPaneLengthKey = nameof(MailListPaneLengthKey); + + private readonly IConfigurationService _configurationService; + + public StatePersistenceService(IConfigurationService configurationService) + { + _configurationService = configurationService; + + openPaneLength = _configurationService.Get(OpenPaneLengthKey, 320d); + _mailListPaneLength = _configurationService.Get(MailListPaneLengthKey, 420d); + + PropertyChanged += ServicePropertyChanged; + } + + private void ServicePropertyChanged(object sender, PropertyChangedEventArgs e) => StatePropertyChanged?.Invoke(this, e.PropertyName); + + public bool IsBackButtonVisible => IsReadingMail && IsReaderNarrowed; + + private bool isReadingMail; + + public bool IsReadingMail + { + get => isReadingMail; + set + { + if (SetProperty(ref isReadingMail, value)) + { + OnPropertyChanged(nameof(IsBackButtonVisible)); + WeakReferenceMessenger.Default.Send(new ShellStateUpdated()); + } + } + } + + private bool shouldShiftMailRenderingDesign; + + public bool ShouldShiftMailRenderingDesign + { + get { return shouldShiftMailRenderingDesign; } + set { shouldShiftMailRenderingDesign = value; } + } + + private bool isReaderNarrowed; + + public bool IsReaderNarrowed + { + get => isReaderNarrowed; + set + { + if (SetProperty(ref isReaderNarrowed, value)) + { + OnPropertyChanged(nameof(IsBackButtonVisible)); + WeakReferenceMessenger.Default.Send(new ShellStateUpdated()); + } + } + } + + private string coreWindowTitle; + + public string CoreWindowTitle + { + get => coreWindowTitle; + set + { + if (SetProperty(ref coreWindowTitle, value)) + { + UpdateAppCoreWindowTitle(); + } + } + } + + #region Settings + + private double openPaneLength; + public double OpenPaneLength + { + get => openPaneLength; + set + { + if (SetProperty(ref openPaneLength, value)) + { + _configurationService.Set(OpenPaneLengthKey, value); + } + } + } + + private double _mailListPaneLength; + public double MailListPaneLength + { + get => _mailListPaneLength; + set + { + if (SetProperty(ref _mailListPaneLength, value)) + { + _configurationService.Set(MailListPaneLengthKey, value); + } + } + + } + + #endregion + + private void UpdateAppCoreWindowTitle() + { + try + { + var appView = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView(); + + if (appView != null) + appView.Title = CoreWindowTitle; + } + catch (System.Exception ex) + { + Crashes.TrackError(ex); + } + } + } +} diff --git a/Wino.Mail/Services/ToastActivationService.cs b/Wino.Mail/Services/ToastActivationService.cs new file mode 100644 index 00000000..57eaaf05 --- /dev/null +++ b/Wino.Mail/Services/ToastActivationService.cs @@ -0,0 +1,20 @@ +using Wino.Core.Domain.Interfaces; + +namespace Wino.Services +{ + public class ToastActivationService + { + private readonly IMailService _mailService; + private readonly IWinoRequestDelegator _winoRequestDelegator; + private readonly INativeAppService _nativeAppService; + + public ToastActivationService(IMailService mailService, + IWinoRequestDelegator winoRequestDelegator, + INativeAppService nativeAppService) + { + _mailService = mailService; + _winoRequestDelegator = winoRequestDelegator; + _nativeAppService = nativeAppService; + } + } +} diff --git a/Wino.Mail/Services/WinoNavigationService.cs b/Wino.Mail/Services/WinoNavigationService.cs new file mode 100644 index 00000000..cadd6b02 --- /dev/null +++ b/Wino.Mail/Services/WinoNavigationService.cs @@ -0,0 +1,163 @@ +using System; +using CommunityToolkit.Mvvm.Messaging; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media.Animation; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Navigation; +using Wino.Helpers; +using Wino.Mail.ViewModels.Data; +using Wino.Mail.ViewModels.Messages; +using Wino.Views; +using Wino.Views.Account; +using Wino.Views.Settings; + +namespace Wino.Services +{ + public class WinoNavigationService : IWinoNavigationService + { + private Frame GetCoreFrame(NavigationReferenceFrame frameType) + { + if (Window.Current.Content is Frame appFrame && appFrame.Content is AppShell shellPage) + return WinoVisualTreeHelper.GetChildObject(shellPage, frameType.ToString()); + + return null; + } + + private Type GetCurrentFrameType(ref Frame _frame) + { + if (_frame != null && _frame.Content != null) + return _frame.Content.GetType(); + else + { + return null; + } + } + + private Type GetPageType(WinoPage winoPage) + { + switch (winoPage) + { + case WinoPage.None: + return null; + case WinoPage.IdlePage: + return typeof(IdlePage); + case WinoPage.AccountDetailsPage: + return typeof(AccountDetailsPage); + case WinoPage.MergedAccountDetailsPage: + return typeof(MergedAccountDetailsPage); + case WinoPage.AccountManagementPage: + return typeof(NewAccountManagementPage); + case WinoPage.SignatureManagementPage: + return typeof(SignatureManagementPage); + case WinoPage.AboutPage: + return typeof(AboutPage); + case WinoPage.PersonalizationPage: + return typeof(PersonalizationPage); + case WinoPage.MessageListPage: + return typeof(MessageListPage); + case WinoPage.ReadingPanePage: + return typeof(ReadingPanePage); + case WinoPage.MailRenderingPage: + return typeof(MailRenderingPage); + case WinoPage.ComposePage: + return typeof(ComposePage); + case WinoPage.MailListPage: + return typeof(MailListPage); + case WinoPage.SettingsPage: + return typeof(SettingsPage); + case WinoPage.WelcomePage: + return typeof(WelcomePage); + case WinoPage.SettingOptionsPage: + return typeof(SettingOptionsPage); + default: + return null; + } + } + + public bool Navigate(WinoPage page, + object parameter = null, + NavigationReferenceFrame frame = NavigationReferenceFrame.ShellFrame, + NavigationTransitionType transition = NavigationTransitionType.None) + { + var pageType = GetPageType(page); + Frame shellFrame = GetCoreFrame(NavigationReferenceFrame.ShellFrame); + + if (shellFrame != null) + { + var currentFrameType = GetCurrentFrameType(ref shellFrame); + + bool isMailListingPageActive = currentFrameType != null && currentFrameType == typeof(MailListPage); + + // Active page is mail list page and we are refreshing the folder. + if (isMailListingPageActive && currentFrameType == pageType && parameter is NavigateMailFolderEventArgs folderNavigationArgs) + { + // No need for new navigation, just refresh the folder. + WeakReferenceMessenger.Default.Send(new ActiveMailFolderChangedEvent(folderNavigationArgs.BaseFolderMenuItem, folderNavigationArgs.FolderInitLoadAwaitTask)); + + return true; + } + + var transitionInfo = GetNavigationTransitionInfo(transition); + + // This page must be opened in the Frame placed in MailListingPage. + if (isMailListingPageActive && frame == NavigationReferenceFrame.RenderingFrame) + { + var listingFrame = GetCoreFrame(NavigationReferenceFrame.RenderingFrame); + + if (listingFrame == null) return false; + + listingFrame.Navigate(pageType, parameter, transitionInfo); + + return true; + } + + if ((currentFrameType != null && currentFrameType != pageType) || currentFrameType == null) + { + return shellFrame.Navigate(pageType, parameter, transitionInfo); + } + } + + return false; + } + + private NavigationTransitionInfo GetNavigationTransitionInfo(NavigationTransitionType transition) + { + return transition switch + { + NavigationTransitionType.DrillIn => new DrillInNavigationTransitionInfo(), + _ => new SuppressNavigationTransitionInfo(), + }; + } + + public void NavigateCompose(IMailItem mailItem, NavigationTransitionType transition = NavigationTransitionType.None) + => Navigate(WinoPage.ComposePage, mailItem, NavigationReferenceFrame.RenderingFrame, transition); + + // Standalone EML viewer. + public void NavigateRendering(MimeMessageInformation mimeMessageInformation, NavigationTransitionType transition = NavigationTransitionType.None) + { + if (mimeMessageInformation == null) + throw new ArgumentException("MimeMessage cannot be null."); + + Navigate(WinoPage.MailRenderingPage, mimeMessageInformation, NavigationReferenceFrame.RenderingFrame, transition); + } + + // Mail item view model clicked handler. + public void NavigateRendering(IMailItem mailItem, NavigationTransitionType transition = NavigationTransitionType.None) + { + if (mailItem is MailItemViewModel mailItemViewModel) + Navigate(WinoPage.MailRenderingPage, mailItemViewModel, NavigationReferenceFrame.RenderingFrame, transition); + else + throw new ArgumentException("MailItem must be of type MailItemViewModel."); + } + + public void NavigateWelcomePage() => Navigate(WinoPage.WelcomePage); + + public void NavigateManageAccounts() => Navigate(WinoPage.AccountManagementPage); + + public void NavigateFolder(NavigateMailFolderEventArgs args) + => Navigate(WinoPage.MailListPage, args, NavigationReferenceFrame.ShellFrame); + } +} diff --git a/Wino.Mail/Styles/Colors.xaml b/Wino.Mail/Styles/Colors.xaml new file mode 100644 index 00000000..f33c0dba --- /dev/null +++ b/Wino.Mail/Styles/Colors.xaml @@ -0,0 +1,19 @@ + + + #e74c3c + #e74c3c + #ff7675 + + #1abc9c + + + + #fdcb6e + #636e72 + + + #fdcb6e + #2d3436 + + + diff --git a/Wino.Mail/Styles/CommandBarItems.xaml b/Wino.Mail/Styles/CommandBarItems.xaml new file mode 100644 index 00000000..dd596d20 --- /dev/null +++ b/Wino.Mail/Styles/CommandBarItems.xaml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Styles/CommandBarItems.xaml.cs b/Wino.Mail/Styles/CommandBarItems.xaml.cs new file mode 100644 index 00000000..a2695111 --- /dev/null +++ b/Wino.Mail/Styles/CommandBarItems.xaml.cs @@ -0,0 +1,12 @@ +using Windows.UI.Xaml; + +namespace Wino.Styles +{ + public partial class CommandBarItems : ResourceDictionary + { + public CommandBarItems() + { + InitializeComponent(); + } + } +} diff --git a/Wino.Mail/Styles/ContentPresenters.xaml b/Wino.Mail/Styles/ContentPresenters.xaml new file mode 100644 index 00000000..7e1293aa --- /dev/null +++ b/Wino.Mail/Styles/ContentPresenters.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Styles/Converters.xaml b/Wino.Mail/Styles/Converters.xaml new file mode 100644 index 00000000..0ef5e1cb --- /dev/null +++ b/Wino.Mail/Styles/Converters.xaml @@ -0,0 +1,7 @@ + + + + diff --git a/Wino.Mail/Styles/FontIcons.xaml b/Wino.Mail/Styles/FontIcons.xaml new file mode 100644 index 00000000..b30f9def --- /dev/null +++ b/Wino.Mail/Styles/FontIcons.xaml @@ -0,0 +1,29 @@ + + + + M128.5,799.5C128.5,778.5 132.5,758.25 140.5,738.75C148.5,719.25 160,702 175,687L525,337C531.333,330.667 538.833,327.5 547.5,327.5C556.167,327.5 563.667,330.667 570,337C576.333,343.333 579.5,350.833 579.5,359.5C579.5,368.167 576.333,375.667 570,382L220,732C211.333,740.667 204.5,750.917 199.5,762.75C194.5,774.583 192,786.833 192,799.5C192,812.833 194.5,825.333 199.5,837C204.5,848.667 211.333,858.833 220,867.5C228.667,876.167 238.833,883 250.5,888C262.167,893 274.667,895.5 288,895.5C300.667,895.5 312.833,893.167 324.5,888.5C336.167,883.833 346.5,877 355.5,868L775,456.5C793,438.833 807,418.083 817,394.25C827,370.417 832,346 832,321C832,295.667 827.083,271.333 817.25,248C807.417,224.667 794,204.083 777,186.25C760,168.417 740.083,154.25 717.25,143.75C694.417,133.25 670,128 644,128C617.333,128 592.083,132.583 568.25,141.75C544.417,150.917 523,165 504,184L120,568C113.667,574.333 106.167,577.5 97.5,577.5C88.8333,577.5 81.3333,574.333 75,568C68.6667,561.667 65.5,554.167 65.5,545.5C65.5,536.833 68.6667,529.333 75,523L459,139C472.333,125.667 485.75,114.25 499.25,104.75C512.75,95.25 526.917,87.5 541.75,81.5C556.583,75.5 572.083,71.0834 588.25,68.25C604.417,65.4167 621.833,64.0001 640.5,64C675.833,64.0001 709,70.8334 740,84.5C771,98.1667 798.083,116.667 821.25,140C844.417,163.333 862.667,190.583 876,221.75C889.333,252.917 896,286.167 896,321.5C896,338.167 894.25,354.75 890.75,371.25C887.25,387.75 882.25,403.833 875.75,419.5C869.25,435.167 861.25,450.083 851.75,464.25C842.25,478.417 831.667,491.167 820,502.5L400.5,914C385.167,929 367.75,940.333 348.25,948C328.75,955.667 308.333,959.5 287,959.5C265,959.5 244.333,955.25 225,946.75C205.667,938.25 188.917,926.75 174.75,912.25C160.583,897.75 149.333,880.833 141,861.5C132.667,842.167 128.5,821.5 128.5,799.5Z + M896,392L896,898.5C896,915.167 892.583,931.083 885.75,946.25C878.917,961.417 869.75,974.75 858.25,986.25C846.75,997.75 833.417,1006.92 818.25,1013.75C803.083,1020.58 787.167,1024 770.5,1024L517,1024C528.667,1014.67 539.833,1004.67 550.5,994C561.167,983.333 571,972 580,960L768,960C777,960 785.333,958.333 793,955C800.667,951.667 807.417,947.083 813.25,941.25C819.083,935.417 823.667,928.667 827,921C830.333,913.333 832,905 832,896L832,392C832,390.667 832,389.333 832,388C832,386.667 831.833,385.333 831.5,384L637.5,384C620.167,384 603.917,380.5 588.75,373.5C573.583,366.5 560.333,357.167 549,345.5C537.667,333.833 528.667,320.25 522,304.75C515.333,289.25 512,273 512,256L512,64.5C510.667,64.1667 509.333,64.0001 508,64C506.667,64.0001 505.333,64.0001 504,64L256,64C247,64.0001 238.667,65.6667 231,69C223.333,72.3334 216.583,76.9167 210.75,82.75C204.917,88.5834 200.333,95.3334 197,103C193.667,110.667 192,119 192,128L192,380.5C169.667,386.5 148.333,394.5 128,404.5L128,125.5C128,108.833 131.417,92.9167 138.25,77.75C145.083,62.5834 154.25,49.2501 165.75,37.75C177.25,26.2501 190.583,17.0834 205.75,10.25C220.917,3.41669 236.833,0 253.5,0L504,0C521,0 537.333,3.25 553,9.75C568.667,16.25 582.5,25.5 594.5,37.5L858.5,301.5C870.5,313.5 879.75,327.333 886.25,343C892.75,358.667 896,375 896,392ZM576,256C576,265 577.667,273.417 581,281.25C584.333,289.083 588.833,295.833 594.5,301.5C600.167,307.167 606.917,311.667 614.75,315C622.583,318.333 631,320 640,320L787,320L576,109ZM576,736C576,775.667 568.417,813 553.25,848C538.083,883 517.5,913.5 491.5,939.5C465.5,965.5 435,986.083 400,1001.25C365,1016.42 327.667,1024 288,1024C248,1024 210.5,1016.5 175.5,1001.5C140.5,986.5 110,966 84,940C58,914 37.5,883.5 22.5,848.5C7.5,813.5 0,776 0,736C0,696.333 7.58333,659 22.75,624C37.9167,589 58.5,558.5 84.5,532.5C110.5,506.5 141,485.917 176,470.75C211,455.583 248.333,448 288,448C314.333,448 339.75,451.417 364.25,458.25C388.75,465.083 411.667,474.75 433,487.25C454.333,499.75 473.833,514.833 491.5,532.5C509.167,550.167 524.25,569.667 536.75,591C549.25,612.333 558.917,635.25 565.75,659.75C572.583,684.25 576,709.667 576,736ZM452,736C452,726 448.5,717.5 441.5,710.5L313.5,582.5C306.5,575.5 298,572 288,572C278,572 269.5,575.5 262.5,582.5L134.5,710.5C127.5,717.5 124,726 124,736C124,746 127.5,754.5 134.5,761.5C141.5,768.5 150,772 160,772C170,772 178.5,768.5 185.5,761.5L256,691L256,864C256,872.667 259.167,880.167 265.5,886.5C271.833,892.833 279.333,896 288,896C296.667,896 304.167,892.833 310.5,886.5C316.833,880.167 320,872.667 320,864L320,691L390.5,761.5C397.5,768.5 406,772 416,772C426,772 434.5,768.5 441.5,761.5C448.5,754.5 452,746 452,736Z + M192,960C174.333,960 157.75,956.667 142.25,950C126.75,943.333 113.167,934.167 101.5,922.5C89.8333,910.833 80.6667,897.25 74,881.75C67.3333,866.25 64,849.667 64,832L64,192C64,174.333 67.3333,157.75 74,142.25C80.6667,126.75 89.8333,113.167 101.5,101.5C113.167,89.8334 126.75,80.6667 142.25,74C157.75,67.3334 174.333,64.0001 192,64L696,64C713,64.0001 729.333,67.2501 745,73.75C760.667,80.2501 774.5,89.5001 786.5,101.5L922.5,237.5C934.5,249.5 943.75,263.333 950.25,279C956.75,294.667 960,311 960,328L960,444C950,436.333 939.667,429.25 929,422.75C918.333,416.25 907.333,410.167 896,404.5L896,328C896,319.333 894.417,311.083 891.25,303.25C888.083,295.417 883.5,288.5 877.5,282.5L741.5,146.5C731.167,136.167 718.667,130.167 704,128.5L704,288C704,301.333 701.5,313.833 696.5,325.5C691.5,337.167 684.667,347.333 676,356C667.333,364.667 657.167,371.5 645.5,376.5C633.833,381.5 621.333,384 608,384L352,384C338.667,384 326.167,381.5 314.5,376.5C302.833,371.5 292.667,364.667 284,356C275.333,347.333 268.5,337.167 263.5,325.5C258.5,313.833 256,301.333 256,288L256,128L192,128C183,128 174.583,129.667 166.75,133C158.917,136.333 152.167,140.833 146.5,146.5C140.833,152.167 136.333,158.917 133,166.75C129.667,174.583 128,183 128,192L128,832C128,841 129.667,849.417 133,857.25C136.333,865.083 140.833,871.833 146.5,877.5C152.167,883.167 158.917,887.667 166.75,891C174.583,894.333 183,896 192,896L192,608C192,594.667 194.5,582.167 199.5,570.5C204.5,558.833 211.333,548.667 220,540C228.667,531.333 238.833,524.5 250.5,519.5C262.167,514.5 274.667,512 288,512L444,512C436.333,522 429.25,532.333 422.75,543C416.25,553.667 410.167,564.667 404.5,576L288,576C279.333,576 271.833,579.167 265.5,585.5C259.167,591.833 256,599.333 256,608L256,896L404.5,896C410.167,907.333 416.25,918.333 422.75,929C429.25,939.667 436.333,950 444,960ZM608,320C616.667,320 624.167,316.833 630.5,310.5C636.833,304.167 640,296.667 640,288L640,128L320,128L320,288C320,296.667 323.167,304.167 329.5,310.5C335.833,316.833 343.333,320 352,320ZM448,736C448,696.333 455.583,659 470.75,624C485.917,589 506.5,558.5 532.5,532.5C558.5,506.5 589,485.917 624,470.75C659,455.583 696.333,448 736,448C762.333,448 787.75,451.417 812.25,458.25C836.75,465.083 859.667,474.75 881,487.25C902.333,499.75 921.833,514.833 939.5,532.5C957.167,550.167 972.25,569.667 984.75,591C997.25,612.333 1006.92,635.25 1013.75,659.75C1020.58,684.25 1024,709.667 1024,736C1024,775.667 1016.42,813 1001.25,848C986.083,883 965.5,913.5 939.5,939.5C913.5,965.5 883,986.083 848,1001.25C813,1016.42 775.667,1024 736,1024C696,1024 658.5,1016.5 623.5,1001.5C588.5,986.5 558,966 532,940C506,914 485.5,883.5 470.5,848.5C455.5,813.5 448,776 448,736ZM736,900C746,900 754.5,896.5 761.5,889.5L889.5,761.5C896.5,754.5 900,746 900,736C900,726 896.5,717.5 889.5,710.5C882.5,703.5 874,700 864,700C854,700 845.5,703.5 838.5,710.5L768,781L768,608C768,599.333 764.833,591.833 758.5,585.5C752.167,579.167 744.667,576 736,576C727.333,576 719.833,579.167 713.5,585.5C707.167,591.833 704,599.333 704,608L704,781L633.5,710.5C626.5,703.5 618,700 608,700C598,700 589.5,703.5 582.5,710.5C575.5,717.5 572,726 572,736C572,746 575.5,754.5 582.5,761.5L710.5,889.5C717.5,896.5 726,900 736,900Z + + + M270.5,954C259.833,954 249.75,952 240.25,948C230.75,944 222.417,938.5 215.25,931.5C208.083,924.5 202.417,916.333 198.25,907C194.083,897.667 192,887.667 192,877L192,147C192,136 194.25,125.5 198.75,115.5C203.25,105.5 209.333,96.6667 217,89C224.667,81.3334 233.5,75.2501 243.5,70.75C253.5,66.2501 264,64.0001 275,64L499,64C534.333,64.0001 567.5,70.7501 598.5,84.25C629.5,97.7501 656.583,116.083 679.75,139.25C702.917,162.417 721.25,189.5 734.75,220.5C748.25,251.5 755,284.667 755,320C755,348.333 750.583,375.25 741.75,400.75C732.917,426.25 720.333,450.5 704,473.5C737.333,499.5 762.75,530.667 780.25,567C797.75,603.333 806.5,642.667 806.5,685C806.5,711.333 803.333,737.083 797,762.25C790.667,787.417 780,811 765,833C752.333,851.667 737.583,868.417 720.75,883.25C703.917,898.083 685.667,910.75 666,921.25C646.333,931.75 625.583,939.75 603.75,945.25C581.917,950.75 559.833,953.5 537.5,953.5C492.833,953.5 448.333,953.583 404,953.75C359.667,953.917 315.167,954 270.5,954ZM493,416C506.333,416 518.833,413.5 530.5,408.5C542.167,403.5 552.333,396.667 561,388C569.667,379.333 576.5,369.167 581.5,357.5C586.5,345.833 589,333.333 589,320C589,306.667 586.5,294.167 581.5,282.5C576.5,270.833 569.667,260.667 561,252C552.333,243.333 542.167,236.5 530.5,231.5C518.833,226.5 506.333,224 493,224L352,224L352,416ZM531,800C546.667,800 561.167,797.083 574.5,791.25C587.833,785.417 599.333,777.5 609,767.5C618.667,757.5 626.25,745.75 631.75,732.25C637.25,718.75 640,704.167 640,688.5C640,673.833 637.083,659.75 631.25,646.25C625.417,632.75 617.583,620.75 607.75,610.25C597.917,599.75 586.417,591.417 573.25,585.25C560.083,579.083 546,576 531,576L352,576L352,800Z + M896,64C904.667,64.0001 912.167,67.1667 918.5,73.5C924.833,79.8334 928,87.3334 928,96C928,104.667 924.833,112.167 918.5,118.5C912.167,124.833 904.667,128 896,128L694,128L398.5,896L608,896C616.667,896 624.167,899.167 630.5,905.5C636.833,911.833 640,919.333 640,928C640,936.667 636.833,944.167 630.5,950.5C624.167,956.833 616.667,960 608,960L128,960C119.333,960 111.833,956.833 105.5,950.5C99.1667,944.167 96,936.667 96,928C96,919.333 99.1667,911.833 105.5,905.5C111.833,899.167 119.333,896 128,896L330,896L625.5,128L416,128C407.333,128 399.833,124.833 393.5,118.5C387.167,112.167 384,104.667 384,96C384,87.3334 387.167,79.8334 393.5,73.5C399.833,67.1667 407.333,64.0001 416,64Z + M192,509L192,96C192,87.3334 195.167,79.8334 201.5,73.5C207.833,67.1667 215.333,64.0001 224,64C232.667,64.0001 240.167,67.1667 246.5,73.5C252.833,79.8334 256,87.3334 256,96L256,514C256,548.667 262.833,581.417 276.5,612.25C290.167,643.083 308.667,670 332,693C355.333,716 382.5,734.25 413.5,747.75C444.5,761.25 477.333,768 512,768C547.667,768 581.083,761.167 612.25,747.5C643.417,733.833 670.5,715.25 693.5,691.75C716.5,668.25 734.667,640.833 748,609.5C761.333,578.167 768,544.667 768,509L768,96C768,87.3334 771.167,79.8334 777.5,73.5C783.833,67.1667 791.333,64.0001 800,64C808.667,64.0001 816.167,67.1667 822.5,73.5C828.833,79.8334 832,87.3334 832,96L832,509C832,538.667 828.25,567.167 820.75,594.5C813.25,621.833 802.583,647.5 788.75,671.5C774.917,695.5 758.25,717.333 738.75,737C719.25,756.667 697.667,773.5 674,787.5C650.333,801.5 624.833,812.417 597.5,820.25C570.167,828.083 541.667,832 512,832C482.333,832 453.833,828.083 426.5,820.25C399.167,812.417 373.667,801.5 350,787.5C326.333,773.5 304.75,756.667 285.25,737C265.75,717.333 249.083,695.5 235.25,671.5C221.417,647.5 210.75,621.75 203.25,594.25C195.75,566.75 192,538.333 192,509ZM224,960C215.333,960 207.833,956.833 201.5,950.5C195.167,944.167 192,936.667 192,928C192,919.333 195.167,911.833 201.5,905.5C207.833,899.167 215.333,896 224,896L800,896C808.667,896 816.167,899.167 822.5,905.5C828.833,911.833 832,919.333 832,928C832,936.667 828.833,944.167 822.5,950.5C816.167,956.833 808.667,960 800,960Z + M270.5,448C218.167,407.333 192,354 192,288C192,271.333 194.667,255.417 200,240.25C205.333,225.083 212.5,210.75 221.5,197.25C230.5,183.75 240.917,171.333 252.75,160C264.583,148.667 277,138.5 290,129.5C322,107.5 357.333,91.0834 396,80.25C434.667,69.4167 473.333,64.0001 512,64C536.333,64.0001 560.5,65.8334 584.5,69.5C608.5,73.1667 632,79.1667 655,87.5C670.333,93.1667 686,99.8334 702,107.5C718,115.167 733.583,124 748.75,134C763.917,144 778.083,154.917 791.25,166.75C804.417,178.583 815.833,191.333 825.5,205C827.833,208.333 829.5,211.25 830.5,213.75C831.5,216.25 832,219.667 832,224C832,232.667 828.833,240.167 822.5,246.5C816.167,252.833 808.667,256 800,256C794,256 789.167,254.917 785.5,252.75C781.833,250.583 778.167,247.333 774.5,243C766.167,233.667 757.833,225 749.5,217C741.167,209 732,201.167 722,193.5C707.333,182.5 691.583,172.833 674.75,164.5C657.917,156.167 640.5,149.333 622.5,144C604.5,138.667 586.167,134.667 567.5,132C548.833,129.333 530.333,128 512,128C479.333,128 446.917,132.333 414.75,141C382.583,149.667 353,163.5 326,182.5C317.667,188.5 309.333,195.25 301,202.75C292.667,210.25 285.167,218.5 278.5,227.5C271.833,236.5 266.417,246.083 262.25,256.25C258.083,266.417 256,277 256,288C256,311.333 260.417,331.5 269.25,348.5C278.083,365.5 289.75,380.25 304.25,392.75C318.75,405.25 335.25,415.917 353.75,424.75C372.25,433.583 391.167,441.333 410.5,448ZM192,800C192,791 195.25,783.417 201.75,777.25C208.25,771.083 215.833,768 224.5,768C230.167,768 235.083,769.25 239.25,771.75C243.417,774.25 247.167,777.667 250.5,782C258.833,792.667 266.333,802.25 273,810.75C279.667,819.25 286.667,827 294,834C301.333,841 309.583,847.417 318.75,853.25C327.917,859.083 339,864.833 352,870.5C376.667,881.167 402.917,888.083 430.75,891.25C458.583,894.417 485.667,896 512,896C528,896 545.417,894.833 564.25,892.5C583.083,890.167 602,886.417 621,881.25C640,876.083 658.333,869.417 676,861.25C693.667,853.083 709.333,843.083 723,831.25C736.667,819.417 747.583,805.583 755.75,789.75C763.917,773.917 768,756 768,736C768,707 761.583,682.833 748.75,663.5C735.917,644.167 717.5,627.167 693.5,612.5C690.5,610.833 685.083,608 677.25,604C669.417,600 661.25,595.917 652.75,591.75C644.25,587.583 636.167,583.917 628.5,580.75C620.833,577.583 615.833,576 613.5,576L96,576C87.3333,576 79.8333,572.833 73.5,566.5C67.1667,560.167 64,552.667 64,544C64,535.333 67.1667,527.833 73.5,521.5C79.8333,515.167 87.3333,512 96,512L928,512C936.667,512 944.167,515.167 950.5,521.5C956.833,527.833 960,535.333 960,544C960,552.667 956.833,560.167 950.5,566.5C944.167,572.833 936.667,576 928,576L753.5,576C805.833,616.667 832,670 832,736C832,763 827.167,787.25 817.5,808.75C807.833,830.25 794.917,849.333 778.75,866C762.583,882.667 743.75,896.917 722.25,908.75C700.75,920.583 678.167,930.333 654.5,938C630.833,945.667 606.75,951.25 582.25,954.75C557.75,958.25 534.333,960 512,960C480.667,960 449.333,958.083 418,954.25C386.667,950.417 356.333,942.167 327,929.5C301,918.167 276.667,902.833 254,883.5C231.333,864.167 212.5,842.333 197.5,818C193.833,812.333 192,806.333 192,800Z + M0,224C0,215 1.66667,206.667 5,199C8.33333,191.333 12.9167,184.583 18.75,178.75C24.5833,172.917 31.3333,168.333 39,165C46.6667,161.667 55,160 64,160C72.6667,160 80.9167,161.667 88.75,165C96.5833,168.333 103.417,172.917 109.25,178.75C115.083,184.583 119.667,191.417 123,199.25C126.333,207.083 128,215.333 128,224C128,233 126.333,241.333 123,249C119.667,256.667 115.083,263.417 109.25,269.25C103.417,275.083 96.6667,279.667 89,283C81.3333,286.333 73,288 64,288C55,288 46.5833,286.333 38.75,283C30.9167,279.667 24.1667,275.167 18.5,269.5C12.8333,263.833 8.33333,257.083 5,249.25C1.66667,241.417 0,233 0,224ZM288,256C279.333,256 271.833,252.833 265.5,246.5C259.167,240.167 256,232.667 256,224C256,215.333 259.167,207.833 265.5,201.5C271.833,195.167 279.333,192 288,192L992,192C1000.67,192 1008.17,195.167 1014.5,201.5C1020.83,207.833 1024,215.333 1024,224C1024,232.667 1020.83,240.167 1014.5,246.5C1008.17,252.833 1000.67,256 992,256ZM0,480C0,471 1.66667,462.667 5,455C8.33333,447.333 12.9167,440.583 18.75,434.75C24.5833,428.917 31.3333,424.333 39,421C46.6667,417.667 55,416 64,416C72.6667,416 80.9167,417.667 88.75,421C96.5833,424.333 103.417,428.917 109.25,434.75C115.083,440.583 119.667,447.417 123,455.25C126.333,463.083 128,471.333 128,480C128,489 126.333,497.333 123,505C119.667,512.667 115.083,519.417 109.25,525.25C103.417,531.083 96.6667,535.667 89,539C81.3333,542.333 73,544 64,544C55,544 46.5833,542.333 38.75,539C30.9167,535.667 24.1667,531.167 18.5,525.5C12.8333,519.833 8.33333,513.083 5,505.25C1.66667,497.417 0,489 0,480ZM288,512C279.333,512 271.833,508.833 265.5,502.5C259.167,496.167 256,488.667 256,480C256,471.333 259.167,463.833 265.5,457.5C271.833,451.167 279.333,448 288,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM0,736C0,727 1.66667,718.667 5,711C8.33333,703.333 12.9167,696.583 18.75,690.75C24.5833,684.917 31.3333,680.333 39,677C46.6667,673.667 55,672 64,672C72.6667,672 80.9167,673.667 88.75,677C96.5833,680.333 103.417,684.917 109.25,690.75C115.083,696.583 119.667,703.417 123,711.25C126.333,719.083 128,727.333 128,736C128,745 126.333,753.333 123,761C119.667,768.667 115.083,775.417 109.25,781.25C103.417,787.083 96.6667,791.667 89,795C81.3333,798.333 73,800 64,800C55,800 46.5833,798.333 38.75,795C30.9167,791.667 24.1667,787.167 18.5,781.5C12.8333,775.833 8.33333,769.083 5,761.25C1.66667,753.417 0,745 0,736ZM288,768C279.333,768 271.833,764.833 265.5,758.5C259.167,752.167 256,744.667 256,736C256,727.333 259.167,719.833 265.5,713.5C271.833,707.167 279.333,704 288,704L992,704C1000.67,704 1008.17,707.167 1014.5,713.5C1020.83,719.833 1024,727.333 1024,736C1024,744.667 1020.83,752.167 1014.5,758.5C1008.17,764.833 1000.67,768 992,768Z + F1 M 15 6.25 C 14.824218 6.25 14.65983 6.217448 14.506836 6.152344 C 14.353841 6.08724 14.222005 5.99935 14.111328 5.888672 C 14.00065 5.777995 13.91276 5.646159 13.847656 5.493164 C 13.782552 5.34017 13.75 5.175782 13.75 5 L 13.75 2.5 C 13.75 2.324219 13.782552 2.161459 13.847656 2.011719 C 13.91276 1.86198 14.002277 1.730145 14.116211 1.616211 C 14.230143 1.502279 14.361979 1.412762 14.511719 1.347656 C 14.661457 1.282553 14.824218 1.25 15 1.25 L 17.5 1.25 C 17.66927 1.25 17.830402 1.282553 17.983398 1.347656 C 18.136393 1.412762 18.269855 1.502279 18.383789 1.616211 C 18.497721 1.730145 18.587238 1.863607 18.652344 2.016602 C 18.717447 2.169598 18.75 2.33073 18.75 2.5 L 18.75 5 C 18.75 5.175782 18.717447 5.338543 18.652344 5.488281 C 18.587238 5.638021 18.497721 5.769857 18.383789 5.883789 C 18.269855 5.997723 18.13802 6.08724 17.988281 6.152344 C 17.838541 6.217448 17.675781 6.25 17.5 6.25 Z M 1.875 3.75 C 1.705729 3.75 1.559245 3.688152 1.435547 3.564453 C 1.311849 3.440756 1.25 3.294271 1.25 3.125 C 1.25 2.95573 1.311849 2.809246 1.435547 2.685547 C 1.559245 2.56185 1.705729 2.5 1.875 2.5 L 11.875 2.5 C 12.04427 2.5 12.190754 2.56185 12.314453 2.685547 C 12.43815 2.809246 12.5 2.95573 12.5 3.125 C 12.5 3.294271 12.43815 3.440756 12.314453 3.564453 C 12.190754 3.688152 12.04427 3.75 11.875 3.75 Z M 15 2.5 L 15 5 L 17.5 5 L 17.5 2.5 Z M 15 12.5 C 14.824218 12.5 14.65983 12.467448 14.506836 12.402344 C 14.353841 12.33724 14.222005 12.24935 14.111328 12.138672 C 14.00065 12.027995 13.91276 11.896159 13.847656 11.743164 C 13.782552 11.59017 13.75 11.425781 13.75 11.25 L 13.75 8.75 C 13.75 8.574219 13.782552 8.411459 13.847656 8.261719 C 13.91276 8.111979 14.002277 7.980144 14.116211 7.866211 C 14.230143 7.752279 14.361979 7.662762 14.511719 7.597656 C 14.661457 7.532553 14.824218 7.5 15 7.5 L 17.5 7.5 C 17.66927 7.5 17.830402 7.532553 17.983398 7.597656 C 18.136393 7.662762 18.269855 7.752279 18.383789 7.866211 C 18.497721 7.980144 18.587238 8.113607 18.652344 8.266602 C 18.717447 8.419597 18.75 8.580729 18.75 8.75 L 18.75 11.25 C 18.75 11.425781 18.717447 11.588542 18.652344 11.738281 C 18.587238 11.888021 18.497721 12.019857 18.383789 12.133789 C 18.269855 12.247722 18.13802 12.33724 17.988281 12.402344 C 17.838541 12.467448 17.675781 12.5 17.5 12.5 Z M 1.875 10 C 1.705729 10 1.559245 9.938151 1.435547 9.814453 C 1.311849 9.690756 1.25 9.544271 1.25 9.375 C 1.25 9.205729 1.311849 9.059245 1.435547 8.935547 C 1.559245 8.81185 1.705729 8.75 1.875 8.75 L 11.875 8.75 C 12.04427 8.75 12.190754 8.81185 12.314453 8.935547 C 12.43815 9.059245 12.5 9.205729 12.5 9.375 C 12.5 9.544271 12.43815 9.690756 12.314453 9.814453 C 12.190754 9.938151 12.04427 10 11.875 10 Z M 15 8.75 L 15 11.25 L 17.5 11.25 L 17.5 8.75 Z M 15 18.75 C 14.824218 18.75 14.65983 18.717447 14.506836 18.652344 C 14.353841 18.58724 14.222005 18.49935 14.111328 18.388672 C 14.00065 18.277994 13.91276 18.146158 13.847656 17.993164 C 13.782552 17.84017 13.75 17.675781 13.75 17.5 L 13.75 15 C 13.75 14.824219 13.782552 14.661459 13.847656 14.511719 C 13.91276 14.361979 14.002277 14.230144 14.116211 14.116211 C 14.230143 14.002279 14.361979 13.912761 14.511719 13.847656 C 14.661457 13.782553 14.824218 13.75 15 13.75 L 17.5 13.75 C 17.66927 13.75 17.830402 13.782553 17.983398 13.847656 C 18.136393 13.912761 18.269855 14.002279 18.383789 14.116211 C 18.497721 14.230144 18.587238 14.363607 18.652344 14.516602 C 18.717447 14.669597 18.75 14.830729 18.75 15 L 18.75 17.5 C 18.75 17.675781 18.717447 17.838541 18.652344 17.988281 C 18.587238 18.138021 18.497721 18.269857 18.383789 18.383789 C 18.269855 18.497721 18.13802 18.58724 17.988281 18.652344 C 17.838541 18.717447 17.675781 18.75 17.5 18.75 Z M 1.875 16.25 C 1.705729 16.25 1.559245 16.188152 1.435547 16.064453 C 1.311849 15.940756 1.25 15.794271 1.25 15.625 C 1.25 15.455729 1.311849 15.309245 1.435547 15.185547 C 1.559245 15.06185 1.705729 15 1.875 15 L 11.875 15 C 12.04427 15 12.190754 15.06185 12.314453 15.185547 C 12.43815 15.309245 12.5 15.455729 12.5 15.625 C 12.5 15.794271 12.43815 15.940756 12.314453 16.064453 C 12.190754 16.188152 12.04427 16.25 11.875 16.25 Z M 15 15 L 15 17.5 L 17.5 17.5 L 17.5 15 Z + M288,192C279.333,192 271.833,188.833 265.5,182.5C259.167,176.167 256,168.667 256,160C256,151.333 259.167,143.833 265.5,137.5C271.833,131.167 279.333,128 288,128L800,128C808.667,128 816.167,131.167 822.5,137.5C828.833,143.833 832,151.333 832,160C832,168.667 828.833,176.167 822.5,182.5C816.167,188.833 808.667,192 800,192ZM0,480C0,471.333 3.16667,463.833 9.5,457.5L100,367C106.333,360.667 113.833,357.5 122.5,357.5C131.167,357.5 138.667,360.667 145,367C151.333,373.333 154.5,380.833 154.5,389.5C154.5,398.167 151.333,405.667 145,412L77.5,480L145,548C151.333,554.333 154.5,561.833 154.5,570.5C154.5,579.167 151.333,586.667 145,593C138.667,599.333 131.167,602.5 122.5,602.5C113.833,602.5 106.333,599.333 100,593L9.5,502.5C3.16667,496.167 0,488.667 0,480ZM288,512C279.333,512 271.833,508.833 265.5,502.5C259.167,496.167 256,488.667 256,480C256,471.333 259.167,463.833 265.5,457.5C271.833,451.167 279.333,448 288,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM288,832C279.333,832 271.833,828.833 265.5,822.5C259.167,816.167 256,808.667 256,800C256,791.333 259.167,783.833 265.5,777.5C271.833,771.167 279.333,768 288,768L672,768C680.667,768 688.167,771.167 694.5,777.5C700.833,783.833 704,791.333 704,800C704,808.667 700.833,816.167 694.5,822.5C688.167,828.833 680.667,832 672,832Z + M288,192C279.333,192 271.833,188.833 265.5,182.5C259.167,176.167 256,168.667 256,160C256,151.333 259.167,143.833 265.5,137.5C271.833,131.167 279.333,128 288,128L800,128C808.667,128 816.167,131.167 822.5,137.5C828.833,143.833 832,151.333 832,160C832,168.667 828.833,176.167 822.5,182.5C816.167,188.833 808.667,192 800,192ZM0,570.5C0,561.833 3.16667,554.333 9.5,548L77.5,480L9.5,412C3.16667,405.667 0,398.167 0,389.5C0,380.833 3.16667,373.333 9.5,367C15.8333,360.667 23.3333,357.5 32,357.5C40.6667,357.5 48.1667,360.667 54.5,367L145,457.5C151.333,463.833 154.5,471.333 154.5,480C154.5,488.667 151.333,496.167 145,502.5L54.5,593C48.1667,599.333 40.6667,602.5 32,602.5C23.3333,602.5 15.8333,599.333 9.5,593C3.16667,586.667 0,579.167 0,570.5ZM288,512C279.333,512 271.833,508.833 265.5,502.5C259.167,496.167 256,488.667 256,480C256,471.333 259.167,463.833 265.5,457.5C271.833,451.167 279.333,448 288,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM288,832C279.333,832 271.833,828.833 265.5,822.5C259.167,816.167 256,808.667 256,800C256,791.333 259.167,783.833 265.5,777.5C271.833,771.167 279.333,768 288,768L672,768C680.667,768 688.167,771.167 694.5,777.5C700.833,783.833 704,791.333 704,800C704,808.667 700.833,816.167 694.5,822.5C688.167,828.833 680.667,832 672,832Z + M768,576L667,576C632.333,576 599.75,569.083 569.25,555.25C538.75,541.417 512.167,522.75 489.5,499.25C466.833,475.75 448.917,448.583 435.75,417.75C422.583,386.917 416,354.333 416,320C416,285.667 422.583,253.083 435.75,222.25C448.917,191.417 466.833,164.25 489.5,140.75C512.167,117.25 538.75,98.5834 569.25,84.75C599.75,70.9167 632.333,64.0001 667,64L992,64C1000.67,64.0001 1008.17,67.1667 1014.5,73.5C1020.83,79.8334 1024,87.3334 1024,96C1024,103.333 1022.58,109.167 1019.75,113.5C1016.92,117.833 1013.25,121.083 1008.75,123.25C1004.25,125.417 999.25,126.833 993.75,127.5C988.25,128.167 982.667,128.5 977,128.5C974,128.5 971.083,128.417 968.25,128.25C965.417,128.083 962.667,128 960,128L960,992C960,1000.67 956.833,1008.17 950.5,1014.5C944.167,1020.83 936.667,1024 928,1024C919.333,1024 911.833,1020.83 905.5,1014.5C899.167,1008.17 896,1000.67 896,992L896,128L832,128L832,992C832,1000.67 828.833,1008.17 822.5,1014.5C816.167,1020.83 808.667,1024 800,1024C791.333,1024 783.833,1020.83 777.5,1014.5C771.167,1008.17 768,1000.67 768,992ZM768,512L768,128L668,128C642,128 617.583,133.167 594.75,143.5C571.917,153.833 552,167.833 535,185.5C518,203.167 504.583,223.583 494.75,246.75C484.917,269.917 480,294.333 480,320C480,345.667 484.917,370.083 494.75,393.25C504.583,416.417 518,436.833 535,454.5C552,472.167 571.917,486.167 594.75,496.5C617.583,506.833 642,512 668,512ZM64,672C64,663.333 67.1667,655.833 73.5,649.5L243,480L73.5,310.5C67.1667,304.167 64,296.667 64,288C64,279.333 67.1667,271.833 73.5,265.5C79.8333,259.167 87.3333,256 96,256C104.667,256 112.167,259.167 118.5,265.5L310.5,457.5C316.833,463.833 320,471.333 320,480C320,488.667 316.833,496.167 310.5,502.5L118.5,694.5C112.167,700.833 104.667,704 96,704C87.3333,704 79.8333,700.833 73.5,694.5C67.1667,688.167 64,680.667 64,672Z + M832,706.5C832,723.167 828.583,739.083 821.75,754.25C814.917,769.417 805.75,782.75 794.25,794.25C782.75,805.75 769.417,814.917 754.25,821.75C739.083,828.583 723.167,832 706.5,832L189.5,832C172.833,832 156.917,828.583 141.75,821.75C126.583,814.917 113.25,805.75 101.75,794.25C90.25,782.75 81.0833,769.417 74.25,754.25C67.4167,739.083 64,723.167 64,706.5L64,189.5C64,172.833 67.4167,156.917 74.25,141.75C81.0833,126.583 90.25,113.25 101.75,101.75C113.25,90.25 126.583,81.0834 141.75,74.25C156.917,67.4167 172.833,64.0001 189.5,64L706.5,64C723.167,64.0001 739.083,67.4167 754.25,74.25C769.417,81.0834 782.75,90.25 794.25,101.75C805.75,113.25 814.917,126.583 821.75,141.75C828.583,156.917 832,172.833 832,189.5ZM128,704C128,706.667 128.167,709.5 128.5,712.5C128.833,715.5 129.333,718.333 130,721L357.5,493C369.167,481.333 383,472.417 399,466.25C415,460.083 431.333,457 448,457C465,457 481.417,460 497.25,466C513.083,472 526.833,481 538.5,493L766,721C766.667,718.333 767.167,715.5 767.5,712.5C767.833,709.5 768,706.667 768,704L768,192C768,183.333 766.333,175.083 763,167.25C759.667,159.417 755.083,152.583 749.25,146.75C743.417,140.917 736.583,136.333 728.75,133C720.917,129.667 712.667,128 704,128L192,128C183,128 174.667,129.667 167,133C159.333,136.333 152.583,140.917 146.75,146.75C140.917,152.583 136.333,159.333 133,167C129.667,174.667 128,183 128,192ZM960,320L960,772C960,797 954.917,820.917 944.75,843.75C934.583,866.583 920.917,886.583 903.75,903.75C886.583,920.917 866.583,934.583 843.75,944.75C820.917,954.917 797,960 772,960L320,960C297,960 275.583,954.333 255.75,943C235.917,931.667 220.333,916 209,896L770.5,896C787.833,896 804.083,892.5 819.25,885.5C834.417,878.5 847.667,869.167 859,857.5C870.333,845.833 879.333,832.25 886,816.75C892.667,801.25 896,785 896,768L896,209C916,220.333 931.667,235.917 943,255.75C954.333,275.583 960,297 960,320ZM544,288C544,279 545.667,270.667 549,263C552.333,255.333 556.917,248.583 562.75,242.75C568.583,236.917 575.333,232.333 583,229C590.667,225.667 599,224 608,224C616.667,224 624.917,225.667 632.75,229C640.583,232.333 647.417,236.917 653.25,242.75C659.083,248.583 663.667,255.417 667,263.25C670.333,271.083 672,279.333 672,288C672,297 670.333,305.333 667,313C663.667,320.667 659.083,327.417 653.25,333.25C647.417,339.083 640.667,343.667 633,347C625.333,350.333 617,352 608,352C599,352 590.583,350.333 582.75,347C574.917,343.667 568.167,339.167 562.5,333.5C556.833,327.833 552.333,321.083 549,313.25C545.667,305.417 544,297 544,288ZM175,766C177.667,766.667 180.5,767.167 183.5,767.5C186.5,767.833 189.333,768 192,768L704,768C706.667,768 709.5,767.833 712.5,767.5C715.5,767.167 718.333,766.667 721,766L493.5,538.5C487.5,532.5 480.5,528 472.5,525C464.5,522 456.333,520.5 448,520.5C439.667,520.5 431.583,522 423.75,525C415.917,528 409,532.5 403,538.5Z + M32,192C23.3333,192 15.8333,188.833 9.5,182.5C3.16667,176.167 0,168.667 0,160C0,151.333 3.16667,143.833 9.5,137.5C15.8333,131.167 23.3333,128 32,128L736,128C744.667,128 752.167,131.167 758.5,137.5C764.833,143.833 768,151.333 768,160C768,168.667 764.833,176.167 758.5,182.5C752.167,188.833 744.667,192 736,192ZM32,512C23.3333,512 15.8333,508.833 9.5,502.5C3.16667,496.167 0,488.667 0,480C0,471.333 3.16667,463.833 9.5,457.5C15.8333,451.167 23.3333,448 32,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM32,832C23.3333,832 15.8333,828.833 9.5,822.5C3.16667,816.167 0,808.667 0,800C0,791.333 3.16667,783.833 9.5,777.5C15.8333,771.167 23.3333,768 32,768L608,768C616.667,768 624.167,771.167 630.5,777.5C636.833,783.833 640,791.333 640,800C640,808.667 636.833,816.167 630.5,822.5C624.167,828.833 616.667,832 608,832Z + M160,192C151.333,192 143.833,188.833 137.5,182.5C131.167,176.167 128,168.667 128,160C128,151.333 131.167,143.833 137.5,137.5C143.833,131.167 151.333,128 160,128L864,128C872.667,128 880.167,131.167 886.5,137.5C892.833,143.833 896,151.333 896,160C896,168.667 892.833,176.167 886.5,182.5C880.167,188.833 872.667,192 864,192ZM32,512C23.3333,512 15.8333,508.833 9.5,502.5C3.16667,496.167 0,488.667 0,480C0,471.333 3.16667,463.833 9.5,457.5C15.8333,451.167 23.3333,448 32,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM288,832C279.333,832 271.833,828.833 265.5,822.5C259.167,816.167 256,808.667 256,800C256,791.333 259.167,783.833 265.5,777.5C271.833,771.167 279.333,768 288,768L736,768C744.667,768 752.167,771.167 758.5,777.5C764.833,783.833 768,791.333 768,800C768,808.667 764.833,816.167 758.5,822.5C752.167,828.833 744.667,832 736,832Z + M288,192C279.333,192 271.833,188.833 265.5,182.5C259.167,176.167 256,168.667 256,160C256,151.333 259.167,143.833 265.5,137.5C271.833,131.167 279.333,128 288,128L992,128C1000.67,128 1008.17,131.167 1014.5,137.5C1020.83,143.833 1024,151.333 1024,160C1024,168.667 1020.83,176.167 1014.5,182.5C1008.17,188.833 1000.67,192 992,192ZM32,512C23.3333,512 15.8333,508.833 9.5,502.5C3.16667,496.167 0,488.667 0,480C0,471.333 3.16667,463.833 9.5,457.5C15.8333,451.167 23.3333,448 32,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM480,832C471.333,832 463.833,828.833 457.5,822.5C451.167,816.167 448,808.667 448,800C448,791.333 451.167,783.833 457.5,777.5C463.833,771.167 471.333,768 480,768L992,768C1000.67,768 1008.17,771.167 1014.5,777.5C1020.83,783.833 1024,791.333 1024,800C1024,808.667 1020.83,816.167 1014.5,822.5C1008.17,828.833 1000.67,832 992,832Z + M32,192C23.3333,192 15.8333,188.833 9.5,182.5C3.16667,176.167 0,168.667 0,160C0,151.333 3.16667,143.833 9.5,137.5C15.8333,131.167 23.3333,128 32,128L992,128C1000.67,128 1008.17,131.167 1014.5,137.5C1020.83,143.833 1024,151.333 1024,160C1024,168.667 1020.83,176.167 1014.5,182.5C1008.17,188.833 1000.67,192 992,192ZM32,512C23.3333,512 15.8333,508.833 9.5,502.5C3.16667,496.167 0,488.667 0,480C0,471.333 3.16667,463.833 9.5,457.5C15.8333,451.167 23.3333,448 32,448L992,448C1000.67,448 1008.17,451.167 1014.5,457.5C1020.83,463.833 1024,471.333 1024,480C1024,488.667 1020.83,496.167 1014.5,502.5C1008.17,508.833 1000.67,512 992,512ZM32,832C23.3333,832 15.8333,828.833 9.5,822.5C3.16667,816.167 0,808.667 0,800C0,791.333 3.16667,783.833 9.5,777.5C15.8333,771.167 23.3333,768 32,768L992,768C1000.67,768 1008.17,771.167 1014.5,777.5C1020.83,783.833 1024,791.333 1024,800C1024,808.667 1020.83,816.167 1014.5,822.5C1008.17,828.833 1000.67,832 992,832Z + F1 M 0 10 C 0 9.082031 0.118815 8.196615 0.356445 7.34375 C 0.594076 6.490886 0.93099 5.694987 1.367188 4.956055 C 1.803385 4.217123 2.325846 3.543295 2.93457 2.93457 C 3.543294 2.325848 4.217122 1.803387 4.956055 1.367188 C 5.694986 0.93099 6.490885 0.594076 7.34375 0.356445 C 8.196614 0.118816 9.082031 0 10 0 C 10.917969 0 11.803385 0.118816 12.65625 0.356445 C 13.509114 0.594076 14.305013 0.93099 15.043945 1.367188 C 15.782877 1.803387 16.456705 2.325848 17.06543 2.93457 C 17.674152 3.543295 18.196613 4.217123 18.632812 4.956055 C 19.06901 5.694987 19.405924 6.490886 19.643555 7.34375 C 19.881184 8.196615 20 9.082031 20 10 C 20 10.917969 19.881184 11.803386 19.643555 12.65625 C 19.405924 13.509115 19.06901 14.305014 18.632812 15.043945 C 18.196613 15.782878 17.674152 16.456705 17.06543 17.06543 C 16.456705 17.674154 15.782877 18.196615 15.043945 18.632812 C 14.305013 19.06901 13.509114 19.405924 12.65625 19.643555 C 11.803385 19.881186 10.917969 20 10 20 C 9.082031 20 8.196614 19.881186 7.34375 19.643555 C 6.490885 19.405924 5.694986 19.06901 4.956055 18.632812 C 4.217122 18.196615 3.543294 17.674154 2.93457 17.06543 C 2.325846 16.456705 1.803385 15.782878 1.367188 15.043945 C 0.93099 14.305014 0.594076 13.509115 0.356445 12.65625 C 0.118815 11.803386 0 10.917969 0 10 Z M 18.75 10 C 18.75 9.199219 18.645832 8.426107 18.4375 7.680664 C 18.229166 6.935222 17.93457 6.238607 17.553711 5.59082 C 17.172852 4.943035 16.715494 4.352215 16.181641 3.818359 C 15.647785 3.284506 15.056965 2.827148 14.40918 2.446289 C 13.761393 2.06543 13.064778 1.770834 12.319336 1.5625 C 11.573893 1.354168 10.800781 1.25 10 1.25 C 9.192708 1.25 8.416341 1.354168 7.670898 1.5625 C 6.925456 1.770834 6.228841 2.06543 5.581055 2.446289 C 4.933268 2.827148 4.344075 3.282879 3.813477 3.813477 C 3.282877 4.344076 2.827148 4.933269 2.446289 5.581055 C 2.06543 6.228842 1.770833 6.925457 1.5625 7.670898 C 1.354167 8.416342 1.25 9.192709 1.25 10 C 1.25 10.807292 1.354167 11.583659 1.5625 12.329102 C 1.770833 13.074545 2.06543 13.771159 2.446289 14.418945 C 2.827148 15.066732 3.282877 15.655925 3.813477 16.186523 C 4.344075 16.717123 4.933268 17.172852 5.581055 17.553711 C 6.228841 17.93457 6.925456 18.229166 7.670898 18.4375 C 8.416341 18.645834 9.192708 18.75 10 18.75 C 10.807291 18.75 11.583658 18.645834 12.329102 18.4375 C 13.074543 18.229166 13.771158 17.93457 14.418945 17.553711 C 15.066731 17.172852 15.655924 16.717123 16.186523 16.186523 C 16.717121 15.655925 17.172852 15.066732 17.553711 14.418945 C 17.93457 13.771159 18.229166 13.074545 18.4375 12.329102 C 18.645832 11.583659 18.75 10.807292 18.75 10 Z M 5.625 8.125 C 5.625 7.949219 5.657552 7.786459 5.722656 7.636719 C 5.78776 7.486979 5.877278 7.355144 5.991211 7.241211 C 6.105143 7.127279 6.236979 7.037761 6.386719 6.972656 C 6.536458 6.907553 6.699219 6.875001 6.875 6.875 C 7.044271 6.875001 7.205403 6.907553 7.358398 6.972656 C 7.511393 7.037761 7.644856 7.127279 7.758789 7.241211 C 7.872721 7.355144 7.962239 7.488607 8.027344 7.641602 C 8.092447 7.794598 8.125 7.95573 8.125 8.125 C 8.125 8.300781 8.092447 8.463542 8.027344 8.613281 C 7.962239 8.763021 7.872721 8.894857 7.758789 9.008789 C 7.644856 9.122722 7.513021 9.21224 7.363281 9.277344 C 7.213542 9.342448 7.050781 9.375 6.875 9.375 C 6.699219 9.375 6.534831 9.342448 6.381836 9.277344 C 6.228841 9.21224 6.097005 9.12435 5.986328 9.013672 C 5.875651 8.902995 5.78776 8.771159 5.722656 8.618164 C 5.657552 8.46517 5.625 8.300781 5.625 8.125 Z M 11.875 8.125 C 11.875 7.949219 11.907552 7.786459 11.972656 7.636719 C 12.03776 7.486979 12.127277 7.355144 12.241211 7.241211 C 12.355143 7.127279 12.486979 7.037761 12.636719 6.972656 C 12.786457 6.907553 12.949218 6.875001 13.125 6.875 C 13.294271 6.875001 13.455403 6.907553 13.608398 6.972656 C 13.761393 7.037761 13.894856 7.127279 14.008789 7.241211 C 14.122721 7.355144 14.212238 7.488607 14.277344 7.641602 C 14.342447 7.794598 14.375 7.95573 14.375 8.125 C 14.375 8.300781 14.342447 8.463542 14.277344 8.613281 C 14.212238 8.763021 14.122721 8.894857 14.008789 9.008789 C 13.894856 9.122722 13.763021 9.21224 13.613281 9.277344 C 13.463541 9.342448 13.30078 9.375 13.125 9.375 C 12.949218 9.375 12.78483 9.342448 12.631836 9.277344 C 12.478841 9.21224 12.347005 9.12435 12.236328 9.013672 C 12.12565 8.902995 12.03776 8.771159 11.972656 8.618164 C 11.907552 8.46517 11.875 8.300781 11.875 8.125 Z M 5.3125 13.4375 C 5.3125 13.268229 5.374349 13.121745 5.498047 12.998047 C 5.621745 12.87435 5.768229 12.8125 5.9375 12.8125 C 6.041666 12.8125 6.123046 12.827148 6.181641 12.856445 C 6.240234 12.885742 6.305338 12.932943 6.376953 12.998047 C 6.669922 13.245443 6.948242 13.463542 7.211914 13.652344 C 7.475586 13.841146 7.747396 14.000651 8.027344 14.130859 C 8.307291 14.261068 8.606771 14.360352 8.925781 14.428711 C 9.244791 14.49707 9.602864 14.53125 10 14.53125 C 10.572916 14.53125 11.101888 14.448242 11.586914 14.282227 C 12.071939 14.116211 12.542317 13.860678 12.998047 13.515625 C 13.108724 13.43099 13.212891 13.346354 13.310547 13.261719 C 13.408203 13.177084 13.512369 13.089193 13.623047 12.998047 C 13.694661 12.939453 13.759766 12.893881 13.818359 12.861328 C 13.876953 12.828776 13.958333 12.8125 14.0625 12.8125 C 14.231771 12.8125 14.378255 12.87435 14.501953 12.998047 C 14.62565 13.121745 14.6875 13.268229 14.6875 13.4375 C 14.6875 13.528646 14.671224 13.606771 14.638672 13.671875 C 14.606119 13.736979 14.560546 13.805339 14.501953 13.876953 C 14.397786 14.000651 14.269205 14.125977 14.116211 14.25293 C 13.963215 14.379883 13.800455 14.501953 13.62793 14.619141 C 13.455403 14.736328 13.282877 14.845378 13.110352 14.946289 C 12.937825 15.047201 12.779947 15.133464 12.636719 15.205078 C 12.226562 15.413412 11.798502 15.561523 11.352539 15.649414 C 10.906575 15.737305 10.455729 15.78125 10 15.78125 C 9.53125 15.78125 9.070638 15.73405 8.618164 15.639648 C 8.165689 15.545248 7.731119 15.390625 7.314453 15.175781 C 7.229817 15.136719 7.122396 15.079753 6.992188 15.004883 C 6.861979 14.930014 6.723632 14.84375 6.577148 14.746094 C 6.430664 14.648438 6.282552 14.544271 6.132812 14.433594 C 5.983073 14.322917 5.846354 14.210612 5.722656 14.09668 C 5.598958 13.982748 5.499674 13.868815 5.424805 13.754883 C 5.349935 13.640951 5.3125 13.535156 5.3125 13.4375 Z + F1 M 5.625 15 C 4.85026 15 4.121094 14.851889 3.4375 14.555664 C 2.753906 14.25944 2.158203 13.857422 1.650391 13.349609 C 1.142578 12.841797 0.74056 12.246094 0.444336 11.5625 C 0.148112 10.878906 0 10.14974 0 9.375 C 0 8.600261 0.148112 7.871094 0.444336 7.1875 C 0.74056 6.503906 1.142578 5.908203 1.650391 5.400391 C 2.158203 4.892578 2.753906 4.490561 3.4375 4.194336 C 4.121094 3.898113 4.85026 3.75 5.625 3.75 L 8.125 3.75 C 8.294271 3.75 8.440755 3.81185 8.564453 3.935547 C 8.68815 4.059246 8.75 4.20573 8.75 4.375 C 8.75 4.544271 8.68815 4.690756 8.564453 4.814453 C 8.440755 4.938152 8.294271 5.000001 8.125 5 L 5.625 5 C 5.019531 5.000001 4.451497 5.113934 3.920898 5.341797 C 3.390299 5.569662 2.926432 5.882162 2.529297 6.279297 C 2.132161 6.676434 1.819661 7.140301 1.591797 7.670898 C 1.363932 8.201498 1.25 8.769531 1.25 9.375 C 1.25 9.980469 1.363932 10.548503 1.591797 11.079102 C 1.819661 11.609701 2.132161 12.073568 2.529297 12.470703 C 2.926432 12.867839 3.390299 13.180339 3.920898 13.408203 C 4.451497 13.636068 5.019531 13.75 5.625 13.75 L 8.125 13.75 C 8.294271 13.75 8.440755 13.81185 8.564453 13.935547 C 8.68815 14.059245 8.75 14.205729 8.75 14.375 C 8.75 14.544271 8.68815 14.690756 8.564453 14.814453 C 8.440755 14.938151 8.294271 15 8.125 15 Z M 11.875 15 C 11.705729 15 11.559244 14.938151 11.435547 14.814453 C 11.311849 14.690756 11.25 14.544271 11.25 14.375 C 11.25 14.205729 11.311849 14.059245 11.435547 13.935547 C 11.559244 13.81185 11.705729 13.75 11.875 13.75 L 14.375 13.75 C 14.980469 13.75 15.548502 13.636068 16.079102 13.408203 C 16.609699 13.180339 17.073566 12.867839 17.470703 12.470703 C 17.867838 12.073568 18.180338 11.609701 18.408203 11.079102 C 18.636066 10.548503 18.75 9.980469 18.75 9.375 C 18.75 8.769531 18.636066 8.201498 18.408203 7.670898 C 18.180338 7.140301 17.867838 6.676434 17.470703 6.279297 C 17.073566 5.882162 16.609699 5.569662 16.079102 5.341797 C 15.548502 5.113934 14.980469 5.000001 14.375 5 L 11.875 5 C 11.705729 5.000001 11.559244 4.938152 11.435547 4.814453 C 11.311849 4.690756 11.25 4.544271 11.25 4.375 C 11.25 4.20573 11.311849 4.059246 11.435547 3.935547 C 11.559244 3.81185 11.705729 3.75 11.875 3.75 L 14.375 3.75 C 15.149739 3.75 15.878906 3.898113 16.5625 4.194336 C 17.246094 4.490561 17.841797 4.892578 18.349609 5.400391 C 18.857422 5.908203 19.259439 6.503906 19.555664 7.1875 C 19.851887 7.871094 20 8.600261 20 9.375 C 20 10.14974 19.851887 10.878906 19.555664 11.5625 C 19.259439 12.246094 18.857422 12.841797 18.349609 13.349609 C 17.841797 13.857422 17.246094 14.25944 16.5625 14.555664 C 15.878906 14.851889 15.149739 15 14.375 15 Z M 5.556641 10 C 5.38737 10 5.252278 9.934896 5.151367 9.804688 C 5.050456 9.674479 5 9.53125 5 9.375 C 5 9.21875 5.050456 9.075521 5.151367 8.945312 C 5.252278 8.815104 5.38737 8.75 5.556641 8.75 L 14.443359 8.75 C 14.61263 8.75 14.747721 8.815104 14.848633 8.945312 C 14.949543 9.075521 14.999999 9.21875 15 9.375 C 14.999999 9.53125 14.949543 9.674479 14.848633 9.804688 C 14.747721 9.934896 14.61263 10 14.443359 10 Z + + + M1024,317.5L1024,507C1014.67,495.333 1004.67,484.167 994,473.5C983.333,462.833 972,453 960,444L960,320C960,311.333 958.333,303.083 955,295.25C951.667,287.417 947.083,280.583 941.25,274.75C935.417,268.917 928.583,264.333 920.75,261C912.917,257.667 904.667,256 896,256L522,256L458,298.5C436,312.833 412.333,320 387,320L64,320L64,832C64,841 65.6667,849.417 69,857.25C72.3333,865.083 76.8333,871.833 82.5,877.5C88.1667,883.167 94.9167,887.667 102.75,891C110.583,894.333 119,896 128,896L404.5,896C410.167,907.333 416.25,918.333 422.75,929C429.25,939.667 436.333,950 444,960L125.5,960C108.833,960 92.9167,956.583 77.75,949.75C62.5833,942.917 49.25,933.75 37.75,922.25C26.25,910.75 17.0833,897.417 10.25,882.25C3.41667,867.083 0,851.167 0,834.5L0,189.5C0,172.833 3.41667,156.917 10.25,141.75C17.0833,126.583 26.25,113.25 37.75,101.75C49.25,90.25 62.5833,81.0834 77.75,74.25C92.9167,67.4167 108.833,64.0001 125.5,64L368,64C388,64.0001 407.167,68.5001 425.5,77.5C443.833,86.5001 458.833,99.0001 470.5,115L528,192L898.5,192C915.167,192 931.083,195.417 946.25,202.25C961.417,209.083 974.75,218.25 986.25,229.75C997.75,241.25 1006.92,254.583 1013.75,269.75C1020.58,284.917 1024,300.833 1024,317.5ZM466,216L419,153.5C413,145.5 405.5,139.25 396.5,134.75C387.5,130.25 378,128 368,128L128,128C119,128 110.667,129.667 103,133C95.3333,136.333 88.5833,140.917 82.75,146.75C76.9167,152.583 72.3333,159.333 69,167C65.6667,174.667 64,183 64,192L64,256L387,256C394.333,256 401.5,254.667 408.5,252C415.5,249.333 422.25,246 428.75,242C435.25,238 441.583,233.667 447.75,229C453.917,224.333 460,220 466,216ZM1024,736C1024,775.667 1016.42,813 1001.25,848C986.083,883 965.5,913.5 939.5,939.5C913.5,965.5 883,986.083 848,1001.25C813,1016.42 775.667,1024 736,1024C696,1024 658.5,1016.5 623.5,1001.5C588.5,986.5 558,966 532,940C506,914 485.5,883.5 470.5,848.5C455.5,813.5 448,776 448,736C448,696.333 455.583,659 470.75,624C485.917,589 506.5,558.5 532.5,532.5C558.5,506.5 589,485.917 624,470.75C659,455.583 696.333,448 736,448C762.333,448 787.75,451.417 812.25,458.25C836.75,465.083 859.667,474.75 881,487.25C902.333,499.75 921.833,514.833 939.5,532.5C957.167,550.167 972.25,569.667 984.75,591C997.25,612.333 1006.92,635.25 1013.75,659.75C1020.58,684.25 1024,709.667 1024,736ZM896,576C896,567.333 892.833,559.833 886.5,553.5C880.167,547.167 872.667,544 864,544C857.667,544 852.5,545.167 848.5,547.5C844.5,549.833 841.25,552.917 838.75,556.75C836.25,560.583 834.5,565 833.5,570C832.5,575 832,580.167 832,585.5C816.333,577.167 800.917,570.833 785.75,566.5C770.583,562.167 754,560 736,560C724,560 711.75,561.25 699.25,563.75C686.75,566.25 674.5,569.917 662.5,574.75C650.5,579.583 639.083,585.417 628.25,592.25C617.417,599.083 608,607 600,616C597,619.333 594.667,622.75 593,626.25C591.333,629.75 590.5,633.833 590.5,638.5C590.5,647.5 593.667,655.167 600,661.5C606.333,667.833 614,671 623,671C628.667,671 634.75,668.583 641.25,663.75C647.75,658.917 655.333,653.5 664,647.5C672.667,641.5 682.75,636.083 694.25,631.25C705.75,626.417 719.333,624 735,624C746.667,624 757.5,625.25 767.5,627.75C777.5,630.25 787.667,634.333 798,640L785,640C779,640 773.083,640.25 767.25,640.75C761.417,641.25 756.167,642.583 751.5,644.75C746.833,646.917 743.083,650.167 740.25,654.5C737.417,658.833 736,664.667 736,672C736,680.667 739.167,688.167 745.5,694.5C751.833,700.833 759.333,704 768,704L864,704C872.667,704 880.167,700.833 886.5,694.5C892.833,688.167 896,680.667 896,672ZM881.5,833C881.5,824.333 878.333,816.833 872,810.5C865.667,804.167 858.167,801 849.5,801C842.833,801 836.333,803.417 830,808.25C823.667,813.083 816.333,818.5 808,824.5C799.667,830.5 789.833,835.917 778.5,840.75C767.167,845.583 753.333,848 737,848C725.333,848 714.5,846.75 704.5,844.25C694.5,841.75 684.333,837.667 674,832L687,832C692.667,832 698.417,831.75 704.25,831.25C710.083,830.75 715.333,829.417 720,827.25C724.667,825.083 728.5,821.833 731.5,817.5C734.5,813.167 736,807.333 736,800C736,791.333 732.833,783.833 726.5,777.5C720.167,771.167 712.667,768 704,768L608,768C599.333,768 591.833,771.167 585.5,777.5C579.167,783.833 576,791.333 576,800L576,896C576,904.667 579.167,912.167 585.5,918.5C591.833,924.833 599.333,928 608,928C614.333,928 619.5,926.833 623.5,924.5C627.5,922.167 630.75,919.083 633.25,915.25C635.75,911.417 637.5,907 638.5,902C639.5,897 640,891.833 640,886.5C655.667,894.833 671.083,901.167 686.25,905.5C701.417,909.833 718,912 736,912C748,912 760.333,910.75 773,908.25C785.667,905.75 797.917,902.083 809.75,897.25C821.583,892.417 832.833,886.583 843.5,879.75C854.167,872.917 863.667,865 872,856C878.333,849.333 881.5,841.667 881.5,833Z + M128,220C128,190 134.083,161.667 146.25,135C158.417,108.333 174.75,85 195.25,65C215.75,45 239.5,29.1667 266.5,17.5C293.5,5.83337 322,0 352,0C382.667,0 411.583,5.91669 438.75,17.75C465.917,29.5834 489.667,45.6667 510,66C530.333,86.3334 546.417,110.083 558.25,137.25C570.083,164.417 576,193.333 576,224C576,254.667 570.083,283.583 558.25,310.75C546.417,337.917 530.333,361.667 510,382C489.667,402.333 465.917,418.417 438.75,430.25C411.583,442.083 382.667,448 352,448C320.333,448 290.833,442 263.5,430C236.167,418 212.5,401.667 192.5,381C172.5,360.333 156.75,336.167 145.25,308.5C133.75,280.833 128,251.333 128,220ZM512,220.5C512,198.833 507.667,178.5 499,159.5C490.333,140.5 478.667,123.917 464,109.75C449.333,95.5834 432.333,84.4167 413,76.25C393.667,68.0834 373.333,64.0001 352,64C329.667,64.0001 308.833,68.1667 289.5,76.5C270.167,84.8334 253.25,96.25 238.75,110.75C224.25,125.25 212.833,142.167 204.5,161.5C196.167,180.833 192,201.667 192,224C192,246.333 196.167,267.167 204.5,286.5C212.833,305.833 224.25,322.75 238.75,337.25C253.25,351.75 270.167,363.167 289.5,371.5C308.833,379.833 329.667,384 352,384C375,384 396.25,379.75 415.75,371.25C435.25,362.75 452.167,351.083 466.5,336.25C480.833,321.417 492,304.083 500,284.25C508,264.417 512,243.167 512,220.5ZM640,284.5C640,262.833 644.333,242.5 653,223.5C661.667,204.5 673.333,187.917 688,173.75C702.667,159.583 719.667,148.417 739,140.25C758.333,132.083 778.667,128 800,128C822.333,128 843.167,132.167 862.5,140.5C881.833,148.833 898.75,160.25 913.25,174.75C927.75,189.25 939.167,206.167 947.5,225.5C955.833,244.833 960,265.667 960,288C960,310.333 955.833,331.167 947.5,350.5C939.167,369.833 927.75,386.75 913.25,401.25C898.75,415.75 881.833,427.167 862.5,435.5C843.167,443.833 822.333,448 800,448C777,448 755.75,443.75 736.25,435.25C716.75,426.75 699.833,415.083 685.5,400.25C671.167,385.417 660,368.083 652,348.25C644,328.417 640,307.167 640,284.5ZM896,288C896,275 893.5,262.667 888.5,251C883.5,239.333 876.583,229.083 867.75,220.25C858.917,211.417 848.667,204.5 837,199.5C825.333,194.5 813,192 800,192C787,192 774.667,194.5 763,199.5C751.333,204.5 741.083,211.417 732.25,220.25C723.417,229.083 716.5,239.333 711.5,251C706.5,262.667 704,275 704,288C704,301 706.5,313.333 711.5,325C716.5,336.667 723.417,346.917 732.25,355.75C741.083,364.583 751.333,371.5 763,376.5C774.667,381.5 787,384 800,384C813,384 825.333,381.5 837,376.5C848.667,371.5 858.917,364.583 867.75,355.75C876.583,346.917 883.5,336.667 888.5,325C893.5,313.333 896,301 896,288ZM0,638C0,623.667 2.41667,609 7.25,594C12.0833,579 19,565.417 28,553.25C37,541.083 47.9167,531.167 60.75,523.5C73.5833,515.833 88,512 104,512L600,512C616,512 630.417,515.833 643.25,523.5C656.083,531.167 667,541.083 676,553.25C685,565.417 691.917,579 696.75,594C701.583,609 704,623.667 704,638C704,667 701,694.917 695,721.75C689,748.583 679.75,773.833 667.25,797.5C654.75,821.167 639.083,842.917 620.25,862.75C601.417,882.583 579.167,899.833 553.5,914.5C538.5,923.167 522.75,930.417 506.25,936.25C489.75,942.083 473,946.75 456,950.25C439,953.75 421.75,956.25 404.25,957.75C386.75,959.25 369.333,960 352,960C317,960 282.333,956.833 248,950.5C213.667,944.167 181.167,932.167 150.5,914.5C124.5,899.5 102.083,882.167 83.25,862.5C64.4167,842.833 48.8333,821.25 36.5,797.75C24.1667,774.25 15,749.083 9,722.25C3,695.417 0,667.333 0,638ZM698.5,896C714.833,876.333 728.833,854.5 740.5,830.5C771.5,828.167 800.417,822.417 827.25,813.25C854.083,804.083 877.333,791.083 897,774.25C916.667,757.417 932.083,736.583 943.25,711.75C954.417,686.917 960,657.667 960,624C960,619 959.25,613.75 957.75,608.25C956.25,602.75 954.083,597.583 951.25,592.75C948.417,587.917 944.833,583.917 940.5,580.75C936.167,577.583 931.167,576 925.5,576L775,576C771.333,564.667 767,553.583 762,542.75C757,531.917 751.167,521.667 744.5,512L925.5,512C940.167,512 953.583,515.25 965.75,521.75C977.917,528.25 988.333,536.75 997,547.25C1005.67,557.75 1012.33,569.75 1017,583.25C1021.67,596.75 1024,610.333 1024,624C1024,675.333 1012.5,720.833 989.5,760.5C966.5,800.167 932.333,832.333 887,857C858.333,872.667 827.833,883.083 795.5,888.25C763.167,893.417 730.833,896 698.5,896ZM640,640C640,634.333 639.167,627.75 637.5,620.25C635.833,612.75 633.25,605.75 629.75,599.25C626.25,592.75 621.833,587.25 616.5,582.75C611.167,578.25 605,576 598,576L106,576C99,576 92.8333,578.25 87.5,582.75C82.1667,587.25 77.75,592.75 74.25,599.25C70.75,605.75 68.1667,612.75 66.5,620.25C64.8333,627.75 64,634.333 64,640C64,684.333 71.25,722.583 85.75,754.75C100.25,786.917 120.333,813.5 146,834.5C171.667,855.5 202.083,871 237.25,881C272.417,891 310.667,896 352,896C393.333,896 431.583,891 466.75,881C501.917,871 532.333,855.5 558,834.5C583.667,813.5 603.75,786.917 618.25,754.75C632.75,722.583 640,684.333 640,640Z + diff --git a/Wino.Mail/Styles/ImagePreviewControl.xaml b/Wino.Mail/Styles/ImagePreviewControl.xaml new file mode 100644 index 00000000..67ad57f5 --- /dev/null +++ b/Wino.Mail/Styles/ImagePreviewControl.xaml @@ -0,0 +1,44 @@ + + + + diff --git a/Wino.Mail/Styles/ItemContainerStyles.xaml b/Wino.Mail/Styles/ItemContainerStyles.xaml new file mode 100644 index 00000000..adf0dac2 --- /dev/null +++ b/Wino.Mail/Styles/ItemContainerStyles.xaml @@ -0,0 +1,291 @@ + + + + + #34495e + + + + #ecf0f1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Styles/WinoInfoBar.xaml b/Wino.Mail/Styles/WinoInfoBar.xaml new file mode 100644 index 00000000..07eb899f --- /dev/null +++ b/Wino.Mail/Styles/WinoInfoBar.xaml @@ -0,0 +1,422 @@ + + + + #74b9ff + + + + + + + + + + + + + + + + + + + + + + 1 + + + + #3867d6 + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + 14 + SemiBold + + 14 + Normal + + 48 + + 38 + 16 + + + -12,0,0,0 + + + + + + + + 16,0,0,0 + + 0,16,14,16 + 16 + + 0,0,16,0 + 0,0,0,0 + 0,14,0,18 + + 0,14,0,0 + 0,14,0,0 + + 12,14,0,0 + 0,4,0,0 + + 16,8,0,0 + 0,12,0,0 + + Cancel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Views/Abstract/AboutPageAbstract.cs b/Wino.Mail/Views/Abstract/AboutPageAbstract.cs new file mode 100644 index 00000000..16d785c5 --- /dev/null +++ b/Wino.Mail/Views/Abstract/AboutPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class AboutPageAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/AccountDetailsPageAbstract.cs b/Wino.Mail/Views/Abstract/AccountDetailsPageAbstract.cs new file mode 100644 index 00000000..036ff394 --- /dev/null +++ b/Wino.Mail/Views/Abstract/AccountDetailsPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class AccountDetailsPageAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/AccountManagementPageAbstract.cs b/Wino.Mail/Views/Abstract/AccountManagementPageAbstract.cs new file mode 100644 index 00000000..c92876a7 --- /dev/null +++ b/Wino.Mail/Views/Abstract/AccountManagementPageAbstract.cs @@ -0,0 +1,10 @@ +using Windows.UI.Xaml.Navigation; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class AccountManagementPageAbstract : BasePage + { + + } +} diff --git a/Wino.Mail/Views/Abstract/AppShellAbstract.cs b/Wino.Mail/Views/Abstract/AppShellAbstract.cs new file mode 100644 index 00000000..5817c572 --- /dev/null +++ b/Wino.Mail/Views/Abstract/AppShellAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class AppShellAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/ComposePageAbstract.cs b/Wino.Mail/Views/Abstract/ComposePageAbstract.cs new file mode 100644 index 00000000..fbe85077 --- /dev/null +++ b/Wino.Mail/Views/Abstract/ComposePageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class ComposePageAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/IdlePageAbstract.cs b/Wino.Mail/Views/Abstract/IdlePageAbstract.cs new file mode 100644 index 00000000..9e28d8ff --- /dev/null +++ b/Wino.Mail/Views/Abstract/IdlePageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class IdlePageAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/MailListPageAbstract.cs b/Wino.Mail/Views/Abstract/MailListPageAbstract.cs new file mode 100644 index 00000000..70a4cb4c --- /dev/null +++ b/Wino.Mail/Views/Abstract/MailListPageAbstract.cs @@ -0,0 +1,9 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public class MailListPageAbstract : BasePage + { + + } +} diff --git a/Wino.Mail/Views/Abstract/MailRenderingPageAbstract.cs b/Wino.Mail/Views/Abstract/MailRenderingPageAbstract.cs new file mode 100644 index 00000000..30fbb8d9 --- /dev/null +++ b/Wino.Mail/Views/Abstract/MailRenderingPageAbstract.cs @@ -0,0 +1,26 @@ +using Windows.UI.Xaml; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class MailRenderingPageAbstract : BasePage + { + public bool IsDarkEditor + { + get { return (bool)GetValue(IsDarkEditorProperty); } + set { SetValue(IsDarkEditorProperty, value); } + } + + public static readonly DependencyProperty IsDarkEditorProperty = DependencyProperty.Register(nameof(IsDarkEditor), typeof(bool), typeof(MailRenderingPageAbstract), new PropertyMetadata(false, OnIsComposerDarkModeChanged)); + + private static void OnIsComposerDarkModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MailRenderingPageAbstract page) + { + page.OnEditorThemeChanged(); + } + } + + public virtual void OnEditorThemeChanged() { } + } +} diff --git a/Wino.Mail/Views/Abstract/MergedAccountDetailsPageAbstract.cs b/Wino.Mail/Views/Abstract/MergedAccountDetailsPageAbstract.cs new file mode 100644 index 00000000..29f1a364 --- /dev/null +++ b/Wino.Mail/Views/Abstract/MergedAccountDetailsPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class MergedAccountDetailsPageAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/MessageListPageAbstract.cs b/Wino.Mail/Views/Abstract/MessageListPageAbstract.cs new file mode 100644 index 00000000..d474c4be --- /dev/null +++ b/Wino.Mail/Views/Abstract/MessageListPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class MessageListPageAbstract : BasePage { } +} diff --git a/Wino.Mail/Views/Abstract/NewAccountManagementPageAbstract.cs b/Wino.Mail/Views/Abstract/NewAccountManagementPageAbstract.cs new file mode 100644 index 00000000..cdd8b272 --- /dev/null +++ b/Wino.Mail/Views/Abstract/NewAccountManagementPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class NewAccountManagementPageAbstract : BasePage + { + } +} diff --git a/Wino.Mail/Views/Abstract/PersonalizationPageAbstract.cs b/Wino.Mail/Views/Abstract/PersonalizationPageAbstract.cs new file mode 100644 index 00000000..ca4d0da0 --- /dev/null +++ b/Wino.Mail/Views/Abstract/PersonalizationPageAbstract.cs @@ -0,0 +1,10 @@ +using Windows.UI.Xaml; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class PersonalizationPageAbstract : SettingsPageBase + { + + } +} diff --git a/Wino.Mail/Views/Abstract/ReadingPanePageAbstract.cs b/Wino.Mail/Views/Abstract/ReadingPanePageAbstract.cs new file mode 100644 index 00000000..01ab1f48 --- /dev/null +++ b/Wino.Mail/Views/Abstract/ReadingPanePageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class ReadingPanePageAbstract : BasePage { } +} diff --git a/Wino.Mail/Views/Abstract/SettingOptionsPageAbstract.cs b/Wino.Mail/Views/Abstract/SettingOptionsPageAbstract.cs new file mode 100644 index 00000000..c9939223 --- /dev/null +++ b/Wino.Mail/Views/Abstract/SettingOptionsPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class SettingOptionsPageAbstract : SettingsPageBase + { + } +} diff --git a/Wino.Mail/Views/Abstract/SettingsPageAbstract.cs b/Wino.Mail/Views/Abstract/SettingsPageAbstract.cs new file mode 100644 index 00000000..5abe8aed --- /dev/null +++ b/Wino.Mail/Views/Abstract/SettingsPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class SettingsPageAbstract : BasePage { } +} diff --git a/Wino.Mail/Views/Abstract/SettingsPageBase.cs b/Wino.Mail/Views/Abstract/SettingsPageBase.cs new file mode 100644 index 00000000..8b0b7109 --- /dev/null +++ b/Wino.Mail/Views/Abstract/SettingsPageBase.cs @@ -0,0 +1,16 @@ +using Windows.UI.Xaml; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public class SettingsPageBase : BasePage where T : BaseViewModel + { + public string Title + { + get { return (string)GetValue(TitleProperty); } + set { SetValue(TitleProperty, value); } + } + + public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(SettingsPageBase), new PropertyMetadata(string.Empty)); + } +} diff --git a/Wino.Mail/Views/Abstract/SignatureManagementPageAbstract.cs b/Wino.Mail/Views/Abstract/SignatureManagementPageAbstract.cs new file mode 100644 index 00000000..22936f9c --- /dev/null +++ b/Wino.Mail/Views/Abstract/SignatureManagementPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class SignatureManagementPageAbstract : BasePage { } +} diff --git a/Wino.Mail/Views/Abstract/WelcomePageAbstract.cs b/Wino.Mail/Views/Abstract/WelcomePageAbstract.cs new file mode 100644 index 00000000..17959876 --- /dev/null +++ b/Wino.Mail/Views/Abstract/WelcomePageAbstract.cs @@ -0,0 +1,9 @@ +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract +{ + public abstract class WelcomePageAbstract : BasePage + { + + } +} diff --git a/Wino.Mail/Views/Account/AccountDetailsPage.xaml b/Wino.Mail/Views/Account/AccountDetailsPage.xaml new file mode 100644 index 00000000..3deac2d1 --- /dev/null +++ b/Wino.Mail/Views/Account/AccountDetailsPage.xaml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Views/Account/AccountManagementPage.xaml.cs b/Wino.Mail/Views/Account/AccountManagementPage.xaml.cs new file mode 100644 index 00000000..273814fc --- /dev/null +++ b/Wino.Mail/Views/Account/AccountManagementPage.xaml.cs @@ -0,0 +1,16 @@ +using System; +using Windows.UI.Xaml.Navigation; +using Wino.Views.Abstract; + +namespace Wino.Views +{ + public sealed partial class AccountManagementPage : AccountManagementPageAbstract + { + public AccountManagementPage() + { + InitializeComponent(); + + NavigationCacheMode = NavigationCacheMode.Enabled; + } + } +} diff --git a/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml b/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml new file mode 100644 index 00000000..405205e7 --- /dev/null +++ b/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml.cs b/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml.cs new file mode 100644 index 00000000..1dabc46f --- /dev/null +++ b/Wino.Mail/Views/Account/MergedAccountDetailsPage.xaml.cs @@ -0,0 +1,13 @@ +using Wino.Views.Abstract; + + +namespace Wino.Views.Account +{ + public sealed partial class MergedAccountDetailsPage : MergedAccountDetailsPageAbstract + { + public MergedAccountDetailsPage() + { + InitializeComponent(); + } + } +} diff --git a/Wino.Mail/Views/ComposePage.xaml b/Wino.Mail/Views/ComposePage.xaml new file mode 100644 index 00000000..9573fb21 --- /dev/null +++ b/Wino.Mail/Views/ComposePage.xaml @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transparent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Views/ComposePage.xaml.cs b/Wino.Mail/Views/ComposePage.xaml.cs new file mode 100644 index 00000000..84cffd23 --- /dev/null +++ b/Wino.Mail/Views/ComposePage.xaml.cs @@ -0,0 +1,570 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; +using System.Reactive.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.WinUI.Controls; +using EmailValidation; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml.Controls; +using Microsoft.Web.WebView2.Core; +using MimeKit; +using Newtonsoft.Json; +using Windows.Foundation; +using Windows.Storage.Pickers; +using Windows.UI.ViewManagement.Core; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media.Animation; +using Windows.UI.Xaml.Navigation; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Enums; +using Wino.Core.Messages.Mails; +using Wino.Core.Messages.Shell; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; +using Wino.Views.Abstract; + +namespace Wino.Views +{ + public sealed partial class ComposePage : ComposePageAbstract, + IRecipient, + IRecipient, + IRecipient + { + public bool IsComposerDarkMode + { + get { return (bool)GetValue(IsComposerDarkModeProperty); } + set { SetValue(IsComposerDarkModeProperty, value); } + } + + public static readonly DependencyProperty IsComposerDarkModeProperty = DependencyProperty.Register(nameof(IsComposerDarkMode), typeof(bool), typeof(ComposePage), new PropertyMetadata(false, OnIsComposerDarkModeChanged)); + + + public WebView2 GetWebView() => Chromium; + + private TaskCompletionSource DOMLoadedTask = new TaskCompletionSource(); + + private List Disposables = new List(); + + public ComposePage() + { + InitializeComponent(); + + Environment.SetEnvironmentVariable("WEBVIEW2_DEFAULT_BACKGROUND_COLOR", "00FFFFFF"); + } + + private static async void OnIsComposerDarkModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is ComposePage page) + { + await page.UpdateEditorThemeAsync(); + } + } + + private IDisposable GetSuggestionBoxDisposable(TokenizingTextBox box) + { + return Observable.FromEventPattern, AutoSuggestBoxTextChangedEventArgs>( + x => box.TextChanged += x, + x => box.TextChanged -= x) + .Throttle(TimeSpan.FromMilliseconds(120)) + .ObserveOn(SynchronizationContext.Current) + .Subscribe(t => + { + if (t.EventArgs.Reason == AutoSuggestionBoxTextChangeReason.UserInput) + { + if (t.Sender is AutoSuggestBox senderBox && senderBox.Text.Length >= 3) + { + _ = ViewModel.ContactService.GetAddressInformationAsync(senderBox.Text).ContinueWith(x => + { + _ = ViewModel.ExecuteUIThread(() => + { + var addresses = x.Result; + + senderBox.ItemsSource = addresses; + }); + }); + } + } + }); + } + + private async void AddFilesClicked(object sender, RoutedEventArgs e) + { + // TODO: Pick files + var picker = new FileOpenPicker() + { + SuggestedStartLocation = PickerLocationId.Desktop + }; + + picker.FileTypeFilter.Add("*"); + var files = await picker.PickMultipleFilesAsync(); + + if (files == null) return; + + // Convert files to MailAttachmentViewModel. + + if (files.Any()) + { + foreach (var file in files) + { + if (!ViewModel.IncludedAttachments.Any(a => a.FileName == file.Path)) + { + var attachmentViewModel = await file.ToAttachmentViewModelAsync(); + + ViewModel.IncludedAttachments.Add(attachmentViewModel); + } + } + } + } + + private async void BoldButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('boldButton').click();"); + } + + private async void ItalicButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('italicButton').click();"); + } + + private async void UnderlineButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('underlineButton').click();"); + } + + private async void StrokeButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('strikeButton').click();"); + } + + private async void BulletListButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('bulletListButton').click();"); + } + + private async void OrderedListButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('orderedListButton').click();"); + } + + private async void IncreaseIndentClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('increaseIndentButton').click();"); + } + + private async void DecreaseIndentClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('decreaseIndentButton').click();"); + } + + private async void DirectionButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('directionButton').click();"); + } + + private async void AlignmentChanged(object sender, SelectionChangedEventArgs e) + { + var selectedItem = AlignmentListView.SelectedItem as ComboBoxItem; + var alignment = selectedItem.Tag.ToString(); + + switch (alignment) + { + case "left": + await InvokeScriptSafeAsync("document.getElementById('ql-align-left').click();"); + break; + case "center": + await InvokeScriptSafeAsync("document.getElementById('ql-align-center').click();"); + break; + case "right": + await InvokeScriptSafeAsync("document.getElementById('ql-align-right').click();"); + break; + case "justify": + await InvokeScriptSafeAsync("document.getElementById('ql-align-justify').click();"); + break; + } + } + + public async Task ExecuteScriptFunctionAsync(string functionName, params object[] parameters) + { + string script = functionName + "("; + for (int i = 0; i < parameters.Length; i++) + { + script += JsonConvert.SerializeObject(parameters[i]); + if (i < parameters.Length - 1) + { + script += ", "; + } + } + script += ");"; + + return await Chromium.ExecuteScriptAsync(script); + } + + private async Task InvokeScriptSafeAsync(string function) + { + try + { + return await Chromium.ExecuteScriptAsync(function); + } + catch (Exception) { } + + return string.Empty; + } + + private async void AddImageClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('addImageButton').click();"); + } + + private async Task FocusEditorAsync() + { + await InvokeScriptSafeAsync("quill.focus();"); + + Chromium.Focus(FocusState.Keyboard); + Chromium.Focus(FocusState.Programmatic); + } + + private async void EmojiButtonClicked(object sender, RoutedEventArgs e) + { + CoreInputView.GetForCurrentView().TryShow(CoreInputViewKind.Emoji); + + await FocusEditorAsync(); + } + + private async Task TryGetSelectedTextAsync() + { + try + { + return await Chromium.ExecuteScriptAsync("getSelectedText();"); + } + catch (Exception) { } + + return string.Empty; + } + + private async void LinkButtonClicked(object sender, RoutedEventArgs e) + { + // Get selected text from Quill. + + HyperlinkTextBox.Text = await TryGetSelectedTextAsync(); + } + + public async Task UpdateEditorThemeAsync() + { + await DOMLoadedTask.Task; + + if (IsComposerDarkMode) + { + await InvokeScriptSafeAsync("DarkReader.enable();"); + } + else + { + await InvokeScriptSafeAsync("DarkReader.disable();"); + } + } + + private async Task RenderInternalAsync(string htmlBody) + { + await DOMLoadedTask.Task; + + await UpdateEditorThemeAsync(); + + if (string.IsNullOrEmpty(htmlBody)) + { + await ExecuteScriptFunctionAsync("RenderHTML", " "); + } + else + { + await ExecuteScriptFunctionAsync("RenderHTML", htmlBody); + } + } + + protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) + { + base.OnNavigatingFrom(e); + + DisposeDisposables(); + + Chromium.CoreWebView2Initialized -= ChromiumInitialized; + + if (Chromium.CoreWebView2 != null) + { + Chromium.CoreWebView2.DOMContentLoaded -= DOMLoaded; + Chromium.CoreWebView2.WebMessageReceived -= ScriptMessageRecieved; + } + } + + private void DisposeDisposables() + { + if (Disposables.Any()) + Disposables.ForEach(a => a.Dispose()); + } + + protected override async void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + var anim = ConnectedAnimationService.GetForCurrentView().GetAnimation("WebViewConnectedAnimation"); + anim?.TryStart(Chromium); + + DisposeDisposables(); + + Disposables.Add(GetSuggestionBoxDisposable(ToBox)); + Disposables.Add(GetSuggestionBoxDisposable(CCBox)); + Disposables.Add(GetSuggestionBoxDisposable(BccBox)); + + Chromium.CoreWebView2Initialized -= ChromiumInitialized; + Chromium.CoreWebView2Initialized += ChromiumInitialized; + + await Chromium.EnsureCoreWebView2Async(); + + ViewModel.GetHTMLBodyFunction = new Func>(async () => + { + var quillContent = await InvokeScriptSafeAsync("GetHTMLContent();"); + + return JsonConvert.DeserializeObject(quillContent); + }); + + var underlyingThemeService = App.Current.Services.GetService(); + + IsComposerDarkMode = underlyingThemeService.IsUnderlyingThemeDark(); + } + + private async void ChromiumInitialized(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.UI.Xaml.Controls.CoreWebView2InitializedEventArgs args) + { + var editorBundlePath = (await ViewModel.NativeAppService.GetQuillEditorBundlePathAsync()).Replace("full.html", string.Empty); + + Chromium.CoreWebView2.SetVirtualHostNameToFolderMapping("app.example", editorBundlePath, CoreWebView2HostResourceAccessKind.Allow); + Chromium.Source = new Uri("https://app.example/full.html"); + + Chromium.CoreWebView2.DOMContentLoaded -= DOMLoaded; + Chromium.CoreWebView2.DOMContentLoaded += DOMLoaded; + + Chromium.CoreWebView2.WebMessageReceived -= ScriptMessageRecieved; + Chromium.CoreWebView2.WebMessageReceived += ScriptMessageRecieved; + } + + private void ScriptMessageRecieved(CoreWebView2 sender, CoreWebView2WebMessageReceivedEventArgs args) + { + var change = JsonConvert.DeserializeObject(args.WebMessageAsJson); + + bool isEnabled = change.EndsWith("ql-active"); + + if (change.StartsWith("ql-bold")) + BoldButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-italic")) + ItalicButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-underline")) + UnderlineButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-strike")) + StrokeButton.IsChecked = isEnabled; + else if (change.StartsWith("orderedListButton")) + OrderedListButton.IsChecked = isEnabled; + else if (change.StartsWith("bulletListButton")) + BulletListButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-direction")) + DirectionButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-align-left")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 0; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + else if (change.StartsWith("ql-align-center")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 1; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + else if (change.StartsWith("ql-align-right")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 2; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + else if (change.StartsWith("ql-align-justify")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 3; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + } + + private void DOMLoaded(CoreWebView2 sender, CoreWebView2DOMContentLoadedEventArgs args) => DOMLoadedTask.TrySetResult(true); + + void IRecipient.Receive(NavigationPaneModeChanged message) + { + if (message.NewMode == MenuPaneMode.Hidden) + TopPanelGrid.Padding = new Thickness(48, 6, 6, 6); + else + TopPanelGrid.Padding = new Thickness(16, 6, 6, 6); + } + + async void IRecipient.Receive(CreateNewComposeMailRequested message) + { + await RenderInternalAsync(message.RenderModel.RenderHtml); + } + + private async void HyperlinkAddClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync($"addHyperlink('{LinkUrlTextBox.Text}')"); + + LinkUrlTextBox.Text = string.Empty; + HyperlinkFlyout.Hide(); + } + + private void BarDynamicOverflowChanging(CommandBar sender, DynamicOverflowItemsChangingEventArgs args) + { + if (args.Action == CommandBarDynamicOverflowAction.AddingToOverflow) + sender.OverflowButtonVisibility = CommandBarOverflowButtonVisibility.Visible; + else + sender.OverflowButtonVisibility = CommandBarOverflowButtonVisibility.Collapsed; + } + + private void ShowCCBCCClicked(object sender, RoutedEventArgs e) + { + CCBCCShowButton.Visibility = Visibility.Collapsed; + + CCTextBlock.Visibility = Visibility.Visible; + CCBox.Visibility = Visibility.Visible; + BccTextBlock.Visibility = Visibility.Visible; + BccBox.Visibility = Visibility.Visible; + } + + private async void TokenItemAdding(TokenizingTextBox sender, TokenItemAddingEventArgs args) + { + // Check is valid email. + + if (!EmailValidator.Validate(args.TokenText)) + { + args.Cancel = true; + ViewModel.NotifyInvalidEmail(args.TokenText); + + return; + } + + var deferal = args.GetDeferral(); + + AddressInformation addedItem = null; + + var boxTag = sender.Tag?.ToString(); + + if (boxTag == "ToBox") + addedItem = await ViewModel.GetAddressInformationAsync(args.TokenText, ViewModel.ToItems); + else if (boxTag == "CCBox") + addedItem = await ViewModel.GetAddressInformationAsync(args.TokenText, ViewModel.CCItemsItems); + else if (boxTag == "BCCBox") + addedItem = await ViewModel.GetAddressInformationAsync(args.TokenText, ViewModel.BCCItems); + + if (addedItem == null) + { + args.Cancel = true; + ViewModel.NotifyAddressExists(); + } + else + { + args.Item = addedItem; + } + + deferal.Complete(); + } + + void IRecipient.Receive(ApplicationThemeChanged message) + { + IsComposerDarkMode = message.IsUnderlyingThemeDark; + } + + private void InvertComposerThemeClicked(object sender, RoutedEventArgs e) + { + IsComposerDarkMode = !IsComposerDarkMode; + } + + private void ImportanceClicked(object sender, RoutedEventArgs e) + { + ImportanceFlyout.Hide(); + ImportanceSplitButton.IsChecked = true; + + if (sender is Button senderButton) + { + var selectedImportance = (MessageImportance)senderButton.Tag; + + ViewModel.SelectedMessageImportance = selectedImportance; + (ImportanceSplitButton.Content as SymbolIcon).Symbol = (senderButton.Content as SymbolIcon).Symbol; + } + } + + private void AttachmentClicked(object sender, ItemClickEventArgs e) + { + if (e.ClickedItem is MailAttachmentViewModel attachmentViewModel) + { + ViewModel.RemoveAttachmentCommand.Execute(attachmentViewModel); + } + } + + private async void AddressBoxLostFocus(object sender, RoutedEventArgs e) + { + // Automatically add current text as item if it is valid mail address. + + if (sender is TokenizingTextBox tokenizingTextBox) + { + if (!(tokenizingTextBox.Items.LastOrDefault() is ITokenStringContainer info)) return; + + var currentText = info.Text; + + if (!string.IsNullOrEmpty(currentText) && EmailValidator.Validate(currentText)) + { + var boxTag = tokenizingTextBox.Tag?.ToString(); + + AddressInformation addedItem = null; + ObservableCollection addressCollection = null; + + if (boxTag == "ToBox") + addressCollection = ViewModel.ToItems; + else if (boxTag == "CCBox") + addressCollection = ViewModel.CCItemsItems; + else if (boxTag == "BCCBox") + addressCollection = ViewModel.BCCItems; + + if (addressCollection != null) + addedItem = await ViewModel.GetAddressInformationAsync(currentText, addressCollection); + + // Item has already been added. + if (addedItem == null) + { + tokenizingTextBox.Text = string.Empty; + } + else if (addressCollection != null) + { + addressCollection.Add(addedItem); + tokenizingTextBox.Text = string.Empty; + } + } + } + } + + // Hack: Tokenizing text box losing focus somehow on page Loaded and shifting focus to this element. + // For once we'll switch back to it once CCBBCGotFocus element got focus. + + private bool isInitialFocusHandled = false; + + private void ComposerLoaded(object sender, RoutedEventArgs e) + { + ToBox.Focus(FocusState.Programmatic); + } + + private void CCBBCGotFocus(object sender, RoutedEventArgs e) + { + if (!isInitialFocusHandled) + { + isInitialFocusHandled = true; + ToBox.Focus(FocusState.Programmatic); + } + } + } +} diff --git a/Wino.Mail/Views/IdlePage.xaml b/Wino.Mail/Views/IdlePage.xaml new file mode 100644 index 00000000..7ca48a84 --- /dev/null +++ b/Wino.Mail/Views/IdlePage.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/Wino.Mail/Views/IdlePage.xaml.cs b/Wino.Mail/Views/IdlePage.xaml.cs new file mode 100644 index 00000000..dfc0c4f1 --- /dev/null +++ b/Wino.Mail/Views/IdlePage.xaml.cs @@ -0,0 +1,12 @@ +using Wino.Views.Abstract; + +namespace Wino.Views +{ + public sealed partial class IdlePage : IdlePageAbstract + { + public IdlePage() + { + InitializeComponent(); + } + } +} diff --git a/Wino.Mail/Views/ImapSetup/AdvancedImapSetupPage.xaml b/Wino.Mail/Views/ImapSetup/AdvancedImapSetupPage.xaml new file mode 100644 index 00000000..5fb44e21 --- /dev/null +++ b/Wino.Mail/Views/ImapSetup/AdvancedImapSetupPage.xaml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Views/Settings/SignatureManagementPage.xaml.cs b/Wino.Mail/Views/Settings/SignatureManagementPage.xaml.cs new file mode 100644 index 00000000..a310b8d5 --- /dev/null +++ b/Wino.Mail/Views/Settings/SignatureManagementPage.xaml.cs @@ -0,0 +1,319 @@ +using System; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Web.WebView2.Core; +using Newtonsoft.Json; +using Windows.UI.ViewManagement.Core; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Messages.Mails; +using Wino.Views.Abstract; + +namespace Wino.Views.Settings +{ + public sealed partial class SignatureManagementPage : SignatureManagementPageAbstract, IRecipient + { + private TaskCompletionSource DOMLoadedTask = new TaskCompletionSource(); + + public bool IsComposerDarkMode + { + get { return (bool)GetValue(IsComposerDarkModeProperty); } + set { SetValue(IsComposerDarkModeProperty, value); } + } + + public static readonly DependencyProperty IsComposerDarkModeProperty = DependencyProperty.Register(nameof(IsComposerDarkMode), typeof(bool), typeof(SignatureManagementPage), new PropertyMetadata(false, OnIsComposerDarkModeChanged)); + + public SignatureManagementPage() + { + this.InitializeComponent(); + + // Environment.SetEnvironmentVariable("WEBVIEW2_DEFAULT_BACKGROUND_COLOR", "00FFFFFF"); + } + + protected override void OnNavigatedFrom(NavigationEventArgs e) + { + base.OnNavigatedFrom(e); + + Chromium.CoreWebView2Initialized -= ChromiumInitialized; + + if (Chromium.CoreWebView2 != null) + { + Chromium.CoreWebView2.DOMContentLoaded -= DOMLoaded; + Chromium.CoreWebView2.WebMessageReceived -= ScriptMessageRecieved; + } + } + + protected override async void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + Chromium.CoreWebView2Initialized -= ChromiumInitialized; + Chromium.CoreWebView2Initialized += ChromiumInitialized; + + await Chromium.EnsureCoreWebView2Async(); + + ViewModel.GetHTMLBodyFunction = new Func>(async () => + { + var quillContent = await InvokeScriptSafeAsync("GetHTMLContent();"); + + return JsonConvert.DeserializeObject(quillContent); + }); + + ViewModel.GetTextBodyFunction = new Func>(() => InvokeScriptSafeAsync("GetTextContent();")); + + var underlyingThemeService = App.Current.Services.GetService(); + + IsComposerDarkMode = underlyingThemeService.IsUnderlyingThemeDark(); + } + + private async void HyperlinkAddClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync($"addHyperlink('{LinkUrlTextBox.Text}')"); + + LinkUrlTextBox.Text = string.Empty; + HyperlinkFlyout.Hide(); + } + + private async void BoldButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('boldButton').click();"); + } + + private async void ItalicButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('italicButton').click();"); + } + + private async void UnderlineButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('underlineButton').click();"); + } + + private async void StrokeButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('strikeButton').click();"); + } + + private async void BulletListButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('bulletListButton').click();"); + } + + private async void OrderedListButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('orderedListButton').click();"); + } + + private async void IncreaseIndentClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('increaseIndentButton').click();"); + } + + private async void DecreaseIndentClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('decreaseIndentButton').click();"); + } + + private async void DirectionButtonClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('directionButton').click();"); + } + + private async void AlignmentChanged(object sender, SelectionChangedEventArgs e) + { + var selectedItem = AlignmentListView.SelectedItem as ComboBoxItem; + var alignment = selectedItem.Tag.ToString(); + + switch (alignment) + { + case "left": + await InvokeScriptSafeAsync("document.getElementById('ql-align-left').click();"); + break; + case "center": + await InvokeScriptSafeAsync("document.getElementById('ql-align-center').click();"); + break; + case "right": + await InvokeScriptSafeAsync("document.getElementById('ql-align-right').click();"); + break; + case "justify": + await InvokeScriptSafeAsync("document.getElementById('ql-align-justify').click();"); + break; + } + } + + public async Task ExecuteScriptFunctionAsync(string functionName, params object[] parameters) + { + string script = functionName + "("; + for (int i = 0; i < parameters.Length; i++) + { + script += JsonConvert.SerializeObject(parameters[i]); + if (i < parameters.Length - 1) + { + script += ", "; + } + } + script += ");"; + + return await Chromium.ExecuteScriptAsync(script); + } + + private async Task InvokeScriptSafeAsync(string function) + { + try + { + return await Chromium.ExecuteScriptAsync(function); + } + catch (Exception) { } + + return string.Empty; + } + + private async void AddImageClicked(object sender, RoutedEventArgs e) + { + await InvokeScriptSafeAsync("document.getElementById('addImageButton').click();"); + } + + private async Task FocusEditorAsync() + { + await InvokeScriptSafeAsync("quill.focus();"); + + Chromium.Focus(FocusState.Keyboard); + Chromium.Focus(FocusState.Programmatic); + } + + private async void EmojiButtonClicked(object sender, RoutedEventArgs e) + { + CoreInputView.GetForCurrentView().TryShow(CoreInputViewKind.Emoji); + + await FocusEditorAsync(); + } + + private async Task TryGetSelectedTextAsync() + { + try + { + return await Chromium.ExecuteScriptAsync("getSelectedText();"); + } + catch (Exception) { } + + return string.Empty; + } + + private async void LinkButtonClicked(object sender, RoutedEventArgs e) + { + // Get selected text from Quill. + + HyperlinkTextBox.Text = await TryGetSelectedTextAsync(); + } + + private async Task UpdateEditorThemeAsync() + { + await DOMLoadedTask.Task; + + if (IsComposerDarkMode) + { + await InvokeScriptSafeAsync("DarkReader.enable();"); + } + else + { + await InvokeScriptSafeAsync("DarkReader.disable();"); + } + } + + private async Task RenderInternalAsync(string htmlBody) + { + await DOMLoadedTask.Task; + + await UpdateEditorThemeAsync(); + + if (string.IsNullOrEmpty(htmlBody)) + { + await ExecuteScriptFunctionAsync("RenderHTML", " "); + } + else + { + await ExecuteScriptFunctionAsync("RenderHTML", htmlBody); + + await FocusEditorAsync(); + } + } + + private async void ChromiumInitialized(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.UI.Xaml.Controls.CoreWebView2InitializedEventArgs args) + { + var editorBundlePath = (await ViewModel.NativeAppService.GetQuillEditorBundlePathAsync()).Replace("full.html", string.Empty); + + Chromium.CoreWebView2.SetVirtualHostNameToFolderMapping("app.reader", editorBundlePath, CoreWebView2HostResourceAccessKind.Allow); + Chromium.Source = new Uri("https://app.reader/full.html"); + + Chromium.CoreWebView2.DOMContentLoaded -= DOMLoaded; + Chromium.CoreWebView2.DOMContentLoaded += DOMLoaded; + + Chromium.CoreWebView2.WebMessageReceived -= ScriptMessageRecieved; + Chromium.CoreWebView2.WebMessageReceived += ScriptMessageRecieved; + } + + private static async void OnIsComposerDarkModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is ComposePage page) + { + await page.UpdateEditorThemeAsync(); + } + } + + private void ScriptMessageRecieved(CoreWebView2 sender, CoreWebView2WebMessageReceivedEventArgs args) + { + var change = JsonConvert.DeserializeObject(args.WebMessageAsJson); + + bool isEnabled = change.EndsWith("ql-active"); + + if (change.StartsWith("ql-bold")) + BoldButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-italic")) + ItalicButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-underline")) + UnderlineButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-strike")) + StrokeButton.IsChecked = isEnabled; + else if (change.StartsWith("orderedListButton")) + OrderedListButton.IsChecked = isEnabled; + else if (change.StartsWith("bulletListButton")) + BulletListButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-direction")) + DirectionButton.IsChecked = isEnabled; + else if (change.StartsWith("ql-align-left")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 0; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + else if (change.StartsWith("ql-align-center")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 1; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + else if (change.StartsWith("ql-align-right")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 2; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + else if (change.StartsWith("ql-align-justify")) + { + AlignmentListView.SelectionChanged -= AlignmentChanged; + AlignmentListView.SelectedIndex = 3; + AlignmentListView.SelectionChanged += AlignmentChanged; + } + } + + private void DOMLoaded(CoreWebView2 sender, CoreWebView2DOMContentLoadedEventArgs args) => DOMLoadedTask.TrySetResult(true); + + public async void Receive(HtmlRenderingRequested message) + { + await RenderInternalAsync(message.HtmlBody); + } + } +} diff --git a/Wino.Mail/Views/SettingsPage.xaml b/Wino.Mail/Views/SettingsPage.xaml new file mode 100644 index 00000000..7ab40b63 --- /dev/null +++ b/Wino.Mail/Views/SettingsPage.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Views/SettingsPage.xaml.cs b/Wino.Mail/Views/SettingsPage.xaml.cs new file mode 100644 index 00000000..bc759574 --- /dev/null +++ b/Wino.Mail/Views/SettingsPage.xaml.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Windows.UI.Xaml.Media.Animation; +using Windows.UI.Xaml.Navigation; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Messages.Navigation; +using Wino.Mail.ViewModels.Data; +using Wino.Views.Abstract; +using Wino.Views.Settings; + +namespace Wino.Views +{ + public sealed partial class SettingsPage : SettingsPageAbstract, IRecipient + { + public ObservableCollection PageHistory { get; set; } = new ObservableCollection(); + + public SettingsPage() + { + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + SettingsFrame.Navigate(typeof(SettingOptionsPage), null, new SuppressNavigationTransitionInfo()); + + var initialRequest = new BreadcrumbNavigationRequested(Translator.MenuSettings, WinoPage.SettingOptionsPage); + PageHistory.Add(new BreadcrumbNavigationItemViewModel(initialRequest, true)); + } + + public override void OnLanguageChanged() + { + base.OnLanguageChanged(); + + // Update Settings header in breadcrumb. + + var settingsHeader = PageHistory.FirstOrDefault(); + + if (settingsHeader == null) return; + + settingsHeader.Title = Translator.MenuSettings; + } + + private Type GetNavigationPageType(WinoPage page) + { + switch (page) + { + case WinoPage.AboutPage: + return typeof(AboutPage); + case WinoPage.PersonalizationPage: + return typeof(PersonalizationPage); + case WinoPage.MessageListPage: + return typeof(MessageListPage); + case WinoPage.ReadingPanePage: + return typeof(ReadingPanePage); + default: + return null; + } + } + + void IRecipient.Receive(BreadcrumbNavigationRequested message) + { + var pageType = GetNavigationPageType(message.PageType); + + if (pageType == null) return; + + SettingsFrame.Navigate(pageType, message.Parameter, new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromRight }); + + PageHistory.ForEach(a => a.IsActive = false); + + PageHistory.Add(new BreadcrumbNavigationItemViewModel(message, true)); + } + + private void BreadItemClicked(Microsoft.UI.Xaml.Controls.BreadcrumbBar sender, Microsoft.UI.Xaml.Controls.BreadcrumbBarItemClickedEventArgs args) + { + var clickedPageHistory = PageHistory[args.Index]; + var activeIndex = PageHistory.IndexOf(PageHistory.FirstOrDefault(a => a.IsActive)); + + while (PageHistory.FirstOrDefault(a => a.IsActive) != clickedPageHistory) + { + SettingsFrame.GoBack(new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromRight }); + PageHistory.RemoveAt(PageHistory.Count - 1); + PageHistory[PageHistory.Count - 1].IsActive = true; + } + } + } +} diff --git a/Wino.Mail/Views/WelcomePage.xaml b/Wino.Mail/Views/WelcomePage.xaml new file mode 100644 index 00000000..25f28769 --- /dev/null +++ b/Wino.Mail/Views/WelcomePage.xaml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/Wino.Mail/Views/WelcomePage.xaml.cs b/Wino.Mail/Views/WelcomePage.xaml.cs new file mode 100644 index 00000000..b5206aeb --- /dev/null +++ b/Wino.Mail/Views/WelcomePage.xaml.cs @@ -0,0 +1,19 @@ +using System; +using Windows.System; +using Wino.Views.Abstract; + +namespace Wino.Views +{ + public sealed partial class WelcomePage : WelcomePageAbstract + { + public WelcomePage() + { + InitializeComponent(); + } + + private async void HyperlinkClicked(object sender, Microsoft.Toolkit.Uwp.UI.Controls.LinkClickedEventArgs e) + { + await Launcher.LaunchUriAsync(new System.Uri(e.Link)); + } + } +} diff --git a/Wino.Mail/Wino.Mail.csproj b/Wino.Mail/Wino.Mail.csproj new file mode 100644 index 00000000..0b59c6a6 --- /dev/null +++ b/Wino.Mail/Wino.Mail.csproj @@ -0,0 +1,888 @@ + + + + + 8.0 + + + + + Debug + x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E} + AppContainerExe + Properties + Wino + Wino + en-US + UAP + 10.0.22621.0 + 10.0.17763.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + Wino.Mail_TemporaryKey.pfx + False + SHA256 + False + True + Always + x86|x64 + 0 + True + True + C:\Users\bkaan\Desktop\Packages\ + True + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + true + + true + x64 + true + true + true + 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 + x64 + true + true + true + true + + true + + + + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM64 + false + prompt + true + true + + + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM64 + false + prompt + true + + true + x64 + true + true + true + true + + true + + + + true + bin\x64\Debug\ + TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS; DEBUG + + + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + + true + x64 + true + true + true + true + + true + + + + PackageReference + + false + + + + 1.2.2 + + + 1.0.0 + + + 8.2.2 + + + 8.2.2 + + + 8.2.2 + + + 8.0.240109 + + + 8.0.240109 + + + 8.0.240109 + + + 8.0.240109 + + + 1.0.10 + + + 5.0.3 + + + 5.0.3 + + + 8.0.0 + + + 6.2.14 + + + 7.1.3 + + + 2.8.6 + + + 2.0.1 + + + 5.1.2 + + + 19.6.1 + + + 3.1.1 + + + 8.4.0 + + + 1.8.116 + + + 1.27.1 + + + + + + + + + + + + + + + WinoAppTitleBar.xaml + + + + + + + + + AccountEditDialog.xaml + + + AccountPickerDialog.xaml + + + + CustomThemeBuilderDialog.xaml + + + MoveMailDialog.xaml + + + NewImapSetupDialog.xaml + + + StoreRatingDialog.xaml + + + SystemFolderConfigurationDialog.xaml + + + WinoMessageDialog.xaml + + + TextInputDialog.xaml + + + + + + + + + + + + + + WinoPivotControl.xaml + + + + AccountCreationDialog.xaml + + + + + + + + + + + + + MailItemDisplayInformationControl.xaml + + + + + + + ConfirmationDialog.xaml + + + NewAccountDialog.xaml + + + + + + + + + + + + + + + + + + + + + CommandBarItems.xaml + + + + + + + + + + + + + + + + + + + + + AccountDetailsPage.xaml + + + AccountManagementPage.xaml + + + MergedAccountDetailsPage.xaml + + + ComposePage.xaml + + + IdlePage.xaml + + + AdvancedImapSetupPage.xaml + + + AutoDiscoveryPage.xaml + + + PreparingImapFoldersPage.xaml + + + TestingImapConnectionPage.xaml + + + WelcomeImapSetupPage.xaml + + + MailListPage.xaml + + + MailRenderingPage.xaml + + + NewAccountManagementPage.xaml + + + SettingsPage.xaml + + + AboutPage.xaml + + + MessageListPage.xaml + + + PersonalizationPage.xaml + + + AppShell.xaml + + + ReadingPanePage.xaml + + + SettingOptionsPage.xaml + + + SignatureManagementPage.xaml + + + WelcomePage.xaml + + + + + App.xaml + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MSBuild:Compile + Designer + + + + + {d9ef0f59-f5f2-4d6c-a5ba-84043d8f3e08} + Wino.BackgroundTasks + + + {CF3312E5-5DA0-4867-9945-49EA7598AF1F} + Wino.Core.Domain + + + {395f19ba-1e42-495c-9db5-1a6f537fccb8} + Wino.Core.UWP + + + {E6B1632A-8901-41E8-9DDF-6793C7698B0B} + Wino.Core + + + {d62f1c03-da57-4709-a640-0283296a8e66} + Wino.Mail.ViewModels + + + + + Windows Desktop Extensions for the UWP + + + + + + + 14.0 + + + bin\x86\Debug .NET Native\ + TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS + false + ;2008 + true + pdbonly + x86 + false + 7.3 + prompt + true + true + true + + true + x64 + true + true + true + true + + true + + + + bin\ARM\Debug .NET Native\ + TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS + true + ;2008 + true + pdbonly + ARM + false + 7.3 + prompt + true + + + bin\ARM64\Debug .NET Native\ + TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS + true + ;2008 + true + pdbonly + ARM64 + false + 7.3 + prompt + true + + + bin\x64\Debug .NET Native\ + TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS + true + ;2008 + true + pdbonly + x64 + false + 7.3 + prompt + true + + + + \ No newline at end of file diff --git a/Wino.Mail/Wino.sln b/Wino.Mail/Wino.sln new file mode 100644 index 00000000..eee1b122 --- /dev/null +++ b/Wino.Mail/Wino.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wino.Mail", "Wino.Mail.csproj", "{0B5C02DC-6B11-437C-9C46-EAB6430C3155}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0B5C02DC-6B11-437C-9C46-EAB6430C3155}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B5C02DC-6B11-437C-9C46-EAB6430C3155}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B5C02DC-6B11-437C-9C46-EAB6430C3155}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B5C02DC-6B11-437C-9C46-EAB6430C3155}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0254B19E-9B52-4594-9F8A-8616BE750243} + EndGlobalSection +EndGlobal diff --git a/Wino.sln b/Wino.sln new file mode 100644 index 00000000..bcd61664 --- /dev/null +++ b/Wino.sln @@ -0,0 +1,231 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Mail", "Wino.Mail\Wino.Mail.csproj", "{68A432B8-C1B7-494C-8D6D-230788EA683E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wino.Core", "Wino.Core\Wino.Core.csproj", "{E6B1632A-8901-41E8-9DDF-6793C7698B0B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Core.UWP", "Wino.Core.UWP\Wino.Core.UWP.csproj", "{395F19BA-1E42-495C-9DB5-1A6F537FCCB8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wino.Core.Domain", "Wino.Core.Domain\Wino.Core.Domain.csproj", "{CF3312E5-5DA0-4867-9945-49EA7598AF1F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.BackgroundTasks", "Wino.BackgroundTasks\Wino.BackgroundTasks.csproj", "{D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Calendar", "Wino.Calendar\Wino.Calendar.csproj", "{600F4979-DB7E-409D-B7DA-B60BE4C55C35}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wino.Mail.ViewModels", "Wino.Mail.ViewModels\Wino.Mail.ViewModels.csproj", "{D62F1C03-DA57-4709-A640-0283296A8E66}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug .NET Native|Any CPU = Debug .NET Native|Any CPU + Debug .NET Native|ARM64 = Debug .NET Native|ARM64 + Debug .NET Native|x64 = Debug .NET Native|x64 + Debug .NET Native|x86 = Debug .NET Native|x86 + Debug|Any CPU = Debug|Any CPU + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|Any CPU.ActiveCfg = Debug .NET Native|x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|ARM64.ActiveCfg = Debug .NET Native|ARM64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|ARM64.Build.0 = Debug .NET Native|ARM64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|ARM64.Deploy.0 = Debug .NET Native|ARM64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|x64.ActiveCfg = Debug .NET Native|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|x64.Build.0 = Debug .NET Native|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|x64.Deploy.0 = Debug .NET Native|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|x86.ActiveCfg = Debug .NET Native|x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|x86.Build.0 = Debug .NET Native|x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug .NET Native|x86.Deploy.0 = Debug .NET Native|x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|Any CPU.ActiveCfg = Debug|x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|Any CPU.Build.0 = Debug|x86 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|Any CPU.Deploy.0 = Debug|x86 + {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 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|x64.ActiveCfg = Debug|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|x64.Build.0 = Debug|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Debug|x64.Deploy.0 = Debug|x64 + {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|x86 + {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 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|x64.ActiveCfg = Release|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|x64.Build.0 = Release|x64 + {68A432B8-C1B7-494C-8D6D-230788EA683E}.Release|x64.Deploy.0 = Release|x64 + {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 .NET Native|Any CPU.ActiveCfg = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|Any CPU.Build.0 = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|ARM64.ActiveCfg = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|ARM64.Build.0 = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|x64.ActiveCfg = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|x64.Build.0 = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|x86.ActiveCfg = Debug .NET Native|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Debug .NET Native|x86.Build.0 = Debug .NET Native|Any CPU + {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|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|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|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x64.Build.0 = Release|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x86.ActiveCfg = Release|Any CPU + {E6B1632A-8901-41E8-9DDF-6793C7698B0B}.Release|x86.Build.0 = Release|Any CPU + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|Any CPU.ActiveCfg = Debug|Any CPU + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|Any CPU.Build.0 = Debug|Any CPU + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|ARM64.ActiveCfg = Debug|ARM64 + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|ARM64.Build.0 = Debug|ARM64 + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|x64.ActiveCfg = Debug|x64 + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|x64.Build.0 = Debug|x64 + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|x86.ActiveCfg = Debug|x86 + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug .NET Native|x86.Build.0 = Debug|x86 + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Debug|Any CPU.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|Any CPU + {395F19BA-1E42-495C-9DB5-1A6F537FCCB8}.Release|Any CPU.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 .NET Native|Any CPU.ActiveCfg = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|Any CPU.Build.0 = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|ARM64.ActiveCfg = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|ARM64.Build.0 = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|x64.ActiveCfg = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|x64.Build.0 = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|x86.ActiveCfg = Debug|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Debug .NET Native|x86.Build.0 = Debug|Any CPU + {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|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|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|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x64.Build.0 = Release|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x86.ActiveCfg = Release|Any CPU + {CF3312E5-5DA0-4867-9945-49EA7598AF1F}.Release|x86.Build.0 = Release|Any CPU + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|Any CPU.ActiveCfg = Debug|Any CPU + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|Any CPU.Build.0 = Debug|Any CPU + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|ARM64.ActiveCfg = Debug|ARM64 + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|ARM64.Build.0 = Debug|ARM64 + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|x64.ActiveCfg = Debug|x64 + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|x64.Build.0 = Debug|x64 + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|x86.ActiveCfg = Debug|x86 + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug .NET Native|x86.Build.0 = Debug|x86 + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {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|Any CPU + {D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}.Release|Any CPU.Build.0 = Release|Any CPU + {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 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|Any CPU.ActiveCfg = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|Any CPU.Build.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|Any CPU.Deploy.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|ARM64.ActiveCfg = Debug|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|ARM64.Build.0 = Debug|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|ARM64.Deploy.0 = Debug|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|x64.ActiveCfg = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|x64.Build.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|x64.Deploy.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|x86.ActiveCfg = Debug|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|x86.Build.0 = Debug|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug .NET Native|x86.Deploy.0 = Debug|x86 + {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|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 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x64.ActiveCfg = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x64.Build.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x64.Deploy.0 = Debug|x64 + {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|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 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x64.ActiveCfg = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x64.Build.0 = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x64.Deploy.0 = Release|x64 + {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 + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|Any CPU.ActiveCfg = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|Any CPU.Build.0 = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|ARM64.ActiveCfg = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|ARM64.Build.0 = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|x64.ActiveCfg = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|x64.Build.0 = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|x86.ActiveCfg = Debug|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Debug .NET Native|x86.Build.0 = Debug|Any CPU + {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|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|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|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x64.Build.0 = Release|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x86.ActiveCfg = Release|Any CPU + {D62F1C03-DA57-4709-A640-0283296A8E66}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {721F946E-F69F-4987-823A-D084B436FC1E} + EndGlobalSection +EndGlobal diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000..2b709c3d --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,3 @@ +files: + - source: /Wino.Core.Domain/Translations/en_US/resources.json + translation: /Wino.Core.Domain/Translations/%locale_with_underscore%/resources.json
+

Sent from
Wino Mail for Windows +