From 3b2ee448f90c35dbadd20bce64090bf849057de5 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 14 Jul 2020 16:02:18 -0500 Subject: [PATCH 01/14] Add support for "Always on top" mode (#6903) This PR adds support for always on top mode, via two mechanisms: * The global setting `alwaysOnTop`. When set to true, the window will be created in the "topmost" group of windows. Changing this value will hot-reload whether the window is in the topmost group. * The action `toggleAlwaysOnTop`, which will toggle the `alwaysOnTop` property at runtime. ## Detailed Description of the Pull Request / Additional comments All "topmost" windows maintain an internal z-ordering relative to one another, but they're all always above all other "non-topmost" windows. So multiple Windows Terminal windows which are both `alwaysOnTop` will maintain a z-order relative to one another, but they'll all be on top of all other windows. ## Validation Steps Performed Toggled always on top mode, both in the settings and also at runtime, and verified that it largely did what I expected. Closes #3038 --- .github/actions/spell-check/expect/expect.txt | 1 + doc/cascadia/profiles.schema.json | 6 ++ src/cascadia/TerminalApp/ActionAndArgs.cpp | 3 + .../TerminalApp/AppActionHandlers.cpp | 7 ++ src/cascadia/TerminalApp/AppLogic.cpp | 15 ++++ src/cascadia/TerminalApp/AppLogic.h | 8 +- src/cascadia/TerminalApp/AppLogic.idl | 9 ++- .../TerminalApp/GlobalAppSettings.cpp | 3 + src/cascadia/TerminalApp/GlobalAppSettings.h | 1 + .../Resources/en-US/Resources.resw | 3 + .../TerminalApp/ShortcutActionDispatch.cpp | 5 ++ .../TerminalApp/ShortcutActionDispatch.h | 1 + .../TerminalApp/ShortcutActionDispatch.idl | 2 + src/cascadia/TerminalApp/TerminalPage.cpp | 59 ++++++++++++--- src/cascadia/TerminalApp/TerminalPage.h | 11 ++- src/cascadia/TerminalApp/TerminalPage.idl | 11 ++- src/cascadia/TerminalApp/defaults.json | 2 + src/cascadia/WindowsTerminal/AppHost.cpp | 24 ++++-- src/cascadia/WindowsTerminal/AppHost.h | 10 ++- src/cascadia/WindowsTerminal/IslandWindow.cpp | 73 ++++++++++++++----- src/cascadia/WindowsTerminal/IslandWindow.h | 6 +- 21 files changed, 209 insertions(+), 51 deletions(-) diff --git a/.github/actions/spell-check/expect/expect.txt b/.github/actions/spell-check/expect/expect.txt index 4774abf99a2..5a404754efc 100644 --- a/.github/actions/spell-check/expect/expect.txt +++ b/.github/actions/spell-check/expect/expect.txt @@ -1530,6 +1530,7 @@ nothrow NOTICKS NOTIMPL notin +NOTOPMOST NOTNULL NOTRACK NOTSUPPORTED diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 7232d65f133..3df0f2d5604 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -56,6 +56,7 @@ "switchToTab", "toggleFocusMode", "toggleFullscreen", + "toggleAlwaysOnTop", "toggleRetroEffect", "find", "setTabColor", @@ -324,6 +325,11 @@ "additionalProperties": true, "description": "Properties that affect the entire window, regardless of the profile settings.", "properties": { + "alwaysOnTop": { + "default": false, + "description": "When set to true, the window is created on top of all other windows. If multiple windows are all \"always on top\", the most recently focused one will be the topmost", + "type": "boolean" + }, "alwaysShowTabs": { "default": true, "description": "When set to true, tabs are always displayed. When set to false and \"showTabsInTitlebar\" is set to false, tabs only appear after opening a new tab.", diff --git a/src/cascadia/TerminalApp/ActionAndArgs.cpp b/src/cascadia/TerminalApp/ActionAndArgs.cpp index cdb7c61eaa5..5375ea02cb0 100644 --- a/src/cascadia/TerminalApp/ActionAndArgs.cpp +++ b/src/cascadia/TerminalApp/ActionAndArgs.cpp @@ -31,6 +31,7 @@ static constexpr std::string_view FindKey{ "find" }; static constexpr std::string_view ToggleRetroEffectKey{ "toggleRetroEffect" }; static constexpr std::string_view ToggleFocusModeKey{ "toggleFocusMode" }; static constexpr std::string_view ToggleFullscreenKey{ "toggleFullscreen" }; +static constexpr std::string_view ToggleAlwaysOnTopKey{ "toggleAlwaysOnTop" }; static constexpr std::string_view SetTabColorKey{ "setTabColor" }; static constexpr std::string_view OpenTabColorPickerKey{ "openTabColorPicker" }; static constexpr std::string_view RenameTabKey{ "renameTab" }; @@ -76,6 +77,7 @@ namespace winrt::TerminalApp::implementation { ToggleRetroEffectKey, ShortcutAction::ToggleRetroEffect }, { ToggleFocusModeKey, ShortcutAction::ToggleFocusMode }, { ToggleFullscreenKey, ShortcutAction::ToggleFullscreen }, + { ToggleAlwaysOnTopKey, ShortcutAction::ToggleAlwaysOnTop }, { SplitPaneKey, ShortcutAction::SplitPane }, { SetTabColorKey, ShortcutAction::SetTabColor }, { OpenTabColorPickerKey, ShortcutAction::OpenTabColorPicker }, @@ -256,6 +258,7 @@ namespace winrt::TerminalApp::implementation { ShortcutAction::ToggleRetroEffect, RS_(L"ToggleRetroEffectCommandKey") }, { ShortcutAction::ToggleFocusMode, RS_(L"ToggleFocusModeCommandKey") }, { ShortcutAction::ToggleFullscreen, RS_(L"ToggleFullscreenCommandKey") }, + { ShortcutAction::ToggleAlwaysOnTop, RS_(L"ToggleAlwaysOnTopCommandKey") }, { ShortcutAction::SplitPane, RS_(L"SplitPaneCommandKey") }, { ShortcutAction::Invalid, L"" }, { ShortcutAction::Find, RS_(L"FindCommandKey") }, diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 06f00892500..271513d4e58 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -253,6 +253,13 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } + void TerminalPage::_HandleToggleAlwaysOnTop(const IInspectable& /*sender*/, + const TerminalApp::ActionEventArgs& args) + { + ToggleAlwaysOnTop(); + args.Handled(true); + } + void TerminalPage::_HandleToggleCommandPalette(const IInspectable& /*sender*/, const TerminalApp::ActionEventArgs& args) { diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index 77f4e4aefef..e036bd9ee2c 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -1121,6 +1121,21 @@ namespace winrt::TerminalApp::implementation return RS_(L"ApplicationVersionUnknown"); } + bool AppLogic::FocusMode() const + { + return _root ? _root->FocusMode() : false; + } + + bool AppLogic::Fullscreen() const + { + return _root ? _root->Fullscreen() : false; + } + + bool AppLogic::AlwaysOnTop() const + { + return _root ? _root->AlwaysOnTop() : false; + } + // -------------------------------- WinRT Events --------------------------------- // Winrt events need a method for adding a callback to the event and removing the callback. // These macros will define them both for you. diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index 9c030b20051..c879a6f1876 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -33,6 +33,9 @@ namespace winrt::TerminalApp::implementation winrt::hstring ApplicationDisplayName() const; winrt::hstring ApplicationVersion() const; + bool FocusMode() const; + bool Fullscreen() const; + bool AlwaysOnTop() const; Windows::Foundation::Point GetLaunchDimensions(uint32_t dpi); winrt::Windows::Foundation::Point GetLaunchInitialPositions(int32_t defaultInitialX, int32_t defaultInitialY); @@ -104,8 +107,9 @@ namespace winrt::TerminalApp::implementation FORWARDED_TYPED_EVENT(SetTitleBarContent, winrt::Windows::Foundation::IInspectable, winrt::Windows::UI::Xaml::UIElement, _root, SetTitleBarContent); FORWARDED_TYPED_EVENT(TitleChanged, winrt::Windows::Foundation::IInspectable, winrt::hstring, _root, TitleChanged); FORWARDED_TYPED_EVENT(LastTabClosed, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::LastTabClosedEventArgs, _root, LastTabClosed); - FORWARDED_TYPED_EVENT(ToggleFocusMode, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::ToggleFocusModeEventArgs, _root, ToggleFocusMode); - FORWARDED_TYPED_EVENT(ToggleFullscreen, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::ToggleFullscreenEventArgs, _root, ToggleFullscreen); + FORWARDED_TYPED_EVENT(FocusModeChanged, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, FocusModeChanged); + FORWARDED_TYPED_EVENT(FullscreenChanged, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, FullscreenChanged); + FORWARDED_TYPED_EVENT(AlwaysOnTopChanged, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, AlwaysOnTopChanged); }; } diff --git a/src/cascadia/TerminalApp/AppLogic.idl b/src/cascadia/TerminalApp/AppLogic.idl index 63441984f97..071a5ce84cc 100644 --- a/src/cascadia/TerminalApp/AppLogic.idl +++ b/src/cascadia/TerminalApp/AppLogic.idl @@ -41,6 +41,10 @@ namespace TerminalApp String ApplicationDisplayName { get; }; String ApplicationVersion { get; }; + Boolean FocusMode { get; }; + Boolean Fullscreen { get; }; + Boolean AlwaysOnTop { get; }; + Windows.Foundation.Point GetLaunchDimensions(UInt32 dpi); Windows.Foundation.Point GetLaunchInitialPositions(Int32 defaultInitialX, Int32 defaultInitialY); Windows.UI.Xaml.ElementTheme GetRequestedTheme(); @@ -58,7 +62,8 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler TitleChanged; event Windows.Foundation.TypedEventHandler LastTabClosed; event Windows.Foundation.TypedEventHandler RequestedThemeChanged; - event Windows.Foundation.TypedEventHandler ToggleFullscreen; - event Windows.Foundation.TypedEventHandler ToggleFocusMode; + event Windows.Foundation.TypedEventHandler FocusModeChanged; + event Windows.Foundation.TypedEventHandler FullscreenChanged; + event Windows.Foundation.TypedEventHandler AlwaysOnTopChanged; } } diff --git a/src/cascadia/TerminalApp/GlobalAppSettings.cpp b/src/cascadia/TerminalApp/GlobalAppSettings.cpp index e623634ae7f..1e074d86cf2 100644 --- a/src/cascadia/TerminalApp/GlobalAppSettings.cpp +++ b/src/cascadia/TerminalApp/GlobalAppSettings.cpp @@ -36,6 +36,7 @@ static constexpr std::string_view LaunchModeKey{ "launchMode" }; static constexpr std::string_view ConfirmCloseAllKey{ "confirmCloseAllTabs" }; static constexpr std::string_view SnapToGridOnResizeKey{ "snapToGridOnResize" }; static constexpr std::string_view EnableStartupTaskKey{ "startOnUserLogin" }; +static constexpr std::string_view AlwaysOnTopKey{ "alwaysOnTop" }; static constexpr std::string_view DebugFeaturesKey{ "debugFeatures" }; @@ -207,6 +208,8 @@ void GlobalAppSettings::LayerJson(const Json::Value& json) JsonUtils::GetBool(json, EnableStartupTaskKey, _StartOnUserLogin); + JsonUtils::GetBool(json, AlwaysOnTopKey, _AlwaysOnTop); + // This is a helper lambda to get the keybindings and commands out of both // and array of objects. We'll use this twice, once on the legacy // `keybindings` key, and again on the newer `bindings` key. diff --git a/src/cascadia/TerminalApp/GlobalAppSettings.h b/src/cascadia/TerminalApp/GlobalAppSettings.h index 58f8ea5a469..988d7fe1c08 100644 --- a/src/cascadia/TerminalApp/GlobalAppSettings.h +++ b/src/cascadia/TerminalApp/GlobalAppSettings.h @@ -84,6 +84,7 @@ class TerminalApp::GlobalAppSettings final GETSET_PROPERTY(bool, ForceVTInput, false); GETSET_PROPERTY(bool, DebugFeaturesEnabled); // default value set in constructor GETSET_PROPERTY(bool, StartOnUserLogin, false); + GETSET_PROPERTY(bool, AlwaysOnTop, false); private: std::optional _unparsedDefaultProfile; diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw index 1f810d4de76..09283b55c6d 100644 --- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw @@ -399,6 +399,9 @@ Toggle fullscreen + + Toggle always on top mode + Open new tab dropdown diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp index 8248d453aa8..a040106e24c 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp @@ -169,6 +169,11 @@ namespace winrt::TerminalApp::implementation _ToggleFullscreenHandlers(*this, *eventArgs); break; } + case ShortcutAction::ToggleAlwaysOnTop: + { + _ToggleAlwaysOnTopHandlers(*this, *eventArgs); + break; + } case ShortcutAction::ToggleCommandPalette: { _ToggleCommandPaletteHandlers(*this, *eventArgs); diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.h b/src/cascadia/TerminalApp/ShortcutActionDispatch.h index e59c8ce47cb..9b930db980d 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.h +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.h @@ -49,6 +49,7 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(ToggleRetroEffect, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(ToggleFocusMode, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(ToggleFullscreen, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); + TYPED_EVENT(ToggleAlwaysOnTop, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(ToggleCommandPalette, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(SetTabColor, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(OpenTabColorPicker, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl index 50f1bc7cd7f..2588c3258b2 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl @@ -34,6 +34,7 @@ namespace TerminalApp ToggleRetroEffect, ToggleFocusMode, ToggleFullscreen, + ToggleAlwaysOnTop, SetTabColor, OpenTabColorPicker, OpenSettings, @@ -78,6 +79,7 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler ToggleRetroEffect; event Windows.Foundation.TypedEventHandler ToggleFocusMode; event Windows.Foundation.TypedEventHandler ToggleFullscreen; + event Windows.Foundation.TypedEventHandler ToggleAlwaysOnTop; event Windows.Foundation.TypedEventHandler ToggleCommandPalette; event Windows.Foundation.TypedEventHandler SetTabColor; event Windows.Foundation.TypedEventHandler OpenTabColorPicker; diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index deecd34850e..6ed6d8e9716 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -852,6 +852,7 @@ namespace winrt::TerminalApp::implementation _actionDispatch->ToggleRetroEffect({ this, &TerminalPage::_HandleToggleRetroEffect }); _actionDispatch->ToggleFocusMode({ this, &TerminalPage::_HandleToggleFocusMode }); _actionDispatch->ToggleFullscreen({ this, &TerminalPage::_HandleToggleFullscreen }); + _actionDispatch->ToggleAlwaysOnTop({ this, &TerminalPage::_HandleToggleAlwaysOnTop }); _actionDispatch->ToggleCommandPalette({ this, &TerminalPage::_HandleToggleCommandPalette }); _actionDispatch->SetTabColor({ this, &TerminalPage::_HandleSetTabColor }); _actionDispatch->OpenTabColorPicker({ this, &TerminalPage::_HandleOpenTabColorPicker }); @@ -1913,6 +1914,12 @@ namespace winrt::TerminalApp::implementation _UpdateTabWidthMode(); _CreateNewTabFlyout(); } + + // Reload the current value of alwaysOnTop from the settings file. This + // will let the user hot-reload this setting, but any runtime changes to + // the alwaysOnTop setting will be lost. + _isAlwaysOnTop = _settings->GlobalSettings().AlwaysOnTop(); + _alwaysOnTopChangedHandlers(*this, nullptr); } // Method Description: @@ -1969,34 +1976,42 @@ namespace winrt::TerminalApp::implementation // Method Description: // - Toggles borderless mode. Hides the tab row, and raises our - // ToggleFocusMode event. + // FocusModeChanged event. // Arguments: // - // Return Value: // - void TerminalPage::ToggleFocusMode() { - _toggleFocusModeHandlers(*this, nullptr); - _isInFocusMode = !_isInFocusMode; - _UpdateTabView(); + _focusModeChangedHandlers(*this, nullptr); } // Method Description: // - Toggles fullscreen mode. Hides the tab row, and raises our - // ToggleFullscreen event. + // FullscreenChanged event. // Arguments: // - // Return Value: // - void TerminalPage::ToggleFullscreen() { - _toggleFullscreenHandlers(*this, nullptr); - _isFullscreen = !_isFullscreen; - _UpdateTabView(); + _fullscreenChangedHandlers(*this, nullptr); + } + + // Method Description: + // - Toggles always on top mode. Raises our AlwaysOnTopChanged event. + // Arguments: + // - + // Return Value: + // - + void TerminalPage::ToggleAlwaysOnTop() + { + _isAlwaysOnTop = !_isAlwaysOnTop; + _alwaysOnTopChangedHandlers(*this, nullptr); } // Method Description: @@ -2187,12 +2202,36 @@ namespace winrt::TerminalApp::implementation } } + bool TerminalPage::FocusMode() const + { + return _isInFocusMode; + } + + bool TerminalPage::Fullscreen() const + { + return _isFullscreen; + } + // Method Description: + // - Returns true if we're currently in "Always on top" mode. When we're in + // always on top mode, the window should be on top of all other windows. + // If multiple windows are all "always on top", they'll maintain their own + // z-order, with all the windows on top of all other non-topmost windows. + // Arguments: + // - + // Return Value: + // - true if we should be in "always on top" mode + bool TerminalPage::AlwaysOnTop() const + { + return _isAlwaysOnTop; + } + // -------------------------------- WinRT Events --------------------------------- // Winrt events need a method for adding a callback to the event and removing the callback. // These macros will define them both for you. DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, TitleChanged, _titleChangeHandlers, winrt::Windows::Foundation::IInspectable, winrt::hstring); DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, LastTabClosed, _lastTabClosedHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::LastTabClosedEventArgs); DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, SetTitleBarContent, _setTitleBarContentHandlers, winrt::Windows::Foundation::IInspectable, UIElement); - DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, ToggleFocusMode, _toggleFocusModeHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::ToggleFocusModeEventArgs); - DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, ToggleFullscreen, _toggleFullscreenHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::ToggleFullscreenEventArgs); + DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, FocusModeChanged, _focusModeChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); + DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, FullscreenChanged, _fullscreenChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); + DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TerminalPage, AlwaysOnTopChanged, _alwaysOnTopChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); } diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index b5536b8371f..2aa717cfacd 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -51,6 +51,10 @@ namespace winrt::TerminalApp::implementation void ToggleFocusMode(); void ToggleFullscreen(); + void ToggleAlwaysOnTop(); + bool FocusMode() const; + bool Fullscreen() const; + bool AlwaysOnTop() const; void SetStartupActions(std::deque& actions); @@ -61,8 +65,9 @@ namespace winrt::TerminalApp::implementation DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(TitleChanged, _titleChangeHandlers, winrt::Windows::Foundation::IInspectable, winrt::hstring); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(LastTabClosed, _lastTabClosedHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::LastTabClosedEventArgs); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(SetTitleBarContent, _setTitleBarContentHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::UI::Xaml::UIElement); - DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(ToggleFocusMode, _toggleFocusModeHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::ToggleFocusModeEventArgs); - DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(ToggleFullscreen, _toggleFullscreenHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::ToggleFullscreenEventArgs); + DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(FocusModeChanged, _focusModeChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); + DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(FullscreenChanged, _fullscreenChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); + DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(AlwaysOnTopChanged, _alwaysOnTopChangedHandlers, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); TYPED_EVENT(Initialized, winrt::Windows::Foundation::IInspectable, winrt::Windows::UI::Xaml::RoutedEventArgs); private: @@ -87,6 +92,7 @@ namespace winrt::TerminalApp::implementation bool _isInFocusMode{ false }; bool _isFullscreen{ false }; + bool _isAlwaysOnTop{ false }; bool _rearranging; std::optional _rearrangeFrom; @@ -211,6 +217,7 @@ namespace winrt::TerminalApp::implementation void _HandleToggleRetroEffect(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleFocusMode(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleFullscreen(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); + void _HandleToggleAlwaysOnTop(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSetTabColor(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleOpenTabColorPicker(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleRenameTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); diff --git a/src/cascadia/TerminalApp/TerminalPage.idl b/src/cascadia/TerminalApp/TerminalPage.idl index 9d5bd0aa83e..7fb5cb29ac1 100644 --- a/src/cascadia/TerminalApp/TerminalPage.idl +++ b/src/cascadia/TerminalApp/TerminalPage.idl @@ -4,8 +4,6 @@ namespace TerminalApp { delegate void LastTabClosedEventArgs(); - delegate void ToggleFullscreenEventArgs(); - delegate void ToggleFocusModeEventArgs(); interface IDialogPresenter { @@ -20,6 +18,10 @@ namespace TerminalApp String ApplicationDisplayName { get; }; String ApplicationVersion { get; }; + Boolean FocusMode { get; }; + Boolean Fullscreen { get; }; + Boolean AlwaysOnTop { get; }; + // We cannot use the default XAML APIs because we want to make sure // that there's only one application-global dialog visible at a time, // and because of GH#5224. @@ -28,8 +30,9 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler TitleChanged; event Windows.Foundation.TypedEventHandler LastTabClosed; event Windows.Foundation.TypedEventHandler SetTitleBarContent; - event Windows.Foundation.TypedEventHandler ToggleFullscreen; - event Windows.Foundation.TypedEventHandler ToggleFocusMode; + event Windows.Foundation.TypedEventHandler FocusModeChanged; + event Windows.Foundation.TypedEventHandler FullscreenChanged; + event Windows.Foundation.TypedEventHandler AlwaysOnTopChanged; event Windows.Foundation.TypedEventHandler Initialized; } } diff --git a/src/cascadia/TerminalApp/defaults.json b/src/cascadia/TerminalApp/defaults.json index 531c1724427..b4167968f79 100644 --- a/src/cascadia/TerminalApp/defaults.json +++ b/src/cascadia/TerminalApp/defaults.json @@ -6,6 +6,7 @@ "initialCols": 120, "initialRows": 30, "launchMode": "default", + "alwaysOnTop": false, // Selection "copyOnSelect": false, @@ -277,6 +278,7 @@ { "command": "toggleFullscreen", "keys": "alt+enter" }, { "command": "toggleFullscreen", "keys": "f11" }, { "command": "toggleFocusMode" }, + { "command": "toggleAlwaysOnTop" }, { "command": "openNewTabDropdown", "keys": "ctrl+shift+space" }, { "command": "openSettings", "keys": "ctrl+," }, { "command": { "action": "openSettings", "target": "defaultsFile" }, "keys": "ctrl+alt+," }, diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 4875475550e..b2c3c32a3b5 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -52,6 +52,7 @@ AppHost::AppHost() noexcept : std::placeholders::_1, std::placeholders::_2)); _window->MouseScrolled({ this, &AppHost::_WindowMouseWheeled }); + _window->SetAlwaysOnTop(_logic.AlwaysOnTop()); _window->MakeWindow(); } @@ -156,8 +157,9 @@ void AppHost::Initialize() _window->DragRegionClicked([this]() { _logic.TitlebarClicked(); }); _logic.RequestedThemeChanged({ this, &AppHost::_UpdateTheme }); - _logic.ToggleFullscreen({ this, &AppHost::_ToggleFullscreen }); - _logic.ToggleFocusMode({ this, &AppHost::_ToggleFocusMode }); + _logic.FullscreenChanged({ this, &AppHost::_FullscreenChanged }); + _logic.FocusModeChanged({ this, &AppHost::_FocusModeChanged }); + _logic.AlwaysOnTopChanged({ this, &AppHost::_AlwaysOnTopChanged }); _logic.Create(); @@ -353,16 +355,22 @@ void AppHost::_UpdateTheme(const winrt::Windows::Foundation::IInspectable&, cons _window->OnApplicationThemeChanged(arg); } -void AppHost::_ToggleFocusMode(const winrt::Windows::Foundation::IInspectable&, - const winrt::TerminalApp::ToggleFocusModeEventArgs&) +void AppHost::_FocusModeChanged(const winrt::Windows::Foundation::IInspectable&, + const winrt::Windows::Foundation::IInspectable&) { - _window->ToggleFocusMode(); + _window->FocusModeChanged(_logic.FocusMode()); } -void AppHost::_ToggleFullscreen(const winrt::Windows::Foundation::IInspectable&, - const winrt::TerminalApp::ToggleFullscreenEventArgs&) +void AppHost::_FullscreenChanged(const winrt::Windows::Foundation::IInspectable&, + const winrt::Windows::Foundation::IInspectable&) { - _window->ToggleFullscreen(); + _window->FullscreenChanged(_logic.Fullscreen()); +} + +void AppHost::_AlwaysOnTopChanged(const winrt::Windows::Foundation::IInspectable&, + const winrt::Windows::Foundation::IInspectable&) +{ + _window->SetAlwaysOnTop(_logic.AlwaysOnTop()); } // Method Description: diff --git a/src/cascadia/WindowsTerminal/AppHost.h b/src/cascadia/WindowsTerminal/AppHost.h index 842f8c19bba..4e072411de8 100644 --- a/src/cascadia/WindowsTerminal/AppHost.h +++ b/src/cascadia/WindowsTerminal/AppHost.h @@ -33,9 +33,11 @@ class AppHost const winrt::Windows::UI::Xaml::UIElement& arg); void _UpdateTheme(const winrt::Windows::Foundation::IInspectable&, const winrt::Windows::UI::Xaml::ElementTheme& arg); - void _ToggleFocusMode(const winrt::Windows::Foundation::IInspectable& sender, - const winrt::TerminalApp::ToggleFocusModeEventArgs& arg); - void _ToggleFullscreen(const winrt::Windows::Foundation::IInspectable& sender, - const winrt::TerminalApp::ToggleFullscreenEventArgs& arg); + void _FocusModeChanged(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Windows::Foundation::IInspectable& arg); + void _FullscreenChanged(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Windows::Foundation::IInspectable& arg); + void _AlwaysOnTopChanged(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Windows::Foundation::IInspectable& arg); void _WindowMouseWheeled(const til::point coord, const int32_t delta); }; diff --git a/src/cascadia/WindowsTerminal/IslandWindow.cpp b/src/cascadia/WindowsTerminal/IslandWindow.cpp index 3e78181d6bb..e6497d1d48b 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.cpp +++ b/src/cascadia/WindowsTerminal/IslandWindow.cpp @@ -51,17 +51,18 @@ void IslandWindow::MakeWindow() noexcept // Create the window with the default size here - During the creation of the // window, the system will give us a chance to set its size in WM_CREATE. // WM_CREATE will be handled synchronously, before CreateWindow returns. - WINRT_VERIFY(CreateWindow(wc.lpszClassName, - L"Windows Terminal", - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - nullptr, - nullptr, - wc.hInstance, - this)); + WINRT_VERIFY(CreateWindowEx(_alwaysOnTop ? WS_EX_TOPMOST : 0, + wc.lpszClassName, + L"Windows Terminal", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + nullptr, + nullptr, + wc.hInstance, + this)); WINRT_ASSERT(_window); } @@ -442,25 +443,63 @@ void IslandWindow::OnApplicationThemeChanged(const winrt::Windows::UI::Xaml::Ele } // Method Description: -// - Toggles our focus mode state. See _SetIsBorderless for more details. +// - Updates our focus mode state. See _SetIsBorderless for more details. // Arguments: // - // Return Value: // - -void IslandWindow::ToggleFocusMode() +void IslandWindow::FocusModeChanged(const bool focusMode) { - _SetIsBorderless(!_borderless); + // Do nothing if the value was unchanged. + if (focusMode == _borderless) + { + return; + } + + _SetIsBorderless(focusMode); } // Method Description: -// - Toggles our fullscreen state. See _SetIsFullscreen for more details. +// - Updates our fullscreen state. See _SetIsFullscreen for more details. // Arguments: // - // Return Value: // - -void IslandWindow::ToggleFullscreen() +void IslandWindow::FullscreenChanged(const bool fullscreen) +{ + // Do nothing if the value was unchanged. + if (fullscreen == _fullscreen) + { + return; + } + + _SetIsFullscreen(fullscreen); +} + +// Method Description: +// - Enter or exit the "always on top" state. Before the window is created, this +// value will later be used when we create the window to create the window on +// top of all others. After the window is created, it will either enter the +// group of topmost windows, or exit the group of topmost windows. +// Arguments: +// - alwaysOnTop: whether we should be entering or exiting always on top mode. +// Return Value: +// - +void IslandWindow::SetAlwaysOnTop(const bool alwaysOnTop) { - _SetIsFullscreen(!_fullscreen); + _alwaysOnTop = alwaysOnTop; + + const auto hwnd = GetHandle(); + if (hwnd) + { + SetWindowPos(hwnd, + _alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, + 0, // the window dimensions are unused, because we're passing SWP_NOSIZE + 0, + 0, + 0, + SWP_NOMOVE | SWP_NOSIZE); + } } // From GdiEngine::s_SetWindowLongWHelper diff --git a/src/cascadia/WindowsTerminal/IslandWindow.h b/src/cascadia/WindowsTerminal/IslandWindow.h index eff8f7724a9..cd593e6663f 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.h +++ b/src/cascadia/WindowsTerminal/IslandWindow.h @@ -32,8 +32,9 @@ class IslandWindow : void SetCreateCallback(std::function pfn) noexcept; void SetSnapDimensionCallback(std::function pfn) noexcept; - void ToggleFocusMode(); - void ToggleFullscreen(); + void FocusModeChanged(const bool focusMode); + void FullscreenChanged(const bool fullscreen); + void SetAlwaysOnTop(const bool alwaysOnTop); #pragma endregion @@ -63,6 +64,7 @@ class IslandWindow : bool _borderless{ false }; bool _fullscreen{ false }; + bool _alwaysOnTop{ false }; RECT _fullscreenWindowSize; RECT _nonFullscreenWindowSize; From bd93cb5e8adda71056131f2e23fbc0a627921837 Mon Sep 17 00:00:00 2001 From: jtippet Date: Tue, 14 Jul 2020 14:45:30 -0700 Subject: [PATCH 02/14] Add High Contrast image assets (#6915) This commit adds image assets for High Contrast mode Tagging this issue so it contains a nice list of all the recent HC fixes: #5360 I made several changes to DHowett's script and added it to the repo: * Add support for generating high contrast icons * Add the ability to easily edit the "intermediate" (previously "zbase") files for manual hinting * Appease the spellchecker I created new SVGs for HC mode. There's one SVG for both Black and White modes -- I just invert the colors. Then I manually hinted the generated bitmaps for the production icons. I didn't bother hinting the Dev/Pre ones, so the text does get unreadable at small sizes. View the original images in #6915. Co-authored-by: Jeffrey Tippet Co-authored-by: Dustin L. Howett Closes #6822 --- .../spell-check/dictionary/microsoft.txt | 3 + .github/actions/spell-check/expect/expect.txt | 3 + res/terminal/Generate-TerminalAssets.ps1 | 181 ++++++++++++++++++ res/terminal/Terminal_Dev_HC.svg | 17 ++ res/terminal/Terminal_HC.svg | 17 ++ res/terminal/Terminal_Pre_HC.svg | 17 ++ .../LargeTile.scale-100_contrast-black.png | Bin 0 -> 1300 bytes .../LargeTile.scale-100_contrast-white.png | Bin 0 -> 1192 bytes .../LargeTile.scale-125_contrast-black.png | Bin 0 -> 1537 bytes .../LargeTile.scale-125_contrast-white.png | Bin 0 -> 1480 bytes .../LargeTile.scale-150_contrast-black.png | Bin 0 -> 1818 bytes .../LargeTile.scale-150_contrast-white.png | Bin 0 -> 1821 bytes .../LargeTile.scale-200_contrast-black.png | Bin 0 -> 2512 bytes .../LargeTile.scale-200_contrast-white.png | Bin 0 -> 2465 bytes .../LargeTile.scale-400_contrast-black.png | Bin 0 -> 6134 bytes .../LargeTile.scale-400_contrast-white.png | Bin 0 -> 6130 bytes ...ockScreenLogo.scale-100_contrast-black.png | Bin 0 -> 374 bytes ...ockScreenLogo.scale-100_contrast-white.png | Bin 0 -> 444 bytes ...ockScreenLogo.scale-125_contrast-black.png | Bin 0 -> 491 bytes ...ockScreenLogo.scale-125_contrast-white.png | Bin 0 -> 518 bytes ...ockScreenLogo.scale-150_contrast-black.png | Bin 0 -> 474 bytes ...ockScreenLogo.scale-150_contrast-white.png | Bin 0 -> 501 bytes ...ockScreenLogo.scale-200_contrast-black.png | Bin 0 -> 574 bytes ...ockScreenLogo.scale-200_contrast-white.png | Bin 0 -> 565 bytes ...ockScreenLogo.scale-400_contrast-black.png | Bin 0 -> 959 bytes ...ockScreenLogo.scale-400_contrast-white.png | Bin 0 -> 869 bytes .../SmallTile.scale-100_contrast-black.png | Bin 0 -> 566 bytes .../SmallTile.scale-100_contrast-white.png | Bin 0 -> 549 bytes .../SmallTile.scale-125_contrast-black.png | Bin 0 -> 626 bytes .../SmallTile.scale-125_contrast-white.png | Bin 0 -> 615 bytes .../SmallTile.scale-150_contrast-black.png | Bin 0 -> 669 bytes .../SmallTile.scale-150_contrast-white.png | Bin 0 -> 657 bytes .../SmallTile.scale-200_contrast-black.png | Bin 0 -> 864 bytes .../SmallTile.scale-200_contrast-white.png | Bin 0 -> 818 bytes .../SmallTile.scale-400_contrast-black.png | Bin 0 -> 1559 bytes .../SmallTile.scale-400_contrast-white.png | Bin 0 -> 1577 bytes .../SplashScreen.scale-100_contrast-black.png | Bin 0 -> 1482 bytes .../SplashScreen.scale-100_contrast-white.png | Bin 0 -> 1371 bytes .../SplashScreen.scale-125_contrast-black.png | Bin 0 -> 1836 bytes .../SplashScreen.scale-125_contrast-white.png | Bin 0 -> 1776 bytes .../SplashScreen.scale-150_contrast-black.png | Bin 0 -> 2240 bytes .../SplashScreen.scale-150_contrast-white.png | Bin 0 -> 2235 bytes .../SplashScreen.scale-200_contrast-black.png | Bin 0 -> 3249 bytes .../SplashScreen.scale-200_contrast-white.png | Bin 0 -> 3190 bytes .../SplashScreen.scale-400_contrast-black.png | Bin 0 -> 8985 bytes .../SplashScreen.scale-400_contrast-white.png | Bin 0 -> 8976 bytes ...re150x150Logo.scale-100_contrast-black.png | Bin 0 -> 726 bytes ...re150x150Logo.scale-100_contrast-white.png | Bin 0 -> 700 bytes ...re150x150Logo.scale-125_contrast-black.png | Bin 0 -> 846 bytes ...re150x150Logo.scale-125_contrast-white.png | Bin 0 -> 816 bytes ...re150x150Logo.scale-150_contrast-black.png | Bin 0 -> 967 bytes ...re150x150Logo.scale-150_contrast-white.png | Bin 0 -> 910 bytes ...re150x150Logo.scale-200_contrast-black.png | Bin 0 -> 1282 bytes ...re150x150Logo.scale-200_contrast-white.png | Bin 0 -> 1182 bytes ...re150x150Logo.scale-400_contrast-black.png | Bin 0 -> 2479 bytes ...re150x150Logo.scale-400_contrast-white.png | Bin 0 -> 2429 bytes ...uare44x44Logo.scale-100_contrast-black.png | Bin 0 -> 504 bytes ...uare44x44Logo.scale-100_contrast-white.png | Bin 0 -> 501 bytes ...uare44x44Logo.scale-125_contrast-black.png | Bin 0 -> 554 bytes ...uare44x44Logo.scale-125_contrast-white.png | Bin 0 -> 562 bytes ...uare44x44Logo.scale-150_contrast-black.png | Bin 0 -> 625 bytes ...uare44x44Logo.scale-150_contrast-white.png | Bin 0 -> 608 bytes ...uare44x44Logo.scale-200_contrast-black.png | Bin 0 -> 697 bytes ...uare44x44Logo.scale-200_contrast-white.png | Bin 0 -> 676 bytes ...uare44x44Logo.scale-400_contrast-black.png | Bin 0 -> 1281 bytes ...uare44x44Logo.scale-400_contrast-white.png | Bin 0 -> 1205 bytes ...ize-16_altform-unplated_contrast-black.png | Bin 0 -> 300 bytes ...ize-16_altform-unplated_contrast-white.png | Bin 0 -> 395 bytes ...44x44Logo.targetsize-16_contrast-black.png | Bin 0 -> 300 bytes ...44x44Logo.targetsize-16_contrast-white.png | Bin 0 -> 395 bytes ...ize-20_altform-unplated_contrast-black.png | Bin 0 -> 338 bytes ...ize-20_altform-unplated_contrast-white.png | Bin 0 -> 427 bytes ...44x44Logo.targetsize-20_contrast-black.png | Bin 0 -> 338 bytes ...44x44Logo.targetsize-20_contrast-white.png | Bin 0 -> 427 bytes ...ize-24_altform-unplated_contrast-black.png | Bin 0 -> 374 bytes ...ize-24_altform-unplated_contrast-white.png | Bin 0 -> 444 bytes ...44x44Logo.targetsize-24_contrast-black.png | Bin 0 -> 374 bytes ...44x44Logo.targetsize-24_contrast-white.png | Bin 0 -> 444 bytes ...ze-256_altform-unplated_contrast-black.png | Bin 0 -> 2701 bytes ...ze-256_altform-unplated_contrast-white.png | Bin 0 -> 2082 bytes ...4x44Logo.targetsize-256_contrast-black.png | Bin 0 -> 2701 bytes ...4x44Logo.targetsize-256_contrast-white.png | Bin 0 -> 2082 bytes ...ize-30_altform-unplated_contrast-black.png | Bin 0 -> 491 bytes ...ize-30_altform-unplated_contrast-white.png | Bin 0 -> 518 bytes ...44x44Logo.targetsize-30_contrast-black.png | Bin 0 -> 491 bytes ...44x44Logo.targetsize-30_contrast-white.png | Bin 0 -> 518 bytes ...ize-32_altform-unplated_contrast-black.png | Bin 0 -> 430 bytes ...ize-32_altform-unplated_contrast-white.png | Bin 0 -> 490 bytes ...44x44Logo.targetsize-32_contrast-black.png | Bin 0 -> 430 bytes ...44x44Logo.targetsize-32_contrast-white.png | Bin 0 -> 490 bytes ...ize-36_altform-unplated_contrast-black.png | Bin 0 -> 474 bytes ...ize-36_altform-unplated_contrast-white.png | Bin 0 -> 501 bytes ...44x44Logo.targetsize-36_contrast-black.png | Bin 0 -> 474 bytes ...44x44Logo.targetsize-36_contrast-white.png | Bin 0 -> 501 bytes ...ize-40_altform-unplated_contrast-black.png | Bin 0 -> 499 bytes ...ize-40_altform-unplated_contrast-white.png | Bin 0 -> 532 bytes ...44x44Logo.targetsize-40_contrast-black.png | Bin 0 -> 499 bytes ...44x44Logo.targetsize-40_contrast-white.png | Bin 0 -> 532 bytes ...ize-48_altform-unplated_contrast-black.png | Bin 0 -> 574 bytes ...ize-48_altform-unplated_contrast-white.png | Bin 0 -> 565 bytes ...44x44Logo.targetsize-48_contrast-black.png | Bin 0 -> 574 bytes ...44x44Logo.targetsize-48_contrast-white.png | Bin 0 -> 565 bytes ...ize-60_altform-unplated_contrast-black.png | Bin 0 -> 708 bytes ...ize-60_altform-unplated_contrast-white.png | Bin 0 -> 650 bytes ...44x44Logo.targetsize-60_contrast-black.png | Bin 0 -> 708 bytes ...44x44Logo.targetsize-60_contrast-white.png | Bin 0 -> 650 bytes ...ize-64_altform-unplated_contrast-black.png | Bin 0 -> 714 bytes ...ize-64_altform-unplated_contrast-white.png | Bin 0 -> 634 bytes ...44x44Logo.targetsize-64_contrast-black.png | Bin 0 -> 714 bytes ...44x44Logo.targetsize-64_contrast-white.png | Bin 0 -> 634 bytes ...ize-72_altform-unplated_contrast-black.png | Bin 0 -> 788 bytes ...ize-72_altform-unplated_contrast-white.png | Bin 0 -> 698 bytes ...44x44Logo.targetsize-72_contrast-black.png | Bin 0 -> 788 bytes ...44x44Logo.targetsize-72_contrast-white.png | Bin 0 -> 698 bytes ...ize-80_altform-unplated_contrast-black.png | Bin 0 -> 883 bytes ...ize-80_altform-unplated_contrast-white.png | Bin 0 -> 757 bytes ...44x44Logo.targetsize-80_contrast-black.png | Bin 0 -> 883 bytes ...44x44Logo.targetsize-80_contrast-white.png | Bin 0 -> 757 bytes ...ize-96_altform-unplated_contrast-black.png | Bin 0 -> 959 bytes ...ize-96_altform-unplated_contrast-white.png | Bin 0 -> 869 bytes ...44x44Logo.targetsize-96_contrast-black.png | Bin 0 -> 959 bytes ...44x44Logo.targetsize-96_contrast-white.png | Bin 0 -> 869 bytes .../StoreLogo.scale-100_contrast-black.png | Bin 0 -> 541 bytes .../StoreLogo.scale-100_contrast-white.png | Bin 0 -> 523 bytes .../StoreLogo.scale-125_contrast-black.png | Bin 0 -> 600 bytes .../StoreLogo.scale-125_contrast-white.png | Bin 0 -> 591 bytes .../StoreLogo.scale-150_contrast-black.png | Bin 0 -> 641 bytes .../StoreLogo.scale-150_contrast-white.png | Bin 0 -> 627 bytes .../StoreLogo.scale-200_contrast-black.png | Bin 0 -> 781 bytes .../StoreLogo.scale-200_contrast-white.png | Bin 0 -> 752 bytes .../StoreLogo.scale-400_contrast-black.png | Bin 0 -> 1409 bytes .../StoreLogo.scale-400_contrast-white.png | Bin 0 -> 1363 bytes ...de310x150Logo.scale-100_contrast-black.png | Bin 0 -> 808 bytes ...de310x150Logo.scale-100_contrast-white.png | Bin 0 -> 756 bytes ...de310x150Logo.scale-125_contrast-black.png | Bin 0 -> 959 bytes ...de310x150Logo.scale-125_contrast-white.png | Bin 0 -> 920 bytes ...de310x150Logo.scale-150_contrast-black.png | Bin 0 -> 1085 bytes ...de310x150Logo.scale-150_contrast-white.png | Bin 0 -> 1019 bytes ...de310x150Logo.scale-200_contrast-black.png | Bin 0 -> 1482 bytes ...de310x150Logo.scale-200_contrast-white.png | Bin 0 -> 1371 bytes ...de310x150Logo.scale-400_contrast-black.png | Bin 0 -> 3249 bytes ...de310x150Logo.scale-400_contrast-white.png | Bin 0 -> 3190 bytes .../LargeTile.scale-100_contrast-black.png | Bin 0 -> 1779 bytes .../LargeTile.scale-100_contrast-white.png | Bin 0 -> 1682 bytes .../LargeTile.scale-125_contrast-black.png | Bin 0 -> 2101 bytes .../LargeTile.scale-125_contrast-white.png | Bin 0 -> 2057 bytes .../LargeTile.scale-150_contrast-black.png | Bin 0 -> 2358 bytes .../LargeTile.scale-150_contrast-white.png | Bin 0 -> 2367 bytes .../LargeTile.scale-200_contrast-black.png | Bin 0 -> 3152 bytes .../LargeTile.scale-200_contrast-white.png | Bin 0 -> 3108 bytes .../LargeTile.scale-400_contrast-black.png | Bin 0 -> 7162 bytes .../LargeTile.scale-400_contrast-white.png | Bin 0 -> 7154 bytes ...ockScreenLogo.scale-100_contrast-black.png | Bin 0 -> 595 bytes ...ockScreenLogo.scale-100_contrast-white.png | Bin 0 -> 586 bytes ...ockScreenLogo.scale-125_contrast-black.png | Bin 0 -> 770 bytes ...ockScreenLogo.scale-125_contrast-white.png | Bin 0 -> 680 bytes ...ockScreenLogo.scale-150_contrast-black.png | Bin 0 -> 842 bytes ...ockScreenLogo.scale-150_contrast-white.png | Bin 0 -> 730 bytes ...ockScreenLogo.scale-200_contrast-black.png | Bin 0 -> 963 bytes ...ockScreenLogo.scale-200_contrast-white.png | Bin 0 -> 792 bytes ...ockScreenLogo.scale-400_contrast-black.png | Bin 0 -> 1721 bytes ...ockScreenLogo.scale-400_contrast-white.png | Bin 0 -> 1298 bytes .../SmallTile.scale-100_contrast-black.png | Bin 0 -> 805 bytes .../SmallTile.scale-100_contrast-white.png | Bin 0 -> 798 bytes .../SmallTile.scale-125_contrast-black.png | Bin 0 -> 906 bytes .../SmallTile.scale-125_contrast-white.png | Bin 0 -> 904 bytes .../SmallTile.scale-150_contrast-black.png | Bin 0 -> 1026 bytes .../SmallTile.scale-150_contrast-white.png | Bin 0 -> 1026 bytes .../SmallTile.scale-200_contrast-black.png | Bin 0 -> 1236 bytes .../SmallTile.scale-200_contrast-white.png | Bin 0 -> 1174 bytes .../SmallTile.scale-400_contrast-black.png | Bin 0 -> 2082 bytes .../SmallTile.scale-400_contrast-white.png | Bin 0 -> 2100 bytes .../SplashScreen.scale-100_contrast-black.png | Bin 0 -> 1940 bytes .../SplashScreen.scale-100_contrast-white.png | Bin 0 -> 1847 bytes .../SplashScreen.scale-125_contrast-black.png | Bin 0 -> 2408 bytes .../SplashScreen.scale-125_contrast-white.png | Bin 0 -> 2363 bytes .../SplashScreen.scale-150_contrast-black.png | Bin 0 -> 2777 bytes .../SplashScreen.scale-150_contrast-white.png | Bin 0 -> 2780 bytes .../SplashScreen.scale-200_contrast-black.png | Bin 0 -> 3898 bytes .../SplashScreen.scale-200_contrast-white.png | Bin 0 -> 3848 bytes .../SplashScreen.scale-400_contrast-black.png | Bin 0 -> 10033 bytes .../SplashScreen.scale-400_contrast-white.png | Bin 0 -> 10012 bytes ...re150x150Logo.scale-100_contrast-black.png | Bin 0 -> 954 bytes ...re150x150Logo.scale-100_contrast-white.png | Bin 0 -> 936 bytes ...re150x150Logo.scale-125_contrast-black.png | Bin 0 -> 1208 bytes ...re150x150Logo.scale-125_contrast-white.png | Bin 0 -> 1152 bytes ...re150x150Logo.scale-150_contrast-black.png | Bin 0 -> 1374 bytes ...re150x150Logo.scale-150_contrast-white.png | Bin 0 -> 1302 bytes ...re150x150Logo.scale-200_contrast-black.png | Bin 0 -> 1764 bytes ...re150x150Logo.scale-200_contrast-white.png | Bin 0 -> 1670 bytes ...re150x150Logo.scale-400_contrast-black.png | Bin 0 -> 3117 bytes ...re150x150Logo.scale-400_contrast-white.png | Bin 0 -> 3073 bytes ...uare44x44Logo.scale-100_contrast-black.png | Bin 0 -> 667 bytes ...uare44x44Logo.scale-100_contrast-white.png | Bin 0 -> 670 bytes ...uare44x44Logo.scale-125_contrast-black.png | Bin 0 -> 775 bytes ...uare44x44Logo.scale-125_contrast-white.png | Bin 0 -> 777 bytes ...uare44x44Logo.scale-150_contrast-black.png | Bin 0 -> 841 bytes ...uare44x44Logo.scale-150_contrast-white.png | Bin 0 -> 828 bytes ...uare44x44Logo.scale-200_contrast-black.png | Bin 0 -> 1032 bytes ...uare44x44Logo.scale-200_contrast-white.png | Bin 0 -> 1010 bytes ...uare44x44Logo.scale-400_contrast-black.png | Bin 0 -> 1803 bytes ...uare44x44Logo.scale-400_contrast-white.png | Bin 0 -> 1726 bytes ...ize-16_altform-unplated_contrast-black.png | Bin 0 -> 404 bytes ...ize-16_altform-unplated_contrast-white.png | Bin 0 -> 485 bytes ...44x44Logo.targetsize-16_contrast-black.png | Bin 0 -> 404 bytes ...44x44Logo.targetsize-16_contrast-white.png | Bin 0 -> 485 bytes ...ize-20_altform-unplated_contrast-black.png | Bin 0 -> 509 bytes ...ize-20_altform-unplated_contrast-white.png | Bin 0 -> 546 bytes ...44x44Logo.targetsize-20_contrast-black.png | Bin 0 -> 509 bytes ...44x44Logo.targetsize-20_contrast-white.png | Bin 0 -> 546 bytes ...ize-24_altform-unplated_contrast-black.png | Bin 0 -> 595 bytes ...ize-24_altform-unplated_contrast-white.png | Bin 0 -> 586 bytes ...44x44Logo.targetsize-24_contrast-black.png | Bin 0 -> 595 bytes ...44x44Logo.targetsize-24_contrast-white.png | Bin 0 -> 586 bytes ...ze-256_altform-unplated_contrast-black.png | Bin 0 -> 4062 bytes ...ze-256_altform-unplated_contrast-white.png | Bin 0 -> 3009 bytes ...4x44Logo.targetsize-256_contrast-black.png | Bin 0 -> 4062 bytes ...4x44Logo.targetsize-256_contrast-white.png | Bin 0 -> 3009 bytes ...ize-30_altform-unplated_contrast-black.png | Bin 0 -> 770 bytes ...ize-30_altform-unplated_contrast-white.png | Bin 0 -> 680 bytes ...44x44Logo.targetsize-30_contrast-black.png | Bin 0 -> 770 bytes ...44x44Logo.targetsize-30_contrast-white.png | Bin 0 -> 680 bytes ...ize-32_altform-unplated_contrast-black.png | Bin 0 -> 681 bytes ...ize-32_altform-unplated_contrast-white.png | Bin 0 -> 647 bytes ...44x44Logo.targetsize-32_contrast-black.png | Bin 0 -> 681 bytes ...44x44Logo.targetsize-32_contrast-white.png | Bin 0 -> 647 bytes ...ize-36_altform-unplated_contrast-black.png | Bin 0 -> 842 bytes ...ize-36_altform-unplated_contrast-white.png | Bin 0 -> 730 bytes ...44x44Logo.targetsize-36_contrast-black.png | Bin 0 -> 842 bytes ...44x44Logo.targetsize-36_contrast-white.png | Bin 0 -> 730 bytes ...ize-40_altform-unplated_contrast-black.png | Bin 0 -> 867 bytes ...ize-40_altform-unplated_contrast-white.png | Bin 0 -> 741 bytes ...44x44Logo.targetsize-40_contrast-black.png | Bin 0 -> 867 bytes ...44x44Logo.targetsize-40_contrast-white.png | Bin 0 -> 741 bytes ...ize-48_altform-unplated_contrast-black.png | Bin 0 -> 963 bytes ...ize-48_altform-unplated_contrast-white.png | Bin 0 -> 792 bytes ...44x44Logo.targetsize-48_contrast-black.png | Bin 0 -> 963 bytes ...44x44Logo.targetsize-48_contrast-white.png | Bin 0 -> 792 bytes ...ize-60_altform-unplated_contrast-black.png | Bin 0 -> 1234 bytes ...ize-60_altform-unplated_contrast-white.png | Bin 0 -> 953 bytes ...44x44Logo.targetsize-60_contrast-black.png | Bin 0 -> 1234 bytes ...44x44Logo.targetsize-60_contrast-white.png | Bin 0 -> 953 bytes ...ize-64_altform-unplated_contrast-black.png | Bin 0 -> 1260 bytes ...ize-64_altform-unplated_contrast-white.png | Bin 0 -> 963 bytes ...44x44Logo.targetsize-64_contrast-black.png | Bin 0 -> 1260 bytes ...44x44Logo.targetsize-64_contrast-white.png | Bin 0 -> 963 bytes ...ize-72_altform-unplated_contrast-black.png | Bin 0 -> 1322 bytes ...ize-72_altform-unplated_contrast-white.png | Bin 0 -> 1027 bytes ...44x44Logo.targetsize-72_contrast-black.png | Bin 0 -> 1322 bytes ...44x44Logo.targetsize-72_contrast-white.png | Bin 0 -> 1027 bytes ...ize-80_altform-unplated_contrast-black.png | Bin 0 -> 1563 bytes ...ize-80_altform-unplated_contrast-white.png | Bin 0 -> 1150 bytes ...44x44Logo.targetsize-80_contrast-black.png | Bin 0 -> 1563 bytes ...44x44Logo.targetsize-80_contrast-white.png | Bin 0 -> 1150 bytes ...ize-96_altform-unplated_contrast-black.png | Bin 0 -> 1721 bytes ...ize-96_altform-unplated_contrast-white.png | Bin 0 -> 1298 bytes ...44x44Logo.targetsize-96_contrast-black.png | Bin 0 -> 1721 bytes ...44x44Logo.targetsize-96_contrast-white.png | Bin 0 -> 1298 bytes .../StoreLogo.scale-100_contrast-black.png | Bin 0 -> 780 bytes .../StoreLogo.scale-100_contrast-white.png | Bin 0 -> 777 bytes .../StoreLogo.scale-125_contrast-black.png | Bin 0 -> 877 bytes .../StoreLogo.scale-125_contrast-white.png | Bin 0 -> 878 bytes .../StoreLogo.scale-150_contrast-black.png | Bin 0 -> 979 bytes .../StoreLogo.scale-150_contrast-white.png | Bin 0 -> 975 bytes .../StoreLogo.scale-200_contrast-black.png | Bin 0 -> 1135 bytes .../StoreLogo.scale-200_contrast-white.png | Bin 0 -> 1099 bytes .../StoreLogo.scale-400_contrast-black.png | Bin 0 -> 1906 bytes .../StoreLogo.scale-400_contrast-white.png | Bin 0 -> 1880 bytes ...de310x150Logo.scale-100_contrast-black.png | Bin 0 -> 1053 bytes ...de310x150Logo.scale-100_contrast-white.png | Bin 0 -> 1014 bytes ...de310x150Logo.scale-125_contrast-black.png | Bin 0 -> 1320 bytes ...de310x150Logo.scale-125_contrast-white.png | Bin 0 -> 1275 bytes ...de310x150Logo.scale-150_contrast-black.png | Bin 0 -> 1496 bytes ...de310x150Logo.scale-150_contrast-white.png | Bin 0 -> 1402 bytes ...de310x150Logo.scale-200_contrast-black.png | Bin 0 -> 1940 bytes ...de310x150Logo.scale-200_contrast-white.png | Bin 0 -> 1847 bytes ...de310x150Logo.scale-400_contrast-black.png | Bin 0 -> 3898 bytes ...de310x150Logo.scale-400_contrast-white.png | Bin 0 -> 3848 bytes .../LargeTile.scale-100_contrast-black.png | Bin 0 -> 1300 bytes .../LargeTile.scale-100_contrast-white.png | Bin 0 -> 1192 bytes .../LargeTile.scale-125_contrast-black.png | Bin 0 -> 1537 bytes .../LargeTile.scale-125_contrast-white.png | Bin 0 -> 1480 bytes .../LargeTile.scale-150_contrast-black.png | Bin 0 -> 1818 bytes .../LargeTile.scale-150_contrast-white.png | Bin 0 -> 1821 bytes .../LargeTile.scale-200_contrast-black.png | Bin 0 -> 2512 bytes .../LargeTile.scale-200_contrast-white.png | Bin 0 -> 2465 bytes .../LargeTile.scale-400_contrast-black.png | Bin 0 -> 6134 bytes .../LargeTile.scale-400_contrast-white.png | Bin 0 -> 6130 bytes ...ockScreenLogo.scale-100_contrast-black.png | Bin 0 -> 374 bytes ...ockScreenLogo.scale-100_contrast-white.png | Bin 0 -> 444 bytes ...ockScreenLogo.scale-125_contrast-black.png | Bin 0 -> 491 bytes ...ockScreenLogo.scale-125_contrast-white.png | Bin 0 -> 518 bytes ...ockScreenLogo.scale-150_contrast-black.png | Bin 0 -> 474 bytes ...ockScreenLogo.scale-150_contrast-white.png | Bin 0 -> 501 bytes ...ockScreenLogo.scale-200_contrast-black.png | Bin 0 -> 574 bytes ...ockScreenLogo.scale-200_contrast-white.png | Bin 0 -> 565 bytes ...ockScreenLogo.scale-400_contrast-black.png | Bin 0 -> 959 bytes ...ockScreenLogo.scale-400_contrast-white.png | Bin 0 -> 869 bytes .../SmallTile.scale-100_contrast-black.png | Bin 0 -> 566 bytes .../SmallTile.scale-100_contrast-white.png | Bin 0 -> 549 bytes .../SmallTile.scale-125_contrast-black.png | Bin 0 -> 626 bytes .../SmallTile.scale-125_contrast-white.png | Bin 0 -> 615 bytes .../SmallTile.scale-150_contrast-black.png | Bin 0 -> 669 bytes .../SmallTile.scale-150_contrast-white.png | Bin 0 -> 657 bytes .../SmallTile.scale-200_contrast-black.png | Bin 0 -> 864 bytes .../SmallTile.scale-200_contrast-white.png | Bin 0 -> 818 bytes .../SmallTile.scale-400_contrast-black.png | Bin 0 -> 1559 bytes .../SmallTile.scale-400_contrast-white.png | Bin 0 -> 1577 bytes .../SplashScreen.scale-100_contrast-black.png | Bin 0 -> 1482 bytes .../SplashScreen.scale-100_contrast-white.png | Bin 0 -> 1371 bytes .../SplashScreen.scale-125_contrast-black.png | Bin 0 -> 1836 bytes .../SplashScreen.scale-125_contrast-white.png | Bin 0 -> 1776 bytes .../SplashScreen.scale-150_contrast-black.png | Bin 0 -> 2240 bytes .../SplashScreen.scale-150_contrast-white.png | Bin 0 -> 2235 bytes .../SplashScreen.scale-200_contrast-black.png | Bin 0 -> 3249 bytes .../SplashScreen.scale-200_contrast-white.png | Bin 0 -> 3190 bytes .../SplashScreen.scale-400_contrast-black.png | Bin 0 -> 8985 bytes .../SplashScreen.scale-400_contrast-white.png | Bin 0 -> 8976 bytes ...re150x150Logo.scale-100_contrast-black.png | Bin 0 -> 726 bytes ...re150x150Logo.scale-100_contrast-white.png | Bin 0 -> 700 bytes ...re150x150Logo.scale-125_contrast-black.png | Bin 0 -> 846 bytes ...re150x150Logo.scale-125_contrast-white.png | Bin 0 -> 816 bytes ...re150x150Logo.scale-150_contrast-black.png | Bin 0 -> 967 bytes ...re150x150Logo.scale-150_contrast-white.png | Bin 0 -> 910 bytes ...re150x150Logo.scale-200_contrast-black.png | Bin 0 -> 1282 bytes ...re150x150Logo.scale-200_contrast-white.png | Bin 0 -> 1182 bytes ...re150x150Logo.scale-400_contrast-black.png | Bin 0 -> 2479 bytes ...re150x150Logo.scale-400_contrast-white.png | Bin 0 -> 2429 bytes ...uare44x44Logo.scale-100_contrast-black.png | Bin 0 -> 504 bytes ...uare44x44Logo.scale-100_contrast-white.png | Bin 0 -> 501 bytes ...uare44x44Logo.scale-125_contrast-black.png | Bin 0 -> 554 bytes ...uare44x44Logo.scale-125_contrast-white.png | Bin 0 -> 562 bytes ...uare44x44Logo.scale-150_contrast-black.png | Bin 0 -> 625 bytes ...uare44x44Logo.scale-150_contrast-white.png | Bin 0 -> 608 bytes ...uare44x44Logo.scale-200_contrast-black.png | Bin 0 -> 697 bytes ...uare44x44Logo.scale-200_contrast-white.png | Bin 0 -> 676 bytes ...uare44x44Logo.scale-400_contrast-black.png | Bin 0 -> 1281 bytes ...uare44x44Logo.scale-400_contrast-white.png | Bin 0 -> 1205 bytes ...ize-16_altform-unplated_contrast-black.png | Bin 0 -> 300 bytes ...ize-16_altform-unplated_contrast-white.png | Bin 0 -> 395 bytes ...44x44Logo.targetsize-16_contrast-black.png | Bin 0 -> 300 bytes ...44x44Logo.targetsize-16_contrast-white.png | Bin 0 -> 395 bytes ...ize-20_altform-unplated_contrast-black.png | Bin 0 -> 338 bytes ...ize-20_altform-unplated_contrast-white.png | Bin 0 -> 427 bytes ...44x44Logo.targetsize-20_contrast-black.png | Bin 0 -> 338 bytes ...44x44Logo.targetsize-20_contrast-white.png | Bin 0 -> 427 bytes ...ize-24_altform-unplated_contrast-black.png | Bin 0 -> 374 bytes ...ize-24_altform-unplated_contrast-white.png | Bin 0 -> 444 bytes ...44x44Logo.targetsize-24_contrast-black.png | Bin 0 -> 374 bytes ...44x44Logo.targetsize-24_contrast-white.png | Bin 0 -> 444 bytes ...ze-256_altform-unplated_contrast-black.png | Bin 0 -> 2701 bytes ...ze-256_altform-unplated_contrast-white.png | Bin 0 -> 2082 bytes ...4x44Logo.targetsize-256_contrast-black.png | Bin 0 -> 2701 bytes ...4x44Logo.targetsize-256_contrast-white.png | Bin 0 -> 2082 bytes ...ize-30_altform-unplated_contrast-black.png | Bin 0 -> 491 bytes ...ize-30_altform-unplated_contrast-white.png | Bin 0 -> 518 bytes ...44x44Logo.targetsize-30_contrast-black.png | Bin 0 -> 491 bytes ...44x44Logo.targetsize-30_contrast-white.png | Bin 0 -> 518 bytes ...ize-32_altform-unplated_contrast-black.png | Bin 0 -> 430 bytes ...ize-32_altform-unplated_contrast-white.png | Bin 0 -> 490 bytes ...44x44Logo.targetsize-32_contrast-black.png | Bin 0 -> 430 bytes ...44x44Logo.targetsize-32_contrast-white.png | Bin 0 -> 490 bytes ...ize-36_altform-unplated_contrast-black.png | Bin 0 -> 474 bytes ...ize-36_altform-unplated_contrast-white.png | Bin 0 -> 501 bytes ...44x44Logo.targetsize-36_contrast-black.png | Bin 0 -> 474 bytes ...44x44Logo.targetsize-36_contrast-white.png | Bin 0 -> 501 bytes ...ize-40_altform-unplated_contrast-black.png | Bin 0 -> 499 bytes ...ize-40_altform-unplated_contrast-white.png | Bin 0 -> 532 bytes ...44x44Logo.targetsize-40_contrast-black.png | Bin 0 -> 499 bytes ...44x44Logo.targetsize-40_contrast-white.png | Bin 0 -> 532 bytes ...ize-48_altform-unplated_contrast-black.png | Bin 0 -> 574 bytes ...ize-48_altform-unplated_contrast-white.png | Bin 0 -> 565 bytes ...44x44Logo.targetsize-48_contrast-black.png | Bin 0 -> 574 bytes ...44x44Logo.targetsize-48_contrast-white.png | Bin 0 -> 565 bytes ...ize-60_altform-unplated_contrast-black.png | Bin 0 -> 708 bytes ...ize-60_altform-unplated_contrast-white.png | Bin 0 -> 650 bytes ...44x44Logo.targetsize-60_contrast-black.png | Bin 0 -> 708 bytes ...44x44Logo.targetsize-60_contrast-white.png | Bin 0 -> 650 bytes ...ize-64_altform-unplated_contrast-black.png | Bin 0 -> 714 bytes ...ize-64_altform-unplated_contrast-white.png | Bin 0 -> 634 bytes ...44x44Logo.targetsize-64_contrast-black.png | Bin 0 -> 714 bytes ...44x44Logo.targetsize-64_contrast-white.png | Bin 0 -> 634 bytes ...ize-72_altform-unplated_contrast-black.png | Bin 0 -> 788 bytes ...ize-72_altform-unplated_contrast-white.png | Bin 0 -> 698 bytes ...44x44Logo.targetsize-72_contrast-black.png | Bin 0 -> 788 bytes ...44x44Logo.targetsize-72_contrast-white.png | Bin 0 -> 698 bytes ...ize-80_altform-unplated_contrast-black.png | Bin 0 -> 883 bytes ...ize-80_altform-unplated_contrast-white.png | Bin 0 -> 757 bytes ...44x44Logo.targetsize-80_contrast-black.png | Bin 0 -> 883 bytes ...44x44Logo.targetsize-80_contrast-white.png | Bin 0 -> 757 bytes ...ize-96_altform-unplated_contrast-black.png | Bin 0 -> 959 bytes ...ize-96_altform-unplated_contrast-white.png | Bin 0 -> 869 bytes ...44x44Logo.targetsize-96_contrast-black.png | Bin 0 -> 959 bytes ...44x44Logo.targetsize-96_contrast-white.png | Bin 0 -> 869 bytes .../StoreLogo.scale-100_contrast-black.png | Bin 0 -> 541 bytes .../StoreLogo.scale-100_contrast-white.png | Bin 0 -> 523 bytes .../StoreLogo.scale-125_contrast-black.png | Bin 0 -> 600 bytes .../StoreLogo.scale-125_contrast-white.png | Bin 0 -> 591 bytes .../StoreLogo.scale-150_contrast-black.png | Bin 0 -> 641 bytes .../StoreLogo.scale-150_contrast-white.png | Bin 0 -> 627 bytes .../StoreLogo.scale-200_contrast-black.png | Bin 0 -> 781 bytes .../StoreLogo.scale-200_contrast-white.png | Bin 0 -> 752 bytes .../StoreLogo.scale-400_contrast-black.png | Bin 0 -> 1409 bytes .../StoreLogo.scale-400_contrast-white.png | Bin 0 -> 1363 bytes ...de310x150Logo.scale-100_contrast-black.png | Bin 0 -> 808 bytes ...de310x150Logo.scale-100_contrast-white.png | Bin 0 -> 756 bytes ...de310x150Logo.scale-125_contrast-black.png | Bin 0 -> 959 bytes ...de310x150Logo.scale-125_contrast-white.png | Bin 0 -> 920 bytes ...de310x150Logo.scale-150_contrast-black.png | Bin 0 -> 1085 bytes ...de310x150Logo.scale-150_contrast-white.png | Bin 0 -> 1019 bytes ...de310x150Logo.scale-200_contrast-black.png | Bin 0 -> 1482 bytes ...de310x150Logo.scale-200_contrast-white.png | Bin 0 -> 1371 bytes ...de310x150Logo.scale-400_contrast-black.png | Bin 0 -> 3249 bytes ...de310x150Logo.scale-400_contrast-white.png | Bin 0 -> 3190 bytes 414 files changed, 238 insertions(+) create mode 100644 res/terminal/Generate-TerminalAssets.ps1 create mode 100644 res/terminal/Terminal_Dev_HC.svg create mode 100644 res/terminal/Terminal_HC.svg create mode 100644 res/terminal/Terminal_Pre_HC.svg create mode 100644 res/terminal/images-Dev/LargeTile.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/LargeTile.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/LockScreenLogo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/SmallTile.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/SplashScreen.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/Square150x150Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-16_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-16_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-16_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-16_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-20_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-20_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-20_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-24_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-24_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-256_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-256_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-30_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-30_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-30_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-32_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-32_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-36_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-36_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-40_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-40_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-40_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-48_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-48_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-48_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-60_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-60_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-60_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-64_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-64_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-72_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-72_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-72_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-80_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-80_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-80_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-96_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-96_contrast-black.png create mode 100644 res/terminal/images-Dev/Square44x44Logo.targetsize-96_contrast-white.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/StoreLogo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Dev/Wide310x150Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/LargeTile.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/LockScreenLogo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/SmallTile.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/SplashScreen.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/Square150x150Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-16_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-16_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-16_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-16_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-20_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-20_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-20_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-24_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-24_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-256_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-256_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-30_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-30_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-30_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-32_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-32_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-36_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-36_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-40_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-40_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-40_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-48_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-48_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-48_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-60_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-60_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-60_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-64_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-64_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-72_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-72_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-72_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-80_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-80_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-80_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-96_altform-unplated_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-96_contrast-black.png create mode 100644 res/terminal/images-Pre/Square44x44Logo.targetsize-96_contrast-white.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/StoreLogo.scale-400_contrast-white.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images-Pre/Wide310x150Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images/LargeTile.scale-100_contrast-black.png create mode 100644 res/terminal/images/LargeTile.scale-100_contrast-white.png create mode 100644 res/terminal/images/LargeTile.scale-125_contrast-black.png create mode 100644 res/terminal/images/LargeTile.scale-125_contrast-white.png create mode 100644 res/terminal/images/LargeTile.scale-150_contrast-black.png create mode 100644 res/terminal/images/LargeTile.scale-150_contrast-white.png create mode 100644 res/terminal/images/LargeTile.scale-200_contrast-black.png create mode 100644 res/terminal/images/LargeTile.scale-200_contrast-white.png create mode 100644 res/terminal/images/LargeTile.scale-400_contrast-black.png create mode 100644 res/terminal/images/LargeTile.scale-400_contrast-white.png create mode 100644 res/terminal/images/LockScreenLogo.scale-100_contrast-black.png create mode 100644 res/terminal/images/LockScreenLogo.scale-100_contrast-white.png create mode 100644 res/terminal/images/LockScreenLogo.scale-125_contrast-black.png create mode 100644 res/terminal/images/LockScreenLogo.scale-125_contrast-white.png create mode 100644 res/terminal/images/LockScreenLogo.scale-150_contrast-black.png create mode 100644 res/terminal/images/LockScreenLogo.scale-150_contrast-white.png create mode 100644 res/terminal/images/LockScreenLogo.scale-200_contrast-black.png create mode 100644 res/terminal/images/LockScreenLogo.scale-200_contrast-white.png create mode 100644 res/terminal/images/LockScreenLogo.scale-400_contrast-black.png create mode 100644 res/terminal/images/LockScreenLogo.scale-400_contrast-white.png create mode 100644 res/terminal/images/SmallTile.scale-100_contrast-black.png create mode 100644 res/terminal/images/SmallTile.scale-100_contrast-white.png create mode 100644 res/terminal/images/SmallTile.scale-125_contrast-black.png create mode 100644 res/terminal/images/SmallTile.scale-125_contrast-white.png create mode 100644 res/terminal/images/SmallTile.scale-150_contrast-black.png create mode 100644 res/terminal/images/SmallTile.scale-150_contrast-white.png create mode 100644 res/terminal/images/SmallTile.scale-200_contrast-black.png create mode 100644 res/terminal/images/SmallTile.scale-200_contrast-white.png create mode 100644 res/terminal/images/SmallTile.scale-400_contrast-black.png create mode 100644 res/terminal/images/SmallTile.scale-400_contrast-white.png create mode 100644 res/terminal/images/SplashScreen.scale-100_contrast-black.png create mode 100644 res/terminal/images/SplashScreen.scale-100_contrast-white.png create mode 100644 res/terminal/images/SplashScreen.scale-125_contrast-black.png create mode 100644 res/terminal/images/SplashScreen.scale-125_contrast-white.png create mode 100644 res/terminal/images/SplashScreen.scale-150_contrast-black.png create mode 100644 res/terminal/images/SplashScreen.scale-150_contrast-white.png create mode 100644 res/terminal/images/SplashScreen.scale-200_contrast-black.png create mode 100644 res/terminal/images/SplashScreen.scale-200_contrast-white.png create mode 100644 res/terminal/images/SplashScreen.scale-400_contrast-black.png create mode 100644 res/terminal/images/SplashScreen.scale-400_contrast-white.png create mode 100644 res/terminal/images/Square150x150Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images/Square150x150Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images/Square150x150Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images/Square150x150Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images/Square150x150Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images/Square150x150Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images/Square150x150Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images/Square150x150Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images/Square150x150Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images/Square150x150Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.scale-400_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-16_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-16_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-16_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-16_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-20_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-20_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-20_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-24_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-24_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-256_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-256_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-30_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-30_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-30_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-32_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-32_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-36_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-36_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-40_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-40_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-40_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-48_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-48_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-48_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-60_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-60_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-60_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-64_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-64_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-72_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-72_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-72_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-80_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-80_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-80_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-96_altform-unplated_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-96_contrast-black.png create mode 100644 res/terminal/images/Square44x44Logo.targetsize-96_contrast-white.png create mode 100644 res/terminal/images/StoreLogo.scale-100_contrast-black.png create mode 100644 res/terminal/images/StoreLogo.scale-100_contrast-white.png create mode 100644 res/terminal/images/StoreLogo.scale-125_contrast-black.png create mode 100644 res/terminal/images/StoreLogo.scale-125_contrast-white.png create mode 100644 res/terminal/images/StoreLogo.scale-150_contrast-black.png create mode 100644 res/terminal/images/StoreLogo.scale-150_contrast-white.png create mode 100644 res/terminal/images/StoreLogo.scale-200_contrast-black.png create mode 100644 res/terminal/images/StoreLogo.scale-200_contrast-white.png create mode 100644 res/terminal/images/StoreLogo.scale-400_contrast-black.png create mode 100644 res/terminal/images/StoreLogo.scale-400_contrast-white.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-100_contrast-black.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-100_contrast-white.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-125_contrast-black.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-125_contrast-white.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-150_contrast-black.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-150_contrast-white.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-200_contrast-black.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-200_contrast-white.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-400_contrast-black.png create mode 100644 res/terminal/images/Wide310x150Logo.scale-400_contrast-white.png diff --git a/.github/actions/spell-check/dictionary/microsoft.txt b/.github/actions/spell-check/dictionary/microsoft.txt index 5e5d2ee3164..ef2c23c5ab6 100644 --- a/.github/actions/spell-check/dictionary/microsoft.txt +++ b/.github/actions/spell-check/dictionary/microsoft.txt @@ -1,4 +1,5 @@ ACLs +altform backplating DACL DACLs @@ -9,7 +10,9 @@ microsoftonline osgvsowi powerrename powershell +pscustomobject SACLs tdbuildteamid vcruntime visualstudio +wslpath diff --git a/.github/actions/spell-check/expect/expect.txt b/.github/actions/spell-check/expect/expect.txt index 5a404754efc..01b64c42d78 100644 --- a/.github/actions/spell-check/expect/expect.txt +++ b/.github/actions/spell-check/expect/expect.txt @@ -1083,6 +1083,8 @@ INITCOMMONCONTROLSEX INITDIALOG initguid INITMENU +imagemagick +inkscape inl INLINEPREFIX Inlines @@ -2266,6 +2268,7 @@ targetentrypoint TARGETLIBS TARGETNAME targetnametoken +targetsize targetver taskbar tbar diff --git a/res/terminal/Generate-TerminalAssets.ps1 b/res/terminal/Generate-TerminalAssets.ps1 new file mode 100644 index 00000000000..f6520f3b3b9 --- /dev/null +++ b/res/terminal/Generate-TerminalAssets.ps1 @@ -0,0 +1,181 @@ +# +# Generate-TerminalAssets.ps1 +# +# Typical usage: +# .\Generate-TerminalAssets.ps1 -Path .\Terminal.svg -HighContrastPath .\Terminal_HC.svg -Destination .\images +# .\Generate-TerminalAssets.ps1 -Path .\Terminal_Pre.svg -HighContrastPath .\Terminal_Pre_HC.svg -Destination .\images-Pre +# .\Generate-TerminalAssets.ps1 -Path .\Terminal_Dev.svg -HighContrastPath .\Terminal_Dev_HC.svg -Destination .\images-Dev +# +# Some icons benefit from manual hints. The most efficient way to do that is to run the script twice: +# +# 1. Run .\Generate-TerminalAssets.ps1 ...args... -Destination .\images -KeepIntermediates +# 2. Manually hint the intermediate images under .\images\_intermediate*.png +# 3. Run .\Generate-TerminalAssets.ps1 ...args... -Destination .\images -UseExistingIntermediates +# +# Hinting the intermediate files minimizes the number of times you'll have to +# hint the same image. You may want to hint just the _intermediate.*.png and +# _intermediate.black.*.png files, and delete _intermediate.white.*.png. The +# script will then automatically derive _intermediate.white.*.png from +# _intermediate.black.*.png. +# + +Param( + [Parameter(Mandatory=$true,ValueFromPipeline=$true)] + [string]$Path, + [string]$Destination, + [int[]]$Altforms = (16, 20, 24, 30, 32, 36, 40, 48, 60, 64, 72, 80, 96, 256), + [switch]$Unplated = $true, + [float[]]$Scales = (1.0, 1.25, 1.5, 2.0, 4.0), + [string]$HighContrastPath = "", + [switch]$UseExistingIntermediates = $false, + [switch]$KeepIntermediates = $false +) + +$assetTypes = @( + [pscustomobject]@{Name="LargeTile"; W=310; H=310; IconSize=96} + [pscustomobject]@{Name="LockScreenLogo"; W=24; H=24; IconSize=24} + [pscustomobject]@{Name="SmallTile"; W=71; H=71; IconSize=36} + [pscustomobject]@{Name="SplashScreen"; W=620; H=300; IconSize=96} + [pscustomobject]@{Name="Square44x44Logo"; W=44; H=44; IconSize=32} + [pscustomobject]@{Name="Square150x150Logo"; W=150; H=150; IconSize=48} + [pscustomobject]@{Name="StoreLogo"; W=50; H=50; IconSize=36} + [pscustomobject]@{Name="Wide310x150Logo"; W=310; H=150; IconSize=48} +) + +function CeilToEven ([int]$i) { if ($i % 2 -eq 0) { [int]($i) } else { [int]($i + 1) } } + +$inflatedAssetSizes = $assetTypes | ForEach-Object { + $as = $_; + $scales | ForEach-Object { + [pscustomobject]@{ + Name = $as.Name + ".scale-$($_*100)" + W = [math]::Round($as.W * $_, [System.MidpointRounding]::ToPositiveInfinity) + H = [math]::Round($as.H * $_, [System.MidpointRounding]::ToPositiveInfinity) + IconSize = CeilToEven ($as.IconSize * $_) + } + } +} + +$allAssetSizes = $inflatedAssetSizes + ($Altforms | ForEach-Object { + [pscustomobject]@{ + Name = "Square44x44Logo.targetsize-${_}" + W = [int]$_ + H = [int]$_ + IconSize = [int]$_ + } + If ($Unplated) { + [pscustomobject]@{ + Name = "Square44x44Logo.targetsize-${_}_altform-unplated" + W = [int]$_ + H = [int]$_ + IconSize = [int]$_ + } + } + }) + +# Cross product with the 3 high contrast modes +$allAssetSizes = $allAssetSizes | ForEach-Object { + $asset = $_ + ("standard", "black", "white") | ForEach-Object { + $contrast = $_ + $name = $asset.Name + If ($contrast -Ne "standard") { + If ($HighContrastPath -Eq "") { + # "standard" is the default, so we can omit it in filenames + return + } + $name += "_contrast-" + $contrast + } + [pscustomobject]@{ + Name = $name + W = $asset.W + H = $asset.H + IconSize = $asset.IconSize + Contrast = $_ + } + } +} + +$allSizes = $allAssetSizes.IconSize | Group-Object | Select-Object -Expand Name + +$TranslatedSVGPath = & wsl wslpath -u ((Get-Item $Path -ErrorAction:Stop).FullName -Replace "\\","/") +$TranslatedSVGContrastPath = $null +If ($HighContrastPath -Ne "") { + $TranslatedSVGContrastPath = & wsl wslpath -u ((Get-Item $HighContrastPath -ErrorAction:Stop).FullName -Replace "\\","/") +} +& wsl which inkscape | Out-Null +If ($LASTEXITCODE -Ne 0) { throw "Inkscape is not installed in WSL" } +& wsl which convert | Out-Null +If ($LASTEXITCODE -Ne 0) { throw "imagemagick is not installed in WSL" } + +If (-Not [string]::IsNullOrEmpty($Destination)) { + New-Item -Type Directory $Destination -EA:Ignore + $TranslatedOutDir = & wsl wslpath -u ((Get-Item $Destination -EA:Stop).FullName -Replace "\\","/") +} Else { + $TranslatedOutDir = "." +} + +$intermediateFiles = [System.Collections.Concurrent.ConcurrentBag[string]]::new() + +# Generate the base icons +$allSizes | ForEach-Object -Parallel { + $sz = $_; + + $destinationNt = $using:Destination + $destinationWsl = $using:TranslatedOutDir + $svgStandardWsl = $using:TranslatedSVGPath + $svgContrastWsl = $using:TranslatedSVGContrastPath + + $intermediateStandardNt = "$destinationNt\_intermediate.standard.$($sz).png" + $intermediateStandardWsl = "$destinationWsl/_intermediate.standard.$($sz).png" + + If (($using:UseExistingIntermediates -Eq $false) -Or (-Not (Test-Path $intermediateStandardNt))) { + wsl inkscape -z -e "$intermediateStandardWsl" -w $sz -h $sz $svgStandardWsl + } Else { + Write-Host "Using existing $intermediateStandardNt" + } + + ($using:intermediateFiles).Add($intermediateStandardNt) + + If ($svgContrastWsl -Ne $null) { + $intermediateBlackNt = "$destinationNt\_intermediate.black.$($sz).png" + $intermediateWhiteNt = "$destinationNt\_intermediate.white.$($sz).png" + $intermediateBlackWsl = "$destinationWsl/_intermediate.black.$($sz).png" + $intermediateWhiteWsl = "$destinationWsl/_intermediate.white.$($sz).png" + + If (($using:UseExistingIntermediates -Eq $false) -Or (-Not (Test-Path $intermediateBlackNt))) { + wsl inkscape -z -e "$intermediateBlackWsl" -w $sz -h $sz $svgContrastWsl + } Else { + Write-Host "Using existing $intermediateBlackNt" + } + + If (($using:UseExistingIntermediates -Eq $false) -Or (-Not (Test-Path $intermediateWhiteNt))) { + # The HC white icon is just a negative image of the HC black one + wsl convert "$intermediateBlackWsl" -channel RGB -negate "$intermediateWhiteWsl" + } Else { + Write-Host "Using existing $intermediateWhiteNt" + } + + ($using:intermediateFiles).Add($intermediateBlackNt) + ($using:intermediateFiles).Add($intermediateWhiteNt) + } +} + +# Once the base icons are done, splat them into the middles of larger canvases. +$allAssetSizes | ForEach-Object -Parallel { + $asset = $_ + If ($asset.W -Eq $asset.H -And $asset.IconSize -eq $asset.W) { + Write-Host "Copying base icon for size=$($asset.IconSize), contrast=$($asset.Contrast) to $($asset.Name)" + Copy-Item "${using:Destination}\_intermediate.$($asset.Contrast).$($asset.IconSize).png" "${using:Destination}\$($asset.Name).png" -Force + } Else { + wsl convert "$($using:TranslatedOutDir)/_intermediate.$($asset.Contrast).$($asset.IconSize).png" -gravity center -background transparent -extent "$($asset.W)x$($asset.H)" "$($using:TranslatedOutDir)/$($asset.Name).png" + } +} + +If ($KeepIntermediates -Eq $false) { + $intermediateFiles | ForEach-Object { + Write-Host "Cleaning up intermediate file $_" + Remove-Item $_ + } +} + diff --git a/res/terminal/Terminal_Dev_HC.svg b/res/terminal/Terminal_Dev_HC.svg new file mode 100644 index 00000000000..e2219a49e97 --- /dev/null +++ b/res/terminal/Terminal_Dev_HC.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/res/terminal/Terminal_HC.svg b/res/terminal/Terminal_HC.svg new file mode 100644 index 00000000000..e5e3a5434f9 --- /dev/null +++ b/res/terminal/Terminal_HC.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/res/terminal/Terminal_Pre_HC.svg b/res/terminal/Terminal_Pre_HC.svg new file mode 100644 index 00000000000..c08c3747a5e --- /dev/null +++ b/res/terminal/Terminal_Pre_HC.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/res/terminal/images-Dev/LargeTile.scale-100_contrast-black.png b/res/terminal/images-Dev/LargeTile.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9f6ceeec51eb5a251e7fdc478cb1a587076129 GIT binary patch literal 1300 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 Q?E&fVboFyt=akR{0FY=G?EnA( literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LargeTile.scale-150_contrast-black.png b/res/terminal/images-Dev/LargeTile.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..2b51fefb028b673afaa7baeb504b6c345606ff20 GIT binary patch literal 1818 zcmd5+doi?>X=HeBki_Z*?_2 zH2?tAu^2QC0Oa^Pp`s{bnt$=#ElY}V9{wHxz$%As;+1509|42&2LP%W0OaHYz=n*< zSpk4FYXEo_0{~970HBlH$PIFqUC77!dZPj0`%)8I8B$Hgd`<=cOP`&POQ%v~G5~~v z_4k52fqVkBLlhknasfbD9gFq|$q-0{E+tw--Qibp>bbf%oKZHceS+3wP9=ADBl)Dy z7Cn@f|E$o}C*Wg=app#Ht7~c&2M>BOw-I3cRs zh=AmkoY`f+Azwl2eX;n~n9=xtiehZVimzGfO=CB~H z9E)bRJXF})4!q$AYLn9|jfu9PcGtNwVSvUSNnu=OgB7o zn5GGvFH$fjLSe|q1E6ma{Thay8|j|TnzRA-vaGp0fto?iZxS))^CKs`3X3an}(Ak4|)pQ^}sN?p7`Xe zJdDm|bSKQb3d8OqfI73qlprjd+h$DMb+&Kf*O${PoK&YrMf9Tr?dL4cx`kAP6!w2P z>^F@?x!k`esu6U~7o*9JQ%NHUnYHZsV-gQ@KW6D{Q8#u>a@7Sd7R!%+Gu}WD2kHINc@@o1}kCq3%Qkn%urQ279LsQ zUgyW0xdNd^v_Sos)mN0AE^3IT1wZ2Wy#fWxjx~3;GERbqZ|FL6uL_+4Lk6_0?dRW7 z^l^hBeOlH``FVrf@2D5Ke^^vhhyYtj|`2Fr-E73$twD0Xh+TR1gU>8 zDrESbk~}dQ%g#9@TPmWViX`W&S))6elG|ktYX82T|7Ikp@#2w04Q!k2HMBZ7n&Arj zN=*31(F?C>Ck#Zk3^a6ZGf~YuWq!XE0n4r(xYcpI#m|hN_hPgDPCSG=FiUj~S*^H4 z!h0`O^|={e$k;1=8k-pOq9R!?ruTh#>wAM`(PV}>gYg<3z9f9>{IyX=mQhK#sBN}- za1aWR=W^okAYv+Wof$lpR9+oXc8@mb zojCMGu~96Nr>6B$|9(5eQQtwr_K`*Ix3}-hkSWD0f^rH^AvzIKiLwOPTH9J9t&bpW vP$4!pPIiZ#P&?4c+8R)~RPm33q_d~uPoMkmf|O7Ma;G8ID*%1nGbZmZsh*lD literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LargeTile.scale-150_contrast-white.png b/res/terminal/images-Dev/LargeTile.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..602efd44f01cf838d3e7ea505e17d8276c1bf220 GIT binary patch literal 1821 zcmeAS@N?(olHy`uVBq!ia0y~yV7v&z94tVQ`KP=EfD}u*qpu?a!^VE@KZ&eBzCyA` zkS_y6l^O#>Lkk1LFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0Vnyg-<-ys89f3`sf6LvlxM#=Ok7M~ax*aSRX978H@y}fJSArmTd z;A4Ex&V~vPDNe5E6P>&}6()J5Ug81iD$eO}h572>P%H z>u&kPpP@WGWR|ev@;+A~%g6WL&aO57eD6)2U9?K$*>|_^-k(16c5S&hBhUeZ8eGXJ z-yef4Yn1oNR7ruS}!wO;3#G7+oI9*lY z3Z1MG;=3rov=b}mEZ->~-~8&5=ZE=(r=1KGS)~@ZVwTIotn%q`2X6cf>aMfw!m1C+ z#1{v?9lN+;`zvOv|Y^Xet^|i9G)%pvg)(T%QGscI#PS`vzADo zoxId}vc}@6rU$qMG)1Oa9x9dxQnp9*&y@oWWly%bK5^1X^E=O8rEv5gv-Z?KI)9`6 zKFz-!w+$0#+BEL8vhrKv_AAyV=9l31Z4OvR;TTHn3qc4t4zc+wQ?V{F_|5p~7d+SeawB$W`^yL3S z73WqqyZr3a)MxEWdOz2jt9#`)Z||KqQFw*R%2^JoURPPP0#~U8bOxC=dQDjsD*U3T zc-hWbCH$7xW?eqJ$whMFIc8hC#~)w$ysx}h7PY9yL$&c3gZqWs>%2-F_JwMM9}>7H z9xhZaB->s7JH{hDs;8IpbPDqW20vZ_jn7_-m@BLvS}~;pQ^kW@SF%kCgBJLxTx8s1 z`tqPu5d}*6egM5x8=6O;z((o3-Kye3i;x^ul8EV)VsLIzkgI`a$~W? zyLlUIwc}quKB8P`@UFA}@#jAAO)~jMiVN${^Ox(|^-NE;{c8`51z@=PJ>8am$jI_y z>ncxpCJ{p6oV}W~_$-rWo+j6KUgBOcD_woI?3A6;9tFM8 z-`n98+sC{yuu3rbxyG#5ZZ^X4Q{!Bw>K)(AbawmZFHFx4e66s*mgN7YbLl1Tl}D;- zB-bDP_+#rAr$Jr%fgG1m@{h4~$BhZH8c|z;T-6fSh?11Vl2ohYqEsNoU}Ruqple{R yYiJT;Xk=wzXk}yycptHiBAH%o30NQbAZpUXO@geCwJK!=6^ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LargeTile.scale-200_contrast-black.png b/res/terminal/images-Dev/LargeTile.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..07c342a30c52042ad32bdf730583a1a557193d61 GIT binary patch literal 2512 zcmeHIdo-Kb7XPZfL|wv|DfJ#1t&X821o4jdRrG~Kyi)N@KDERvRJfg#P6>mKR<*R3 zDcVF+Ixz^Qv2KWG8*N0;jzLQ!Ly?-PNAG9uU-yr$HTVBHYn}aD`?t?NkA3#p=bMv3 zzUl|{4gvt6?(gSy8UU0idmVNFV&2@eZ-L-If=8eS06Z*H+a~@E(oJIhP6q-&&Jh48 zU;w~-h$>hFfDCKMBL)C4*8xB$^=9WOXUL#*F2L6d0PZmnNJvvn^}|yEz)5|t?<2ws zeuYStbpJqam3b8nHM?UU%;jGJ0Ibj7%j0aeR6Y}YIWobpe|9CKqG0rAY=kP-Bh2y* zS4)mXPCjGqOEUSDqSG=Bdvo{q{n+BOTFn++$08XQy&qp>{@4n(vWpvHE{WJq;};#y zlonqJL?*p@fkJKG+T3&;cW?H8&puk0>;ixSGev78(U z(`nZOoh?wYGT|Ap)u%$6)(VZQV`%Y8c; zdOtpdFD`GM%Hk0AbVAWE!yfSC5isWj%2yE-cSrtz z;b=I#V8Jo#NflLP$2xZZpceYJ0rAg+{@}{`2qhj>wg6`rDftdq-o+pdR|_d&X>UvO zBS**C_Dv|Ym8uj;h@m4+Vzsd5@?m|>c|51G)0DE4YL21COTd|ddUQY1d0B7xehI6157_|KX0kmH-# zj=`+e<>Fts@N2mneI;zpOV-Bn5Z~u8KU9)y;TkP%!b%Qqi3S7w^zC2-V((-qO@jC&l#;M)_`|SKdJrJ!0~%uA{1`LaRJ&?k^2YEmZfgc0Z6$u;|povIe&H&9t0$m1ZEfT;Opo7RKkB>Gejj zlr>u{^OKfSU zAG@K+rTds7aeZb;9d%Zs9^Ps=8qx6pzOEDB- zP)`-X!is9@#EdG-(B{$|K3&joBRG zZJ8nBMJQ2x#ZAEyWdymzT~cUDF7c2kLlP?~{G43kDN%-`m!$9shJ1eh1iCG8TQXS9 zo6HFVvTEWx9pVIY(;Iai7QBAhxDbzUxYFOeG%`8$H0Oh-e_lLzqvyGELY6D{5(v<1 z|AnBw2xr5wl_U#egPCGvtZjRO)lz@Ndtz7yNx^ZctQ*CR5$li+DfuL7V-#Nu@4AP$ zUno~NqvrxI{FZ<%n=-EEJb%qfB=$NS!hfyM=JH>J(^T>G%0!E0DwLVxz0B<5h}zLLi(%!w=qe=*V zL3Sy)LsK}JQd~O3Ie_QZ8ED7O_UD!cHd1%1nBscfXDL0c*vH(9xcGZqt&pWiF8?6R~!z|q!mrf$4$6;dA;vfK! z)<|nhYkNx@+p{({7&{ck)&^2B*4B6PYs~(~0X$Diil=?tVZszqy%%tQ?;x)hY|O>~ E04=G5*#H0l literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LargeTile.scale-200_contrast-white.png b/res/terminal/images-Dev/LargeTile.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef86a82225e6a8f452e0a28647763d853396fab GIT binary patch literal 2465 zcmeHIZ8V!{8h#B++L=_!V3qmJXxQX0Vt>Bo$_dqQP2iQW|An_SgRCIXnO7Ip;ptxvuxQ-}k<+ z^E~%k93Do1@3h(p002CQ=zkIbK4EPI%m`9m3*DL^Fk;|C@c__L`sq6DPY~aKj(9Q@ z0J!!5kdqGp?;$B?4gfOHPzDtMu-^fIWvcLTgctPSle57De*kFUqg)}jBb7)_2LMm_ zRv6GsbCw{{gcB4RU@~p8>oWtZjY=jF0AOW7{`ja%%Ebx%wbNfArT>l#se_3ou2DWe zg^&D&PaRQyTjzA-(B3aC`U>RyU^k2WV-H(w^J;=K#!mQO{~@pBLS!F@Vks~1jYzG1 zh&DeM|IZ8*Q*eKv7->yG*BkH;#exa$7o%il~M=l%nIUB7Zxca;53SI4eigN1v>q)* zQsS0mvbDE5lIL8>VrX|iBfV|dkCA)vflUs%OJ$oh9nv+*HF^b}(>z0EIZ7$QORGpq zYjx=>ZJ=q@_=1AF@-2ppdRFYE;u=Leuy7uu+?*QRFc*lP6(x|GW^yqO$s2*ou#j(( zvcMPjD}ohVSL8;w`$DnFt~)PA%u)h!)AHem2#TEF0kO0ORAif`<%XTK@m8{;#b5?z z9bN)%!(g%85X4rW?oC|yUGLm3qHtwx{fn`5T=R6gh+sgx8B)|yc}M;F<$+C!LCO>3 zeTn3%>Ls18Cj4!tA%-d<3ox{+wbX%a)XA%kGtDsxY{P9T#@yVdOh59SIwp1!YlVB6 z1OM*P?&>ohNh9{G2de{Dd%Cb1_0Vj#CYKhPF9P2Ub#}K$6o7km(s2UO`Z$b2n~Y1n z-X4()Nx#L$rk1r2cb^lPPz%Q=%RQ^g(=vZ7?y8)P@sZc|C(ailDNM;qh?ArHk|wK0 zJC_RUi59lI*wPM@l!#IgenN@hgK)eO@ihqdRU(Q(xStYH1j7B5hyoBEphR2+;ekp- zE(j+m>q!b@J9gCU7?;=j^y^6H5874Pny-dYgZ$yH^_hmMMs0&WcvPqHQoqki=!3pp z-r$h5k!}lViD8n<_DV43@vle4xsD$i7o(cQHc0gi5FVpO9X?r4RT>GbNR=&m-GP-&53M zbMp%9f6HLGvz~>Wkrgp)+Nvu9Nm4o4abh{TOtSiPq4D4*3wLbae%8xO?;&UR*Y`xy zLPJ&)uXR}RH(9H0HhaIDH4aH(JmB<}@a=-zbmiFz!p31U8cNot!&ieB>~>hU272^h zyvVgSG;3jF#8wCLtq$yyq7JfpV{Se0nWm9{>o*tU9c9Youvc*+LJ@C|_yELayym4B z=JP;!0#iQt+^TZ7_}6|b?G6={&NqXp!s&b$nCb+b9|2RL>HG^Y)qXnv228a(hOyWZ z`%D|cPvJefNuYH9`N?UErnxtxdweP~2s z7O;U0uK<$85s^H_S3q}um$KwRMi20A*(5^!1-}rC(|AskF{!sRuE?h9*%=mBhAEI! zC$;qW1Kt&1S#&qhT9mmoEZ(n&mUa?cJ|5-1y`U`X%Eg2IO zd3~?623N86`FipCA(H6QWN7?=o2dfhDelp|;W&vnq>kf>X5x|LnTow5kXI;H--IW- zH4xVmt@gYJSx8hEFK>?8C;ei_^1GyOXCF=)qxh_QEPD=ZC7I2t+EKpTlGd^Kl=EDxFrFgp;)$9M~z~QEew1A(UpfNaA32LWFA``@I zMmMTQE|`!TezwSfu40DMPa^`s8oNYdb2ePRM!Y=9g+-sQcst#kmEt|jy@o&C-zP_b zSWj`+!t{)giTf!h^Ue1@voFjcW!<5Ch3dW3HteVzD##9!zdtLL*9z9ss`~u~Hm{w? z;ANqFhD_gZHPHY4kM(f}5UMK%|FW(1ma(Typj`(!0jD^08s|LrT-tdE09Ujt+7a#M x=yEK|#TAQo!Mb7~ibbQ@lbx0SlfX`)Gvl*9p0F>^=)hJTK>=a@O}^B;{{Z)RfUN)k literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LargeTile.scale-400_contrast-black.png b/res/terminal/images-Dev/LargeTile.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..dcbc2dfec17ec94f6cc735cb68c4b15a7aa0a72a GIT binary patch literal 6134 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-100_contrast-black.png b/res/terminal/images-Dev/LockScreenLogo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..931b46f231819bf206e1d4b7f7e3df2ed770ccde GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85r1;K$y{@YUXXA25wIm#}E(iw^MAnnjHjM%Zu4^b!^@E6vVV5 zZgwO*ox7)HZSADj5uNrLK66S%t{>^J_ngY#R`^}_y`}bve`^jhKDhWbd;gS&b2j@e zzgiu3?v7zXpsivbuYt^cxLYeM5DT{**xwkENXDs7PjlA^E za0#b~tDvoK@Uva-EGGv{Sdbgd(d6LMm@2_0;_CRyZV5w*+@e)lDUoik%Ho(N*qnE~ zyv0zZODSmEXQ6=WrV-OjXT9FVcXzu&sddnSJ9j?YWXx*2QtQFk_qgZTzW3el4Ozdl z)vo+-MnqGA=kUi1cVuSH*1al{*}BYg(jHUyZ$2L;*I(RQ|A))`RsFPtH=Gw4pFLS; S=9mKvD+W(jKbLh*2~7aoL6;H$ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-100_contrast-white.png b/res/terminal/images-Dev/LockScreenLogo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..41c3aee350233cd2ff70c74a145c20a9ac7692b5 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlkv$2787-=2-UbS?mw5WRvOi(x&rHQ53wON;ef660rOrG~ ztxYRT{B8=I5dA)N>Z@roQ?s?AjPf-z)+M+IB(ckI%#|(OT)M-1R#tM6Bgc8J2Ia;1 zaxW)LkQSC!I2OYgaif8;nn908*J0B7m$%byFbRCjwG47Q)0nCz{$7dMX0!ND^>+Dt zmsWb+-|_!9i=6IH<1Z3Pl@EbVS1oakC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE}E) qRwl+ku9bnoNruATC>nC}Q!>*kackHSd(s`Kfx*+&&t;ucLK6TOZ;$o> literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-125_contrast-black.png b/res/terminal/images-Dev/LockScreenLogo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c78011e6c57d817c0e5ffbb4bcdd24da21f8c2 GIT binary patch literal 491 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGdIRF3&IRRbWvnK!m0f0$FK~zXf?Upf* zf-n?-%iVMr5{65R0}~@|H!6caz?t9S?jK;oA7jGc%zAN9MiK|&bPR}hVYu}A>N{hl zsEIA!;Fmo6`r729*aGB1TNsp5i?#18o_R&WY&Lsy9Ov70-7hRjNs{C>P1BdrX!MCC z89yvOK)hs0kCz%43~=fsX#!S!%y>M8J3u|pqucEktLhQN>-CyT|3as{w&E}hsbLrgIqdqPC~#CAH8IeJ zTq*`m<(6g9&1Qq6x6>#Ff*?4EA#B^mk=to}fRtqkZzb&QVVeyz1>gk;Fex1lhr()o z-^Wok)Wk9=+;Y_j;;O3n**%uRCX+FlOoVyo0_L6~{Kt8olf`0zJwlk2uqPSzM6xWy z>@u>sg1Fo5k|>Hur_&+R>9kP_n5K!@Wn^=uZzm|RGmJewNRN|lDFEWtK5dodRiC$t h;h(qr^nrE=`32Y>^OiXl$msw8002ovPDHLkV1juT*RTKp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-125_contrast-white.png b/res/terminal/images-Dev/LockScreenLogo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1788b2253da4495fd211afb98c2892237a972732 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q%1+0G4}3eb)X=7iKnkC`xACPZY%9+`zD+R3jOqSaSX9IeRZlK|3L?dw)>Mj z0w!+oP+?oF_sCvCrOwCqFZ11>(q+3F*DW)O(ovcy(b9SSLUxtA^4@tz%bnlf`*!l~ z@7ljn-6!N(nXmC|3pmc;8YyM|{rg?t+BM-Xr-`S#RwXdEEU;o?JF`ep=fKI@tm9{j z69Tjk=loB5uDI&f4v#-mo^*Xncih+e;!>i>tO}dLpDLbgYhE7SSx_nXSbW=;#0$dr z_-7_ORo!SPws~vZ$^%-{lkV?a_nhTx$>!KcUJKThTuzVr@qV843uXqj8J>N&R@w=N z9&qm|Xj;ACfT^fo$ja4Uq|at S*pu!+4Gf;HelF{r5}E)9@51H) literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-150_contrast-black.png b/res/terminal/images-Dev/LockScreenLogo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..153e67c4ebb6f832aa8336f60ba379d186abf9fb GIT binary patch literal 474 zcmV<00VV#4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dGk}K~z{r?Upf) zf>01ZKU9JoftDUgC_DvsacfV&0jP+#u)%_G0(ue?dkLM9YL(AqA#4C35u5uh=Pgtcs*i6s11Pmh{a>R65Uw*$H7!<@-4S^XpKb zp`L=z8S3--EbjL^t)_z&IvftdvMjOPZbhEwv^xZuUINv+pw$g+$whUcXaayp$r z)3lZp&e&Kp_4dWM*=&SqnzU-T-EQJ?xzK80NQ|W@3UFPw)g27q_bFp|o(gd?tJMm^ zFrC9t(pWx{1mSqW^=hX%H zb&sNm?mXxB2gwEpyNgo${T|{trk&Re`N)=kjPIDG&{uOg3+Cjq@R11d4gCS2#Vx?O QD*ylh07*qoM6N<$g765=6#xJL literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-150_contrast-white.png b/res/terminal/images-Dev/LockScreenLogo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee49b96db01a6c13352c7fc7837ce0ce38ede6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FLRskWe64^V{Rg{O;Sh{y4_(;WF29R*zL zCwD|}vQOyPE8M}_X~CwQJ?B8@9A_oHhiqpeeCM4tNU1WoyLU$G{n@Lc_JoA~FS)hA zU={155CN67uKyUOtjx|$xobAbr?X15JcT1=NrCLjEZMz{zp|1!SBqS@`(s^Eq-{NUid3HjJ z&NjAhd$%}shP3zh)btr0oxi_sw-ieV6Uj_v*5%&)Q-yoQLAj2Z&t~ay3h|cp=wAMB z7Iien)Y!_z7|69UFfe@3#egTe~DWM4f?p~>u literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-200_contrast-black.png b/res/terminal/images-Dev/LockScreenLogo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..03201095aec16fe49a5a1814e667077c533f5dfb GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nDq z!Y~kk(?vlLJ$aHv#G?g|J&E9P_bt5mU_OLreGpOUB9`8Y9%VLD$8}em^iP^($p?c| zo9KKtlS-LIF%AGwY9?>=YAjYjH7M}O!{>p`kSiR=i6iM;mMA$NYyQ9{#^jwxZupnS zuSGY4vhz7U3KX8Lfq-pdTlD*V*lxEpLJx#Xh!;!Q9b87!=~S=fL?Ta| z&u8GpK3xS2otBeO05L&ADuC!Nkt%@5B)sre9D}Fp4Lli|cQVmi8-HS(r0O5_Av`-8jS@d>GMU8NX&Om$%Y+Ew zHrnlWDZ9gqXUpZ1HJeR(M*~RYiN`x{-Zg)l_o@&feJa5v*ladqm&=7M7K_}!{O#Fi zStKRe$12MC7Xn|`)JS|3m}3$jng!N8$0oiW8j5XV)mQ=57%srrH(NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiUahvM&J4r5PU|`hnba4!cIQ(|n#w;dBfwuow z_1YskS(;?*ImvaB#T+y3GqTAKaZMJunY?%1@ruO2PZ;FSsFJFE4k~g;IW$EQDcb?yLELh#~ zp~C1n@QCMH0xm4U$*_bp8*8glbfGSez?YiO0? Ru>)#g@O1TaS?83{1OU=t*jfMp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-400_contrast-black.png b/res/terminal/images-Dev/LockScreenLogo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..563108e90e9037ec6b9d9a5d81e44dd90926b4c2 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85m^SK$tOhk#Hje19OO{i(^Pd+}peR^KJ!*uoXxfF7SwrQs@jZ zT(Ck}mbrS#K1Sx~c}jPM;ug62RJMM|Pjc{z+%2rhanY-?*~?RP8qYi1XG&WO9^W{A z-A?ph-6hXFnVZ)w<=K)aJpkGX1`cUEz8w6#=liS6;i28*Pw3d@igywz6DcF zzevN0GaL!M@0uJ0m;~AwS`--)IUFRw%!{2H&Ttz1C}81mW;k?2&-H**A3_qWF5(Tt zuDk1sD=J=y_bMt?$sH)Itn@su_-|!*H}~IIj%L}0l|N@YaXj3}#F6!HnShhUMCKPI zR>#_AcQrL7Ok`dWqIE27e+Y+S#FNbnCQlZ&&pJFj{FnBPh0Pqf8zU-~2A!

NxZ#f=Km^3@38TK6f2mwDF?j)f}_0V&CE) z?UyVsFMn<##hbo0>ZR)X)6YMj`}}$HzpVYL{}%npFzLEdQ&do}z+LizJUb`n=TkS! zo)%f=+sM7veY5`v(*v`53z=8CDb7la3w}O~-zz574NXe9|Rf zv3d>bflRx-TUPo7e-+zw(u*O(F8&R}g+CQZtPRhOALnz}_0!zkd`)-lw(f5W@4tV& zx2sQ-Vf)XL!gJI9FZ?;%%FgauwP@@UhIQ-L_gV{vl(=3=``no+ck)r!p0uq|rtc1T zPjvwb=m7<4Ot-}7y}tN5K1jPT_>la3yZ`@B@(Qik2ldEvWu{K(e2t+?cB&7_-`FXZy`^WXdVbLaJ} zt$Uspt(>m5{`%{m_B&Q8W{SOap5y)UN4e>t57R##5@;}BQQ%<&r5X)}DrWWxA3Ydr zqWc{W=-TrCSip8abnj% a7WE8&?}{s?D00<+1U+5-T-G@yGywo|#G>l} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/LockScreenLogo.scale-400_contrast-white.png b/res/terminal/images-Dev/LockScreenLogo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7950c71504b71352e735c09a27c9e76a1878 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A}ZE2s6em5^e+vvX^-Jy0SlE=i@fjOZ2Je2WpD&ba4!+xb=3{YCmR2k+%Pe z2PY&r1UYg{S6JaXiGh>p_*+(i9iKQtK8aYkWL7jSTFJ)9#?t0AeZm$do+k<%jFZm2 zIpgWO zHdD#{+rm~oKSO5&jfYIhtxp+e>^Loc`H=A`w$dEKx%=dG=SY+ou8LTYEMTZ8ps--S zxEIqMPcSlEQj_TMS2jRjz;wz4fv@F2v(-5Z(m$|jRUA>)x-+NGLR^2SqQY1m z*Kb}O(Au;+qR}ai^&{8M&=&0D%)~r}D7D;Q+mgp#6yl+2bTWG#+qYkyYDpFEjR^^@BtAC;S)cKJs0>;9>r! zhrhXQe2mZR6~6C(pzr=N*0>sZ#*06GG9CK(ndQji_BFk2kKbFc)$hx^7#7GVUU&2L zt0Rwv1@DRr-`H$6qwFuWgH#3(uNI~>{Lr!BT7;dOH!?pi&B9U zgOP!efv$nMuAxbYp`n$jv6YD#kZWaNkbGn5Y7`B*`6-!cmAEwswaSVEH86O(`njxg HN@xNA!{b;} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-100_contrast-black.png b/res/terminal/images-Dev/SmallTile.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4d56193975cc54b0453c7700996e44ea8b69b2 GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^?jX#;0wn+MoHPYUv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i!>V3oBOs5n zz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0SlE=i@fj7F6p2iZE(=x;Tbp+?t70js0Kk0oyLQCB!H>CNUV zS&>%NyW>|H&e^t9c;)9M-@m=M^CBWWDn<0x$>$rb7IzCMi-jl_TD8COoFrGW?)tOK zjn#YtPCS(-C;3e|cfZBxMUD8a=Nl_!XI$2AVGEpXwIr-H`Gbr5(aW>v3G41Gvhw!p z&N)(g`E1nbFEh;cPQ7l#{A{Ap$(UMXtvZ+}~={VZ9w^yG`_6MfTUO_ zQmvAUQh^kMk%5tcu7SC(p-G6Lp_Qqzm5DKsYh_?y_@IjiMMG|WN@iLmZVe85jWz%^ OFnGH9xvX literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-100_contrast-white.png b/res/terminal/images-Dev/SmallTile.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..110e3de75f022ffbf9097822d25266933fb0ae08 GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^?jX#;0wn+MoHPYUv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i!>V3oBOs5n zz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0SlE=i^}%`r!7kih+Sq!qdeuB;(%O>5f^497NjY zFYPE1y~QlDq}o3q=0@-FjIecAg)0`#a~9CQD4p>}t0pffsAJ{i!V;mM`){@!pYZ)` z^<>3lwH5&<4#k!o!q41F8B98F-%$-cpU78wFs^w=^t$%jA~&W^dubseaPEAe*VVmg zwpMFiwOQ$|_H&-QkT*$sy8BIa%jh^i`Qqp95py*y8KmdkUSO=$?A_vI{(5e#;*+bJ zE?9|kwO;?Jz2&*?zCOc;0UW7kzfEA4JO1F>zV7Af)x29%?!Qu5^D|X)cjVGD{F!go z#+*v=NveOrIa_L`Wa*i8%O_t8duG3G+2!Zl79RpLoke69pYQtE87sIh@}9Uf|E}-r z?>NqNo#2yrPYL1^0nt7-%Nb4+Y(yRbgH5%>HKHUXu_Vl&Jb v7#dj_7+M)x0J&BM2AlH_D5Ge|%}>cptHiD0kWs~apaup{S3j3^P6$0wn)4Ij8_BmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SknSmE9iY=x6v#vN0ZjO^~4 zdNluSH_PN`8-eGOP2YGFocj4_`?r)6ntqitC(SQxcvyekeC58x`8#|Irke98SACM+ z&e4=`F8cEmKk3KP^C#!4@)e3_x;QTPxmRp3vv|ha#0fH1w^S^1wgeX0O4)cTR+{}X zX-z3QvPbA|!h|iFY)z(@4hlVGp}{*??2sD zz5z5~gX514GWEq?eQX8x^wOx(8~kHfoh3sL`h0w zNvc(HQ7VvPFfuSQ&^0jEH8cq^G_*1`wlXmRa;*#uzPN8`LeY?$pOTqYiCaUf6ptNH O1B0ilpUXO@geCy{U+hl+ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-125_contrast-white.png b/res/terminal/images-Dev/SmallTile.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d864ab7131ce5f0977fa163065c0a3008b43707e GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>$0wn)4Ij8_BmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkPqVJ5 zlYJlbZ>OBhN)ACNxY$@Bkh6=yA)x9{+~kQG&z2Q!%H-&awmcSWxz*F{rONXi%N~17 zl!Q-*T_9bI+-EydvSDPO`qfg^IKMt7Y;u6-!lDe;`}$ZyZTbjU;L`_d~u^A&&mCZ=O=lHm25oY z5`TR{%*O+HCt{z?zv|=`cKT`dROyPdYd$bdUzp!h^Fc&>Vg27v2c74%{!@N#dBe`~ zBy0VGpZ+c0XHSMtZT|0ad;KTx#Da#CO)TeIt8Wf7(D-D;J2VH2ZN?Psa-pLyrw0s~XmGFV0YN@w`bb`==#swJ)wB`Jv|saDBFsX&Us z$iT=z*T7uY&?Lmr$jZRb%FqJHwK6c+oPR(WMMG|WN@iLmZViWwD&_+4;&0%z_E{W`L114cD>RrDiD^5t!3nMvM$@8@9;wCU`?!x&#Ju@d!JN2 z{F$QluU{ zeQFWYQsb2Ge6-B?J#nhgdiCwcv;`|$WaqBkciu7DJ~DQ$?xr9imF&#tWjUK~=+4%v z@7F6;o17W1fA0M4|J_rjz7F}emDl90*R?O!t7dNSh`hAq;)aY!S5=)i)?&J=Z*J&_ z^lfuJ8^!zjE5CO2!qnXb z5!;ksmv>(~_Wf4cwcfqkg{Iyv)xORM3pIv@S$2#Ul0F@t$6$IND5zTE8c~vxSdwa$ zT$Bo=7>o>z40H|5bq!5I3=OSJjjc>ffm|yCgCK+bW+)nR^HVa@DsgL2&SmccS?lTQ K=d#Wzp$Pz8f&%ye literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-150_contrast-white.png b/res/terminal/images-Dev/SmallTile.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6f029a17a158bb2699851b57ba9f313e9512bfa9 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^*&xip0wiy3+tLoCSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz#uRigc(aZ=Xe7J*-JcqUD=da|2dYV0gZ=(O(ki@mp3VTE}Q!NOpb_gwot;!-e)&9-)G`pzxGN>Q}%V=XFt{z zJSaEW)wgC&MeNR^d(n*IC-#0#KAWz*|9HBOt!;G5Qx%VEZFg@pPhA-u7FL-beSNLU zOV{1+%J=;5H;Ht<`|@^3YWyazzt@~1X6amZ-JQ5{Q&&{PgKC}7u+xbzH%0M!&-`kh zv+l56%1o}g;fL%>ue9p~FD%r}(GLu}Q0{bd>E5uiI)Tp#>=FMD1!hHAM)zxd+RssL zveLyibHe|dl@0$$L{)Ojl=!z-*RuSo4#)0%U@j2`2{ye9a+x0NoEuM$wR)pOTqYiCe=Vql)<;D?MHPT-G@yGywn!fA@O; literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-200_contrast-black.png b/res/terminal/images-Dev/SmallTile.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..ee72b0ec3eed8c3e04abd04dc5780ca60470e619 GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^eIU%i0wjIE{AdPJEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`M6E>5`8NAftrFnT^vIyZoR#|J5ShAqV3^* zjbCw#hicuqZ$Uj;p>qVY?Hpxht4dyP7SZ3dx1?v^+Ppc7yhN!zyn7)pN4+f)}4(oR%N-;oU{) z=kZd-Cm-KktbXpMuhitsb&t6or_6p+m37~`|M|8p;WzD<%ubwI`}0H1+mBmiZ+Ko) zIC|^OhG^Zq+O^C66;*zJ(W(6R(m%I(E6dK_v#oku@$BO}LxsM0x%YC-k1C!5IR<_f z=Y8@!i_7IMXFvM!1Sq2A_hZlTEjm``Qa)Q&e^V=1`zdqP_WP$&%!TIMXpCKNd;Nxa z^`!KO)cEMqxvZCCQoMp^{E&OF#klt4|Cr}Sx8LnpBwM6$R=M`AkfXWlZ2vX))pg-gPI8|{^;_^>a%aEZOu_4kgM zUN%##|9ng23iXY=(rF=hq|-w*{i*GQKC`o@mvnu;sO$1Gd$C*l# literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-200_contrast-white.png b/res/terminal/images-Dev/SmallTile.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..af58357987fcd3ced84d39a2f756c07e52e464b4 GIT binary patch literal 818 zcmeAS@N?(olHy`uVBq!ia0vp^eIU%i0wjIE{AdPJEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`FI#b^OQ<%0yU|6x;TbZ+mDAX-Ib8O8FGYE!H=PksY6&Gb6ZgJ%~g{V z4WpO3&1onvG!uRubxFK$4#OiB0dA|nma*$n%w^F@@76i-c@Y-bWc>u`)8kAxK`PR z=67MAO3JdzT+e;lp_E=3GjX%cx)qW0(reYv-L721{V3(s<5RcpuHE%+qT9O1C1v*M zY2u>4|7=}7{e0HjYD=A3fxoudwI#JrN<^OTF*Aa zS?=FIKU3c}ZhG3}wK6xJ^3QrKwLG!@f7r=Kf2wCMy2rCMw9u#Zoyy(obM|c4>C5z= zzcv2ztt0nC<~`ibKlg)ebS@J(oWf+{ua{r8nB6J*+$@^oe|0kR?oFAGZVP;!7GL)A zE&B%4*aPu2_b?m{KkCxlE&dnCQ!R0gC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~Mpg!f pRz`+Eu9bnoii##-6b-rgDVb@NxHa5VwOS9d(9_k=Wt~$(698?;Lf!xX literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SmallTile.scale-400_contrast-black.png b/res/terminal/images-Dev/SmallTile.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..c636747380b56db2630d76fb531671a315feebd2 GIT binary patch literal 1559 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 y!Oi!0n_Hj}=4cBfM9~O@zg6uO#c%Q@15rW literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SplashScreen.scale-100_contrast-black.png b/res/terminal/images-Dev/SplashScreen.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a4480138b64db10868b307073bff1ccc8b621e18 GIT binary patch literal 1482 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 QuP%D@_T1@l%blP4Co0-bqW}N^ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SplashScreen.scale-125_contrast-white.png b/res/terminal/images-Dev/SplashScreen.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..53057953a8ffaf07795f46713ad539bf643221a6 GIT binary patch literal 1776 zcmds2`%jZ+6h5VeuP7}r=Txk~6i|dp%ea;*6e<@H5Or#iOSuUa6u~M3+}0IEQMyv( zCbVdR!KlM@GNmGuDjMht6%}39K*z8Z29#;lA_%gtiDtCp8ei9@ixTdct`m^k6d3?a25$aOgK zIibJao;ksyk6p$)2Xh>U6sP!07@4*YidSD|YI|d!vP~#dry-xT8)pa`mT=)q6SA=d#yQvk3p}_ z;*M=NyN?!p&b5YP4Jz4=BCscqXEhpOsO&U-Lr=+X9rMI#WWyVu7{gs&XR)&aLv~f> z49_p;&=6x_-Ef*Mh_F!6je!U)@SO4>=rezCEG0oXlL+A}5pc@=+9}GlIH8J8Ty6}s z8y*GT2eLw^#_|yHrsIXA6=3r}*@vw0`SLaUw6EK1a}L&e@7ChkQI)LyyLIOV^0!>y zGvm;!fl;r{&)cSxtTwsoS`54Nt_ei2@XfFab-)3wcSW%X!SJHjQ~lfriCr`HW*}*b zZg8klgxcXUPb@yRSJ7{2cuNn^Y3gs(-MrQn=<(Kpkh{#T@x@?&QU2Al&FT;w+h$u# zb9?-|HID?7m9`)$Y`U-4IF?Op3kB|&Bxt8Q9=LVM3lc6mLf_t|2<|aH1YKBm;X#!p zT5V55_)aGiA$4s+sfln!!8PXtAy-5vpE<}MPzf5`MBjHuPG2)N*7dv#3z_wQSaBoC zV+#2zI>@57^O3~U@Lz+JM4!#?+YBio><O1$bBD{R?SVkn(YagZZlFawGVvc+ue8A$z+ex}+^`cuOaA)@|on;w0F;jUUEq{IT2NGJj*9;7I{Fq zU3f2u2rjbcOS5Y_HNs2lhNanPjyvmSyN8aX90KsCGfhx?{s^CUt@%aYbyYnU)t@;D=9v5D_-?S+>nx zC|QM+sbUkA!ieuws)tm+jww=mJw_@!v!q70y}?aLl%5cKpBk!EvNIKJQRSv<{jojh zt3Iv9%C>Yowg<5@@{3k!LP;M`ryBb_la(awN29p`H7_}OMtu4B^m(HV#9gm{Dt7O% zi|uTEzq_B_BW3DHeqs)rQ}V5+Dkly7G{Bj=aThl&nVU{a%}YlOcv3tmWQs4D>b0Hf sNuy9{p57>=Q7G}gO(y++f_*t@d-oK4TtMd7x0@6Z8>5+5g4z6k0Y1|&iU0rr literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SplashScreen.scale-150_contrast-black.png b/res/terminal/images-Dev/SplashScreen.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..9137cacbf1814b7f5f4284a90b1ef81163611d7a GIT binary patch literal 2240 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 XZ9nke0=pf!W|e~O=})btL>~GZC5nU& literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/SplashScreen.scale-200_contrast-black.png b/res/terminal/images-Dev/SplashScreen.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..38ad367e1097779d75080b517d1aa5b17cfa7e36 GIT binary patch literal 3249 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 z zoFy;Bq?lnAteORvGufqV?W*8LY5Bfx*h9=B7jqE08ceT@EEzs`WbH%x=}7h3vN!hT zUrrYnsWz9jbv`ybgijas7qz|G{r5fcfWn0ORh}-TwG2(Q~{0DSbTf+WDGgY;JkT_i(AY z;*Wz}K61&S7k6T!O>q_-`_)~X5^?%kAmz(PuFmm-Tz@{UN`@AI&muTipHaBN=2WoM zsof}ruKJ8}n7-BZ2P~6o4A``DJ=baHmLsy7Db_>4WK!+%zQS&>PFt8;K|=LK;XjFg z4f9-CJ1^VAH88rb0d%^#OBU;hvFueY+h=@FcRFDX+5e^UeeJG=r#68A*8%Hu;h4G4 z*?SS2^Z*$#{#pZVj)#dhaq8bre+=rGx)A(C;Si+?>WlWY_Xe$%LSg#xEvH7H`lQY8 z5OatEj0yS_yZw(Elox-Tmx&cfl%ZP0}lGYD6>mhgP_$sahr1OTEEzFeWq;8g+ zYDTCWQjN#@m-jK}=;^Vw=UNWDlBeEhC*gfIcytK;@jiP5@3V&m#QW^?b-Fr`n@69y+;3H? z@VlY8h}Q!WzN%iGyC)uL_v0F3ctWmD`g@ionmQ?xvP+Y5D=&#P@nxs<5fagV^FW1r)ZdECbHrBdl1Gbm#p~xVz zB3vQfH%17f!{g7Tn5AXn;-s>nJ_d65jiX~?O=_=3Rq!YsoP?dIBq2ZZ3EhaqI{^iT zGI2vYC&&-eRah1HlJ~e%6`4^wY9Eabjyt|#2C{4;6)ZBWswyPbWp0$2h-?5$Wu>3u zu6>vsDm-^kt8lfKL3i8QG+l|GMh!=dPs!Jyw1&KftVcH0TWz#^^%`^XYV$QFxM@x%`*f6K f|7n7c?@>>8+Fwst6eXhx!EV{)u<_;wYSe!LSU-rC literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square150x150Logo.scale-100_contrast-black.png b/res/terminal/images-Dev/Square150x150Logo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a94e09558d5cc18cf399bd8e73cd36cd312dd929 GIT binary patch literal 726 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm1x)VD1X3*Nj=qiz3>*8o|0J>k`3lJ%LB0$O zRcZ_j4J`}|zkoswFBlj~4Hy_+B``2p&0t^2<1Fxq zEM{QfI|9OtQ?>b|fr9KMp1!W^PuTgmO?CR6Bo{Lv2X9)jV*NyT~|hE zr|&IWGeczNW#OOb)Q?EC~xi${W|+nq)k8n=e^b+ ztA86F`@i;Z|Brne%GWlGpl+O6QoXT)W&l(f`x+u$9w_r_Nk-sQz&K=Wz9pX78riH!O^f zVHGcbmwSEH!*y%4%0Fzbkgb2@`+C)_CkynxYZkNHcgVNBN$B}#|L%?SMk@``*V*gq z_i7rutc*yv<-2kua-k+lFatRYw(bA0^umG*246gYJk=7{h?11Vl2ohYqEsNoU}Ruq zple{RYiJT;XlP|>Y-M5sgrXrgKP5A*61Rp{DIPnJ<({s7F6*2UngC+N BB>n&Z literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square150x150Logo.scale-100_contrast-white.png b/res/terminal/images-Dev/Square150x150Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8b15f746632193c704c1c7be2661009e7d6fd461 GIT binary patch literal 700 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm1x)VD1X3*Nj=qiz3>*8o|0J>k`3lJ%LB0$O zRcZ_j4J`}|zkoswFBlj~4Hy_+B``2p&0t^2<1Fxq zEM{QfI|9OtQ?>b|fr9KMp1!W^PuTf*7==E#J*;A2U|jF%;uunK>+P+Ld6xr3*d7R< zayinWB_{Gwp=4=o$G)ihEG#}f9xJ4q)I!CVt#a~6wcyb>+G@3O_K&#hf9>?QtxNg+ z$7~D#TYk;4 z(%d;~HD3eo9%JTw9lZES zx#iyAkpD+RU0RnOzIpZDZ;KB3r}+sVq+&P3?A(4f^zhp?TKBDd9&406+OTzXUhwaf zr-}A#9}`d1t~|WoT9#vVb5P>kZ&lx17iw|c?EiUe^_OkAa_h6Fv!jG3kkk5ytt^>O z?dQ};U_>*hmbgZgq$HN4S|t~y0x1R~10w@n19M$NlMq8AD+5C-Lkl3+%D`ZA{sCna c4Y~O#nQ4`{H5@Xkm=Cht)78&qol`;+0A$J#-T(jq literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square150x150Logo.scale-125_contrast-black.png b/res/terminal/images-Dev/Square150x150Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..52a0961f9c19d77dba3094b918fa8e3a2575ffb9 GIT binary patch literal 846 zcmeAS@N?(olHy`uVBq!ia0vp^dq9|j1xRK%@F)N&mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkrHp&khl*VitT;)X>oC;+oC>K$JyU?!cvl7~8vcv2Zw%|)^l!nh$9$X8 z&gM6)Mr=acW<_&U34 z{rP#;vF0ZYUT%Kww_WFy0GPHp{S2sQZeHk&vR{>Zgz7pz-2Jk-Li3NnLuEg!m-jjB zU4C>N@BN^<&QI;niGPh*R=UU6?!R*~?o!E`dz0lK6=mq<)QB~c8{{}^mKnry1RVR zjg@`-j1PUddH-(AN1iMFMJul_E%%@Fm*NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkGSY~rJ?pxe9 zmQ#T{w^as&_-!qV`59Pz&F*P?|1HP4ZT|5;b-sVOtXd=Va5BeymA}uVLd~zsiM@Mf zA42TeFW+(h=sC+A(tSo`L%_Q$13+xrubKhI{}DK&p} z-pWJeGW(9$*d3i;vE$)Nl}Aggew}1E{JcK>%NdsGr{BM=+fX<2q_%vB|Y0ggYc_brZZJXI|J z9jHjP#5JNMC9x#cD!C{XNHG{07#ZjqnClvvgcurG85mj_83MUh1_moCnuJj_V3oBOs5n zz$3Dlfk8|Kgc)ax9uolyvX^-Jy0SlE=i@fjOZ2Je2Wr~o>EaktaqI1!y?K`dB-kDZ zw=B|&VTes&(5g~hvsYdsB4gqXt}>C%)@@F6XF9~*oZyk@=Je{D;m6BI{BkD$n6uc% ze|cE%m#4Ma$B!>B@&Z~y7<>`DTp<~L(X&fr*E01i{%PD#uxbT_6 z=czM*9^2|VbM=usl_4u^&)BFwJGa;_P2BQf9?N$xn#;Z@j5f#`Iq;uJ@Z)Z z<*~WuVm}hSS&a_7@?W-DTH1gA^)~tKWro3@(i1oS6018m#&MeR-+-gLg8mN3*&_qKi^^AqP_jl^_}b*6|=04nDn{d zbd7qSz2`$kDd7YJR8e+b|GC%_?oZDBi9nueiEBhjN@7W>RdP`(kYX@0Ff!0JFxNFS w2{AOZGBvg`F#~d~3=EQQEM1MFAvZrIGp!Q02BB72agd8VUHx3vIVCg!0KnaQzW@LL literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square150x150Logo.scale-150_contrast-white.png b/res/terminal/images-Dev/Square150x150Logo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..00fb42558e08a090d0f8cb27d826aacd65942edb GIT binary patch literal 910 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square150x150Logo.scale-400_contrast-black.png b/res/terminal/images-Dev/Square150x150Logo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb828ac8d54d9fea6988b4cde142a695f3b8593 GIT binary patch literal 2479 zcmeHIc~p~E7XPpj5?K`41Z>KZvNSA#ut->yy~x%nU(x{~n1nb9`wn3nss$1PEohNV zY%Gf=FbPN%q1M!33YsvL5+Y3&bjCJ?(g1v-aEg0 z&wEu-5y9GrOb!76pdA_#@BsiEAnY3)1~K|+QFsVo)RW;S0YFfzxtn+p^36ygAA|!y zp%nm>od{?y7--%1MA_}=qP+@NNLx~Aah z`7#heYc>cs_nbztHR~?)V{LiKu>KL1n)yjirRaUrPytL!{U`Q_0bb7c5`oLjd3NGGElMJ%2?f7@LasYusQ(U|oF0~Z$$sGn<0g(@&o?hQV!Cu@>8fyBBvzi?JtwHY z`FuHy-{jiLoSb{KJ?WXvx3Ewhj|>61KK0%J@}~>cak|sW^=0#ank5m~O-Od0tQfOZ z^_)u39aQ!YcYn#IMkW!u3$3j20ivpW90P7=P3WGIBJcfOnsm5q;rLNE+MTy!J?Ig> zW^^JfgP|PY#q=2oX+K=t_((DqsDfJ<`WT02hQKeH6a0+J5B?5#-s9UnI%uG;>toDz zzJFl!h}~5!;jd7wCx46RvG^p*V{yg``)~TU=>G&>>YmeGgJywot(YtK|EuNfSHA2f zodSOzIzw6W=Fai4q_ij}&9-VQxjh>f$9EWBV5kEZRje z20w*@-R#eVD7n3zMdjAyQ6KhLtY z&4Gi#DAo)D#G_bu5g--Cx`F`nP^=OJSb<{2Bftg}%Lf5=qF6`-cnif+!9g*U4+kfq zd^orWZY65__jE<_)y?s*{P>?>9PtTNoAb;LxD0r)ph$jFUC~>ilc&pDl{}mn z$d^z!F2Q`9yE`7gz*I+olk-eSRq;F%Qux+9Qw0Y*=b4c54f9N>3l;Osc&IzQS+BvC zDhUDQ`_=5}q1La_ME&v8MxB?HC*1d_tB2N{S|MX2m%LVL)1K7R@pAfQ zmij5Zu_pb6{41V)S?r$s%D{VCaQeG=-JWSS)=gzLp2S=oY_`r5YhXCSX45+_|U)r z0a`ooUL_B3tU3*$c@Eutn*UzB$B$XHSbX=_U$kVev5Z0M2+_j~mEV}lAjd(dcn~y{ zT}B=;xP$^4dW9&G6i?YrDQa4aEKtkN@)-p-rqT zt7)wy?7u)l+JuJutz%92Z=%a5ZqT9aR9mmcz06e3_gybP+loyl*Pe|UR89;J%0DI= zV|hXLsSj9k(lOcJ7H-5O5hP6!50(V2-b}SKENdfAD8~cKOR~?Mt=fuNPO2r@3@XD0 zXpP3;Tu1QiPKFzD!-!iWuTYi@>3$RYWE2Vil>QC!8x5=i&spI1HwvwE5ltC`d^o|0Sv5zZXneST^pT N85$T7&~u7d{tH^&aq|EG literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square150x150Logo.scale-400_contrast-white.png b/res/terminal/images-Dev/Square150x150Logo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..99fc2a7ff4d1fe9f45d37cd301dc53a427b46e07 GIT binary patch literal 2429 zcmeHIYfw|y7Cy*9q6py?P(%?SP#YcrD)LmZ1i=`dk^}_>5{Q8EkWf(|a)TfR5gRH5 zf!c5*Z^RjUVA6Z2TrVs$M5$CfLmoYuCTW*JuoU00KD~A zO)CzWKLZDK=|KdX?zpbO1}%%_x}-n=K%@ux`yI+2ct7M<97Ec4Pwi|MabB4!;hA#3 z-!U10P0DJxsi$|KkcG?mAxrhNOvif5E3%RJNkZ21z5W*==B12?F8UF3W#PWC^!j$J z+ksxmR6zL8y|$UNcYo{rQ1@Y>gJ3o*_njT~T&X?%R#u0A+xYveDxjS3*8uJ1(lMcj zdAX#ZW?+=Qa4c%Xa)-@}(zbYehM@?5wm)=OTOB?vZG9;nbnke(HlWGMoPt?s&Gf)< zzw$L~?54Sk2K`9nv;|zQQ>tADeMS}YQu}r2$m55o45!W-U(kS3sJJB^EAyzntr{hf zjTY4X*>3N;GDC=D-lybXesOVxI$C4s!HyM7Mr(i~4OIhpu-ne_?rcR)OnWTpM`_y> zPpQ+De4)8GSwUZP&Um#2Y3blrA2w{fCIMj9xpR6frRBS&eJ5zhjb?`2;JfGEd_b3$fRM?#+KxhM zSb1#L*o4ktpqT30`csKBLD{H^ zcqz3mt?sw|S3@Lb*$siO_;|Kfw%gdV_oAJ!XlHT5^Jck3F#W@WlgynPdN{kq7RA)C zx>$W&^9@4NTAQdtcH{>_)Ugtb-jCiUq?QZv|9~lbcc~UR)I2XIDzZ*I-x>rF7d^SB z2TC5Rf1Tzno6X|AEH~2)i0(HPTik1o zelK}9M}kE+U@AHigm;WX=GmXgjJR?~nc|F)0ixbv=Tq7hS-ein48|y2qNuOvM5sT`aw;NxVU&IJ3UWI6(1jNp+~?22IHYb-KqIG z4ReV5DLf|yU(q%4Ix(Q4wvs5ToxgVRxmj(mVuc#oM7H09o|ZhXd5Gdx!MjIkX}gS> zG~xy?=DqnaQL?(2Rf)bw_&0hQx`?v7XY)R1n1)!Xg;Tv(N@utgD5AYaRo$NZPuk&_ zFqp3*`sAFa_Mon;BkrHM<{;#_izgp-RG>+R?8$YWK2fJ|dGN#q6@r`5?-N9e-qVT5 ze3S{-V5p8O$gR`RFi))moD`#PHMFT@PZs^{o73wGqTA-25T zib%`#;YVWFuI1e{)sVVIztK(J-8Od6r?o$C_~b5rSD}jg8@w5wj=W#a#M*?R8@18&dYjhzM0Ym2C?;$^|cXN+81 z#x-ArLHvQ%$wu|?oWEw<+AJ5R1mr&oqT&Q8n4@Kx@U!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4`&PFxJ9)-FP&im6ngFH;uzv_{OuKcz9s_+)(`!g zcJH*DVNu1FfACq7%$}yj-Q@~~{~j{<9W$=rWWQnC!2M+BlqFM>7XEGWju%&WslR@y zgNTsOr{@nkgrbC0432)-bHs6Li`sgPvOLktyJXAKr8l>(PV!!IPvyhmbzNpY$rWaO zZ+e5hEMH%DFXCrPY~Q!>Q1Jxe+}2_r)xA$!V_))Z@Y1hHe9*aZ$#lLC{rpc{^D9js zTIDf(INwS+0~h`sdGx6|vr5{DSYiO7+FxTl&rwuw6`uOnA^2oy`6__o&1E zv!_m9O?&;}X7joiPqyEiFhSsd4Z}<8mu_pe@BIk$wrYuML`h0wNvc(HQ7VvPFfuSQ z&^0jEH8cq^G_*1@v@$UQa;*#uc160dp=ij>PsvQH#I4~p%b#694Gf;HelF{r5}E+< C8@ea} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.scale-100_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..7786af596e0f3dacbe0da4e07527925b27bac825 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!0wlNePU-?uEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4`&PFco+rbJQ~7)LN7dB978;gzrA9}*JQxJdO_bu z?tmn_{zJ*0#l}Z^jdxg7vG!W+EaX1_Amh=aC(ryo$7Wq>bK00&@bW#AO6^ZwRs}V+ zXZI}^v0V+^sKj&l!=7V~ONDs#CRk1P+L+gV_vW!TM?yEIF1Z)-<#1S+nNM!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4aw{yO%6q!~3;BGJb-8+(dwX%0kE{*;BVfu%&EQyE2YrUR5W zJ(-Gw>9y-vDuk}H@viSuJ63s7v$HD-ZglkTiaEUa@UcDDZFifQJy&P8 zZp=@)t~buO>J@bv%fUk*%j6NF`$?b%22WQ%mvv4F FO#m}P(8vG) literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.scale-125_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..86948693b8afe36d5645721772d6455c4bfdd116 GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^<{-?$0wkF(Nu32!Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4uZ?5 zYX9e%+jno)(N2fUVao~mFhsqy;nT!R!&9n0*!zLS(f&7Zf&a|M@P zU*p9QTzY7#cwND|_1a2z+``4z?YMrOQ(3=d_V4bFPi}+Z3~Z^yDkj*kacekaR52f@ Ofx*+&&t;ucLK6V=OvNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkWdE$VX6xQ_>;ms&xR3hrgnf$6I22b_y!&QO(v+Xu zPEMNe)5us-$U%U`QK02NtNw~ePL6eli{n1u>02QqB*lKUi;F?9UM`B)S>@Wj#T!|s zh!!*3I;a%M*gn+EUdtiL*ZkHqe|8LZ-sLj4wpH{E#qNN;5e^X{&nAO6Kv*Sy%%#?=dtY%E;Od4I9UDXB7-^S3v~%lH=bzGcak@5r3%e`-~n$7Ig;N6r*< z`p1N(IUYQp6;qvb?Vn;^-yebNlPj`J7x7J=u~W}ynL+kfK~_g#puCu;FLd?7g4~8v zpmNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkcgpyXXGLR~_P3|7reg)gja4Kl?LESnD}=H*wpl=1pCx7s;Zz z#Uv`C@5Sf$mqpVm%71riXk7DMYVx+#LOXG9x0uCYGr!)|4<V3oBOs5n zz$3DlfkAj32s3V6n4=C9WH0gbb!C6T&c|)4`@>b!l!1Y9ji-xaNXEUlw>J76a*#Rx zvA&aA@kr|q%O4^eB;^l0H}LE0Ig#|}QMSayNa4BNtLJ=@m(kugv!lG&?We!c$W z``erurv~AM+TdZ;yKePKY3;nr1??%i_(HM{A ze>Q~8K3phZb4_p4I{h1&`!61t6q%xX{C$w{L6-HYwlC+LUvgyAvEG8m2iUjqPdV4| ztoOsdX7NoKLKQl-FHi4C+obxrFaJw*wT6V%{eZCi^bcp{!xbc6vdjNvKCXT{=3McQ zq_rv;67WrX0>GQQ>_2V3oBOs5n zz$3DlfkAj32s3V6n4=C9WH0gbb!C6T&d0+jnx|B9lYxP8x~Gd{NXEUlw>J76a*#Rx zvA%cqL5nZ0F$u*6Klt{wb$1FM>AZNdTwtb5fpMNqTj%WA6DRxD^Bp--VOw?mUhMw~ z_qR*SJiT0$tJlDh++%o5BDrVd-PKcON*sKa8+&)ffs1bMmh!NlR}wnp?jO765T{vD zKz+!Ho1Tv^x>YSqa8YaNE91HSxkleq(C5ScIpGX@^merv#FfZyeP4Cx`@LDa*IFOm z&G*iGfA+@BU8Yw!7z{qe&E0zIR`c;6xtn+&X#dGwBmal(iRyONc;?EJZ=ZiSqNG0e z^xK0oPZ}PGJXv@^^5n(?p-nX*#HHax6w`_en6KYueq1JLm8Uk0DXo7a2OC7#SED=o*;o8k&R{8d(__S{WGvxmE@SD=M0VQ8eV{ ar(~v8;?{6e)oMLZ1B0ilpUXO@geCxN%o3Xb literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.scale-400_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8ca35feb043b6979fe5c4266ad1796457ec065 GIT binary patch literal 1281 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y1xT{))42+ySkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz@Q!n!i?t+M)Uy%*-JcqUD=0nHfYNX4zUclUOShRYoL zm|kU&2k#`h9iO zeZl?qTqVQS%!HZu%45yHCVzeZ<+xx#{o?ss7cW+v^WOSWO=;?_#~xwwSLW7KR*ObR zz4Ry%%jc{=;dE|~t?}~K7kVEh_smOw`}aTNmn1gt*H`bo>{E{1Yj{`x*fi%I_qMNV zs(<#_+vVDxy~1*}HU>@{Ic^EYOtS@V^c+ZIF;m_k*?9KR_0*l~Gk>c^^hiP^bGzRi z5Ry5}1Cd77@sPW>BYKzG%k0{?swuTW>d~vdeoEJ@U4HJh&x51aD??Y?h3`7OhE?vo zwRfkr;E%U^Hc#Hc+&EqBS?JoTjU{uL8XxqXPv1Rq$$(U$}8=!{7EF&X4v^v;FY$SoohSpDkr3*LJS>I=3#fX8J!pk)zW)yrv7K zeJl{;I(&AXm-r;Hu0)k>cYKvUN-w)TRi*A|nf;6-`V#p&CPx_6FLq4&9qy)bu5O`W zBLCcrM~{WquDtKH-6QBv+W8~3lZ522uhR9lJG%afnq0^wr;W?}Z(Gcmw)M-_zXihE zzr`F05Z?adf#=fCv+`@M&hneKI`P7*$+pp3=1iz?eeQjAL(k5q{n6LLd)M!Z(P&FQ zqWjx>yL9~L#EBwuYv-`<-?%Ec>e7cz6#ayX>{>IqCG;T}3fo z_ul?;KHklCa_v@0n=^aXvdU%Mn>MXu${y=4%loFSOT6Ip0Lb3D>hIF%h#S*^;=fDF z-9F!9UjB6N(%PlgHzJrPUzeJ(XOf{oWxN5a-^pr)8RfoHzowrJI#je--Sj>CLFc=x z(x-8(KR&HU~h~SZ@HDUS3GcEdOYIF;TL=#514!PZ(Q-=#pCdz`7ipO zdG&9eFp)3(d(!Tf^n$Pb&rG#!FDbeGGMiPtYIDb{uD%!Hwi>qg!fY?3%C1^B&5j2n z&jAH)eU+&eoU-DNPR0QsPqoA~q9i4;B-JXpC>2OC7#SED=o*;o8k&R{8d{lJSeY0B mxmE@S`Q=sqC>nC}Q!>*kachv%I`kQ+fx*+&&t;ucLK6U*S4OV@ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.scale-400_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3109e7e2233d073517048f188118fa2789cceb GIT binary patch literal 1205 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y1xT{))42+ySkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz@Q!n!i?t+M)Uy%*-JcqUD=#K6G3!qdeuq~g}wJNvUl0wvl$ zng{Z5WQn?L@L8D@pu(uERmCo*q~&Clf1t#3<{|D2r@W-4b(xenni6;%rIp1zmrn{U zX3R5@W^7ocZ%JGoNpN`sU3!8%yh%Gw1YzJckY(ZqK=(TpH3+@kjL8)jM(J zk^H4=*6q1|#n-Im`RjidLaW#8lkK@z`Ih_pWv#M3ih^<5S6`0Wu=Y}Z-Q>;*mC|Vr z!q-CI*gxpwYrpf%tv6xiV&!e3Z{F{hE1NAXwqrxxv$yRX7gT2*-Shq10RzPi#!S}A zsDyF+Op(^o-aTI=yA7M>3f_=xocng`x(n}SXO{IOq_dQ{p%Q8PE^OGbKzowh>(n=U zbEce{{8a6~?}6Doc3bryDNj8ReDwdao_5 zzxeHw3WaYDaJx<{Pg?vyTq;}jw7ThAdk!HXn-704rQf+2@@B7J)JgXh>nj4LWPfN> zDoYTpJ-U~xQ@Z++n0>*s&R~u?rH@RQ(&t!AJ#bUaPrYDSXE4{C)JI#G(q~v~JrF8< z{s`aoJ0SX)ACQhz^)oJT>kQ_d#uoJR^NKQZ0^N~m&JCjo(~WIn>#I5w$<&c54-og%U1)}9?99Xcgp^b2-Wxc zv0j$zXTE-ODlYWXzblq|JEc^%+;S_h{(Mbr$J)wlE0>UyyH{y`SDY^7icOip|RxpRQ8%tPt@aJ(`tH5`fwf!LCGh`I z`ex^rdawHT)H{V|vlYJ8xm~)dS-W9vlKjEk#(WvbG=zrS{FKbJO57TBv*h-Gba=Y@xvXSriH3a51_CT^r)+trA+XS~rcpgu z`6EwU!U`TyQT`o2`i{0}aJ95e^xGZRxwZG|UxC2q>F$x!3Z(BF_1FIBdmdEU=~HYh zHvK{kpV?sp4}s$wUt~T}liQX#E9m}rk8^@tvzASqq~duZs{6}~fCE=bbyaP0Z!7)f z-S3nzFWqA4B8?_%2G@|#sc+^yx3qjdL2mQ!PS?N-7JVLK7XRmzA2Rm4d}L9N;Uev* r>>a!{N(GHyXX&2a|8l|hg;%(zoJ?6<^*nM8&@&94u6{1-oD!Ml9uiDF5-Yx&qAEeOotwy`xXciEvH!}W~c z4p_$+CpTK={(C0A;!4MC$@Zr0K$obNxJHzuB$lLFB^RXvDF!10BLiInb6rD|5JN*N sQwu8-BOuqxz#zZ8${$5TZhlH;S|x4`a$1Kz12r&sy85}Sb4q9e0K?US4FCWD literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-16_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-16_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..26ae28f2a0b12cfd4c2050e0afb1b7e377c2b7c2 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=fx>SriH3a51_CT^r)+trA+XS~rcpgu z`6EwU!U`TyQT`o2`i{0}aJ95e^xGZRxwZG|UxC2q>F$x!3Z(BF_1FIBdmdEU=~HYh zHvK{kpV?sp4}s$wUt~T}liQX#E9m}rk8^@tvzASqq~duZs{6}~fCE=bbyaP0Z!7)f z-S3nzFWqA4B8?_%2G@|#sc+^yx3qjdL2mQ!PS?N-7JVLK7XRmzA2Rm4d}L9N;Uev* r>>a!{N(GHyXX&2a|8l|hg;%(zoJ?6<^*nM8&@&94u6{1-oD!Ml9uiDF5-Yx&qAEeOotwy`xXciEvH!}W~c z4p_$+CpTK={(C0A;!4MC$@Zr0K$obNxJHzuB$lLFB^RXvDF!10BLiInb6rD|5JN*N sQwu8-BOuqxz#zZ8${$5TZhlH;S|x4`a$1Kz12r&sy85}Sb4q9e0K?US4FCWD literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a036a06ee23b8265c3a6a40baf647c8869b23a0e GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_m~D5N7lZxp5pQ_}tUQF~q|E?3CTS%?1Jvge{j;?a)-TBhfmw#n5gu{(*$qs zdCIPM!k0twgZQ@`v#j~;IWjlpTU^XuAGYB1`5C0>6M4`wJUjThX__CCGRv%GfxFoQ zLq*g2li$_{ibO?CQ%&oCD6_)m{MIQ!T{r()I31fI<`&p;^KXRHgrkLPQamShBuZ@9 zB(MACciibqCZdlmlAcOL-PpD^e49?AzR#Mt>!nGv)ZYA!m^>r#(Owz9MSAVm|I~5% f*W8NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`&*s!i>HlH;w}Z*-JcqUD=t>XyKl1dScAiW85xZiQTK7BsD{-?CpYMqIb zLpnD)>Z~~RbP0l+XkK&ybLU literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-20_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-20_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a036a06ee23b8265c3a6a40baf647c8869b23a0e GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_m~D5N7lZxp5pQ_}tUQF~q|E?3CTS%?1Jvge{j;?a)-TBhfmw#n5gu{(*$qs zdCIPM!k0twgZQ@`v#j~;IWjlpTU^XuAGYB1`5C0>6M4`wJUjThX__CCGRv%GfxFoQ zLq*g2li$_{ibO?CQ%&oCD6_)m{MIQ!T{r()I31fI<`&p;^KXRHgrkLPQamShBuZ@9 zB(MACciibqCZdlmlAcOL-PpD^e49?AzR#Mt>!nGv)ZYA!m^>r#(Owz9MSAVm|I~5% f*W8NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`&*s!i>HlH;w}Z*-JcqUD=t>XyKl1dScAiW85xZiQTK7BsD{-?CpYMqIb zLpnD)>Z~~RbP0l+XkK&ybLU literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..931b46f231819bf206e1d4b7f7e3df2ed770ccde GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85r1;K$y{@YUXXA25wIm#}E(iw^MAnnjHjM%Zu4^b!^@E6vVV5 zZgwO*ox7)HZSADj5uNrLK66S%t{>^J_ngY#R`^}_y`}bve`^jhKDhWbd;gS&b2j@e zzgiu3?v7zXpsivbuYt^cxLYeM5DT{**xwkENXDs7PjlA^E za0#b~tDvoK@Uva-EGGv{Sdbgd(d6LMm@2_0;_CRyZV5w*+@e)lDUoik%Ho(N*qnE~ zyv0zZODSmEXQ6=WrV-OjXT9FVcXzu&sddnSJ9j?YWXx*2QtQFk_qgZTzW3el4Ozdl z)vo+-MnqGA=kUi1cVuSH*1al{*}BYg(jHUyZ$2L;*I(RQ|A))`RsFPtH=Gw4pFLS; S=9mKvD+W(jKbLh*2~7aoL6;H$ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..41c3aee350233cd2ff70c74a145c20a9ac7692b5 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlkv$2787-=2-UbS?mw5WRvOi(x&rHQ53wON;ef660rOrG~ ztxYRT{B8=I5dA)N>Z@roQ?s?AjPf-z)+M+IB(ckI%#|(OT)M-1R#tM6Bgc8J2Ia;1 zaxW)LkQSC!I2OYgaif8;nn908*J0B7m$%byFbRCjwG47Q)0nCz{$7dMX0!ND^>+Dt zmsWb+-|_!9i=6IH<1Z3Pl@EbVS1oakC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE}E) qRwl+ku9bnoNruATC>nC}Q!>*kackHSd(s`Kfx*+&&t;ucLK6TOZ;$o> literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-24_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-24_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..931b46f231819bf206e1d4b7f7e3df2ed770ccde GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85r1;K$y{@YUXXA25wIm#}E(iw^MAnnjHjM%Zu4^b!^@E6vVV5 zZgwO*ox7)HZSADj5uNrLK66S%t{>^J_ngY#R`^}_y`}bve`^jhKDhWbd;gS&b2j@e zzgiu3?v7zXpsivbuYt^cxLYeM5DT{**xwkENXDs7PjlA^E za0#b~tDvoK@Uva-EGGv{Sdbgd(d6LMm@2_0;_CRyZV5w*+@e)lDUoik%Ho(N*qnE~ zyv0zZODSmEXQ6=WrV-OjXT9FVcXzu&sddnSJ9j?YWXx*2QtQFk_qgZTzW3el4Ozdl z)vo+-MnqGA=kUi1cVuSH*1al{*}BYg(jHUyZ$2L;*I(RQ|A))`RsFPtH=Gw4pFLS; S=9mKvD+W(jKbLh*2~7aoL6;H$ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-24_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-24_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..41c3aee350233cd2ff70c74a145c20a9ac7692b5 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlkv$2787-=2-UbS?mw5WRvOi(x&rHQ53wON;ef660rOrG~ ztxYRT{B8=I5dA)N>Z@roQ?s?AjPf-z)+M+IB(ckI%#|(OT)M-1R#tM6Bgc8J2Ia;1 zaxW)LkQSC!I2OYgaif8;nn908*J0B7m$%byFbRCjwG47Q)0nCz{$7dMX0!ND^>+Dt zmsWb+-|_!9i=6IH<1Z3Pl@EbVS1oakC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE}E) qRwl+ku9bnoNruATC>nC}Q!>*kackHSd(s`Kfx*+&&t;ucLK6TOZ;$o> literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f89467e732044c8525a4304a73eb8d32c687197f GIT binary patch literal 2701 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 b3|~QIYFx(`YDI88 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..665dfbe3a37d5360daad034f6b9b38bcdf5fd14f GIT binary patch literal 2082 zcma)-doU)5Oe?!bS4tO_e@3y7xEP8j;CV*aBJMyu)Bs==OIxcj^t{u zFrlEPY`#BaZ({+ZY$p+pk}nR5{&4--+iT~$g%MeV!-;`PJzB2QpuUMQXU7YCFehv= zBMeo$m4Y=?N;saFI_P!HDVKRC9rdDutb^J%u573qYKkltOjPW++RKl+JASHbpkr8g zTc}w&_fCNPZu8;AhnTK4;ra*La#}`f!bkaL4Hz;9Ac#;;e_br+*!5M=sr#6>->}F0 z*0|q5ZE_X0`(ojVm}(5V?}j8i-X`u$Mv%Pak~ps~q9FdJ#{RE)eWyjN3)6KMzD8z* zDn&>0i1i;Eo@RN`Ni%Fo=<;&~<}+AWK?HZTG2)gBwvba3?mpcmDdTg(C#P;yE>(t} z6ZrNFR@hcjhDH+d&KT9n97CGU+&~-lP_trWZ@t8(UX<$lKEu8BPlp)kArVpTD~aAP zqPm#V+_1^2{w{ASZ+6v{Sus*^(~F(!&{DOX(vN-2_UThpVQdVVh5;{8DWga{9id|d z->mtc`Tvh>9<}g`UG5gle@C!K|A}Y5LH?Z-e=Zn(q5aATGb7xbd35gC8)n{h5MjpB z7C$-6L+#CJS-!ne9B4-hk&od`Dz2}1*@`aL)Z)`n)K3y; z_o?l3&syX=(O4Y(cv9`+<n<+vt zJiM?>X!aI@H9=i^=bHT}D;B8j-uBWTkz}nv&1@64t?AC2uxD<5CoNTXl-+3HhjCW~ z$X2RdtLEi^|-=xezQ4s5qk#nGcw=ko9=N!S>&#hiWoTdJ?AIpANjfQ)rW~M1I`W|W~614l;`!AYQZVO*IL(OPv^Oj(ZW;~w|$_^FxE9t`@v^AYFLm6Cq z9S(J&XY{^hYw9^Gkp>>&G*%OUKp9*a&)HjE?N<7$CM`qq?T*7|-{;u}A7p0h(zT_i z4v)8#ms=a`v~L~qP4e_!EpdD>YgbFeqOis)B zMbU3-H@Y*OX6Im&;Z<#!4ar6623kT?bA_zOv}vEGVLz(5Qq~}5jnK%Q#vr!Z{RfvE zaq7v$JA~!oB>C=j6D#=?N#QFj;BYn7U}Z9Fn-&=KFX({qK^q#vlI#t&eFtceaEVgY zV5Jm4sedo#l9O8Cg`Ai`!TQNx#R)lSa&0(x_j(>y9f%H4K7sD_9;_;a{;wcJ>nQ_K z)v&39Qnu+%*s3_A4O4P( z=mQe>mWsGoUM~sq6{1G9F4H_5W+kTZ?5RWWN0tU@rAbHb$kCmJTf(^IU9hhW<1;jF zRTs=^cuK$-p$IKgpNHe0g?#nlN|yBL*)Ngv6DkMx9g$&iwd(Wr7M(h94p+sYR6eqs z(u*!?9Qsg|V(hR4tD%jX8CAqfjk_Z4TKO2f)H%=!6BdptlLZ^!*&_K4!2{!xZ3zp= z?)AkYcjeMUP#ywwU5l+Ca3N`_4n5qrzO?r^O{6_aU6h47dE7kZQX z-+jfF%|7|THLr`s?08kWIM$u`A|mDfeOu8&B`oJ~1jpmbC5gKIPY&mUs`m7_%~_A0 zO-$s_1itKJx90qmpV~YO7G;(2)!5umLOq=6KEX(dRU(FE%d!#QkGF6AQac;2?kt=| z)Qn77MD?@c{aUHymnSOy9TGC-MlJvkCrI9Zbj~|e-5OO zSpg%h1E=;|)FuO0vT`P`bD$TJv2pgN;?4%d1zQK53x*6Z!I|I;ah8V0W@KYyYjaa; oGZVIMrm7!jVg&Nz{;BO66LUXiQ`fx;bviJvH*V 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 b3|~QIYFx(`YDI88 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-256_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-256_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..665dfbe3a37d5360daad034f6b9b38bcdf5fd14f GIT binary patch literal 2082 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1788b2253da4495fd211afb98c2892237a972732 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q%1+0G4}3eb)X=7iKnkC`xACPZY%9+`zD+R3jOqSaSX9IeRZlK|3L?dw)>Mj z0w!+oP+?oF_sCvCrOwCqFZ11>(q+3F*DW)O(ovcy(b9SSLUxtA^4@tz%bnlf`*!l~ z@7ljn-6!N(nXmC|3pmc;8YyM|{rg?t+BM-Xr-`S#RwXdEEU;o?JF`ep=fKI@tm9{j z69Tjk=loB5uDI&f4v#-mo^*Xncih+e;!>i>tO}dLpDLbgYhE7SSx_nXSbW=;#0$dr z_-7_ORo!SPws~vZ$^%-{lkV?a_nhTx$>!KcUJKThTuzVr@qV843uXqj8J>N&R@w=N z9&qm|Xj;ACfT^fo$ja4Uq|at S*pu!+4Gf;HelF{r5}E)9@51H) literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-30_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-30_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c78011e6c57d817c0e5ffbb4bcdd24da21f8c2 GIT binary patch literal 491 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGdIRF3&IRRbWvnK!m0f0$FK~zXf?Upf* zf-n?-%iVMr5{65R0}~@|H!6caz?t9S?jK;oA7jGc%zAN9MiK|&bPR}hVYu}A>N{hl zsEIA!;Fmo6`r729*aGB1TNsp5i?#18o_R&WY&Lsy9Ov70-7hRjNs{C>P1BdrX!MCC z89yvOK)hs0kCz%43~=fsX#!S!%y>M8J3u|pqucEktLhQN>-CyT|3as{w&E}hsbLrgIqdqPC~#CAH8IeJ zTq*`m<(6g9&1Qq6x6>#Ff*?4EA#B^mk=to}fRtqkZzb&QVVeyz1>gk;Fex1lhr()o z-^Wok)Wk9=+;Y_j;;O3n**%uRCX+FlOoVyo0_L6~{Kt8olf`0zJwlk2uqPSzM6xWy z>@u>sg1Fo5k|>Hur_&+R>9kP_n5K!@Wn^=uZzm|RGmJewNRN|lDFEWtK5dodRiC$t h;h(qr^nrE=`32Y>^OiXl$msw8002ovPDHLkV1juT*RTKp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-30_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-30_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1788b2253da4495fd211afb98c2892237a972732 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q%1+0G4}3eb)X=7iKnkC`xACPZY%9+`zD+R3jOqSaSX9IeRZlK|3L?dw)>Mj z0w!+oP+?oF_sCvCrOwCqFZ11>(q+3F*DW)O(ovcy(b9SSLUxtA^4@tz%bnlf`*!l~ z@7ljn-6!N(nXmC|3pmc;8YyM|{rg?t+BM-Xr-`S#RwXdEEU;o?JF`ep=fKI@tm9{j z69Tjk=loB5uDI&f4v#-mo^*Xncih+e;!>i>tO}dLpDLbgYhE7SSx_nXSbW=;#0$dr z_-7_ORo!SPws~vZ$^%-{lkV?a_nhTx$>!KcUJKThTuzVr@qV843uXqj8J>N&R@w=N z9&qm|Xj;ACfT^fo$ja4Uq|at S*pu!+4Gf;HelF{r5}E)9@51H) literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e195a888f5f7dd7420505b44ee4bd93eb0adeb9b GIT binary patch literal 430 zcmV;f0a5;mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGd*Z=?t*a63&xvc;I0YgbdK~z{r?Up@` zgD?BGbDCjyx#5Ks~R#}NdS za`1hh;8+RjPk??3Uhf35EMv6`a00iaX$mL8DoGMteIA^E>$;P`9uk~D*LB3U?U_Uz z$Jmt*CjjgzArt^a5}xN_R~~l-fVORkX__;MFbuIPhlgK8!!T&$IO6PzWm!0q1d4Dp zO+yUBnB9F8Mc9>xP+%FZ>pCfl0=shI1pX7=_x-eQOTqpnoPgsv(-R;(&vWeX+`jnM zTEeZs-9qqMI3NmGt0nvjrLJpIRTa+eBjYW2iJxQmcdCjD2%KTSruzb!KiA=h_eIlw Y0e<5FT9O;O7ytkO07*qoM6N<$f@S-#00000 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..efc5601809454e3b8d083828e286152c8639adb5 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SUOx&gwB#~18e3lwB8@$_|Nf5OhkEvof-=?oK~&|Oa##}JR>Z>QSw9Wvl)ji24g zyg_klBlCtLwj+{J8^7}C^u#c-NJr-%l$4klVYP9id6mve4V6Dv-W_PzYccVjxOL&A zjth}%uKZ_UxUq<7cH9O9Cb=2wH*`)s*dcB{<2aWkgTz-km)1>!UnCdo<|%rj)M9;^ z)w4+QO~dv$cK4vR70rt0`8G~sJks&(L7&A5h6f$u?KkQRV{IiC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE_&~RwhP3 mu9bnou1FU)6b-rgDVb@NxHX(+`LheCfx*+&&t;ucLK6Tf9;rzH literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-32_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-32_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e195a888f5f7dd7420505b44ee4bd93eb0adeb9b GIT binary patch literal 430 zcmV;f0a5;mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGd*Z=?t*a63&xvc;I0YgbdK~z{r?Up@` zgD?BGbDCjyx#5Ks~R#}NdS za`1hh;8+RjPk??3Uhf35EMv6`a00iaX$mL8DoGMteIA^E>$;P`9uk~D*LB3U?U_Uz z$Jmt*CjjgzArt^a5}xN_R~~l-fVORkX__;MFbuIPhlgK8!!T&$IO6PzWm!0q1d4Dp zO+yUBnB9F8Mc9>xP+%FZ>pCfl0=shI1pX7=_x-eQOTqpnoPgsv(-R;(&vWeX+`jnM zTEeZs-9qqMI3NmGt0nvjrLJpIRTa+eBjYW2iJxQmcdCjD2%KTSruzb!KiA=h_eIlw Y0e<5FT9O;O7ytkO07*qoM6N<$f@S-#00000 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-32_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-32_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..efc5601809454e3b8d083828e286152c8639adb5 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SUOx&gwB#~18e3lwB8@$_|Nf5OhkEvof-=?oK~&|Oa##}JR>Z>QSw9Wvl)ji24g zyg_klBlCtLwj+{J8^7}C^u#c-NJr-%l$4klVYP9id6mve4V6Dv-W_PzYccVjxOL&A zjth}%uKZ_UxUq<7cH9O9Cb=2wH*`)s*dcB{<2aWkgTz-km)1>!UnCdo<|%rj)M9;^ z)w4+QO~dv$cK4vR70rt0`8G~sJks&(L7&A5h6f$u?KkQRV{IiC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE_&~RwhP3 mu9bnou1FU)6b-rgDVb@NxHX(+`LheCfx*+&&t;ucLK6Tf9;rzH literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..153e67c4ebb6f832aa8336f60ba379d186abf9fb GIT binary patch literal 474 zcmV<00VV#4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dGk}K~z{r?Upf) zf>01ZKU9JoftDUgC_DvsacfV&0jP+#u)%_G0(ue?dkLM9YL(AqA#4C35u5uh=Pgtcs*i6s11Pmh{a>R65Uw*$H7!<@-4S^XpKb zp`L=z8S3--EbjL^t)_z&IvftdvMjOPZbhEwv^xZuUINv+pw$g+$whUcXaayp$r z)3lZp&e&Kp_4dWM*=&SqnzU-T-EQJ?xzK80NQ|W@3UFPw)g27q_bFp|o(gd?tJMm^ zFrC9t(pWx{1mSqW^=hX%H zb&sNm?mXxB2gwEpyNgo${T|{trk&Re`N)=kjPIDG&{uOg3+Cjq@R11d4gCS2#Vx?O QD*ylh07*qoM6N<$g765=6#xJL literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee49b96db01a6c13352c7fc7837ce0ce38ede6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FLRskWe64^V{Rg{O;Sh{y4_(;WF29R*zL zCwD|}vQOyPE8M}_X~CwQJ?B8@9A_oHhiqpeeCM4tNU1WoyLU$G{n@Lc_JoA~FS)hA zU={155CN67uKyUOtjx|$xobAbr?X15JcT1=NrCLjEZMz{zp|1!SBqS@`(s^Eq-{NUid3HjJ z&NjAhd$%}shP3zh)btr0oxi_sw-ieV6Uj_v*5%&)Q-yoQLAj2Z&t~ay3h|cp=wAMB z7Iien)Y!_z7|69UFfe@3#egTe~DWM4f?p~>u literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-36_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-36_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..153e67c4ebb6f832aa8336f60ba379d186abf9fb GIT binary patch literal 474 zcmV<00VV#4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dGk}K~z{r?Upf) zf>01ZKU9JoftDUgC_DvsacfV&0jP+#u)%_G0(ue?dkLM9YL(AqA#4C35u5uh=Pgtcs*i6s11Pmh{a>R65Uw*$H7!<@-4S^XpKb zp`L=z8S3--EbjL^t)_z&IvftdvMjOPZbhEwv^xZuUINv+pw$g+$whUcXaayp$r z)3lZp&e&Kp_4dWM*=&SqnzU-T-EQJ?xzK80NQ|W@3UFPw)g27q_bFp|o(gd?tJMm^ zFrC9t(pWx{1mSqW^=hX%H zb&sNm?mXxB2gwEpyNgo${T|{trk&Re`N)=kjPIDG&{uOg3+Cjq@R11d4gCS2#Vx?O QD*ylh07*qoM6N<$g765=6#xJL literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-36_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-36_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee49b96db01a6c13352c7fc7837ce0ce38ede6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FLRskWe64^V{Rg{O;Sh{y4_(;WF29R*zL zCwD|}vQOyPE8M}_X~CwQJ?B8@9A_oHhiqpeeCM4tNU1WoyLU$G{n@Lc_JoA~FS)hA zU={155CN67uKyUOtjx|$xobAbr?X15JcT1=NrCLjEZMz{zp|1!SBqS@`(s^Eq-{NUid3HjJ z&NjAhd$%}shP3zh)btr0oxi_sw-ieV6Uj_v*5%&)Q-yoQLAj2Z&t~ay3h|cp=wAMB z7Iien)Y!_z7|69UFfe@3#egTe~DWM4f?p~>u literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..65b26da3965040a745f1166a929e7f2e00ac1eac GIT binary patch literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGgP5=N5P62;+j3WR50fqbioh}>gpJdp#ZcNZo!_(n?#*LB%Qb8M95$=nSDl@c=x zIvyX5#dty3ceOpA8S{5g^&y#?|ND@fPA4Z#Q#QU7IO0c|rXkDa5{{mY$K#RTnIBYe zwOTQ`?|P*qD!AM22z~P#A&CkC`~6;!^nITk4hP;b4}*e$36i6N04537o6UxI=w(t6 zD9ciigxYSmyh9&Sf_>kUBuNCpAP9JeJ|+c0F3U1O&htD{*ER3b$EYC4<#{g1Efxz> zRTb~j%b?(p9K6Kaw&h*=K?R58!Y~|_>$*I! pZXoyp6Lx79-~?_Ki)9$c`2vYH+1C3(JNW!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`M9lgIBv1#FfcH(d%8G=cpQIw&Cu_#gFx#; zbA^iqJtiKU<_mfkI2LenO=0p<>5^$=(mSZAVZkXoN%>-~$U=>uniH<6Md~YBw+fyy z$zK1b(&qKl+!N+ybN24%@Vd^GWXpJE(%NFj@MR1BUa6gsqHCJ+tf^Bze#+d}{}xG{ zi$1#FsdVol{RaX5Qeu-o+S;eFow3Ngt0$^~CNtsXeDd zzQ?K@oPOqT9;@63E*}e@k~HmrFO^H?=X`x;`-gXa!^+j-Wu{jre%oVl_tt;?!tV$8 zU+_gJFZa0c5*SLVC9V-ADTyViR>?)FK#IZ0z{o(?z+BhRB*f6r%GAQj#01E-GBDs- h?q7PXaYCc)I$ztaD0e0s!Dayr=*G literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-40_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-40_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..65b26da3965040a745f1166a929e7f2e00ac1eac GIT binary patch literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGgP5=N5P62;+j3WR50fqbioh}>gpJdp#ZcNZo!_(n?#*LB%Qb8M95$=nSDl@c=x zIvyX5#dty3ceOpA8S{5g^&y#?|ND@fPA4Z#Q#QU7IO0c|rXkDa5{{mY$K#RTnIBYe zwOTQ`?|P*qD!AM22z~P#A&CkC`~6;!^nITk4hP;b4}*e$36i6N04537o6UxI=w(t6 zD9ciigxYSmyh9&Sf_>kUBuNCpAP9JeJ|+c0F3U1O&htD{*ER3b$EYC4<#{g1Efxz> zRTb~j%b?(p9K6Kaw&h*=K?R58!Y~|_>$*I! pZXoyp6Lx79-~?_Ki)9$c`2vYH+1C3(JNW!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`M9lgIBv1#FfcH(d%8G=cpQIw&Cu_#gFx#; zbA^iqJtiKU<_mfkI2LenO=0p<>5^$=(mSZAVZkXoN%>-~$U=>uniH<6Md~YBw+fyy z$zK1b(&qKl+!N+ybN24%@Vd^GWXpJE(%NFj@MR1BUa6gsqHCJ+tf^Bze#+d}{}xG{ zi$1#FsdVol{RaX5Qeu-o+S;eFow3Ngt0$^~CNtsXeDd zzQ?K@oPOqT9;@63E*}e@k~HmrFO^H?=X`x;`-gXa!^+j-Wu{jre%oVl_tt;?!tV$8 zU+_gJFZa0c5*SLVC9V-ADTyViR>?)FK#IZ0z{o(?z+BhRB*f6r%GAQj#01E-GBDs- h?q7PXaYCc)I$ztaD0e0s!Dayr=*G literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..03201095aec16fe49a5a1814e667077c533f5dfb GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nDq z!Y~kk(?vlLJ$aHv#G?g|J&E9P_bt5mU_OLreGpOUB9`8Y9%VLD$8}em^iP^($p?c| zo9KKtlS-LIF%AGwY9?>=YAjYjH7M}O!{>p`kSiR=i6iM;mMA$NYyQ9{#^jwxZupnS zuSGY4vhz7U3KX8Lfq-pdTlD*V*lxEpLJx#Xh!;!Q9b87!=~S=fL?Ta| z&u8GpK3xS2otBeO05L&ADuC!Nkt%@5B)sre9D}Fp4Lli|cQVmi8-HS(r0O5_Av`-8jS@d>GMU8NX&Om$%Y+Ew zHrnlWDZ9gqXUpZ1HJeR(M*~RYiN`x{-Zg)l_o@&feJa5v*ladqm&=7M7K_}!{O#Fi zStKRe$12MC7Xn|`)JS|3m}3$jng!N8$0oiW8j5XV)mQ=57%srrH(NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiUahvM&J4r5PU|`hnba4!cIQ(|n#w;dBfwuow z_1YskS(;?*ImvaB#T+y3GqTAKaZMJunY?%1@ruO2PZ;FSsFJFE4k~g;IW$EQDcb?yLELh#~ zp~C1n@QCMH0xm4U$*_bp8*8glbfGSez?YiO0? Ru>)#g@O1TaS?83{1OU=t*jfMp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-48_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-48_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..03201095aec16fe49a5a1814e667077c533f5dfb GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nDq z!Y~kk(?vlLJ$aHv#G?g|J&E9P_bt5mU_OLreGpOUB9`8Y9%VLD$8}em^iP^($p?c| zo9KKtlS-LIF%AGwY9?>=YAjYjH7M}O!{>p`kSiR=i6iM;mMA$NYyQ9{#^jwxZupnS zuSGY4vhz7U3KX8Lfq-pdTlD*V*lxEpLJx#Xh!;!Q9b87!=~S=fL?Ta| z&u8GpK3xS2otBeO05L&ADuC!Nkt%@5B)sre9D}Fp4Lli|cQVmi8-HS(r0O5_Av`-8jS@d>GMU8NX&Om$%Y+Ew zHrnlWDZ9gqXUpZ1HJeR(M*~RYiN`x{-Zg)l_o@&feJa5v*ladqm&=7M7K_}!{O#Fi zStKRe$12MC7Xn|`)JS|3m}3$jng!N8$0oiW8j5XV)mQ=57%srrH(NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiUahvM&J4r5PU|`hnba4!cIQ(|n#w;dBfwuow z_1YskS(;?*ImvaB#T+y3GqTAKaZMJunY?%1@ruO2PZ;FSsFJFE4k~g;IW$EQDcb?yLELh#~ zp~C1n@QCMH0xm4U$*_bp8*8glbfGSez?YiO0? Ru>)#g@O1TaS?83{1OU=t*jfMp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..acc3310df63c2291a0a7410caa592290325da6f9 GIT binary patch literal 708 zcmV;#0z3VQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGma{vGma{-JZxd#9M0$E8!K~!i%?V7!6 zGC>rEX9Wd2(JGDLEeIAuQhEUv78W*EHeaql1iQ2W(aImR_9~Jzf{GVlnU6FoR#rNh zvpE|=ob2q+gv{*D11CGX9$xlgv&R)B27|$1FsOqCe<-E5Z1V)`Fj$ry2YL23ERyr? zSl+Y6!v3+HM^+!{Ay8ZxLheEMKU>_`heD#bFz^P#($X{#CJEfe1|uAGVkZn!LEc2r zfcRZunQu!vV1`!IF~U49mka53yQEsJlFep=M>Pe8mK#i#wpuM1Y<6Wb8M;_3@KybA z6+WNOwApNa$~u+JX6bUd#4f#X6`svzSF%p&D(!j?7YYTENbpscqLax4 zyVW9)Ffberh0^o+9J|#aurSc+bhxrk<@0&$RENNymf(S-*X!XPpIWVkD}_LDU#!<_ zn#<+5SJkO{y^h^#;ak{?Y@^Y@ZuRgbERuym)o!=3TTMI*dyyRs2H34Go`jxfJFjG2xOsw!=tSa?=EQk;>HkdXL*@rLAt3brE-M;(rKaILCWb4l9$ zq-##MOYOWjQNKzokLL+FZxN34&TA6BlOXV-p|m&U?HtW#r5q19!eqC-kmT8*vP;ik z(`)rv?c&TAuZhaeI~ZzPy&=*2c~Z6H>AdCjQwp0HQ!EbhhDj}-JNfX39+jWROfOb` zc^>vQ&E|PIPvnb(w{_enZwY?vej`Z#xGvXPsrSV(CwFa(`t9shk`d6#$FF^1a$Uho z!}5}Z`P=SXZ9KTnJ^$r_g!xx1y4e0#S&6=|RK9*TSHV7a>UzI@;ZmmGZhH5IzTGr! zdErfiH=Elx-V|7K=+}lhbJemQrt;10-6Y+}d+}WDp2j^_Hd`EMJtyDDYR9pucjCtI z$FBFfr-hVAoT)s{|L*DUs+|{(=Lf3DbcK;l%`<+L* zA4zPQzGC8StHevkC$Okngw-(06rBssx9Tba#*J!;YeY#(Vo9o1a#1RfVlXl=GSD?J z*EKW=F*LL?HMTM_1#+zn41x^yo1tjP%}>cptHiBAIhVZ)sDZ)L)z4*}Q$iB}UXA$& literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-60_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-60_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..acc3310df63c2291a0a7410caa592290325da6f9 GIT binary patch literal 708 zcmV;#0z3VQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGma{vGma{-JZxd#9M0$E8!K~!i%?V7!6 zGC>rEX9Wd2(JGDLEeIAuQhEUv78W*EHeaql1iQ2W(aImR_9~Jzf{GVlnU6FoR#rNh zvpE|=ob2q+gv{*D11CGX9$xlgv&R)B27|$1FsOqCe<-E5Z1V)`Fj$ry2YL23ERyr? zSl+Y6!v3+HM^+!{Ay8ZxLheEMKU>_`heD#bFz^P#($X{#CJEfe1|uAGVkZn!LEc2r zfcRZunQu!vV1`!IF~U49mka53yQEsJlFep=M>Pe8mK#i#wpuM1Y<6Wb8M;_3@KybA z6+WNOwApNa$~u+JX6bUd#4f#X6`svzSF%p&D(!j?7YYTENbpscqLax4 zyVW9)Ffberh0^o+9J|#aurSc+bhxrk<@0&$RENNymf(S-*X!XPpIWVkD}_LDU#!<_ zn#<+5SJkO{y^h^#;ak{?Y@^Y@ZuRgbERuym)o!=3TTMI*dyyRs2H34Go`jxfJFjG2xOsw!=tSa?=EQk;>HkdXL*@rLAt3brE-M;(rKaILCWb4l9$ zq-##MOYOWjQNKzokLL+FZxN34&TA6BlOXV-p|m&U?HtW#r5q19!eqC-kmT8*vP;ik z(`)rv?c&TAuZhaeI~ZzPy&=*2c~Z6H>AdCjQwp0HQ!EbhhDj}-JNfX39+jWROfOb` zc^>vQ&E|PIPvnb(w{_enZwY?vej`Z#xGvXPsrSV(CwFa(`t9shk`d6#$FF^1a$Uho z!}5}Z`P=SXZ9KTnJ^$r_g!xx1y4e0#S&6=|RK9*TSHV7a>UzI@;ZmmGZhH5IzTGr! zdErfiH=Elx-V|7K=+}lhbJemQrt;10-6Y+}d+}WDp2j^_Hd`EMJtyDDYR9pucjCtI z$FBFfr-hVAoT)s{|L*DUs+|{(=Lf3DbcK;l%`<+L* zA4zPQzGC8StHevkC$Okngw-(06rBssx9Tba#*J!;YeY#(Vo9o1a#1RfVlXl=GSD?J z*EKW=F*LL?HMTM_1#+zn41x^yo1tjP%}>cptHiBAIhVZ)sDZ)L)z4*}Q$iB}UXA$& literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..01686eaccf76d5498ecf6a85d9ebef18c3172542 GIT binary patch literal 714 zcmV;*0yX`KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGnt^fcNt^u*3Y$pH!0$)i)K~#8N?V7ue z+CUVBF&!d^W<^KAThJlO6jXT%v;`#2&&R zKFD}Hrg!ZoQowvZ|Eu{R5Mw)$0$Qz>vH2jjONbOOnM{n0hhwt@)*688-PCwEwyp^* z0idiB*aAQqCBzZ{$|fPU0Kk#Z>-A`Mu}LHVa3plQU7B575(~KB?`kv}85<9$-|y2A z#U!x+013n4(Aao5tJR8*C?2VP4qva=%JF!ly?@i`bZD!9kcilv&u9M{M~VMsu~^U% z#Uzn{vNR833*aTnIFht^V5*mOI7H6c zZnu7;uf@|e4_@o#5e}?byWLLJ>-A^hB-i{a;S#Isz#%c>XQ$^30koT zhPhlW>U28MUOI~MHR%35PNP_y0G+SLrbuoO@cXeXl20sxcwGLc&Uc+}cvS#+K>SnZ w9RmDUq~aDq8pYxS&?pusfJU(h7f`AE0TOe>p7;90n*aa+07*qoM6N<$g6@$%XaE2J literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..63fb5b06cd7b7589f89bf6ebe388ea10e224e87d GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz#zO1gc&z3%uxplvX^-Jy0SlE=i@fj{o$%<%D}*w>*?Ycl5y|tbVEO8Ljl+Q zmlr8??d9;j6u6*(eVt>o%hV1nRnc;VC5syPE@wY>dUN_4}U4--Fb7Uz?*ew(`Lz4vmRtRp$^ z7wqbu%$TsCCe28+;SEFIOnZ(^;R@CbpX7cV7JZ?8fJ521#i4)JB$ef_-hE#^VWs5u zS1RKtv`ljSFJa5YFL)?bO(SE0!;@5;AM2ELtvx73*!_+LbSvomC{ zc*q?e9X9`sz%|1s^B&2*dt|D!|G6zg#pze?*>{}gD&P)@NLc$WHujiQ_=-(>`&X=3 zA^wX+bKmWQg))&mz_?H?ag8WRNi0dVN-jzTQVd20Mh3bD=DLO^A%=!lrp8t#ra-Qh kfkBYLelrvex%nxXX_dG&DCe?w0W~mqy85}Sb4q9e0A=FsaR2}S literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-64_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-64_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..01686eaccf76d5498ecf6a85d9ebef18c3172542 GIT binary patch literal 714 zcmV;*0yX`KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGnt^fcNt^u*3Y$pH!0$)i)K~#8N?V7ue z+CUVBF&!d^W<^KAThJlO6jXT%v;`#2&&R zKFD}Hrg!ZoQowvZ|Eu{R5Mw)$0$Qz>vH2jjONbOOnM{n0hhwt@)*688-PCwEwyp^* z0idiB*aAQqCBzZ{$|fPU0Kk#Z>-A`Mu}LHVa3plQU7B575(~KB?`kv}85<9$-|y2A z#U!x+013n4(Aao5tJR8*C?2VP4qva=%JF!ly?@i`bZD!9kcilv&u9M{M~VMsu~^U% z#Uzn{vNR833*aTnIFht^V5*mOI7H6c zZnu7;uf@|e4_@o#5e}?byWLLJ>-A^hB-i{a;S#Isz#%c>XQ$^30koT zhPhlW>U28MUOI~MHR%35PNP_y0G+SLrbuoO@cXeXl20sxcwGLc&Uc+}cvS#+K>SnZ w9RmDUq~aDq8pYxS&?pusfJU(h7f`AE0TOe>p7;90n*aa+07*qoM6N<$g6@$%XaE2J literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-64_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-64_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..63fb5b06cd7b7589f89bf6ebe388ea10e224e87d GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz#zO1gc&z3%uxplvX^-Jy0SlE=i@fj{o$%<%D}*w>*?Ycl5y|tbVEO8Ljl+Q zmlr8??d9;j6u6*(eVt>o%hV1nRnc;VC5syPE@wY>dUN_4}U4--Fb7Uz?*ew(`Lz4vmRtRp$^ z7wqbu%$TsCCe28+;SEFIOnZ(^;R@CbpX7cV7JZ?8fJ521#i4)JB$ef_-hE#^VWs5u zS1RKtv`ljSFJa5YFL)?bO(SE0!;@5;AM2ELtvx73*!_+LbSvomC{ zc*q?e9X9`sz%|1s^B&2*dt|D!|G6zg#pze?*>{}gD&P)@NLc$WHujiQ_=-(>`&X=3 zA^wX+bKmWQg))&mz_?H?ag8WRNi0dVN-jzTQVd20Mh3bD=DLO^A%=!lrp8t#ra-Qh kfkBYLelrvex%nxXX_dG&DCe?w0W~mqy85}Sb4q9e0A=FsaR2}S literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..110249863df597f565c86d78d0fa43b7449ee9dd GIT binary patch literal 788 zcmV+v1MB>WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqBme*wBmtWh#uNYm0;x$vK~#8N?VHPr z;y@IJlUW2eK7elActPLB7ns+Wjl#I=0iUAxBDnE__y~$`;Kpv(g5a*Ee!CnpGo|O` zQcb6FKKQXZrYhYZMP1TKAPAWVl~SfC*!X5Xg$IZr0ue+Yf(S$qfe0diph)MJ&YKSA z{9F=-;h)&P&m#`6anyOyiLeer;fGGH=wI5D^c5YgwLak*FA#*DQ~UTiKRgli4na;@ z_C$~j(i9?yKm-wpAOaCYfN8+Z@b3xIg9t_Pf;I;mc-XB88V zZv!`55GbRhM1nxsBqbIE$|Nb3Ai$LrhM^jbMy6KrNG%9(B_V^sz|<-hnFImfC1n-_ zxa%ZjI-QzY#UPjaLG^k)7!HSj{jdBHlgY%C3W5=p39OzUZD!-atadmYOs!&&S&;2E zh%Jz_-EK{-;*d#@?{YwDL0mc2YE|uaJ5#H8q!PrH({8tKGhC5LET~L!Kq5h9lLOd- zT+6`%($=1fBw4Jo1g+O=mK?06)Ak%&doII;b!M~Kv|c2hEOLOYO_$-q+G^Bl&mW`K za)QlfbK7!whY|G@^o&QF(X2h^j;(E%;le)Cc3UIQ*(%=dXM_v?Obuk*C3U;q+~k0N z{{YwFl1LD^TrNtFH|l&on!YgJm zywp3=`L5&PULh5DsTUpRCj{M&2zF$UCJ;dcB8Wf)5r`lH5kw$@2t?3Rg5WpJP|_;k S%6PH>00009In0r*OX-BxcT-_j~+b_5Vc9ZUN|(rmMucb&FedEGnc zF=x8wr0oxN&9x_O(pxcclfLG}PkLTUbmdtnJgKWGE3#34=pa*HXKNf+x&P(*%iyTZ>P^|{Koz>=5yEPti)Bh9w}7~ z>-Av1q@Wx%nxXX_dG&2(`+J12r&sy85}Sb4q9e0Miu{ AivR!s literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-72_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-72_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..110249863df597f565c86d78d0fa43b7449ee9dd GIT binary patch literal 788 zcmV+v1MB>WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqBme*wBmtWh#uNYm0;x$vK~#8N?VHPr z;y@IJlUW2eK7elActPLB7ns+Wjl#I=0iUAxBDnE__y~$`;Kpv(g5a*Ee!CnpGo|O` zQcb6FKKQXZrYhYZMP1TKAPAWVl~SfC*!X5Xg$IZr0ue+Yf(S$qfe0diph)MJ&YKSA z{9F=-;h)&P&m#`6anyOyiLeer;fGGH=wI5D^c5YgwLak*FA#*DQ~UTiKRgli4na;@ z_C$~j(i9?yKm-wpAOaCYfN8+Z@b3xIg9t_Pf;I;mc-XB88V zZv!`55GbRhM1nxsBqbIE$|Nb3Ai$LrhM^jbMy6KrNG%9(B_V^sz|<-hnFImfC1n-_ zxa%ZjI-QzY#UPjaLG^k)7!HSj{jdBHlgY%C3W5=p39OzUZD!-atadmYOs!&&S&;2E zh%Jz_-EK{-;*d#@?{YwDL0mc2YE|uaJ5#H8q!PrH({8tKGhC5LET~L!Kq5h9lLOd- zT+6`%($=1fBw4Jo1g+O=mK?06)Ak%&doII;b!M~Kv|c2hEOLOYO_$-q+G^Bl&mW`K za)QlfbK7!whY|G@^o&QF(X2h^j;(E%;le)Cc3UIQ*(%=dXM_v?Obuk*C3U;q+~k0N z{{YwFl1LD^TrNtFH|l&on!YgJm zywp3=`L5&PULh5DsTUpRCj{M&2zF$UCJ;dcB8Wf)5r`lH5kw$@2t?3Rg5WpJP|_;k S%6PH>00009In0r*OX-BxcT-_j~+b_5Vc9ZUN|(rmMucb&FedEGnc zF=x8wr0oxN&9x_O(pxcclfLG}PkLTUbmdtnJgKWGE3#34=pa*HXKNf+x&P(*%iyTZ>P^|{Koz>=5yEPti)Bh9w}7~ z>-Av1q@Wx%nxXX_dG&2(`+J12r&sy85}Sb4q9e0Miu{ AivR!s literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..81f6b28749e3428c3f24d988e33aeb428536e947 GIT binary patch literal 883 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

NxZ#f=Km^3@38TK6f2mwDF?j)f}_0V&CE) z?UyVsFMn<##hbo0>ZR)X)6YMj`}}$HzpVYL{}%npFzLEdQ&do}z+LizJUb`n=TkS! zo)%f=+sM7veY5`v(*v`53z=8CDb7la3w}O~-zz574NXe9|Rf zv3d>bflRx-TUPo7e-+zw(u*O(F8&R}g+CQZtPRhOALnz}_0!zkd`)-lw(f5W@4tV& zx2sQ-Vf)XL!gJI9FZ?;%%FgauwP@@UhIQ-L_gV{vl(=3=``no+ck)r!p0uq|rtc1T zPjvwb=m7<4Ot-}7y}tN5K1jPT_>la3yZ`@B@(Qik2ldEvWu{K(e2t+?cB&7_-`FXZy`^WXdVbLaJ} zt$Uspt(>m5{`%{m_B&Q8W{SOap5y)UN4e>t57R##5@;}BQQ%<&r5X)}DrWWxA3Ydr zqWc{W=-TrCSip8abnj% a7WE8&?}{s?D00<+1U+5-T-G@yGywo|#G>l} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7950c71504b71352e735c09a27c9e76a1878 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A}ZE2s6em5^e+vvX^-Jy0SlE=i@fjOZ2Je2WpD&ba4!+xb=3{YCmR2k+%Pe z2PY&r1UYg{S6JaXiGh>p_*+(i9iKQtK8aYkWL7jSTFJ)9#?t0AeZm$do+k<%jFZm2 zIpgWO zHdD#{+rm~oKSO5&jfYIhtxp+e>^Loc`H=A`w$dEKx%=dG=SY+ou8LTYEMTZ8ps--S zxEIqMPcSlEQj_TMS2jRjz;wz4fv@F2v(-5Z(m$|jRUA>)x-+NGLR^2SqQY1m z*Kb}O(Au;+qR}ai^&{8M&=&0D%)~r}D7D;Q+mgp#6yl+2bTWG#+qYkyYDpFEjR^^@BtAC;S)cKJs0>;9>r! zhrhXQe2mZR6~6C(pzr=N*0>sZ#*06GG9CK(ndQji_BFk2kKbFc)$hx^7#7GVUU&2L zt0Rwv1@DRr-`H$6qwFuWgH#3(uNI~>{Lr!BT7;dOH!?pi&B9U zgOP!efv$nMuAxbYp`n$jv6YD#kZWaNkbGn5Y7`B*`6-!cmAEwswaSVEH86O(`njxg HN@xNA!{b;} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-96_contrast-black.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-96_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..563108e90e9037ec6b9d9a5d81e44dd90926b4c2 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85m^SK$tOhk#Hje19OO{i(^Pd+}peR^KJ!*uoXxfF7SwrQs@jZ zT(Ck}mbrS#K1Sx~c}jPM;ug62RJMM|Pjc{z+%2rhanY-?*~?RP8qYi1XG&WO9^W{A z-A?ph-6hXFnVZ)w<=K)aJpkGX1`cUEz8w6#=liS6;i28*Pw3d@igywz6DcF zzevN0GaL!M@0uJ0m;~AwS`--)IUFRw%!{2H&Ttz1C}81mW;k?2&-H**A3_qWF5(Tt zuDk1sD=J=y_bMt?$sH)Itn@su_-|!*H}~IIj%L}0l|N@YaXj3}#F6!HnShhUMCKPI zR>#_AcQrL7Ok`dWqIE27e+Y+S#FNbnCQlZ&&pJFj{FnBPh0Pqf8zU-~2A!

NxZ#f=Km^3@38TK6f2mwDF?j)f}_0V&CE) z?UyVsFMn<##hbo0>ZR)X)6YMj`}}$HzpVYL{}%npFzLEdQ&do}z+LizJUb`n=TkS! zo)%f=+sM7veY5`v(*v`53z=8CDb7la3w}O~-zz574NXe9|Rf zv3d>bflRx-TUPo7e-+zw(u*O(F8&R}g+CQZtPRhOALnz}_0!zkd`)-lw(f5W@4tV& zx2sQ-Vf)XL!gJI9FZ?;%%FgauwP@@UhIQ-L_gV{vl(=3=``no+ck)r!p0uq|rtc1T zPjvwb=m7<4Ot-}7y}tN5K1jPT_>la3yZ`@B@(Qik2ldEvWu{K(e2t+?cB&7_-`FXZy`^WXdVbLaJ} zt$Uspt(>m5{`%{m_B&Q8W{SOap5y)UN4e>t57R##5@;}BQQ%<&r5X)}DrWWxA3Ydr zqWc{W=-TrCSip8abnj% a7WE8&?}{s?D00<+1U+5-T-G@yGywo|#G>l} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Square44x44Logo.targetsize-96_contrast-white.png b/res/terminal/images-Dev/Square44x44Logo.targetsize-96_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7950c71504b71352e735c09a27c9e76a1878 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A}ZE2s6em5^e+vvX^-Jy0SlE=i@fjOZ2Je2WpD&ba4!+xb=3{YCmR2k+%Pe z2PY&r1UYg{S6JaXiGh>p_*+(i9iKQtK8aYkWL7jSTFJ)9#?t0AeZm$do+k<%jFZm2 zIpgWO zHdD#{+rm~oKSO5&jfYIhtxp+e>^Loc`H=A`w$dEKx%=dG=SY+ou8LTYEMTZ8ps--S zxEIqMPcSlEQj_TMS2jRjz;wz4fv@F2v(-5Z(m$|jRUA>)x-+NGLR^2SqQY1m z*Kb}O(Au;+qR}ai^&{8M&=&0D%)~r}D7D;Q+mgp#6yl+2bTWG#+qYkyYDpFEjR^^@BtAC;S)cKJs0>;9>r! zhrhXQe2mZR6~6C(pzr=N*0>sZ#*06GG9CK(ndQji_BFk2kKbFc)$hx^7#7GVUU&2L zt0Rwv1@DRr-`H$6qwFuWgH#3(uNI~>{Lr!BT7;dOH!?pi&B9U zgOP!efv$nMuAxbYp`n$jv6YD#kZWaNkbGn5Y7`B*`6-!cmAEwswaSVEH86O(`njxg HN@xNA!{b;} literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-100_contrast-black.png b/res/terminal/images-Dev/StoreLogo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..c52aafcc5ddd969f598df095dd468ca02657f00b GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQHmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk-s=0 z=S@s5v*jjeY+`uzhV|8&2G$);H(7Z_1i2HKJv_cxlmxEullok2bCKtpgyt;cUelx2 zyT0F?wA4XC-~*>Jm%yQ?^Dch9qM^RfL)P=q!?><>&&*!EST5$dPS5$*q~dJPPXW#o zcI($I&c8pY-1fEW%Kn7o{$*~=iocfJX$qaREy?qemvikeFDCDK0!}42r}`vKnQ}S8 zThFwAO|55wqw(b}bK)3RAC-T(a8{Nna;stM`Uv2uOTJ(JXKcT0pkG+NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkK|O@ISc4N!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e46XM}0Q30wEoGbQaa z>D2jMZ9GkhSAnBRf#bi>yp5s)TOLN(o93Rn5FU}=y^P_4(A|x3D=)3x{)YdGv*fm^ ze&&;U8o#<(uesZuC%xlW(uGIu>;9F$p1-00_MFOD^(Wo)1Z6&U6@Iv6Up!fXLu`-V zlI3!vXeD;lZn^wxFJ)8B|?dj?{&vN$Z-G8uV`=0i=>F+z0W2*HGSOri9K!4 z_mp+3y8kK7{AY9XB+%PU3O9Z*_3rD=Ns&x`4Gd}364!{5l*E!$tK_0oAjM#0U}T_c zV6JOu5@Kj*Wom3?Vglq^85n$V-_nGlAvZrIGp!Q0hE^#aJD>&zPgg&ebxsLQ0FZU$ AMF0Q* literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-125_contrast-white.png b/res/terminal/images-Dev/StoreLogo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..5e741ef242fb7eca59fb4e94b1cb25b6af07c45f GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^_8`o`0wn*2-3S3vEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4zuQePiAs0}r4_?~oq$B&IK`%8uIq7lo3m&0YSC&TaUn=xUeuHSIsM9osST>a@2^;euHCg%uj)wwe}jzXynS$I-i67r{g)0$-~M`x z{dZ2wlT%e|WgKQE%A{@&`{SN%*;I7j`~0H!7x=#}W;>NTS@sX}jl_&QS(4)J_YVoN z8}U4PJ%1zPAGQag|9M|0Gw25&xLnPD;A%DBf$QST43lsCy3DZoM%5wfO)(AY%=cbi z7QHy|-Tf(-4lND#+;YaW=J`DvSL?Ko-Je9`lJxd2`on*AhWxyAOaJv;pDd-)*|r2a z{*Q`W$NFIJ-|2yJ5&i)`OwLu7?tMC8=?eG#TMSc77x!#GV;q;7_jbm@*V_-qbavNC z`Pg%sZ36mNfkW-vXZK&}^Z7#N0RvdI#5JNMC9x#cD!C{XNHG{07#ZjqnClvvgcurG s85mj_S^&9L1_qn+4=AH($jwj5OsmAL;gC_qe4qvfPgg&ebxsLQ070tYNB{r; literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-150_contrast-black.png b/res/terminal/images-Dev/StoreLogo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d843bd16ae1e902f4bc56158ab4a7ddf2a62b5b9 GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4EalYaqsO7d%wd5GHnm_ zb0aMnR%!7aIKb)P5!1ACjZSFfLl>SLkDfKQ49r1RWeV&LuY^=S88!$M-o5d0{*A-$ z-(J!3n}2KCBB==~o|AxR$^445v*tD~(Cp66I`_57>GUdt*KOhq9RITeM2~;dd3?8N zV?YM0^5Y#UoU8qBP2GA!Xd>&(bJtwHCw@A4s&re6=$x%bMbB;U%gwd--@ZqML+<0* z9~JNBE3baW`tkRyO=ns||1ErUV2*g9r0BCVSt1cPY@eO!;{Kd)w54)mSz@x?^8-rK z_qHV{+dTy`^h9oCtAwpjPij=<`@c8;!=>~c`M>KTPiAIs^Siku{)lP1?iJ4cm)`4& zmddd_JsA{e&N%J-Y*GHF2RAt%{1n=rSgWz3RXppv$nl9=A2te3ZE&?K$Z=3joY+4{ z!mKJ|+S8xcxTMc~|HJ%l$HaH{URk_#IG(({;N-?=oiNiI-}iq{y!*IVAf$KqK{W?Z z*Z`5tZ?=Z(pAIXOs{aN?iE4>!L`h0wNvc(HQ7VvPFfuSQ&^0jEH8cq^G_*1`wlXmV ma;*#uf(-VXp=ij>PsvQH#H~R&m%R(9fx*+&&t;ucLK6UHk@@Wa literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-150_contrast-white.png b/res/terminal/images-Dev/StoreLogo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8dac64a4fe876c72b2da84695e0a1be19cb46cc4 GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4a$xjrHA zSKsrFH4~!B#m;SB${}&-=Bf108D?vd4dHbhL@m~bjxXWCRrvGb?6yc7Sn>lWT&pLXEECdS`~ zJmn*pnpd(~pE$zxOU-HB)3qNz1fF<&vh>WFLwhzxoi})DUdUg{{Ix0Y=jPPKa-{*8 zI?|O{!y@qYXi&k2&(|sh^F8gE52Q3r$7I{ zw(!lVx2IPA^t)}5&$7YDY)QOwbJEr9>i;?^AC7!wj(J%%ee+gbhGcN4Osr*2y#8?S z)%xGjz(`Onag8WRNi0dVN-jzTQVd20Mh3bD=DLO^A%;d)28LFK7C^3*fx+hd1Ij2G ca`RI%(<*UmIAl~YAE<%B)78&qol`;+0OTC_6951J literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-200_contrast-black.png b/res/terminal/images-Dev/StoreLogo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb88aad7d15136791956aee314e3e3df8972d17 GIT binary patch literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^DImQK%ZOfg@eH3usM{92a#Ia#-@HYKeAwSL8Y0tvvDav#c{#U8yKo64>}h%KD_w%l*eExu^Ty4NMNteDmPs!Zu;SsmBC^ zmP_%u9Lk6g=Un2EjjG5J@On;ZDVA^7n8j%N)!{@vQE zZv669s$kRE^htA7#HPCSuD2%^+V;P@ek)Q$ z{)3L!<|&ojWME)??CIhdQgQ3;ti67R4Mg1X z1y>0O87pyfS3eYF2rPA6b!4@{=8#2CO)D7ZEn5*P&Nl0vjwrXhGvmc$T-zSs|1{Uf zH~F=k^}cPBI|Q6K6k8y~C)a4XB_c0mw7;y|s$n>N;+D6rZu1Up(l%Vfy){%j=+wk@ z#wM$>Ba#$b*K*jjr3Nl~_egefRZyGKO2>&;R`^O8oQQI4O1*Zfe$RxZ^wTM#U~Y7MYi< zvZGC2aOyE>zuK%H0)d%6fj_Pm=nHus2Aatm&oBSQm_WV#+$~;?ITs`sljg7mzmgzdrtd5)YT6TTW z{U?uo5K*xywT5X`$x)Y(Xq8*Q6rft-8c~vxSdwa$T$Bo=7>o>z40H|5bq!5I42`S| r46Td|fm|yCgB2A`!YCSY^HVa@DsgMLscN+zsDZ)L)z4*}Q$iB}8FC=N literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-400_contrast-black.png b/res/terminal/images-Dev/StoreLogo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d6616c8ab55727854d542cc1a048138f84f9536a GIT binary patch literal 1409 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k1xT_7rilV6mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk4|lIiaPS(?at!gZ>)dsJHNU3{&_RY8GC1b|C^Scm;UUV3eW{Oz=PE< zKRwwJzdqBo{i{Q#uh&twT6gc%YlYtSS+U}?Zr^pEuV}kS|I3vc_bs)P#SBiwN?Tp~ zbFK7?vG?!Nr7nGPEED%#FM7B7$-XyJ`A$E1(W)GEwl=G7g6R9e_A;aIoj-T4nQax2 zrek{})ie5R^IbRl%^^8DdpQ=V6{meJkJM;VI4GbZ(Zu3BA%R1P$FWJ#!+?de4J0_@ z4|m8@KjyE@&o}*Q1Pj#e^nW6-Y4@FGi&Me-~UQm_LE$B;llTC@6Jnp9xf5Cc;Y|vge9>b6(+0CSIOmK&zxT|$tTR@gsJWR z(@Wy7b4ykB+s|3#cyG4RLuFajlYFktHRh$9liq}woJej<^)OoZLi%w2mpT8;YS!EB z3+4HFtROPo_o(Hb|I0u0?{$tfSevxv_4(v#&yVJ9=_U8J2;G~0C-mVJPS3Q!r%#kT z-)P11D|Uu%Rr%Z-lWkUN^9esX`_N1wds1{& zSp4<-HtBlbQzIw;St|ZLMrgV8Q;$o>-kv*ZeC%>xwQlF*wM&+J8Z~}iK55={>1Fqy z-(AityUtAW^MvZgQ-70_)_Tfa*Z&-usH(VLB8unh!pxl$zqf@wl1o|Az3l0;U*d*L z#e7NoXZ`DY-xl_`if7|}rZ20mWuHAUN9Td#-8!a^Eqdj#k)_<_0q@KEYWy5eTs)@A zVR_4vW#e;;ozIIbST;V(_|j-sJVPM==6sFm$LBpx-uu)@@!qO^PA3dwk19ObutKaw z#%yZSgu|yEPL{bfadC4>nXastk6o>z40H|5bq!5I3=OSJjjc>T lTq^?u29606Q8eV{r(~v8;?__Ys-X*VhNr8a%Q~loCIH;UWw`(V literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/StoreLogo.scale-400_contrast-white.png b/res/terminal/images-Dev/StoreLogo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8c622de1d48bc2145c794380c6764eb1d86a5fd8 GIT binary patch literal 1363 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k1xT_7rilV6mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkxSlMx(@|He6{1HRUrul>oUY&`ys(q+ zZHVYACBxv^(Ok>k7GCHuuiE>3-tRfZ|DIdkKOZZ!<9zMB=QYLg^NQu?c>tY&11w0n z{dKF@m5JG(wynGAUi*2Q=`|~>S=TdjPftx=FLy*@T~qU(J-V6xKNjRkJ-S)wKmW*! zH*NQ})NOlJd8bq-^V3%?wl9t!y!?-xyvW7=CG^FjhmQMB?7hBBmOIwqkLB)Fa|^#M zWz~-ia#v2|Zp)v@9e3$-V>h4Bp9>H5BRiTDjtLx*Xp(RiNajf5aqLm-Fk~@o0}0M} za8gD*S8uhfnc?)Sd|<&G&RBy-=A5CAB~g_k>Gu>%*}g8*ReRU6yF0(%+~V^5TVIyn z;@|FfM^Pjcon%3qf8H0zLhl5oFzLdxP5j&fCZ+Ewl@l9TXzwa%>CCPbTG zR98;o-0LaV8Ey05`+nH->G+o4=YRe<-0Qw)muK7Ts|r`uHcBtKq%y5JWag2w30#vS z_=94FemiP;2RThxHED|Al0_;@Sw8w-DxCjJ?uu2@5B136_9FglS;ti#L17cPCQT7@ zd3U-@T~puV^kkM(HKCV;cfHuk`9I5PzuCq^B~0#Szf+THC;wU3KRYr}Ybo2reOD#> ztJgmLy_`8wr>^yN@|n*@FYBM*yWnEP{_(%r-<@dL1 z+1K-{`+Vy+?V6b;F0@wj;mq#erb}gaEuAlYuT^mF<-po2Uryv~SR?(*P4++QDeI|Q zp6Z-SO)P+>Q>4Vl$!~PPF}w92SFC}}iF{D{dvKAHzsUBx-E1)%tB1vrx3?_lyz@Kv z$|AL`V%su)7(dy`_qy(#t$AjkyHoLr*Y~TxY+AKC>YCnLt+%@jE|z@h-gmv{-LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq_>O=u<5X=vX`mo`iKnkC`xACPZd09pC&|S?P12q&jv*Dd-rjP|5)NcI z{;+;Ylfted)u67^T=N{bu1>vo$d~__V$ADp*8B?FjgfvlqsSAifUrwuFbn|(38cVAaTl~|5ktBq$z9a zZ605&dn?J;cw>@EYO1#M@o5uZ&v_E|mhr=X0qMPh(tAJZ7>1hJAN5*Sye8*M#`v)8v<4Z+{vpoHdv?B_@ac>Es($ zPt0~bN%;0s=Xl<-lC?Xzd{2GM$$kAQEvmYX=R}Rv-REH-Mv_b{gi$2-dFNfd_eb5# z*KwuTZQuLJFGu>*B|XpE_ND5T^Df`KH}_A}??3-m&i?T-dFlI~*KX_%ueLCscO$Cy zT=$&w-`+iUe#^K~dfNO=dht=d+u5J4*5@cmF3mcBs=qf#Seo~?uWydYpXjWe$JETC zOb%Dv@_4r5PmK1~qj$2-=S$Q`$9^jK_EICic>A}48>VMNUwk_2czg4#skyOrH~lvK zU`w2I{pVcswX1KH>fNe|zo(#*w0pzbt?oIU>1I_bW>w1DR_aIF{@(HJOPga(uzEC4 z(wxb+E;AE|CkBQG$9^%Fw_I4TF>`hgP_b%>YeY#(Vo9o1a#1RfVlXl=GSD?J*EKW= uF*LL?HMTM_0dlPj48FK;X+qJEo1c=IR*73fs}zqN$T^;_elF{r5}E+yCpAj| literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Wide310x150Logo.scale-100_contrast-white.png b/res/terminal/images-Dev/Wide310x150Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce5b04031638643118daa2afcc5d9ce39c7b217 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0y~yU^D}=r*W_V$$$59Du5JAx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq_>O=u<5X=vX`mo`iKnkC`xACP9!8-LZV#(~PI&I=;uunK>+Nm(Zed3W z_6O!!sXK!Bq&e#Za`*lgs59N)xhQN}Q;hoZlZnZyN=;(xT~F*Px_LJC+xayoKl^Mx zeZa{0PeuA>XCoGHaEu$r^yeqtl;qrnHJ&vi#CWnq? zwB&ZX#vF0g@#1f04z-S{nj&v({JGdJ&%R}sZ?l)KgnZFsBk@DmlyAQz++B zFYS&J-8EnT^ZI#a!7H8|C~WrPlQCbBQhlfHsc_;LPW{qwdsk zMZ4S8ZmAGhzIFHerR|3sZv^$4sdHxE|FrOwn|_(g+w6J28Xf$j7JoDIulcpW{IHwv zjTJjXujD!1$Oz&-_B$#i?s?7n6|vpY4=*1Vi(j?cyim^Gi@&`&c(v2)$<52kO{eC@ z{|npl&0pr(N2PbiJ|A0EHu=q&sQmuPt`X9^zC}F$aPC+~OYcRF+qbSR@QboFyt=akR{0N2tM AWdHyG literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Wide310x150Logo.scale-125_contrast-black.png b/res/terminal/images-Dev/Wide310x150Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..33010325e98d0e15bdf75afe8fc7037d2ca9d95b GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h_i(TP$xE*Ub$}F0x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LjzFpFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0V%z?iW|X(u~SkiEpy*OmPVJ0G{H?hjW@Q=q0zo-U3d6}R5r-Pk1@D8lw& z@&fL%O<`tD>lGq8GHV&Qxw&Vr)%n8fvf(y+#D)o>7jLnD5M>FkVel504qvn8PO|bN zpGjxm6s5njsEc3K;`waenV-*#CM$LVZ6gC*JMEe$B01aq)xNun%FbSx#Q(YCgM!TS z=3AxyN7sB~Sf<4P_|vnsX@V1FQamnRfc+wr#rS1$7SfFbEc|0~&Ft!0}@dw;uZpE%1u@w4A*{;IRpx-Trd8=TmC zp?h_&`8SQcqmFMC4+`8$fA!ol{|r~{TG6cQyu7D%t$aj4jMcMBIyA1Vla>nGp7}p; zMXb5Wn(QlOBF}z$3Cvjcb?vRbLpt$XOu?l=o8RfXKI~O6@KxXb`mvjU(t3_VCw@5P zGO%yFUiHN9t)ip-wfURvpDevrQ?UI;O@doO%C6%N;too1FezWwW!qd6V#3yR;6zFH z!OMpX1z6mc`SGwcPPDA%c_d=)nDAuQ+n<`-qs7DCh<6-Z1$0lfR!#qf?(KzNuJ5h1 z>7IMbxk=IF{N?+fquOsC=sECYi}aW1xc6IJ#8}i)cOKpUtk-6~zFF<7$h&# z{V2Vubxqz$`NG7<#{R_|)5;&&Upe)`Of2a29UYF;A6Ga)fzPsV&S931ye?WTpQ;+9)xZ_Q>SBYiM51pa3A642%1cxJo?s9&|jHKHUXu_Vl&Jb7#doc8e5r|0=ZTO20;e<%}_Mt=BH$)RpQp5oXg$?a-pZIpUXO@ GgeCx1aa6Pb literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Wide310x150Logo.scale-125_contrast-white.png b/res/terminal/images-Dev/Wide310x150Logo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b5745ff70f6cdfd81fa7cdc8aca6a7fc00c4a93c GIT binary patch literal 920 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h_i(TP$xE*Ub$}F0x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LjzFpFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0V%z?iW|X(u~SkiEpy*OmPVJ0B0DXr5BZO`xW3PZ!6Kid%2*Z0r(tlsNEF z|KKqi8#ZkG!1zX&Wxk`14G=zUIi0Q=V^)6h zj^XUc>-Y6T`)rM7pQ)dIQ>PPX6&c{#4EMaMlxN3s&uzTB=c}Ic_017Ewk@tUxqELX z8)n)zT(s!Oo^5_gqx!V>_U`wp>rbUQtx)wgUnSM#zhP45YsLct9E?sJ0)kEr9UHE! zQtK8w{nfXoDbzyQ!6hckwqavI!oTg7$_^ZiN?=tlE}G0c{(Hy8Dv1rDbFH1#cg~+V z)BbbV#lOqM>kcf?@jaip@6>+2Vt0-|=F^rv-)pn-y2y${QVYf7lL{Z*)Ui9__ge8_ zSV`ZN{!bMz*Ic+A#mJ^Ay_BJOQg2X$<4HHo0}E0jxsF%HbM!<^Tejf@yHmoJYd+WR zP8E5_)i^QAIyU~vru9w|67ef?51u>4e`#;Ft;&m&GmpQS{c~}#T}5{9feg{~56424 z-PUL{yY5>vyHP-5#v-11SI#+b@c7K;X*qBp#-jPN0F(1}6WjIA6Q3XJy2~XwXBJcF z54nZnEj+U;N4Qtm(|@EXS4`JFb7We39xV0g35THLXtf|Fo9R z+wp30Wr)ndi2_xRw`XTtmU_kY#f$$wZtTFmtXoNt_A4_67c2q-AE1e|xA z9RBxO)%N2~99!R*MyRH|*?KSc#jNiI-gkc;e|v2=4;gXKz|j1S{ie(DjY;eo%Ygb- zOI#yLQW8s2t&)pUffR$0fsui(fw``sNr<75m4Ts^ks*+4Wni$PqDdGFVdQ&MBb@0B`_B`Tzg` literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Wide310x150Logo.scale-150_contrast-black.png b/res/terminal/images-Dev/Wide310x150Logo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..7844cda30cf5650538b84cdd3991195f87f13166 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0y~yV7v%qKjdHmlD5a)Ie`>Qx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq#8g0-akl6&5uhM@iKnkC`xACPZd1KPpNf7424(|K7srr_TW@b~^b>KE zIPlRjS2z{A+!EUf6YWzj~{?z5K+x zngj3MOP@^hY5Sf2t*qRO5oih3zz=)FzVJdRZOy<%Yrb7OEo0dGSK|6Seh;;8)m-n2 z+}~WC$A7Lji@#x}h3@Rt`^vxhcboqEb<4d*KKJT8!8DawE^98HXXu5UZJLUS*CEpYpzU9tt-zcbh>|@^Ay9>h?eyedX5@(NE7p%irg8J9-Yp8K4k(D$otNd8{CmFe z-G%<;+2`3+E>AnzeFGuLr+=()Gv{9Y!nE*;)QjWum{_Hz)f?N)xjmz-F8@n#zIb6K{#dnJX8PJ&%}uwn3T0>4=j_X7-P+}} z{+7|t-Hf?gSMLyNy|=~Pymzj~$CRVDb%4B>DRjpirxHs{@cl-dIf6RIUgkUApgQx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq#8g0-akl6&5uhM@iKnkC`xACP9!AkTrIMRKP47Hi978H@y}i59Pb5&J z;bFI-baGPeony!3YFSK$q=bdykKSr?d0<+@IG>Gq;l>F|w=0^-al06AX13mJRNVie zHu!DYv^zY%pYxTcIcWmzpdR?25yp3Fk<0wIPWx-G|2UF)Q-AZVcIHhtwbD~0 zXtKr~UZdUbY*gR{F@|KkG9ODDzp8rnR>G%pC81e&5036$aK z{*qoZLBmI*%}r{fcHj&jm2Q!Y2ua`TrI$KnJMR^})BBaLb1Ki>@_iOR_q&d%pKp~t z-uCPC)Vs^m0%siQO4(+`T>CITaE8Y^2URXzX6CQ=O0 zw7mCTzLBjt!?MzAReQAp5`4Uu&pLbiS$~y|kmbeJk0mLezB6vATfIXF$Zj+0Kiu)- z(r2S?mqeTJlnC}Q!>*kacj7#YPB9@ Np{J{#%Q~loCICnWSkM3f literal 0 HcmV?d00001 diff --git a/res/terminal/images-Dev/Wide310x150Logo.scale-200_contrast-black.png b/res/terminal/images-Dev/Wide310x150Logo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a4480138b64db10868b307073bff1ccc8b621e18 GIT binary patch literal 1482 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LargeTile.scale-100_contrast-white.png b/res/terminal/images-Pre/LargeTile.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6b05881de1da444a4477a24bf2bb0baa3795d9 GIT binary patch literal 1682 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 E-$e9a>i_@% literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LargeTile.scale-125_contrast-white.png b/res/terminal/images-Pre/LargeTile.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..e675b860dc34b78a49c6d257ada152128a887fb1 GIT binary patch literal 2057 zcmcgsX*ApW7X53LP?U?yRa1$g12HRVj3G~jbU+P7i6|wWL=0`UT(zoAXeDl{6+?|x zq^9Jl*{i1%krt^Cx~^G6-b+Ype(~k5`#!v{_qWzrXYKtv`|PvMhm-9CcbAn`lLi1l z7UluH3;<%8hXE27F@?>={-Pv~a`JKlfQH=TyJ5#fSUcR~vKIiPo(6yiqT+24^97@T7q%ZaJqfg>F&DUNd6k)IQq+*Gc z_d4R+)?txdBa=49C4jO%VaHPpp40;jP)QJ;QT&(9ZCW3<6@D_&AASZ~UGhO2xS$j)L{#KOI?e93LV1U^2uKzp+{w-sMy# zX2UqkHZiCmh2#@jY@4(p2`>K%T`dC$Svfr>lS^G)P^satVSFC!l=dklfNO zQRPXilNS3g&R-1B8mhPRYugV?`97uYbMi~^9a`MS&fC?&I(R4}{e8>A# zDq;F?q9k59zWkL-$>OS6E$-X96N?9J`Niy*aY|CxaOJZ3#_WfEg!MD}{A>&B%}LSb zFa+O)QZ5%$!%hBipI;nWU)qzFUWeT#c`h~J*tX{=+|g$!y% zlckOZFteqH{cHo`yw`|^g*SWT7tcy$II0Mgk2;k+v3S&@(PG=C4QW>B{~EM~U8^?& z)pmP?$5(QzIm~0}$^}$a(2?LFKN<0KqdyC`9;a)M_TBAslwW@3E%WpC`>&IYbvV|~ znaX^voD*E3J?gnVIXERAOx+-~H(cDiyI^eQmdoBo)TWZ)ftzt8#^KygU zwpR%Xq5}!H#ss`2#qg<<>i-B`VUVb#O+CGZnk<$*!k)QL4~dO(xS2ajp4FA%LUU=% zHQ5)jLo9wreI0qJ=x!|=S0J0^c65r;XXG#%@%LCVMat^-ikSXC$|m-LDOU z)7L|0zHGmn*kh*u=4w`~khS51qZ#ko7O8@HXpY19DD5oTD^Gp62gwK_o@lNj^K+#G zAFo(^Ro&m_Uo~9tZw({JVH4Bb{6pf-=m+Mazx}}fo6axeH#Pd-h`P8RluPw)+qZjU zc_&jj+1d~3DYvv`kw*Eo_1wwEhRx-H-SV=v!D)7p(N?N(V#eSKT;6xSZx<;;zI%;xD}3nsp5U4G z>`n~Xc3j>4d9*&iZ({6*=%KKTTkAnwNvMqGj_ghK9wKTG*tXK zt!^LDOT{sygv1L|sc|Us9H?S?-r89!%Z&oBOH-JmlX$esw5NWuf)n0yW`bHX^VN+g z+Jw<5*lz*fjm?`W13V(w8)rw?XD$2=9_YuEk9SUg_A6G78gX&1_J5Q{5$b~1hMFdTahXM zUohe_U@Q{+a_Ddc9f?f}OF#liNl8Yx;$kr2Vev>KbOP$-x}BP+2!Of5q4mz88UF=a C@oKIB literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LargeTile.scale-150_contrast-black.png b/res/terminal/images-Pre/LargeTile.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..9de6e5ae4ef41cd68b6234a50525820c2a33ca80 GIT binary patch literal 2358 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 Y6crK4pcPCy?No^X0?rL9IePB$pBN~n+a literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LargeTile.scale-150_contrast-white.png b/res/terminal/images-Pre/LargeTile.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c3a8d6ce37a3fb56262be481511b3b74ed9090 GIT binary patch literal 2367 zcmd5-e>BtUAOBFUn!6;VBxOZeehf{Sm1JTV$?qRanwj6kn8l)tu6~TZq1fcd+)*o| zM(&36?1^^Jn0HBjl%JW1jCX~;*I-vl7McremU>g&h1Cjv1#C0u|m`85j zRfwuYG{#YNRCUvjAX`tMLIMCAz-W}cck1AzBqTT3Z>Q>Xyf}*)_0(Y2=6t`nw{~Cy&6k={ z!PNadMTKscMv)y3Baj}F=6kxioY}A9pT#9MX;KoQ_t3&;i4|v~qNjg!^qsghDn-(` z-p|G1EJe&ZOeTGJ#8!+Dw##MXGtTpbM{`Xorym)5T!S3b)Z^c3!f_dMP2q5VFJ9(l z5?a42$cg{Ot;evWxBHb#$So^$4_LyBZ+LbFghb(!ZhwH z$46BxT#b9Z!sT&R`&$lVK(Q;b?V(_st9kq!rO8$mS55wd06nw;o(w@4xwd;c2ju1E zIj-&p8SCt0;1YcFTbzGvlJ<*yd8j~FRQvl!c*w7&3u?xcT-mnZ<`^{t<}Qt$Sv64& z8mDebb-FM@e_p+nI==dZ-@QbOERDC{vyxpLKsjJoaE;|JCkKwLO98FX!(laM3i>1~rSmu_r}oT%yN`2ay*5~E3^LYw z^sLerZjkfL7n%C$5|MpAZKC+{e$D$&r)zfzI6_+&RSc@cpZdeJR<;%>`f#=%MPYrJ zwODn}R9p2I;iFLLm2ia)PZzSSc2 z=2p{&z9C1{gzPx_I?7<_eRgX_O%)|j63wtZ-owC6iyxY@KJWUbweT?gP$k|_ zrfXcYty}mOi!Uwr6+qKwCm}_WvO^2vB*bdZtd4m2dX^(JEA%d0w2Xp>oVhY&%U_8p zf(o^TPOLW4lx?3CpORejT8F3I>o;`Xh}TwUZ8~60lL^kkvjkJ-71ZzjCaoHnq9~_@ z$0M#M4*IZm5vQ8j`xtFIM!!bBLXq4y5j>zl`N0WEN-P(&N}X;)3I!v`3mW3%@qK-|&#O)7SeNWb$}V-R8K@K|^4s%AlO$a(g@0U; z7b42k@x5F2ai>OgzQz+)B{nUi{YOjSYSwm_^KNitTIAjNhBifn8TvBQgYGd-WOvrh zRPXIzFCVmnV&@Ar`NoMMadkp@*wNxWw=2)V)W<}E91plA_U81Em@gV?khX9 zvl2&e|JX~x3pcn19-YMHHm^3uoSq(-Fa0QDZ*NG8()3(fJa=JOG*r4yO~0h0x-2$) zT7DOeqSFpwpUBc#-#*>Kl6yOOsg-jUf4!-x6UryXC(;|6GhjP>1uvi%l3%`X+Hc)x z_s#_S>_zR=g{3~b8Mkt4KWXyq)_sW=I_fa)VXkJAvwyZXj}Pg8yV6=h5N_sIhtEc& z6q+%ZdEqtM*_aZUb+XY^*9h}!1hb0VmT5hHDmckpDo4^WqC$~?+3;I%-sk~txCCn6d$kgJXw}mCb0)~Lw zC@2C3Ytuhh@IQvw_^`-u^8YvVICPjR4BOXs@QM#7l0p;l0Et90i;Rm-!i6T_&EgXY TbU9L2Q3RkJ-BIl0XMXxOvZT)- literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LargeTile.scale-200_contrast-black.png b/res/terminal/images-Pre/LargeTile.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9b19f44ee5152762cd58e6f26dff966c5f206c GIT binary patch literal 3152 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 RE9tC|!x2~es>6h&{{on6w^slF literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LargeTile.scale-400_contrast-white.png b/res/terminal/images-Pre/LargeTile.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6aefd75a66e6bf0fc92c88c649ab3cdfb7d588 GIT binary patch literal 7154 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 A4*&oF literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LockScreenLogo.scale-125_contrast-white.png b/res/terminal/images-Pre/LockScreenLogo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..788d405f453839ad52a263c7abdc7d0c64bc61ab GIT binary patch literal 680 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q^v-g@k7caFQ6cMiKnkC`xACP9xiR4?HhJ7Fff*Rx;TbdoW45symoV;%<=fy zftw#baPPjQveb-Svc9SLmZzuXPvNrL6DMmwefF$lwuU+TG?!vYzGPK?uUN4$lYkeoT*>=yzxM!=EH>O+r z@CFA>`phAh9P`syJu^BkvFH>3{!eKg;`)KLUXvbW8MUuIOJ{vX0Q zlK%P=59JXat)x7$D3zhSyj(9cFS|H7 au^?41zbJk7I~ysWA_h-aKbLh*2~7YO90gMV literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LockScreenLogo.scale-150_contrast-black.png b/res/terminal/images-Pre/LockScreenLogo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..62f84ba9aab999a0dd93d7f6f501366879c97a10 GIT binary patch literal 842 zcmV-Q1GW5#P)?>2K~z|U?bk6#8*voJ@oy4|xyylA1VJ3MNhAn@IaE*)2eT>I z!Kq{m6rJ4M1Q927RB;Ik4h3E6q7^bp7Keaf21zg=h-fedAxbco*GbE1QqO77eD)azD!R~PsYsVkw~QW;NYNkY-}uPqWl-| zqYC&5xXe5tl}eG%=gpJ?kk98yrBbHrfp1o`m@>sHA z(@fQ8vstdMuc@!EHxCjK)1Y$X-CbExP%@b$m&=vY0u%wQtgPVicZqyTyh{*2lu4tNOK()8G%f-b-Wk8ig z6$KSTIh{^PBodVYiHL;5VNn#tfKpYpWbf3oA4Z?gM`L57VeRJThU4Sow;FU~{-(`j zGSb=EX*eA~=H})~aylY^xw1kShr=PEP^e^>qM$+;RaGS%4wn>D5R}PeMA!9-Uu&=3HTNQ91#4wjad482u_HniLAOixe0 z7;>NU^K&jQFWK4Ip{}kDfSQ^bY&IKSua~{OJ-l8oGcz+ZH#a{IdTsjp`dC<40O088 z2!PqySx!z)7#|-;*LAM0u82mXoSvTIa{c)evrSD+1%OX)g}J-Cqp7Kh*49=4L%Ki<5fK;g6>z>4>K~H@zE{}rk^dmS0l9V! U>QdEUKmY&$07*qoM6N<$g2{SzrT_o{ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LockScreenLogo.scale-150_contrast-white.png b/res/terminal/images-Pre/LockScreenLogo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..61be432569a6b769673a71f654d3aa1dfade2655 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FJTm!8dC7c&M1#uc6}jv*e$-%hjlkWQ31 zRxjTBWBCOM$E6%jLarN@I=AV)e4;S3WTkUphOx-SyspVREK1*`w3lgH?AQ`;@L-dI z)e6Jzgp2?|uY~~|OT~p-KI~AL^Gwg}eNe%NpVPiqzu$fT?)QD?%jYP*QjVW%Q7(`o zkT|97)Rz*CsdvxantuG&{4M&jw=cQwGuh;Jqt02q?)dXxFH7ncn%k-OaDTmfFe%@{ zYLm3^WySvuW_8xhD<*IK@89cWQthzPCT{hLDON4J1Nk0lc}<$cRmE%@>i4N>)1l|T z!ku>BdhoPU{mRvqtwy3BnVg)hv=i^8hz{^VHLP!@7+&F{65Gxi9* z>&{Iqk}A6YuVGT0ftW@h^Jl*xNBOJjo~JSbj3+IbdTL$mGwliKE$>5jed-igU%_MY zv6(YLv{`)W{E5ZKB2>;*UH$gW*mGX|0ro{T%t>zyLwDWE(6vc_7&X5{FlC1Qf%vW^ zm2R^t{oX8yy7fd?fbH3fhqk|MR8A@PF=QmndEjeM=V!@M(^0xj;sL{CF|IdEDLjYv zEO{H2eo$|6>f?X^S1i+GSiz$G(9SsW9WWYIOI#yLQW8s2t&)pUffR$0fsui(fw``s zNr<75m7#%^i5ZY&tmyoe-$JTDsgV^BMG-ce4K|w%q9_(AQkF;^ zG_J3&X*QdQ_%21G(a6io%UsVbiXkb`+1Z&0|8<#6CSF}#6*1oLNVbs4WJ((oMG=A^ zlvg`RnZ3QeQ4oZ*r+_kRCrJUaG9+XL$nux?Re+S2(CKtMIyzE1rz9B(kn$2*t(J#} zhf3y@Bx3=Rj7FpE>FN1VqNb)ssf@B@b(DB`c)dU1Pu3m|@ooSK?K zdwV<9*4A)vaFCeqa=9=uF_BbLavN=JZ7pbc00;(y*x%pB=jSJUJ|Ft}`tbbxj6fiO zPTK8ulH}&*CIK)I2+(S^a%5zL zBsn`fO8|U)e5A+YVN+9+Y)!3{SY2Hmc6WC%IXQ_~EC!#?m-EVh=i}o8p->2ZzaJWn z24=Gv01ys`vADR1_4Rf1_V%K=xfuZP{{9ZP+YJDio}R|w;9yccNdW-R>-E^$+R8ih zch1kx;cz&h)9J9hybO!Q0wDgew6L&%>gs9)gTc%T=G7Bf;&eJ`u~--mhxzjIk{JJL zp^J+P*4Ni_e0-cF^J^icsI9F{ta>U|s}=L}^O%{L!PwXsfaDhH>gvMW++5NeEr7o$ z(m#Uk?rs>3#7?XKr|Xnof@ek`3Ld8GzLY} l7oG?JPpLzwsHpt!`~&*JRf*~>{eA!d002ovPDHLkV1mx~w^RTC literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LockScreenLogo.scale-200_contrast-white.png b/res/terminal/images-Pre/LockScreenLogo.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..f490a9aa0805a2fc967a6f8da3c6a60c10519ffd GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiU@o?$c+;uTyU|@Xa>Eaj?aro`@{ob=3C63#7 zUOKqyMSzooDu?KDg)1u)V!i${HU)Hg7mECE6_btOdZe<{dDo4VSAq&Iuf4?8HF;Ub zgpU1_E*)JsO@O)UuT{pQ-)^6ri`7Lx*_^g5|86(`arODTrz=}xKS!O5XZ*v?@It-u z)6a0;PA0oGJDnbL{@T-$xoO)EwL@{;FBxaO|F0I!UXk+C=u?7Z!T;|M)-f_}yP=dI z@^FWB)D~q=tAOl-(l6ZJ@t95BXv@mO7$fx7dP$U#+LY$7#reC8oSk+$b9da~d))Cl zHt$I1yqRoIl>DydN;Sx3oo)1(t#w(uy5+o}s_)dyW5(*g4*ffoAEs3P%lYS-yiL}B zH@!MDZRN)=hl;9p{yQnybn_ekFVClId(2B1IPC;d+3Yu*ujZ3@YRSM|vuDmrt;_dS zm$mD~JxFZ{m3r}1Gqh(Ti%sH&DYv)mu;}jMXjS>Dv8r;Rre`nLYmM}@t&>a7Fl-Jn z3@Z34{;ffw`A@QVM)I8SH6PhmJmmh+_w;n-)pzHETD)xLzjd*AYI@tDf%Du8t-mVb z-(8P>iTLUSG;6EoO8-SOT+BC`-0ssjrgFLFoY$6vx7WDr&-?5Yp*}Bny#RaKizlk~ zKmC*gW=r}w$bbCQA1v2@`Sr>@U$h%Gy_K26abc!v{bOTbB2X=HjVMV;EJ?LWE=mPb z3`Pb<2D%33x`rkphDKI~2396!K(3X6LF*sJCny?n^HVa@DsgN0vT$bvP=h4MhT#0P qlJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS7(8A5T-G@yGywqS9zm7> literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/LockScreenLogo.scale-400_contrast-black.png b/res/terminal/images-Pre/LockScreenLogo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..217ea2d31a00e2aeaa5095b4fe055e688784ecc6 GIT binary patch literal 1721 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SmallTile.scale-200_contrast-black.png b/res/terminal/images-Pre/SmallTile.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7481d481b75fa8e813c10025cb44cc7e50c2f4 GIT binary patch literal 1236 zcmeAS@N?(olHy`uVBq!ia0vp^eIU%i0wjIE{AdPJEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4sogeDCdbR+?TO&Yl6t`g2(4ttz9Q967i9r z!WBD3XYD_w=+edj+ZE?n-MXEgWDN!#>ucRu~yb1Y%PSjhe&h5lrRh^kO|Js*-k0fhXl+6fS%Nz2%_MXqT$uG^$MR$}t2IYE4^>ZJzj-#~ zibC(!KL_Sr+~&GG^sajND>>~W6ZNuxZ?Y-%J-f1cjf8sYyeqa<9h3F^U&+}X^_;3+ z+AsH5q4`t57-^e zTc;m+{n>M`|6GBI5oh;pe^s`};OtG0OsQoxY!=tP{&;k5>$(1m%N{e%n$Ufz=S9sC z6K3J%8fRP57A=#UV3B!=$7N1PCYyraE|cE=;!O%?x6Qg_Vt3BDcInPZ_xIjkA6^o9 zDP-R>#=Q&cRXnA|bN_Zbc73jhcRxE-RsC^|-15)QZyxNsT)Q~(Ys;%6mWyZq(vhxG zKWBRPLblV3?K)XSi?G+BJ_;-5TOQndZ)8e-O3J z=8VST9-$YH`C^@Fzb!n#=J&zG{v(Ha_)NA3JpY+yZ(jQO&LakcgV%D-n*ZTCpm^=5 zv{(JRvZ|P?D|0@rSymkN_DXV;_7>0Z-OuLe-mJa($THpTP^Rd|6O0niPTKAJ&CVeA zw76}vY4nV=#^pCA?teD(&Fd4)FOO^S^~v?k@h|bad~=qy@Tb77E&ERO&++HpZ+~Wm z)L;AEWt*~Z3eOj>5UiMLpLL^t@naF|Ggbede9g(!Pwp{1c8{Z)OZ0h=Z6bqN0mqL? ziy6)sAD1cqxxS1c?a&*|E5=Ve@9{}G{9*0UnU$9RQGUZbu?+|AJIubV^Q68$-Y%1Q z^4fCeeY5M>FJDW^EuZ?d?mGKIJBDl=+2UHtf98pGTRHrqxGaDfShd78q9i4;B-JXp zC>2OC7#SED=o*;o8k&R{8d(_{Seb&jRt5%IZ6*#V8glbfGSez?Ylyzx^9QIw5@bVg rep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt&9mu6{1-oD!M<+vy-_ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SmallTile.scale-200_contrast-white.png b/res/terminal/images-Pre/SmallTile.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b321705e93cac09f3112ca20976d5c10ca1c844a GIT binary patch literal 1174 zcmeAS@N?(olHy`uVBq!ia0vp^eIU%i0wjIE{AdPJEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4U0v`9ul>|kQAe(&xRO-pq& zCz*TgdVcEC@%>BhS4)*oFf(2e4hbM4mDl#QomWzO)C zTP^Z7u6=r&iujGC7XPQO*AXd}Q&yTi;duDnb;pxSTz|Z}vF63r>}MP^?_5k4oiCg7 z==dU=jlO5Y7N%CNaXS4eqIKHSja-MHMm{S&8fndcbGZfQ(~YNg?S5T;&w1W9E5Drk z&r>cw-+Vs(QPnS(wZEgvL}NPE)nsjrsC{xoWcg)t-`&sVuv`l9m)UP(ztj4Z$yK4_ z`e!v}FZK(_jPqYd#&ks-=>4zlRvN7^;je>qpjBY>7zHvviiH6&mUcxKFe9< z5&5_-Qp z-wE3=70CM<+U&nt_~+{b_H79#_L_D?o=FmG7POhX(&A~oOsiRQ9K&4;Murmy8kvv( z&R}QoIlkR|sf2;`^Cd4XB<9|mWo1<|Ly6o>z40H|5bq!5I z42`S|4XjK-Tq^?utu_+}6b-rgDVb@NxHUxI?)d}MAPKS|I6tkVJh3R1p}f3YFEcN@ cI61K(RWH9NefB#WDWD<-Pgg&ebxsLQ0DSrFDgXcg literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SmallTile.scale-400_contrast-black.png b/res/terminal/images-Pre/SmallTile.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..27dca17f1d11276be10e47ed1706e1f9eac74b6f GIT binary patch literal 2082 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SplashScreen.scale-125_contrast-white.png b/res/terminal/images-Pre/SplashScreen.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4d19a7cc9573beaeb31302472d43d5e84a5223 GIT binary patch literal 2363 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 F{{ytN*l7R& literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SplashScreen.scale-200_contrast-black.png b/res/terminal/images-Pre/SplashScreen.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8fc2d06f5e3819379d72e581443de287c313e4 GIT binary patch literal 3898 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SplashScreen.scale-200_contrast-white.png b/res/terminal/images-Pre/SplashScreen.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..357a83f132552e9df66f92aef7655993956a935f GIT binary patch literal 3848 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SplashScreen.scale-400_contrast-black.png b/res/terminal/images-Pre/SplashScreen.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..24ea7722a7d4018238b6dd01e2ce4afcf8e30e2e GIT binary patch literal 10033 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/SplashScreen.scale-400_contrast-white.png b/res/terminal/images-Pre/SplashScreen.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..5568cc8615d9ab663de5000336d48b8cc6d154a0 GIT binary patch literal 10012 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-100_contrast-black.png b/res/terminal/images-Pre/Square150x150Logo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..2a82392f5f653187f75fa8874ea253d341b08ad0 GIT binary patch literal 954 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm1x)VD1X3*Nj=qiz3>*8o|0J>k`3lJ%LB0$O zRcZ_j4J`}|zkoswFBlj~4Hy_+B``2p&0t^2<1Fxq zEM{QfI|9OtQ?>b|fr9KMp1!W^PuTf*xb$r9x|jhqb$GfshE&{od+W4!NTS5?kNL|2 zZniE6ozc0VvGJN#mtKT)sVYm*?pr%LGeWz~bi00uZ(6$Lg_8n{;>ATAQ7(=2Jb$J^#d8u?w8g|Fyyy5DzGGi! zoSyn(=Iaj?CCgSW(h7{Ky)yOf*4Hn*gI!i_I3+H6V3~>Q60X%s5@CWot2s^!%~jW0 z*!N0AedUBTIfs)VqBC1eow#*-QeuB6g;r>rOZ7SmeEq28rTY5UDY0wU9(=zhp#OjM z2BVC_ZGY}@yfu4V(i(oyWy|yRYlBRauYH}WyQb*K)Y95ip4DFpQ)A;J56_Yc_q}7h z<|c?ydMEZvqUx_}iO-7EZk#{-Cxi9ASe)A=E2F)4E05o9x;RT`xskqPo9Qt|x6g~W z+MKoOKAQAvx6iv}=|#5%@@tys>#nh1d`ouzf6Y~0e5G$tN z-M1p=m(Ei^pjLJB5N8}SuS~M>^c~C&;_gMMA+IhaKDJrh^!v^;^}lbPC^y?YU>DD1 zmouJFck89dHlMtw|Gu-m>A2RhL+VI^iF>)r9Ii*TUykkaxn*$CKe08eaPs0m3+m6U z&bn0ICb6K)En!A+Od9*^#`Rwqj^CVI@=UUYb!*J*=gRXhy77ujxjK>YQgah z&z}O5scMO9L`h0wNvc(HQ7VvPFfuSQ&^0jEH8cq^G_o=@ure_Na;*#uTK_OULD7(# zpOTqYiCe>$g*zjF8YDqB1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BL!5%;OXk; Jvd$@?2>=eQj>7-| literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-100_contrast-white.png b/res/terminal/images-Pre/Square150x150Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3a93c3c213b380f8b696a5428ccfcd3bd7216fb2 GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm1x)VD1X3*Nj=qiz3>*8o|0J>k`3lJ%LB0$O zRcZ_j4J`}|zkoswFBlj~4Hy_+B``2p&0t^2<1Fxq zEM{QfI|9OtQ?>b|fr9KMp1!W^PuTf*xb$r9x|jhqm3g{2hE&{od+V%sNT9^=kNIM{ zZ(3toIK-SMY?-tmtZ{4SB?S(y+bySG#A{?-RO<*6(#;88y@KP;Q$5Xv8KG_*T2uQj zE^}?2G2zN(r(^3L`t(^mzxCtqoU?n+oVGom|IWDh-I)dz&q-L(7QZ#ZuV9x|8(uXfh92CoYJ=k0M5U}4 zw@FrJOD#M$U0-r6=dhMUm?+O`uAMER2`z$LmDl&BrLKEgc6@h7$BZ6Z(e)gwrAk$U zZ`{`SDbV^~YmLmUf~3UN2Ns;&(Q+p8f`tF0{?M#ryM#>pRyr_bDxcD*KIXWY9tODs2=&wURN(!K4JxA}|kYh2F z`g>9Aa-n{Ne{Mu?B%wDHD*LT$hyLC_GqtJ9E(<*}suk(Q3_bU9b6&wBpYBVEPQ>xns2?b+TRQo^%=iBh%1HKHUXu_Vl&Jb7#dj_8d#Z_0l8KN2CaV>pP*>S%}>cptHiD0%fg)zKn;>0 u8-nxGO3D+9QW?t2%k?tzvWt@w3sUv+i_&MmvylQSV(@hJb6Mw<&;$T+H-Aq6 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-125_contrast-black.png b/res/terminal/images-Pre/Square150x150Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f2031a207aa48f65400394a03a2410e0ebf1295f GIT binary patch literal 1208 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 QQb0uvp00i_>zopr03R7w!~g&Q literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-150_contrast-white.png b/res/terminal/images-Pre/Square150x150Logo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2e8f38cb251d1242a41459d243a75c2e29a3d1 GIT binary patch literal 1302 zcmeAS@N?(olHy`uVBq!ia0vp^4?&oN1xQZWCG`V3oBOs5n zz$3Dlfk8|agc&`9R6YO&*-JcqUD=ihT$QP=Dts>HIA1A6iZ`+*xZEnt|efmG^o^3KdqqDzq{vPA^*3Mx}Ku3@R zSTbMtSbZ|^KK<>t^V^-f&iuUp@O#{a_N?Q1eFw{q=p`(eTxDIxxioXH^6R@dQhAKT zb~iM}^~O5%Ur!P@h}b1)C$PJrW%bL6c`Xt`f@%F6o84P(Dj#~Y6)4*wySpiFZA!G( z&6R&U7wnyXX-^&Zjr#fDUj4qY+(PN(zg*3YaWnF~3-!;)!E~P1JM?$f)qgi!6Ete$ z_sf0Eyt;F!n-y8^hepx_$F!{=kKz??ySYr`PqtjHxIBKoDoF7hwv3j)dUXl9vtBvVS@ZO6%Ui#al{@j^$`u)EXyLC^`HN9Wg z!(qNc>=3{7tH$c8zP+zHwGORY-%;=+OYw`{HNL$qWy&>&9@j1ASt0$zZGRIa zAFkmR*Sm90@{PaTi8<+M@i2G8x{>HrTDd+coaQj(P`gU)D(q!(;u)P73rhUE3)>r2y1!-m+<&z^YySGv=l>tEyZWZLBJTRz*8HCzU-dqERq(9x{?@-$%&hB zu^>&P?#j_y{j+Npo>!?|v+~AK(=BI}-sFeXzo?t5ef?ZkV0YA&n>SKHE*XZ+rKr&N;sVAXl}-HKHUX zu_Vl&Jb7#dj_8d#ZvxK;)RT5To{C>nC}Q!>*kachXa-SY>i wK@wy`aDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0uvp00i_>zopr0Bl(q2><{9 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-200_contrast-black.png b/res/terminal/images-Pre/Square150x150Logo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4b35315c7ef90d5ea5226c5dc8672d571c4106eb GIT binary patch literal 1764 zcmbtUYgp2E6#m;Z((JxzI<=M;k`PJL3SE|WNt@}!3z{e*B6$fABu#rPvw6uy7MZBc z4RamxTzVd^KEm`sUel9FA6QX7yzl@foGG$xklirnX`_j{o-iRw|(WDm><1A zQXtrjo{rHl(dB@d@HUthGY-t8o7m7SMb7g<+U+}uo{h$ceed;Cb-+k|0(Ay>D6&ipdm z)zz2nRw4o#>FN-+O8l>0``y%);f>-}MQlXMS$zLQwgzfw3mpSUu)>Px)#bTJ7!X zI@<2Wl)^ZsiB1tUvPWiHP&}91fe%;Ks8e$JWRTeE`ONowuwr}~tPg$Q&3)Gbh;(5$ z8*G(&HH;KL|Dx`VF=+PM=t#OGI|nT~(lPOoRUDn<9)#$Wr}do6<8$iVPBN12^qA$UyU2b!9oAPJi8#bJ6g4~2f!D+BqGQZpv z7?|I8J;_oyO?<&cYM9zS`W9c~(Oz#e!fGi>NmDW}q4AT2@|f<1Ylkn0gH!j9LD!zL z^h>LZJYub&o%YOa$4K{S=OFF^7V21ZNXSr`A1XUM(??R@U2eu@Ozfg#y3yGrILfxK z<&xpS0FCpXG;&VmydajUJBF2JN$D-tWd*~FZr{iDViH+Z)!R~2EHYk(BHNzw91i1B zTqj>f-oN*;KnUCX{@m8d59_}*sFT3TJ969HHjMshX z|Id!EKHO~A-7DcELH^oJwiKTTN+5kAgo!}1e!wv@zeSOdgaS)Dh(Uk}| z9CGE*@qZ1Zq$Lm%>Hj@|eqFq-9Wc`=gr+4@XmKPQK%>!Mgj6CK8<&oQrIGLzDtB`& O2?+2x<=yIu$@?2r)D7PN literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-200_contrast-white.png b/res/terminal/images-Pre/Square150x150Logo.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..47154776d69a675fe3ad8695c60ce30f4cebf19d GIT binary patch literal 1670 zcmbu9c`(~)7{`AtN~7quXq_o_v<(rej5u0d3D(u7O#}@|i8!LHgb0c%J*cKw)fIGm zpoFBZ(T1!o8)qYHG}Kkob+zIu#R?l6f9}lgUwvnudFK0hzu)(r=bz{91#edskTwVa z02OyP7Zd>OG21OAc^Mg?BBin>PjdEh27p?I@-{(1rjG@?p}YVf(F6d}G5|m#LusD? zAPxoqb9exNKLUUwF~!`A4zi2AS3O)^0H7-8xRp%pk8$&(0D#`@-P*&L{z8;NMXI|O zLUBq_^#I7~#Mn_f04Q8`cX7U)FtRX?yK{x4rMSG)fvLtuco-rfU)wM(VJ*vIWLV{m zK=p066MW^1>gwhViAN5Sf6|mwP+l)r0vQ?_zra5MUEJS@a&}?4IXAp_i)3<&@Btau zz!vdVCiV8r;Sx%0U-9POeTdKxf@1o5%T9~1*zxr6?%3aWMyOG$v*ZZzs2+N4*+ze3 zXQ30_7@fp$WP+z9Y&BdxRLo67;+UosuOS4vy1 z^V|#*6$rK|9{1ZJ-?Iel8*ZI=?@TOuNWnTB`{t>wd^Sc&v*w_gzX7)4{L8RRe1BE} zTR9Ac9@2PABA%-!@Skej5Z^*&-bU%+27Ud@yn`jYxUAO?<}RZqLB#+WJVE>VrN*%#9D!}7*Smgue>hGh}-vLbazE)G$K zVt6{V`$o8yp_T$R=7&@g`TkinTiuBm>K03s=sWGP`FWorg|sNJEnfuDtpp^B zb+buF(OnT|70>RHCL48s7<=f7oZOf#qz5d%P0AlD*@}&~mR?o82TrOIx3|45w_$hN z8VYyvuGeU!w4y2t6057K^mUuse0)zeHe*;-b2le33FPp=77GN#v$V&Yo|3%evTidd zpZ|Pi)~H)_cydRJr=1#}y`__07M9uV-;h$!RKAHd<_Nvq^C~Qk^2~16EU^$wuij-57wy02{ zecpWOU#~hUlL=JurXS5q?Mhp(MP$u#EtlsMxWpOC=@gb|u-^^2&OVN|<7mJkAtu79 zn3TK;V%)gzsi0nP-h59}GqmooKOqvc%HKAzU+GUaJgb|-``7}xl`5!ZdysQAScp~u zEzfA8r?0<@t*aHi)ePmJ+d+fFo3#FFIlJ5tlB!^(P)Nl^<=+y4Qgg2t&Q!P7j{PN?KSMv+J;rU1jzc$O08R`bpsdopJB!5**m6JSj=P@8`bn z>qHBls@WRfxRGS>1qqlybs;ghZokTuF%^NOh7hPkcyKIH)&MJ*70euFYi?6m2epB)Gh0C{|ZD!hlGdH|345gdT(16(AxdsQgkSlMu;T>G#U*Wel3y`Oo$;u Wqhm?TMF(w}32;YvyRgsW)BgeIuE<{i literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square150x150Logo.scale-400_contrast-black.png b/res/terminal/images-Pre/Square150x150Logo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad38f6a9e46f9acc74a60ce2f6964662cbdd1aa GIT binary patch literal 3117 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-100_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a7550ffadf2174ddc1b2358d30fe3222fc03ab72 GIT binary patch literal 670 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!0wlNePU-?uEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4`&PFc(}BEwr|+Uz`&T}>EamTas2JoyYjEne=-3gWuBjo*B0f=UmxYIDj2C-h zp%XLF8VY{`Dmx`^Zms-!4}b?J58p?1&dlwEjduR)Jb1! zX>PuS&24il$*_;!hw6ft{%>U6D!Qfo@G{GUod*)9|4fg5$S5A#QzErm&70xP&ae*$ zp0V3IS={2E_xS3f?~7ZVFaO&xcVD-d*ylZwUm`gw9Ay2ql4DC3X_+fd`?29#bYGEn z-3_^&8uoD>*W~Lq-q>^cL9x^vqjRRbeiDy6)O?K&K9I5H58D#)xJf8hY-jppD{Bdr zrgtB?R?Drw{b+*vwU-L1P+nfHmzkGcoSayYs+V7sKKq@G Q6i^X^r>mdKI;Vst05W>`%m4rY literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-125_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..ce820d9be4ddc37a5cc5e3896da2bb7b626323a2 GIT binary patch literal 775 zcmeAS@N?(olHy`uVBq!ia0vp^<{-?$0wkF(Nu32!Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4u3TSpyBG=enxrbgYWU%-0tq^}5zp!@PIu~Iw4Vp(EC z-&{DlHsD24kVs37l}38ivy*eD&uO-q|59#V`}@~B-xrqi-vEJ@o_nhnS>3$a<5RhG z?=NA|vz4!p+di(`6}9cV-m||ut|c7Cl>4^){)nwrkqztZPRnX}SG=leKXTpL4?Y z2U#0^Jl?2HH#zt|V&AS)pXN@q()Rnw`Q_4adA|l3e#^%a4U9o7C%*2J`@QX=VAYbA zX!n^h&CrMce>8BjAFBbpWx-iaD|BH{ilREFL%s=;e9~m4q zTg!C8<`)MX5lF!N|bKK-a)r*U%)y(8$Wrz{!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4vTJ0z1uJ8>GJ96J$fMjUpyhC zZsqcC9(|psp1u$L@;syS&9&$m+>aI=W{7IGIK4CZ-0pk6E5B_?yY(Y6;*ntFr?!m| zM}LXN^2CJP{<(jCtgPNaEzZ+>>ecpK+PS1ywRgGa3bAR{*HZI1+n&0Gb}{jsUMMJk z=JnQEJ)sY3F_saR*3|O#{#;;^I{)*QXT|op#q;cb+=%~r>#2?Ij|j)wviY%=Woz_y z=cidt%M@AtXqL~r>SOEI8SP2ge5{9k3$we-hY8CaW;wsR%z41<=7QeX`*-~kBp*-u z7J6k#Tga7pT~Z-Fm-7GqDu2`Z)T%^7b8%ks!bg*4nJkXw)ztkGdb-QADrotPWB>1p zaqj!r)Vr(vy7!#i1-<1ekt`3mwQbDKtp8l?Yv`c0K;rTeNj95Znj2US7~QwrZ7Hs1 z%d>&~kK#$Y&kQ*m{E9u^^<2;_C@P(*?%f$U$>w>>`85~nEhlhCB{yAW+rQye*{RvL zubw*!1W);j8O>gCya?HJDH<5-swJ)wB`Jv|saDBFsX&Us$iT=z*T7uY&?Lmr$jZ>b z%ES!FwK6bh{loYKMMG|WN@iLmZVg`+?u-CxkObKfoS#-wo>-L1P+nfHmzkGcoSayY Ys+V7sKKq@G6i^X^r>mdKI;Vst0PXNUA^-pY literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-150_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a2e6cc928a84898ada01a690cb46be21a5dc1d GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|0wg_SPb32=mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkmA zmk}0t=R(GnB46jP)@3abK9}xpQh$?n$!Ae17lUn@(8|XuHb#oir+k}t)2tw)-(pV7 zMweE*Un`cp70vm2`jx1Y<=!c}N#1Wn_q)ffk5ap+(pRG}Eojz4mbKv_pRyCRr`!-) zd%;5?F5fN zH3Dr5U8X+P`Mo*UX0w){Q*Bq==QwHWuV#P6Kl`^j|N0cp)v1!BtukT5`Uww&WfLyi z+Z~eKCABL4spf^l64esVc_%#A**)`-9K+!`-?sJq?tEty(!l!e)8tIP51o~An@*W} z9T0xj^GaT@{krCC_Q0_HOJ+NL*2;3Z#JZ4Q>hiZ`g(-_$&5CCmuQ8I1Y&EUha6(4* z3zK)uL#yUD4EqeZ<~%MqtiAbc-rb`;iLCRD9n^(I8n~w4Jm54*;nib<`}*IHLk|UiQaRbFOffPr+2LDap@#`k>4kO9%nzv_}J!|*k75a${(&q zubFw&aLKCHc_MzHsnuJ{fsxdH_@dY!rq=CM3wWC5fKrWWiEBhjN@7W>RdP`(kYX@0 zFf!0JFxNFS2{AOXGBmI9nO2Eg!ErERK(!v>gTe~DWM4f85d1` literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-150_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..2df02c392996b2554f975c9366cb797f51b93363 GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|0wg_SPb32=mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SklRjhKRTX}jt@Xhz+YE_RFOq}Xd zzSz5+D^PKzKl{wmlIO>*PoL5FXm|hgnLT?x+kLKkR?E(&Bi4O1Y2%;tFM&>VU;Vzj zI`C#1t=Q|5|FmJNoRDRdaP@((qBNnCnhaZJdM@dkTCif}9u-xal%q2wmDjge3KvFj zCU@#&ubJo@duHqP_-pB&m$t2AsWVgx4e1QEtO+zT?3`e+EoS4HrBYp|cg4Lgb@5r~ zGS$OHd6x^5)K!l;SAMLGUanXe^w?p$zcbU^>x;aT?a!)K9Z{VXn{K`A?y6&l@7=WI z|G9M9m&X?CKE$4VxqrrSQLz%mzp7HZok}`cL~K;DY*bG@d8s3R{_^p4>wjuoZxC9q zVc^HT;i&hv$`i5-X%&yH(@qHeOC2CK<7@PF@Y&b9Xy~0=aaO38J6P8vlpX<+duuir~m?-aH8+?FU ztfo5cP~P6t3m&qRO?ciQXx5<9|I;}<)G_2pV%+Aa>!GnCPOQGGW36Wi6dn<5tu>2D ze{J*7GXHd;&S#S#nfTQ|oj1B{tobuh$>1C>Tf{?VUx(()5k|Y?^^ZzyQ+cm-N%;Pq zXmI3M3jbmD&pF%crk~&nOem@)t`Q|Ei6yC4$wjF^iowXh$UxV?T-VSf#L&pf(7?*X z49K-IFlhb5_yk2mZhlH;S|x4`Ul#6+0BVo~*$|wcR#Ki=l*&+EUaps!mtCBkSdglh WUz9%kosASw5re0zpUXO@geCwIB0iS@ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-200_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..07bb68ba944a904dc3b133da908443e09d53a84b GIT binary patch literal 1032 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL0wizG`LQ2Jv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i!>V3oBOs5n zz$3DlfkAjZ2s0)>>pKh-WH0gbb!C6T&d0-Lq;W^05~%5#r;B4q#=W<*{5?bxCEDeW za+nIIOy%r6a6%A}s5+^oqV*YmfN?oFDRqTDn>hz*4No z`G?BxCLJwW@OpAV!LEHA>?>b47i`#d?vQJqc|qICDZ6GImnkW{WAUD0#S@n3hUgl$ z1zlohOu{z)=l1TIlz;JZdCc5t@3^OXZdL1#Tx{t1_2e#>$&=cqt@(A;_0YQeFWof! zJiiBs&E9{)`_@lab54eLA7&l?lX5}I-mgc(@YLStvtKTm9kR0hUasga&6l$Uel4n6 z7(U6ZwJege{Mn-RME(AbNe>pTzUTX#Gr*6PA%AAFM8>vbYA+d9?R=7dXwsM1&5`ro zu5}X36>xIaw5{>u*0hazUVexnb)MP(*9wT-C(}1 z$ZqMo1oqn!PbHQ!tXOjIYg8l0?Ue~L%ywBY91y8x*b=yz>7o42zq(&^lzlE7E=xG} z%i_Wo4Vm+CKO_U~kL=1=mgia98=2L}^zIYeip1=qoac|WERWnjK}qU*&9vz(^)s&9 zKHo17OIg4KmiYA(dzSH?2h39!gEE_HiEBhjN@7W>RdP`(kYX@0Ff!0JFxNFS2{AOX zGBmI<1#ztm47A!z98fgm=BH$)RpQnVeY@umP=h4MhT#0PlJdl&REF~Ma=pyF?Be9a af>gcyqV(DCY@~pS7(8A5T-G@yGywp}-nN|p literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-200_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b71dd10ecb58f5808446bcb898bdfb324838fc54 GIT binary patch literal 1010 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL0wizG`LQ2Jv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i!>V3oBOs5n zz$3DlfkAjZ2s0)>>pKh-WH0gbb!C6T&d0-Lq;W^05~%5br;B4q#=W<*d_6(}CEDbV zY6Sh>YNi{-?ii8alpw^pb)|#hLf3auJ2RB8xvdmq7QO1E=`>@J>&y#EIx8l4cqnb0 z`f%AIc@ANg*@2oJ+glf(vnc*_?v8c&u^;m`TNR(%``z+=P5HAk{1R=6Q1o9u^oy{& z_SWpGy^rR!esc@obEfR*t6h} z=uK{MO|_gur!@+BJy^wxXIRF!&;EGKPfOynMY*}5-S60r;w1+-cb^H1<(*wHk@I>$ za7MDaq*>kENlX0B-}a0@yT4$%SjQT+hs9pYR{v;KUs5pjFIW78L!sZ|4^K3Cy64)a z`iB#yHVg2DT1q?=nA$9KZpoibJ6er3`Ng*vbgo;j$uG9qKr7IHR*|>HAi_MnWA1{onuvj;9FN4pgj(!JeYla_=^7k8lEm{9d-)M5}hIK9bb-cG9 zOb)tuG`ViIYevdO`^8oZ`<86Z`#fR8^YUF`&w?)1&O3TbzqljrT7h!mPGgw|lCLf2 zOVs-?^O_jERld(-9y|Au<(0gUpxGC~JTH~?daM$+Qhk}L^l)Cy6@xvGSpH7A^kQY% z^kSYFX zeCza&lNGCWPJVGeUA#Kt_e$TeIHK%lyEh;hQ zaL^TGSkzNpu`TAzlkeLv?A{V|KJ*^*)y{rqXYWHF-?YxZB+?RL&b-I_Rr!XQh7NPm z>t)x7$D3zhSyj(9cFS|H7u^?41zbJk7I~ysWA_h-aKbLh*2~7aelb{U% literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.scale-400_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..52b835c05b86d0df7584c267542ad4878748b00b GIT binary patch literal 1803 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 F{s&^W8|?r9 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-16_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-16_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..3640ec3fa32ceadea3e7a3df4e3180d8465e6708 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2>u z-+(Y~}U&3=E8do-U3d z7QII&ZR|SaAmZ9@6C*1!a&!i}CzBNH{$w%fjy2lb0b|{DmZk)LL ztk&+lX`wncPg~3H&zae{T{&~5^_s2U12ff5hBo$#e`6QTUiCZNm^Opat z`4`~$b+=!jNQ|C%kD-ZF@AG#DqO_BHe*N8d?e*8gT-(DX_}b^3Pv4}o_-fYQh)K&d z9R)T-=t%IeSv>D}JVT>vho;Z+;Iz#**C#f-E%RP}IdN-Lq19Xq8NMr7rVKnASeiEZ v7pZy*xh)pl_rBOh&hXfV+i!o&sx_W}UpIB#|C`RB@MrLJ^>bP0l+XkK?c%3e literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-16_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-16_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..f068d41135df2abd08dad102205db6c13269ca83 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L9(7-n!%-EIpw+JZ6UgGKN%Kn6%kB3X!XZwboK%vc^E{-7@=a)|0&&QZ3aHRfz zrpqFM-k9d#jJ*wRN)uPC|C%7h{~%CBtM!;V*CN5dfV5<$d^iAu4ZKtK)_xXBv{%%t(5xSCOw1>Wtdhs%M3)C}j8YS;5L8 zKQH{*oSj9_o3=iCpTCdcLSfmml`}iCfzDSgag8WRNi0dVN-jzTQVd20Mh3bD=DLO^ zA%;d)h6Yw9#z3x>fx-17dd?^sa`RI%(<*UmST=Lof1n0QkPX54X(i=}MX3zs<>h*r fdD+Fui3O>8`92>u z-+(Y~}U&3=E8do-U3d z7QII&ZR|SaAmZ9@6C*1!a&!i}CzBNH{$w%fjy2lb0b|{DmZk)LL ztk&+lX`wncPg~3H&zae{T{&~5^_s2U12ff5hBo$#e`6QTUiCZNm^Opat z`4`~$b+=!jNQ|C%kD-ZF@AG#DqO_BHe*N8d?e*8gT-(DX_}b^3Pv4}o_-fYQh)K&d z9R)T-=t%IeSv>D}JVT>vho;Z+;Iz#**C#f-E%RP}IdN-Lq19Xq8NMr7rVKnASeiEZ v7pZy*xh)pl_rBOh&hXfV+i!o&sx_W}UpIB#|C`RB@MrLJ^>bP0l+XkK?c%3e literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-16_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-16_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..f068d41135df2abd08dad102205db6c13269ca83 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L9(7-n!%-EIpw+JZ6UgGKN%Kn6%kB3X!XZwboK%vc^E{-7@=a)|0&&QZ3aHRfz zrpqFM-k9d#jJ*wRN)uPC|C%7h{~%CBtM!;V*CN5dfV5<$d^iAu4ZKtK)_xXBv{%%t(5xSCOw1>Wtdhs%M3)C}j8YS;5L8 zKQH{*oSj9_o3=iCpTCdcLSfmml`}iCfzDSgag8WRNi0dVN-jzTQVd20Mh3bD=DLO^ zA%;d)h6Yw9#z3x>fx-17dd?^sa`RI%(<*UmST=Lof1n0QkPX54X(i=}MX3zs<>h*r fdD+Fui3O>8`9I>X^Go>4DMCKCZlBoZ1726_~J-*mfO0Wu6j{eC~bP?9>GjsO8_Hk7?QpMpFcGH8Q=br=O6M6gPsCffgkUt00000NkvXXu0mjffbrIO literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-20_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-20_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..59f4b0be724ce80eeb6e8c57e587b8db5332bf0a GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc0wmQNuC@UwmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`&*s!i>HlH;w}Z*-JcqUD= zd2Plh+UXd=!hFzAK(K~gS0tJ%Du4N_?Z=-g&0AR&skiMAR0(H!MuSRDd ze%w|n96o15-epfiwurPoKIC*G^VE?B%}q+p_FNQne3rM`hYXJp*U{j*}h_ z{)O+!y*4AM*`dF3-lhX~vqj@R=>7T4|DVy>W^K%x1x;^&epfAVjVMV;EJ?LWE=mPb z3`Pb<2D%33x`rkphDKI~2397BuF?hQAxvXI>X^Go>4DMCKCZlBoZ1726_~J-*mfO0Wu6j{eC~bP?9>GjsO8_Hk7?QpMpFcGH8Q=br=O6M6gPsCffgkUt00000NkvXXu0mjffbrIO literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-20_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-20_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..59f4b0be724ce80eeb6e8c57e587b8db5332bf0a GIT binary patch literal 546 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 A4*&oF literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..788d405f453839ad52a263c7abdc7d0c64bc61ab GIT binary patch literal 680 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q^v-g@k7caFQ6cMiKnkC`xACP9xiR4?HhJ7Fff*Rx;TbdoW45symoV;%<=fy zftw#baPPjQveb-Svc9SLmZzuXPvNrL6DMmwefF$lwuU+TG?!vYzGPK?uUN4$lYkeoT*>=yzxM!=EH>O+r z@CFA>`phAh9P`syJu^BkvFH>3{!eKg;`)KLUXvbW8MUuIOJ{vX0Q zlK%P=59JXat)x7$D3zhSyj(9cFS|H7 au^?41zbJk7I~ysWA_h-aKbLh*2~7YO90gMV literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-30_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-30_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f7094e3374bc9e8b31667b321b2847e02409b164 GIT binary patch literal 770 zcmV+d1O5DoP)JFvx|1?*8T@>1qZi+LuV(WE{!;dTA{6AZ&1^#Pvv`CxoF#1XuQP_WJx~xz4#@+ zJivFpD2j*#fM0;8RVkaz2E*ZSZE9-jPrJd+&dz>bUS9r)#bUqP)at;A7dQl_+YMMK z6c`y9X;%TjvMg?HZXA1n+2e$|lFDT)P$Q!y@7cyOE~%IG4*&tybNYhebq^ z$)xR`kB^Uc4Q~0$v@DBkHf!6bX_|YFlZc3AS+cymY@6-c+FI9UE7IgrH$#)jWLMD- z@bmMtXqsk2Q>m2WAg8CNVw$GZ>vg%mzZb(W$;qupEu62Ew0hgQ4S6c zP*s(5I!!zt|MXhf+uNg7t5GZ#nVFekV`GDhiwgiEkqEl3GchsI=zHG}plKSnx3?&Y z($ONFot*Fbp!845d7V%heij!OQ4|G_$AhY>#9}eLUN6C5 zkfEU=o}QkFMxzW54+G>s^?Tdp)Pa*Pvc3a<0r;As!%ER>KmY&$07*qoM6N<$g3R`3 A4*&oF literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-30_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-30_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..788d405f453839ad52a263c7abdc7d0c64bc61ab GIT binary patch literal 680 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q^v-g@k7caFQ6cMiKnkC`xACP9xiR4?HhJ7Fff*Rx;TbdoW45symoV;%<=fy zftw#baPPjQveb-Svc9SLmZzuXPvNrL6DMmwefF$lwuU+TG?!vYzGPK?uUN4$lYkeoT*>=yzxM!=EH>O+r z@CFA>`phAh9P`syJu^BkvFH>3{!eKg;`)KLUXvbW8MUuIOJ{vX0Q zlK%P=59JXat)x7$D3zhSyj(9cFS|H7 au^?41zbJk7I~ysWA_h-aKbLh*2~7YO90gMV literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..7363adf4cf4dfa495fae568322fb38a8676bbe03 GIT binary patch literal 681 zcmV;a0#^NrP)uwsEx%D;sTQEV)fD6(QBsbdz3 zFJNioJ9y)qSXjzJK7)miK$3blA{&K;am~uqJ2=A`hdO7j<x_f|c{r4jI zljM${D3wZmR&s6aj$};$@B_fp17?2$@FG0O{2fAgpg90QkxHd_N#Srfgu~&usOdGe z3X&HA{4G8F2~Gl3t5sC1)%y^93}>ZMApinkxm>tzs`Oy;Hlzug1#`5c?gMt1i6{Cvw09>?&Y ze!owxRx6u6pU>ZPdh*N@d^8sXfz4*~=H@2>?rDA!z-qP1%o~lyMUB$wG<`lFv)L?{ z%O#`HD1AO3bGaN>s}&1{0=-@@y-BknX0u5_5Uw&ONw?e0PN&0UGRaD%LW9A; z!C=5ZAi!3u#c(*xdcDr^c+CBNe;$A&d%YgJ-R{Na2Y_O+NT<`ucDqf3!N6E7M!Vh4 z>2%6)I82+(#z-V0yLU2%@pv4GMB?g1sZ=V6qKITN2>=L%LfCG%&}cLOfKsW1TCFC# zqaeA%4gQ55j|ZYC!teJ30E|W>`u#pcQG_H(n9XKbEEdq|bZ9ghhkf#@AXx+O@>K{) zlAzb?p;D;;0MqFdCX)&K{T`AeL9JF}yWIi+%w{u`O64nnUtjV3*1w@Q)foB~Q7{<& P00000NkvXXu0mjf!l*Al literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..80df0b81f93ce325c4239ce9679743d69f738ec9 GIT binary patch literal 647 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SUOx&gwB#~18e3lwB8@$_|Nf5Ohk!=>%BeZx)$2F6fN7sn8f<8P<#^LaehlwBESE zaj5Nlnv>6_ix%055AQvDcV=FG**n`a78-YiIamH?W_TH}FQeavtD_+>erLy|t|)!E zt7$4NF_RW8%zp5MxyNArtY5OFB9}b(zii%eDU9RtWgZ6WM!p|Lvrfw1P@HvA$DeIu zHv0y*nz~HIyf+LFNH5WZ00=b6ZSt-x;5g-)iv|C-gFASr;r%z;$6x8A>+x( zhJHWI;xiJ{r&uOUVb%)i*vc$qQgy<0YUsHW4>lgqeJyhH(9xG`4jO6O)@?pz_kGR7 zzy-%lT;+DW%1d?>w~hX~Zpt~;*ld^lN#C~Qrpf%gKffzx>-5L|~Y!mbgZgq$HN4S|t~y z0x1R~10w@n19M$NlMq8AD?uwsEx%D;sTQEV)fD6(QBsbdz3 zFJNioJ9y)qSXjzJK7)miK$3blA{&K;am~uqJ2=A`hdO7j<x_f|c{r4jI zljM${D3wZmR&s6aj$};$@B_fp17?2$@FG0O{2fAgpg90QkxHd_N#Srfgu~&usOdGe z3X&HA{4G8F2~Gl3t5sC1)%y^93}>ZMApinkxm>tzs`Oy;Hlzug1#`5c?gMt1i6{Cvw09>?&Y ze!owxRx6u6pU>ZPdh*N@d^8sXfz4*~=H@2>?rDA!z-qP1%o~lyMUB$wG<`lFv)L?{ z%O#`HD1AO3bGaN>s}&1{0=-@@y-BknX0u5_5Uw&ONw?e0PN&0UGRaD%LW9A; z!C=5ZAi!3u#c(*xdcDr^c+CBNe;$A&d%YgJ-R{Na2Y_O+NT<`ucDqf3!N6E7M!Vh4 z>2%6)I82+(#z-V0yLU2%@pv4GMB?g1sZ=V6qKITN2>=L%LfCG%&}cLOfKsW1TCFC# zqaeA%4gQ55j|ZYC!teJ30E|W>`u#pcQG_H(n9XKbEEdq|bZ9ghhkf#@AXx+O@>K{) zlAzb?p;D;;0MqFdCX)&K{T`AeL9JF}yWIi+%w{u`O64nnUtjV3*1w@Q)foB~Q7{<& P00000NkvXXu0mjf!l*Al literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-32_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-32_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..80df0b81f93ce325c4239ce9679743d69f738ec9 GIT binary patch literal 647 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SUOx&gwB#~18e3lwB8@$_|Nf5Ohk!=>%BeZx)$2F6fN7sn8f<8P<#^LaehlwBESE zaj5Nlnv>6_ix%055AQvDcV=FG**n`a78-YiIamH?W_TH}FQeavtD_+>erLy|t|)!E zt7$4NF_RW8%zp5MxyNArtY5OFB9}b(zii%eDU9RtWgZ6WM!p|Lvrfw1P@HvA$DeIu zHv0y*nz~HIyf+LFNH5WZ00=b6ZSt-x;5g-)iv|C-gFASr;r%z;$6x8A>+x( zhJHWI;xiJ{r&uOUVb%)i*vc$qQgy<0YUsHW4>lgqeJyhH(9xG`4jO6O)@?pz_kGR7 zzy-%lT;+DW%1d?>w~hX~Zpt~;*ld^lN#C~Qrpf%gKffzx>-5L|~Y!mbgZgq$HN4S|t~y z0x1R~10w@n19M$NlMq8AD??>2K~z|U?bk6#8*voJ@oy4|xyylA1VJ3MNhAn@IaE*)2eT>I z!Kq{m6rJ4M1Q927RB;Ik4h3E6q7^bp7Keaf21zg=h-fedAxbco*GbE1QqO77eD)azD!R~PsYsVkw~QW;NYNkY-}uPqWl-| zqYC&5xXe5tl}eG%=gpJ?kk98yrBbHrfp1o`m@>sHA z(@fQ8vstdMuc@!EHxCjK)1Y$X-CbExP%@b$m&=vY0u%wQtgPVicZqyTyh{*2lu4tNOK()8G%f-b-Wk8ig z6$KSTIh{^PBodVYiHL;5VNn#tfKpYpWbf3oA4Z?gM`L57VeRJThU4Sow;FU~{-(`j zGSb=EX*eA~=H})~aylY^xw1kShr=PEP^e^>qM$+;RaGS%4wn>D5R}PeMA!9-Uu&=3HTNQ91#4wjad482u_HniLAOixe0 z7;>NU^K&jQFWK4Ip{}kDfSQ^bY&IKSua~{OJ-l8oGcz+ZH#a{IdTsjp`dC<40O088 z2!PqySx!z)7#|-;*LAM0u82mXoSvTIa{c)evrSD+1%OX)g}J-Cqp7Kh*49=4L%Ki<5fK;g6>z>4>K~H@zE{}rk^dmS0l9V! U>QdEUKmY&$07*qoM6N<$g2{SzrT_o{ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..61be432569a6b769673a71f654d3aa1dfade2655 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FJTm!8dC7c&M1#uc6}jv*e$-%hjlkWQ31 zRxjTBWBCOM$E6%jLarN@I=AV)e4;S3WTkUphOx-SyspVREK1*`w3lgH?AQ`;@L-dI z)e6Jzgp2?|uY~~|OT~p-KI~AL^Gwg}eNe%NpVPiqzu$fT?)QD?%jYP*QjVW%Q7(`o zkT|97)Rz*CsdvxantuG&{4M&jw=cQwGuh;Jqt02q?)dXxFH7ncn%k-OaDTmfFe%@{ zYLm3^WySvuW_8xhD<*IK@89cWQthzPCT{hLDON4J1Nk0lc}<$cRmE%@>i4N>)1l|T z!ku>BdhoPU{mRvqtwy3BnVg)hv=i^8hz{^VHLP!@7+&F{65Gxi9* z>&{Iqk}A6YuVGT0ftW@h^Jl*xNBOJjo~JSbj3+IbdTL$mGwliKE$>5jed-igU%_MY zv6(YLv{`)W{E5ZKB2>;*UH$gW*mGX|0ro{T%t>zyLwDWE(6vc_7&X5{FlC1Qf%vW^ zm2R^t{oX8yy7fd?fbH3fhqk|MR8A@PF=QmndEjeM=V!@M(^0xj;sL{CF|IdEDLjYv zEO{H2eo$|6>f?X^S1i+GSiz$G(9SsW9WWYIOI#yLQW8s2t&)pUffR$0fsui(fw``s zNr<75m7#%^i5ZY?>2K~z|U?bk6#8*voJ@oy4|xyylA1VJ3MNhAn@IaE*)2eT>I z!Kq{m6rJ4M1Q927RB;Ik4h3E6q7^bp7Keaf21zg=h-fedAxbco*GbE1QqO77eD)azD!R~PsYsVkw~QW;NYNkY-}uPqWl-| zqYC&5xXe5tl}eG%=gpJ?kk98yrBbHrfp1o`m@>sHA z(@fQ8vstdMuc@!EHxCjK)1Y$X-CbExP%@b$m&=vY0u%wQtgPVicZqyTyh{*2lu4tNOK()8G%f-b-Wk8ig z6$KSTIh{^PBodVYiHL;5VNn#tfKpYpWbf3oA4Z?gM`L57VeRJThU4Sow;FU~{-(`j zGSb=EX*eA~=H})~aylY^xw1kShr=PEP^e^>qM$+;RaGS%4wn>D5R}PeMA!9-Uu&=3HTNQ91#4wjad482u_HniLAOixe0 z7;>NU^K&jQFWK4Ip{}kDfSQ^bY&IKSua~{OJ-l8oGcz+ZH#a{IdTsjp`dC<40O088 z2!PqySx!z)7#|-;*LAM0u82mXoSvTIa{c)evrSD+1%OX)g}J-Cqp7Kh*49=4L%Ki<5fK;g6>z>4>K~H@zE{}rk^dmS0l9V! U>QdEUKmY&$07*qoM6N<$g2{SzrT_o{ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-36_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-36_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..61be432569a6b769673a71f654d3aa1dfade2655 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FJTm!8dC7c&M1#uc6}jv*e$-%hjlkWQ31 zRxjTBWBCOM$E6%jLarN@I=AV)e4;S3WTkUphOx-SyspVREK1*`w3lgH?AQ`;@L-dI z)e6Jzgp2?|uY~~|OT~p-KI~AL^Gwg}eNe%NpVPiqzu$fT?)QD?%jYP*QjVW%Q7(`o zkT|97)Rz*CsdvxantuG&{4M&jw=cQwGuh;Jqt02q?)dXxFH7ncn%k-OaDTmfFe%@{ zYLm3^WySvuW_8xhD<*IK@89cWQthzPCT{hLDON4J1Nk0lc}<$cRmE%@>i4N>)1l|T z!ku>BdhoPU{mRvqtwy3BnVg)hv=i^8hz{^VHLP!@7+&F{65Gxi9* z>&{Iqk}A6YuVGT0ftW@h^Jl*xNBOJjo~JSbj3+IbdTL$mGwliKE$>5jed-igU%_MY zv6(YLv{`)W{E5ZKB2>;*UH$gW*mGX|0ro{T%t>zyLwDWE(6vc_7&X5{FlC1Qf%vW^ zm2R^t{oX8yy7fd?fbH3fhqk|MR8A@PF=QmndEjeM=V!@M(^0xj;sL{CF|IdEDLjYv zEO{H2eo$|6>f?X^S1i+GSiz$G(9SsW9WWYIOI#yLQW8s2t&)pUffR$0fsui(fw``s zNr<75m7#%^i5ZY_n7YETn zL=Z=X9y;ElAUe4f1wo2qr`j$CqUa*%YDEW^Zi3)qD;9)2Hyjr%No#Xn{~YvzEa82V zANe5fmjK;#(@p)5{6VtJ26J_F#g&znM$4@%FE8`@`r1uPnPgG~uni#4?g! z1Cx`JFbt!W9($Z#;kvHV@Ane`{eC}BPfuM>j(-(LpsK0_U>)s5Is*6i_bCWMM<5-6 zBzbsvXhZh&^e~^#x6)S|NOlIYE|7Fa3WC7R&COQ$z6O$HDwVP!0dRMBx7ohNfTn43 zVq(Gu?Cx6C&4%-MJj`aZO~=&**21Z(%0i*g z5?oDSEnF}dY$=W;Jx=p^eSICNRI2Kns;W3YKgZbESVJ@Z_4O5xkB3SXV6j+qypH33aAafzhGAfSejXPW7l_B>4K1rva=9GN&dv~xMgah& zQVAOy8_;zfv$L~S-QwaR5{U$!o}Q}uYi?L$u^2L$3}Ug^U*iB^XJ-eRrs3%52mnA5 zg+c*duNN~jGgjU7^fcz?<`4)}f2KEm%YSoogG?raNF)LP=BRR$V+E z$N2a-DwT>2_|^=V*XxC%C{^ctJ|ARRhA4_SI5>c=>$tqUgrX=|T3SLPkw7+^{oGO( tNG9?7|4eT)px;Otz|VFgy6L9l^9$DivAHGCtBwEw002ovPDHLkV1ftuf3pAp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-40_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-40_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..59cef34ed0b6c5704baee4350a91acb9acf7928b GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`FObWZ0@?4F)%Q0_H=O!@i_kW+HP;zy03>DB7=f3E+al=Nz?!V02E;Y11 zU^bEZDA?=aapt_!Ov%zT-gCN4RsO~4@6NRE>@Sw^o{_6~_+B_m;uMoA`L(~4Ymx$W z?Spcb%9)e* zNPfzBPN6T1VrNrsG9*kkeYf|3Qxx}I8OH4{mT7zqvi}0Jn!mRuN3M&nk_>txso*7j zU1#Ib_s<(mdJ4Yp6n-vP&J%rq|B<8Yc8qC;T&I60sB;2iRJFu4q9i4;B-JXpC>2OC z7#SED=o*;o8k&R{8d(_{SecjsxmE@St$!GwplHa=PsvQH#I51W!krO74U!-mg7ec# p$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe1W@O1TaS?83{1OQ*&ABO+{ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-40_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-40_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..93ef2fac9c51b2ffcccd13e58f196fcf9ba8710e GIT binary patch literal 867 zcmV-p1DyPcP)_n7YETn zL=Z=X9y;ElAUe4f1wo2qr`j$CqUa*%YDEW^Zi3)qD;9)2Hyjr%No#Xn{~YvzEa82V zANe5fmjK;#(@p)5{6VtJ26J_F#g&znM$4@%FE8`@`r1uPnPgG~uni#4?g! z1Cx`JFbt!W9($Z#;kvHV@Ane`{eC}BPfuM>j(-(LpsK0_U>)s5Is*6i_bCWMM<5-6 zBzbsvXhZh&^e~^#x6)S|NOlIYE|7Fa3WC7R&COQ$z6O$HDwVP!0dRMBx7ohNfTn43 zVq(Gu?Cx6C&4%-MJj`aZO~=&**21Z(%0i*g z5?oDSEnF}dY$=W;Jx=p^eSICNRI2Kns;W3YKgZbESVJ@Z_4O5xkB3SXV6j+qypH33aAafzhGAfSejXPW7l_B>4K1rva=9GN&dv~xMgah& zQVAOy8_;zfv$L~S-QwaR5{U$!o}Q}uYi?L$u^2L$3}Ug^U*iB^XJ-eRrs3%52mnA5 zg+c*duNN~jGgjU7^fcz?<`4)}f2KEm%YSoogG?raNF)LP=BRR$V+E z$N2a-DwT>2_|^=V*XxC%C{^ctJ|ARRhA4_SI5>c=>$tqUgrX=|T3SLPkw7+^{oGO( tNG9?7|4eT)px;Otz|VFgy6L9l^9$DivAHGCtBwEw002ovPDHLkV1ftuf3pAp literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-40_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-40_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..59cef34ed0b6c5704baee4350a91acb9acf7928b GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`FObWZ0@?4F)%Q0_H=O!@i_kW+HP;zy03>DB7=f3E+al=Nz?!V02E;Y11 zU^bEZDA?=aapt_!Ov%zT-gCN4RsO~4@6NRE>@Sw^o{_6~_+B_m;uMoA`L(~4Ymx$W z?Spcb%9)e* zNPfzBPN6T1VrNrsG9*kkeYf|3Qxx}I8OH4{mT7zqvi}0Jn!mRuN3M&nk_>txso*7j zU1#Ib_s<(mdJ4Yp6n-vP&J%rq|B<8Yc8qC;T&I60sB;2iRJFu4q9i4;B-JXpC>2OC z7#SED=o*;o8k&R{8d(_{SecjsxmE@St$!GwplHa=PsvQH#I51W!krO74U!-mg7ec# p$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe1W@O1TaS?83{1OQ*&ABO+{ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..8427e96d1307e1c014f70b0c24558da9bfa4255d GIT binary patch literal 963 zcmV;!13dhRP)&tmyoe-$JTDsgV^BMG-ce4K|w%q9_(AQkF;^ zG_J3&X*QdQ_%21G(a6io%UsVbiXkb`+1Z&0|8<#6CSF}#6*1oLNVbs4WJ((oMG=A^ zlvg`RnZ3QeQ4oZ*r+_kRCrJUaG9+XL$nux?Re+S2(CKtMIyzE1rz9B(kn$2*t(J#} zhf3y@Bx3=Rj7FpE>FN1VqNb)ssf@B@b(DB`c)dU1Pu3m|@ooSK?K zdwV<9*4A)vaFCeqa=9=uF_BbLavN=JZ7pbc00;(y*x%pB=jSJUJ|Ft}`tbbxj6fiO zPTK8ulH}&*CIK)I2+(S^a%5zL zBsn`fO8|U)e5A+YVN+9+Y)!3{SY2Hmc6WC%IXQ_~EC!#?m-EVh=i}o8p->2ZzaJWn z24=Gv01ys`vADR1_4Rf1_V%K=xfuZP{{9ZP+YJDio}R|w;9yccNdW-R>-E^$+R8ih zch1kx;cz&h)9J9hybO!Q0wDgew6L&%>gs9)gTc%T=G7Bf;&eJ`u~--mhxzjIk{JJL zp^J+P*4Ni_e0-cF^J^icsI9F{ta>U|s}=L}^O%{L!PwXsfaDhH>gvMW++5NeEr7o$ z(m#Uk?rs>3#7?XKr|Xnof@ek`3Ld8GzLY} l7oG?JPpLzwsHpt!`~&*JRf*~>{eA!d002ovPDHLkV1mx~w^RTC literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-48_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-48_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..f490a9aa0805a2fc967a6f8da3c6a60c10519ffd GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiU@o?$c+;uTyU|@Xa>Eaj?aro`@{ob=3C63#7 zUOKqyMSzooDu?KDg)1u)V!i${HU)Hg7mECE6_btOdZe<{dDo4VSAq&Iuf4?8HF;Ub zgpU1_E*)JsO@O)UuT{pQ-)^6ri`7Lx*_^g5|86(`arODTrz=}xKS!O5XZ*v?@It-u z)6a0;PA0oGJDnbL{@T-$xoO)EwL@{;FBxaO|F0I!UXk+C=u?7Z!T;|M)-f_}yP=dI z@^FWB)D~q=tAOl-(l6ZJ@t95BXv@mO7$fx7dP$U#+LY$7#reC8oSk+$b9da~d))Cl zHt$I1yqRoIl>DydN;Sx3oo)1(t#w(uy5+o}s_)dyW5(*g4*ffoAEs3P%lYS-yiL}B zH@!MDZRN)=hl;9p{yQnybn_ekFVClId(2B1IPC;d+3Yu*ujZ3@YRSM|vuDmrt;_dS zm$mD~JxFZ{m3r}1Gqh(Ti%sH&DYv)mu;}jMXjS>Dv8r;Rre`nLYmM}@t&>a7Fl-Jn z3@Z34{;ffw`A@QVM)I8SH6PhmJmmh+_w;n-)pzHETD)xLzjd*AYI@tDf%Du8t-mVb z-(8P>iTLUSG;6EoO8-SOT+BC`-0ssjrgFLFoY$6vx7WDr&-?5Yp*}Bny#RaKizlk~ zKmC*gW=r}w$bbCQA1v2@`Sr>@U$h%Gy_K26abc!v{bOTbB2X=HjVMV;EJ?LWE=mPb z3`Pb<2D%33x`rkphDKI~2396!K(3X6LF*sJCny?n^HVa@DsgN0vT$bvP=h4MhT#0P qlJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS7(8A5T-G@yGywqS9zm7> literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-48_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-48_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..8427e96d1307e1c014f70b0c24558da9bfa4255d GIT binary patch literal 963 zcmV;!13dhRP)&tmyoe-$JTDsgV^BMG-ce4K|w%q9_(AQkF;^ zG_J3&X*QdQ_%21G(a6io%UsVbiXkb`+1Z&0|8<#6CSF}#6*1oLNVbs4WJ((oMG=A^ zlvg`RnZ3QeQ4oZ*r+_kRCrJUaG9+XL$nux?Re+S2(CKtMIyzE1rz9B(kn$2*t(J#} zhf3y@Bx3=Rj7FpE>FN1VqNb)ssf@B@b(DB`c)dU1Pu3m|@ooSK?K zdwV<9*4A)vaFCeqa=9=uF_BbLavN=JZ7pbc00;(y*x%pB=jSJUJ|Ft}`tbbxj6fiO zPTK8ulH}&*CIK)I2+(S^a%5zL zBsn`fO8|U)e5A+YVN+9+Y)!3{SY2Hmc6WC%IXQ_~EC!#?m-EVh=i}o8p->2ZzaJWn z24=Gv01ys`vADR1_4Rf1_V%K=xfuZP{{9ZP+YJDio}R|w;9yccNdW-R>-E^$+R8ih zch1kx;cz&h)9J9hybO!Q0wDgew6L&%>gs9)gTc%T=G7Bf;&eJ`u~--mhxzjIk{JJL zp^J+P*4Ni_e0-cF^J^icsI9F{ta>U|s}=L}^O%{L!PwXsfaDhH>gvMW++5NeEr7o$ z(m#Uk?rs>3#7?XKr|Xnof@ek`3Ld8GzLY} l7oG?JPpLzwsHpt!`~&*JRf*~>{eA!d002ovPDHLkV1mx~w^RTC literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-48_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-48_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..f490a9aa0805a2fc967a6f8da3c6a60c10519ffd GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiU@o?$c+;uTyU|@Xa>Eaj?aro`@{ob=3C63#7 zUOKqyMSzooDu?KDg)1u)V!i${HU)Hg7mECE6_btOdZe<{dDo4VSAq&Iuf4?8HF;Ub zgpU1_E*)JsO@O)UuT{pQ-)^6ri`7Lx*_^g5|86(`arODTrz=}xKS!O5XZ*v?@It-u z)6a0;PA0oGJDnbL{@T-$xoO)EwL@{;FBxaO|F0I!UXk+C=u?7Z!T;|M)-f_}yP=dI z@^FWB)D~q=tAOl-(l6ZJ@t95BXv@mO7$fx7dP$U#+LY$7#reC8oSk+$b9da~d))Cl zHt$I1yqRoIl>DydN;Sx3oo)1(t#w(uy5+o}s_)dyW5(*g4*ffoAEs3P%lYS-yiL}B zH@!MDZRN)=hl;9p{yQnybn_ekFVClId(2B1IPC;d+3Yu*ujZ3@YRSM|vuDmrt;_dS zm$mD~JxFZ{m3r}1Gqh(Ti%sH&DYv)mu;}jMXjS>Dv8r;Rre`nLYmM}@t&>a7Fl-Jn z3@Z34{;ffw`A@QVM)I8SH6PhmJmmh+_w;n-)pzHETD)xLzjd*AYI@tDf%Du8t-mVb z-(8P>iTLUSG;6EoO8-SOT+BC`-0ssjrgFLFoY$6vx7WDr&-?5Yp*}Bny#RaKizlk~ zKmC*gW=r}w$bbCQA1v2@`Sr>@U$h%Gy_K26abc!v{bOTbB2X=HjVMV;EJ?LWE=mPb z3`Pb<2D%33x`rkphDKI~2396!K(3X6LF*sJCny?n^HVa@DsgN0vT$bvP=h4MhT#0P qlJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS7(8A5T-G@yGywqS9zm7> literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d742b734893faedac5728062c45d74778ae668a0 GIT binary patch literal 1234 zcmV;@1TFiCP)#?W-CWYi7V{!c%I3Abm_P~Tv=HO zQH(w0?CcD!t*!9;{gSm;R!FoXGcz+3Me)T-f3%)XC`{&-bW*}(?noysOy-7kO2TAf zX;Bn8KR=&|TqPl8VKT9_APAhBo0B?MNk~hWB;9UzLh0q@Whrx>Uc8a&U0)MPUHc zXf#sgDH&=1Tk`w;7#kalJEpU-A8pAMWJt@9*R2=qNH)qtT$Qt`36m za9ewQeI3Wg$4}zvbh_9F`0;jQe0)6aZ)UgKE!obi)#@kl^YZf8-``J??CtG+wtjVW zHAA5gNwT@Q`Puc6k&&3|#1+20yku={ZN_Dzg%=hU=yW<+Qc^+y+}_@f2-|EnE-Wn2 zU@#B>`}+Ex2oDYp(&ci|<#O@h;2?Ejk~}{@k1T);_UxnZ&CLx-(qu9b0B2`sBf=h! zha@>UIY|ICo6RKu6MjiDn*2n)rBEoay1I(?_IB*->|knY3TCr8(X>|)3Pf;cX#9N?hX!z1I5L~P%4!O27?F$0tf^G2!%qiLj5IB!bcC^IRx+}`r*=F w0DSkRDP@j-0Q@cpg7>Wxk&%&+k&%hw8+GfrA&^ydTmS$707*qoM6N<$f~6%iCjbBd literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-60_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-60_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..edb9d45d24e322791a607544ec4769930377d8ec GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw0wgDV75oXLSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXICJ|Af_a5cNd2L?fqx=19_YU z9+AZi3_>L!%y=(Nz5*!7UgGKN%Kn6%kB7@h|a@-%XeaD#h83oQn^2S-}il|-|zcg|9$UtYwwU_PNI*l9WX5@ z5Mx_CH&;hn#%#~uhrgxeyZ*;~KlY8c_OWYIP){~b(v1}n)r*r|lLfk7PMvQt`=7w_ zjXmc#ADt;6_&B2B>(%Y6R`chqbo#yM>O<~5GtZy-(Gl&<9Q^MfnK#p=KF2Mv_<`Qjs0kU(1lX?}TUmU_IK}w&}Wk z_~HxAYwC+$u8donu9|%LfuHR4Jxk1ZJ$Ehe^YyTr&&ad9`ZveJ8n|D~xsJ8l;H-dKBGX7^5S>Af+!8(G|LF#23%%3<|m_->TUe1@rTS@+a4 zqN-~zv@D7AytHDCOs_v@`>~5olFQ$^pH%(NS=?hdr_!S>^6b7j!ms?|m_PqB>%3&N z?sQdV@8K%N%>R?5*uO2$ZIpPV#LI9eX_Dt7%g2gB|M`A;T~Z956n{Y3jl=kW`6QQ& zMV+PHj`Fqpf^>>Ezuew(^_*T9o9WZaH`d?3-dI)3v$8S!LD9|pNs|sNY@K>H0GLWu zOI#yLQW8s2t&)pUffR$0fsui(fw``sNr<75m7#%^DTr%jV4&4z;(($dH$NpatrE9} z=-WMifEpx0HU#IVm6RtIr81P4m+NKbWfvzW7NqLs7p2dBXCnnv#Ng@b=d#Wzp$Pyy C(vD~V literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-60_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-60_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d742b734893faedac5728062c45d74778ae668a0 GIT binary patch literal 1234 zcmV;@1TFiCP)#?W-CWYi7V{!c%I3Abm_P~Tv=HO zQH(w0?CcD!t*!9;{gSm;R!FoXGcz+3Me)T-f3%)XC`{&-bW*}(?noysOy-7kO2TAf zX;Bn8KR=&|TqPl8VKT9_APAhBo0B?MNk~hWB;9UzLh0q@Whrx>Uc8a&U0)MPUHc zXf#sgDH&=1Tk`w;7#kalJEpU-A8pAMWJt@9*R2=qNH)qtT$Qt`36m za9ewQeI3Wg$4}zvbh_9F`0;jQe0)6aZ)UgKE!obi)#@kl^YZf8-``J??CtG+wtjVW zHAA5gNwT@Q`Puc6k&&3|#1+20yku={ZN_Dzg%=hU=yW<+Qc^+y+}_@f2-|EnE-Wn2 zU@#B>`}+Ex2oDYp(&ci|<#O@h;2?Ejk~}{@k1T);_UxnZ&CLx-(qu9b0B2`sBf=h! zha@>UIY|ICo6RKu6MjiDn*2n)rBEoay1I(?_IB*->|knY3TCr8(X>|)3Pf;cX#9N?hX!z1I5L~P%4!O27?F$0tf^G2!%qiLj5IB!bcC^IRx+}`r*=F w0DSkRDP@j-0Q@cpg7>Wxk&%&+k&%hw8+GfrA&^ydTmS$707*qoM6N<$f~6%iCjbBd literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-60_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-60_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..edb9d45d24e322791a607544ec4769930377d8ec GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw0wgDV75oXLSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXICJ|Af_a5cNd2L?fqx=19_YU z9+AZi3_>L!%y=(Nz5*!7UgGKN%Kn6%kB7@h|a@-%XeaD#h83oQn^2S-}il|-|zcg|9$UtYwwU_PNI*l9WX5@ z5Mx_CH&;hn#%#~uhrgxeyZ*;~KlY8c_OWYIP){~b(v1}n)r*r|lLfk7PMvQt`=7w_ zjXmc#ADt;6_&B2B>(%Y6R`chqbo#yM>O<~5GtZy-(Gl&<9Q^MfnK#p=KF2Mv_<`Qjs0kU(1lX?}TUmU_IK}w&}Wk z_~HxAYwC+$u8donu9|%LfuHR4Jxk1ZJ$Ehe^YyTr&&ad9`ZveJ8n|D~xsJ8l;H-dKBGX7^5S>Af+!8(G|LF#23%%3<|m_->TUe1@rTS@+a4 zqN-~zv@D7AytHDCOs_v@`>~5olFQ$^pH%(NS=?hdr_!S>^6b7j!ms?|m_PqB>%3&N z?sQdV@8K%N%>R?5*uO2$ZIpPV#LI9eX_Dt7%g2gB|M`A;T~Z956n{Y3jl=kW`6QQ& zMV+PHj`Fqpf^>>Ezuew(^_*T9o9WZaH`d?3-dI)3v$8S!LD9|pNs|sNY@K>H0GLWu zOI#yLQW8s2t&)pUffR$0fsui(fw``sNr<75m7#%^DTr%jV4&4z;(($dH$NpatrE9} z=-WMifEpx0HU#IVm6RtIr81P4m+NKbWfvzW7NqLs7p2dBXCnnv#Ng@b=d#Wzp$Pyy C(vD~V literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4d97ed69bd34fc76376e96fc818bcc58d26b7a49 GIT binary patch literal 1260 zcmV0AgC_v~0gyzc& z$N@k?Cm|%cUayze4$scc5Dte?Sy{E`ie;FgiNQD&e!P37oG2*(!mv0HW-a zkdgqR?30kP03vP@8XFsVPBk;6C4h*VgxcC#K6A|oX$y!(qhzz$SS2(!H}jb<@1!k& z=vji*YGsu$KR?e`zP$6M$Km_?dmJ1bupU=hTKbkSnI&Cwp-_lwYin7nKRG$cXTf+U zEdkjwc%n1}a2dQrBB80NsZ8X{J1Gg^GI*&}NfJv)K@hMw#~6*;#CFZ==1v9S;u=a5|lF=XZ8?!sqibn^LJv9*9d-{C+>l zb*_$|)Y}8UO$d z4GmaYT7uDNL^K-3;^HE2-+4AxR#pH2N~IDim5SNFx3`B-C4D%H8WyQACN+f+_Tnb-_atJPFkSjbf0<#G{G@-?8pzn>zJ2oWV; z1FEX3UX90T2E$ttWMN?A~G#U*6;Qag?J3Bi7 z0KHz1larH#^XlvCQB+j)aNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz#zOHgc*~c^&JKZvX^-Jy0SlE=i}ir(zqj03Dh*v)5S3)%tj9skMQIifP#WcI8xa(61HpP4JN$I`CiNs%newVpX-Wav!^mU7itZ`Kizc|gMHsiOL!8IcV| z9KvagIY{hi@nezqfSniv0%!=k2<2_V`U!hc5OShF>>W z4wwtoupVNapLA~W+8B1b=@s&YFFkGSpD(X!QTzONjaADp?svNuCd^wb^lekXlfRRt zvTnKZ8Jsa%cXPe;@*BsK!-}rS)qAvX2tE^A-y(ZTC-Lp$NxxdIc~3IS3JQvNv1Cbj z8B5!pCk!@^H9VP0c1HcaR3MnXPZJPMg1Fy3L89ek4mUDcXTiCWU_xt;ebLXyk(0Z0h|RR@EMNDCU{$g)IAfJ^xuxMD$#U<#(>W zaZ38$^WSsVr1pqxn7Q|W$n8(b=VzY#>*LVD^77c#U#===Yn`V3-@lOm0rQ{l4Eq^P zVpge1XI(x3Os}dXt`Q|Ei6yC4$wjF^iowXh$UxV?T-VSf#L&pf(7?(R#I-Uo&}uVr zK+%w!pOTqYiCaVT?VdkC4U!-mg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe1W N@O1TaS?83{1OU`~i;4gM literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-64_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-64_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4d97ed69bd34fc76376e96fc818bcc58d26b7a49 GIT binary patch literal 1260 zcmV0AgC_v~0gyzc& z$N@k?Cm|%cUayze4$scc5Dte?Sy{E`ie;FgiNQD&e!P37oG2*(!mv0HW-a zkdgqR?30kP03vP@8XFsVPBk;6C4h*VgxcC#K6A|oX$y!(qhzz$SS2(!H}jb<@1!k& z=vji*YGsu$KR?e`zP$6M$Km_?dmJ1bupU=hTKbkSnI&Cwp-_lwYin7nKRG$cXTf+U zEdkjwc%n1}a2dQrBB80NsZ8X{J1Gg^GI*&}NfJv)K@hMw#~6*;#CFZ==1v9S;u=a5|lF=XZ8?!sqibn^LJv9*9d-{C+>l zb*_$|)Y}8UO$d z4GmaYT7uDNL^K-3;^HE2-+4AxR#pH2N~IDim5SNFx3`B-C4D%H8WyQACN+f+_Tnb-_atJPFkSjbf0<#G{G@-?8pzn>zJ2oWV; z1FEX3UX90T2E$ttWMN?A~G#U*6;Qag?J3Bi7 z0KHz1larH#^XlvCQB+j)aNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz#zOHgc*~c^&JKZvX^-Jy0SlE=i}ir(zqj03Dh*v)5S3)%tj9skMQIifP#WcI8xa(61HpP4JN$I`CiNs%newVpX-Wav!^mU7itZ`Kizc|gMHsiOL!8IcV| z9KvagIY{hi@nezqfSniv0%!=k2<2_V`U!hc5OShF>>W z4wwtoupVNapLA~W+8B1b=@s&YFFkGSpD(X!QTzONjaADp?svNuCd^wb^lekXlfRRt zvTnKZ8Jsa%cXPe;@*BsK!-}rS)qAvX2tE^A-y(ZTC-Lp$NxxdIc~3IS3JQvNv1Cbj z8B5!pCk!@^H9VP0c1HcaR3MnXPZJPMg1Fy3L89ek4mUDcXTiCWU_xt;ebLXyk(0Z0h|RR@EMNDCU{$g)IAfJ^xuxMD$#U<#(>W zaZ38$^WSsVr1pqxn7Q|W$n8(b=VzY#>*LVD^77c#U#===Yn`V3-@lOm0rQ{l4Eq^P zVpge1XI(x3Os}dXt`Q|Ei6yC4$wjF^iowXh$UxV?T-VSf#L&pf(7?(R#I-Uo&}uVr zK+%w!pOTqYiCaVT?VdkC4U!-mg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe1W N@O1TaS?83{1OU`~i;4gM literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..bb27466d5a137a9d572e4a55cf96a35f5f3d28dd GIT binary patch literal 1322 zcmV+_1=aeAP)%oh84b8MBmyc_nAf09nH+EUO!$v zKRA&09G~;_^W4XKj|wmt3li->q7fIk8Jmgm>0(9i?;9RMi+{F3Kn3YlLO04npHMFCT($ae;X4il6FCMXF^ zP!gD+Bya#I-$@iQ%BiWTtOeiR-iFa=gu!6QO8h_|faBw1baZrNB|ZRfM8sCm7qA+X z1STj6Oi&V-pd_R$$nW>V;c&q3_h%!Y!XuSkq>YUYQmfSjfOwv#_4V~^Y*rN%k_AP} zd2gj4Ns^$=&CNJD?@g^%lgs7GcAj}dk|2Y@@Tr_qkR+){*Vos7+5hR>@5#bPiRB#XuJat;m-#?)5gT}_jnB!)%8D6g!dc9ss7+FxMR2Ui>f>x^q03011#f{;49({d%;^T*hhnRki zMuYP5azoScY{?RGmt2! zSXfwqMx%)tV=|c#2m~Mq0=l}o(A3lv7pJGEC+4_P`GtmDtb$C4UO}_7v$VIj7q_SM zu}C|ePU1L@0MPRCvN-O210zI2g=IIaB*>gv9Yn3zKMwmR8&-mZDL{~VH^d3A6d>dFX(hS*zI-zz|ztZ zoKC0M7l}l0b#*1SkCy>a1UVx54&aZhXPhQPgzM{T0DxAj{j{LIyu9H4{vH5OR#ql{ zcpwM@Zfyj>f;zP>^bgt+H_`}Qra*#F0Oj)-^w(|G%7X6`R)3X>p!e*oC>oCkx! gU@#aA2BT2<7vR)Pu?BL(`~Uy|07*qoM6N<$f*k8%V*mgE literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-72_altform-unplated_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-72_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..c337b4be5ee40dd2b3b0f6c9bea6e01a0b51d8f5 GIT binary patch literal 1027 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A~|<2s3&HseAwmvX^-Jy0SlE=i}ir(zqj03Dk7a)5S3)*}V`)k<0&O&N(7R()dL z?8JU&g^EVj&wRu4$M?*%e!S;m<@eP0ch2s9e(&?U{BySN=N+CqgJb%UTxJ&s!2p&o z_n93h{azBNsjK!f&C@tMdi}pCcGZ)rRfO+6T$MZD;?faQk>`7I`TAozE@#X>sNB1d z`xS=vn%>sde0JiRiJ3vP)`0cXum$a=+Tb`z1DxQ|zR`mBp5Sv*umOG+r^=MCIn^NuDR5*m?IAf zDjtqpeS%-+I7`Wu24fMCKF*AiSc|WDp#}@xvjnW(W!1fEeANE*9% zw;f(p*l6_Wko^SnnZNF?;ki&3`f}3d7`7Erp1dBD$}Al2dTB15GD)u5xyZM8g8sSB z9PS>|rz%aaJR`H=^i`dYG7VD8?a%WVpV{zaqxXzBGgs^NH_nFlP3>eZXs}AS^Kxt8 zQQd?VL-*oYa~ZyDi1FIC{%WE+!{4oErt!YoJ59BB^)+GVWIwqxeG8@fYZqO3Kl{1w z&3%n~8EPIVeeQcEt$U>Mta|x5@8>_u``)t6SC-_Dy=b>RDT?=%aMZ+-b6+o{F0O6O zyI^NDqrCP{kNN>;sjeuts-@S@>fDwrsQT+;eAeWzrNh&Dw|%KyatpdAGhCUZ0PzNHKHUXu_Vl&Jb z7#dj_8d#ZvxK;)RT5To{C>nC}Q!>*kachXa-SY>iK@wy`aDG}zd16s2LwR|*US?i) cadKios$PCk`s{Z$Qb0uvp00i_>zopr0B>ij%oh84b8MBmyc_nAf09nH+EUO!$v zKRA&09G~;_^W4XKj|wmt3li->q7fIk8Jmgm>0(9i?;9RMi+{F3Kn3YlLO04npHMFCT($ae;X4il6FCMXF^ zP!gD+Bya#I-$@iQ%BiWTtOeiR-iFa=gu!6QO8h_|faBw1baZrNB|ZRfM8sCm7qA+X z1STj6Oi&V-pd_R$$nW>V;c&q3_h%!Y!XuSkq>YUYQmfSjfOwv#_4V~^Y*rN%k_AP} zd2gj4Ns^$=&CNJD?@g^%lgs7GcAj}dk|2Y@@Tr_qkR+){*Vos7+5hR>@5#bPiRB#XuJat;m-#?)5gT}_jnB!)%8D6g!dc9ss7+FxMR2Ui>f>x^q03011#f{;49({d%;^T*hhnRki zMuYP5azoScY{?RGmt2! zSXfwqMx%)tV=|c#2m~Mq0=l}o(A3lv7pJGEC+4_P`GtmDtb$C4UO}_7v$VIj7q_SM zu}C|ePU1L@0MPRCvN-O210zI2g=IIaB*>gv9Yn3zKMwmR8&-mZDL{~VH^d3A6d>dFX(hS*zI-zz|ztZ zoKC0M7l}l0b#*1SkCy>a1UVx54&aZhXPhQPgzM{T0DxAj{j{LIyu9H4{vH5OR#ql{ zcpwM@Zfyj>f;zP>^bgt+H_`}Qra*#F0Oj)-^w(|G%7X6`R)3X>p!e*oC>oCkx! gU@#aA2BT2<7vR)Pu?BL(`~Uy|07*qoM6N<$f*k8%V*mgE literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-72_contrast-white.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-72_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..c337b4be5ee40dd2b3b0f6c9bea6e01a0b51d8f5 GIT binary patch literal 1027 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-80_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-80_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e636f00d75cae30fd20c202cab5db914bf0890a9 GIT binary patch literal 1563 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Square44x44Logo.targetsize-96_altform-unplated_contrast-black.png b/res/terminal/images-Pre/Square44x44Logo.targetsize-96_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..217ea2d31a00e2aeaa5095b4fe055e688784ecc6 GIT binary patch literal 1721 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 a7NqLs7p2dBXCnnv#Ng@b=d#Wzp$PyX&Mi^^ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-100_contrast-white.png b/res/terminal/images-Pre/StoreLogo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..59318f1e47d5446c86122b2a199448d834d562c0 GIT binary patch literal 777 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQHmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk+Tz5xWP1T!gHI47>g4q`ix*l|5=WY#R z|DUQEa%CHb5(n$VI3IyS>zg?}_2OskR=KYC{Z7&S^7nhs|Nh&|UjqbEUX$0}J#IVe zt>fj1Pd>gX{CU24uDSL7KN_#kZ8{NG=zc-$Lt{qeCOxNPT+Sskz2`64ze93EZQmu1 zq@`yaawG42^jF!|`d=kDz+7zF!v8|KGLo0?X`al!AM571_vrukrkw>Bl~;Z`-?GW; z)ut713za0p!X|B5xuJX#3iz# zttkOd4b&`8?A?0l^(!38CdpC-zq}x1TJ-jAF zrpUhEqnKll>Nz8W6Kui9ZX_%PO8tMmCr+|Szsy=0S3ygKu64!{5l*E!$tK_0oAjM#0U}T_cV6JOu5@Kj%WoTe! zVg}?|85p$wVSIw3AvZrIGp!Q0hA#_uMgTQPf@}!RPb(=;EJ|f4FE7{2%*!rLPAo{( X%P&fw{mw=TsEEPS)z4*}Q$iB}x!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4{XE)7O>#2|FJTm!8dC7c-zHYfl%)kch)?XV_+lI7+n5 z?{!bQ(!pq0!7tDCbjipnUY~08p6ma2~mrJKBOW+1?MKPrntr}+k5-qj_ ziG-Z#oI2ywlPO1TJUNs7u;@-&{`0c$-@=YmuG%^CX63&3vu`%qZivtk>sA$&sh@5( zajo6YpQp@Mx7oAnmu=nr{`S0?4F^4+J9ku+I5yt7y1+-~n(gHe9rv$2d2M-bgI9Ru z&Gqs34E}Z*{0jMb`q!C9eVf}(vfh(Ce!qBf_}7=d(f2)97uHzI3ikKC-#cB&R^Ip7 z=D+vd*SGCE!0`QY&+<>x<^+UgbmnPDD!tsFwN}7M@^0RQdjWqc)9!|KI=)*H|7Xvw zJAWqMZ0h*6gt=plzgdGsRX)QDms`J%GV&~6JAIy3u;78$N4_l7yBi;~ION~fo^=NN zM-R&vd%9~Gtg-{x4kibmLOBKuqiK*-I?bDlf_}(WtnUb7X3Q-r%`a0{)v!tDK z7tf#Dvq@azf)Dp^r5Dd%{Xcg1n85QLJabq!`TTqNPw-J-@0H5!EXDWoSATnc%I%u! zW>vX;7Q(y{SCckI=uE3`y3e>?{{D$}?G#|jQY~?fC`m~yNwrEYN(E93Mg~R(x(4RD zh9)6~MplLfRwiaZu9bm7>mSA^C>nC}Q!>*kaclUpaAyQigCxj?;QX|b^2DN4hVt@q hz0ADq;^f4FRK5J7^x5xhq=1STJYD@<);T3K0RSrxdR+hj literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-125_contrast-white.png b/res/terminal/images-Pre/StoreLogo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..fc296cb2f9a05c23c0d5469a551410e58ab0ebe7 GIT binary patch literal 878 zcmeAS@N?(olHy`uVBq!ia0vp^_8`o`0wn*2-3S3vEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4{XE)7O>#2|FJTm!8dC7c-zH8&4O02VYsu;gqNUN{*y>uJ_@YD;k(|*`AIt`9!AqmNh=%vm|>>p3x zZhLQXaQUkJJ^XY2I4%-@er54%!-K!RIvt(y^B{xn?urN5XP&?Rs$2H2^VG)AY&W@A zzke&T;O~9+^_+Ig4ZkkUI`Q4-nFiy1ONrlCqD-V~%;*1D%KGc_@%2l&PD*XiuABFA zSEI|e1AOy$Fh zc<(23h`Tb}+t6K;`#1Mmz>2T$x6Jx0s=Py^s9APTN|#MRi}L{n)(0%rH*Ve9>+W9a zdCB-~=+e&T=Vx6gF7=+&HEWWIw&$uG*R=nAoOK23;{HVItQP-Y z>Sg=fR+)Q^u{1Mo(iVUI>{5>KYZ_I-wiixT)yJ5B^;llwALRFW z*5%l4kN7w5izlw$8Yicr&^GgF#M&QA@4sH9_G6)aP1K^>GZl2+oS%9&YW|sNCNCDp zZC6}183ZodFPxuN7r}XKN!5E`(o!vPjVMV;EJ?LWE=mPb3`Pb<2D%33x`rkphDKI~ z2396!K(3X6LF*sJCny?n^HVa@DsgN0vT$bvP=h4MhT#0PlJdl&REF~Ma=pyF?Be9a af>gcyqV(DCY@~pS7(8A5T-G@yGywn%5O*E` literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-150_contrast-black.png b/res/terminal/images-Pre/StoreLogo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6c20ce317dd97b2899cd9139bc0a2afaa3d42d GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`FObWZ0@?40W~f3ba4#Hxc7FZeTHzL%yIk7 z*+JGBxeIhl1^)AdbuW_L5_Obsrjcmj1*;t;nxzE=;vy=Oom|xyMik~A^pxo?30d-A z;EjBMV>{cHCQX(2>8~d)nZ9TDlXaaR>>@wCt9xHQ|M%YG)pukgbi}%kCT)yZr1Gpb z;_jR!J8QOo*;qXLq|ehU`PTNOccRw{Oi0%JrrfYPPjhuw%*81_doFCyR9PLE->mjN z>4Ma+9TgY7tUAKp&+}lE;aU`0z9vi{Y7gH%^Rn9s(@dSuuwSc5;aadY@69xY?4Da{ z50xjI&pW*`Bz0RBiw&<-NnYgI3tPACIOiJn>TT4X`FSr_3B0=0R9MaDH#I6UR_xq* z_tU+Lw!ZOlRSx^A;OC+hwl!>@i_RTOAiX8YG{aRhZ1T0djcI!`S#&kmTe~Lt&dLR` zJ_>E@7tCb6C7kSYA@0Jt&w3u;qcqFYPruS!6}JD=SNS8NU&TD<2CVy6ygKAnkVcSc z)>NJ_#x>UEcRNY-TD1-)Kv`?fN8wil;t;B28;+7d?`A5Y2usBU#6py77a`MNfbVu6OsIR(=`pWAtS z%VpWHt$&P_O2IZ%@e3;E6S!B%^&%ET?ikGYv9)GU#<~JA3=iX%z`m)$j<4Hu%-<}^* zki?=h?SE(evN=@;W4}E&1g2lr64!{5l*E!$tK_0oAjM#0U}T_cV6JOu5@Kj%WoTe! zVg}?|85p$wVSIw3AvZrIGp!Q0hA#_uMgTQPf@}!RPb(=;EJ|f4FE7{2%*!rLPAo{( X%P&fw{mw=TsEEPS)z4*}Q$iB};v1O- literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-150_contrast-white.png b/res/terminal/images-Pre/StoreLogo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..66fd56550582e6bca6f1ac9f8b048bc9e7e3385a GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`FObWZ0@?40X5C_ba4#Hxc7FZeMYdO%yIkm z*Ge*`9&>bT-zH|VWs!y0?yl~Hu-vPUmW3QSs-(1|t9ijSM|N}ZR=v`V34u-*7j{Lx zRbo9Dq;;&``OW?xr3Su}zo>q{ce>iQ?f0EY)$iXOe_mI9=c8W2#t0p;?xRVaLd(y5 zmMz)1vS$0jbJy=5uM6R;O}YK=nzXT~RLaj2d*pA{i3KkG6tlc_;hc-c!Lwa|-C>oA znIESv_G!%y;m5n=*UptzV%>1MKkV$rsJe`j>WZ^B*7mB%wwbZN{2*|0Z|mx?-G&jf z)RI?AWb#kEQ+VG`)F3K@t#sG6HDNEJbZwHFT-L^R^Iu8p^`7+XYOc*Z<|zqLhI=n) z6?fyJ<@9yZNG8WGof+2O=2gb&;k8pm7HHT z>tBEMDT;^vyhzV7UvJi#Qf6sdGxMz%o|QU#U5~@|+;u6Qn?`xd=SwQQHVj@pXZcLQ zsuzq4I&F1|wZ7~1H6M<5X5ruc$JuWK)1B`ctP>KYGEQEdR_O7(Zu@5I54Kl#t$Z1} z|9I=XDPKbPrvye7_Ik~_C|?_#e^A9wVtUPD^YbE_@{6sGelNo_@RWwj})5ZUvD|H5wjk zjwV4;%O`%$zY%4=8F4>=X;-zxHKHUXu_Vl&Jb7#dj_8d#Z_ z0l8KN2CaV>pP*>S%}>cptHiD0%fg)zKn;>08-nxGO3D+9QW?t2%k?tzvWt@w3sUv+ Wi_&MmvylQSV(@hJb6Mw<&;$Uu3zIGY literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-200_contrast-black.png b/res/terminal/images-Pre/StoreLogo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..60eb894b35a799669ec87c8dd7f3e0deddca022a GIT binary patch literal 1135 zcmeAS@N?(olHy`uVBq!ia0vp^DIm?NMQuIx|P`FOaDH10@LGB7aPdb&7g=MQKo%A z_eY+_22W)-m&eME){fk)f(ON;BDte(bo46ya4|GY5DC6x35vnF(U^(Zl~V{P|nA(y1S zZR|=}DYV(6OlxCz%F;;<9oxP9Wb5a5Z0EB2_Puk-`bjf7zVB(OG7?x>V1MaMVSnhk ztEaSjU0U_!f898?-LtZCUTf8CA*CBj;_P@TvhMhMEN1#sol}2v(!cL9pENcuoOdDN z`=yKvk6BEG1V3KNxEioXinAkSvEXixFsaVHH6GE*VH2a}q;fSgk7#Y$q10RcPOEZV z+3VgVcIN5xzP+BTlIiF9cKRft$l$>2J+rSU9*>#$C_lJL>1p?o4Rcp%6#3hi9OT@r zVYKf3E$x;#OQm$vMS{IAsuLzo@Sc+PZqu2c_fO@{Qog%D^35W~ig(YR++;eiWAeJ? z6Wydvvaj20R^Zuw^G*u0f8?pP9a0S6fADOvSb5y%0^gQRCr<7>=FMO=Q}Cyhs?T-T zeXq6|8ypUN6Q#W+YO53Xm#sNHIwjXKmnNs^6kO-JtHkhi&FTl=Y*-RR#aEUWi5Yn` ze$^>Iom2A9olC!>+hyqurRQH9n*GkbKX`BToC~7cUC&j|doP~N7QZHJL(!?eRPEc1 zwtISGvai-uy-pK*fAjegz6&nGzA_!2DHgU9Zn;0S}ZXJXdG^{=?^cBSXp4KDWIEaj`4ca{R4a8_Z>AErpzj z|6A>6IGMSX!|0E+6)N S&PEETh{4m<&t;ucLK6U0g4jv` literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-200_contrast-white.png b/res/terminal/images-Pre/StoreLogo.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..93713970ec561de492e887ffe79ee733a1559c48 GIT binary patch literal 1099 zcmeAS@N?(olHy`uVBq!ia0vp^DIm?NMQuIx|P`FOaDH10@LGB7Ypdb&79h}q5v@(`H$WL-`b!5>NeUp>ZlqC3{DUh>iYS^@EVO=W}xRL}9o~k#| zI_WseMMO#MRd(U*r+PQn?5-}}UjD3l+0MCh=gv+~+jn>7ZRW!UJP7pRWMQjK*JLS` zx!s{fX1p)T|6EFrQ4_yDO9W^jd5#Xgqe}bbrd-e?on3b9=-hXO`Z6 zynUHrp6=GZ&MQ)CLD?oQbEj;|yEo^U+ZMA=jTMR)ujeGUoaa1Me(_{-`J{>I**PwY zqJG~$(g9T79i1XuyXN$+r=1*kpL}`IzGVKb=^4^bRd$MKW@t!@mMh(DY*YCgkiWO9 zCP*_htWzOz!~Xfjds=RPS@wR#D#P{uR$tss<%QhoTu`=m&hntG8_G2&t?Y`P$P*gV zowDpvoJ!2o{&Uynd+g{k38+_+ToK}>@@J=#>yLE#uhVpt z(%;9;{c5(g%E{F1N_0<1>|!IOM5+5*_DzzSD!_TUVs+oCtR3PfJq~a6NRyiS>*K;# zQhKgsZ5ex3PHXd?_&qgq4M*6?#k&@kExhY^PCPbrw!kUzt93hql>ARg^@^%q-xunw z5cDAKtBaR-r>A-vX7DM?sLm-sMa2P`HV5U^6a`PQVh`<%x-@c^O_XP zRUBuxPq$yq_#$2HYq`kg10tDM%j^v%FFkZc>RRww52?Ux&z_nO*E5eAUJ|O#Qk4^I z(3G2c(OR0Z;+WyGKXdv^E}n3XV@ZAYdw#v8WWU7ki6+WLL9?4=Pv>lSe^K7Ey-Cn= z;t$J72c=g(=Q&^9TiYIep!8Po^(f=@_kR62RkZG>yR(nMK^EsemrM7j2^ss@7tGkp zu;tOihpgL^8IE1LUUxFL$K=H1<;xb$Nvr&HMWIFN>B-AMx}W9S=Gkl&i?^Q?)FK#IZ0z{o(? zz+BhRB*f6j%Fw{d6vVYMFwkl08-nxGO3D+9QW?t2 i%k?tzvWt@w3sUv+i_&MmvylQSV(@hJb6Mw<&;$SwGtfE! literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/StoreLogo.scale-400_contrast-black.png b/res/terminal/images-Pre/StoreLogo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d9835eb78f697a313d46ccdd7667ef29665838 GIT binary patch literal 1906 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-100_contrast-black.png b/res/terminal/images-Pre/Wide310x150Logo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..b1efc07df3ad9e846c115b4fada5a52e5cc84e7f GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yU^D}=r*W_V$$$59Du5JAx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq_>O=u<5X=vX`mo`iKnkC`xACP9xgqbyDmWMnO=LkIEGZ*dV6PYw@j%7 z`-l7_rmPyr4U?YOFqJ#CxM&A1D!LUD#M-i8u34r_P-bHC!Ws1kBiOj(IapXYlNPe* zxHtx9I_$Z_snwLP!sS$>W48TGWp(zB+jsA))Yx4eSs#AJK3B1h;$I-0k}I_(aGBeU8B&SKSuMF8OW&N{r?XX# z&3xIx@R{P-`AdV0zvlLOzy9@N!oh?)@jG{&xmJG2%Fa*G$2ZTNR1=t@g3wn^T&97GG#Ls`f zl7A}fHv4ns^-rUd^JGrfTF#T7bmrO5JG0F{2TpoYFmG?wl9l~OF24}?{^h!xyRPMQ z{?Gn?Papo7w)v+?_$N29Ni`FV*LE-1%@%#{)$Hc~`3t(Y?q79p<&~SW)+>j84O&{a zGP!iQnN`dDPiu>_@0~B+IVo8AeU@$g^O|!h)!)>1PPqOlOzu>y=f5)-RrH@+ymqvt zYXk2_?e}qyC&oW_D0}AeY?98?t9PapuVweYp8HO+c;mBIPJiPhM<;dK{{7;@CIKB18E;|Cr3MjoU`ae^pY}JBA89@($T-6fSh?11V zl2ohYqEsNoU}Ruqple{RYiJT;Xk=w*U}a(k2D?NY%?PN}v7CMhd8i!PC{xWt~$(698#Fx?}(V literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-100_contrast-white.png b/res/terminal/images-Pre/Wide310x150Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..066fceb3401827275f68987c8c02abd65874881b GIT binary patch literal 1014 zcmeAS@N?(olHy`uVBq!ia0y~yU^D}=r*W_V$$$59Du5JAx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq_>O=u<5X=vX`mo`iKnkC`xACP9xgqbyDmWMnT~k6IEGZ*dV6PMw@j!E z`-glX&xtE$I5{btQj%EXq!8w`g;Pyjfa%mt53i5$0b4c*9?|MJdNV^bgz2TvbOHV; zAyrC^rx&V~CnYZwN;)7=FLrz#^Ud3rPro@QVK@K!p2W2F?``_;kDqyy#{_f$0T5lH zl)bX|*3GJwMho}G%=f#sf7;G<%dhj_-Yw_guaols%DKJv+_C=aQ>Bp_jCKsbDnZ9su=z%aBp7FV`O~j*clFKW96J=o+8z7 zqZd^Yca}@NHExR&M$wnYU%F>!}y9>w2r2V?ul~W0OU1 zg^ItD*A)$xSgCoO*DdQ*Ve`aUGTZH6M!n$uj1057zfN$M-;%Z~P}odr znY3x5_oLI_oqH{Go<3Od-_`HQvo`rE<@QNyo*veDUh++K=QREz+x5>fCO!FFV`For zw9j2W`H#&j-@d3KmGkM9?ot)%l+bK)T%2r zp|Y!=T7|DHU!CQzdnNzW3yHc@< zo3!VvR@!&R`Y#J_$?cgv^Z#^ryQxd>oO>PVX>=lb=Vawr{(1LqU$TAnb61rAwZl`r zbg%EU3NU}=<0^T#Vd~p?cTRaFzs|aMuKK6SVWVHZ_g+>t>{ZHnU3cr0{g&FfR|Ef_ zUZZ9?clqa}eP@@x@%;3l;Ca;b%ZvS=ZMt=6@$HYfrpI^BlOvE|fYSe?>zUI^&-SkO zVxI@(s+PD$l%ynzopr0AaL})Bpeg literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-125_contrast-black.png b/res/terminal/images-Pre/Wide310x150Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b0c364f9d912cc679d5928174eed4d8a640665 GIT binary patch literal 1320 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h_i(TP$xE*Ub$}F0x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LjzFpFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0V%N{XE)7O>#2|FJTmyyODiAn|r=5L-Zjv*Dd-rn`?2u+n> z|L|Ydb<(Ln3K<#0Azt6m-5wRV2m!hX9_%9yqbh=&Yd^o1L#Bk9Cpm7G@4P@(pnx&=m%mdQh64%@lW!d%mlXGdB zNY&Rqg$tqKQfu1NTpuz!E||T}Cg!_o(}XB(4&`IwS=|p(;^uuklbl=5+4lHT@we++ z(~ebbNKJU%DB37^xt?d9Oac!JkQL8U_4SQIvI0lXjDJZVZZ&{eWl11Dh-`ke&Vu=p z%%tU;6`wD+l{-EArrmo>yHoEy*PZ&+qyAIvzMAK?XY0O9s+l%_*{!>FZ=c1#%Rb_f zdG7N1b369E2#DYO`$x!c)vrFGZ}*k_kuBY}>fQb?KUlSy7O%2gqJL#Bci+MLjut`e zuWotO2JY70y1MU5o7dZ!T!;2qMX+Z(2}pz*vwzj!ns~6f`J>n0z|d&zuVru7U3s{w zYH!f(WlaW#uV-v~{f^6=QEt-IpBDVjPw$zS%Wdq( zZ{+Q=N`vh?pZ~Zo_J#98#nP})t*;Kgez%ov;;-IN_SvuQcDuB^RWxzMH2ohPyEhw2 zZ%%&oc#rJP3E!9BWqkbk&a4#I+o`1!6nbXxZ_c^3*tb$?`KLI!laD9)38p_939N%9{`d7HEQ-MSB~e-B(amUHfE_m8Ii&nDm7xNS8X>A4A5 zf(U*SXJ4kBU|Mmx2dH1Q#5JNMC9x#cD!C{XNHG{07#ZjqnClvvgcurG85&rbg1A-& z23l<<4k#LO^HVa@DsgLwzTNW&s6i5BLvVgtNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6 RHc~)E44$rjF6*2UngAjSCDZ@_ literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-125_contrast-white.png b/res/terminal/images-Pre/Wide310x150Logo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6671495b6c0479f458de0385d0504c19b89ac54d GIT binary patch literal 1275 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h_i(TP$xE*Ub$}F0x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LjzFpFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0V%N{XE)7O>#2|FJTmyyODiAn|r=98W-jv*Dd-rjNS5D%4M z|L}g6i(p8Gn^0`ag2|_n0#hbz*Ne3hX$s=ZboG{fC7`I77`~8C_DENkRmlsWqD2M< z#)}pm2u|55>vesJfz$u}eCxLTzkBEJ`m^=vKYsr_lX=73_`Tu#-*WHmH%|sSfplQd zbnMo;0~|MJ+%CTP$MxI2k01N<|8DuPa@)NvACJkhi))mqu@^6R>*l<_^GgtS?)|He zxuNov)6(US^u$dA7>9WKG=4RjXF+DqZm1SHG&+@8#=xr?cYc z7Oy$R+UV^T|NTyoF|R3?$swskjeY+4$L@8#IbU%*v`N)4dr94nb6?JKIY(|CE-_vf_ilHgy*ULH@|8^0xY!NuC5U4LHQid|{@y#N2E zu+UeFKmYchE%;*1KE2w~+Kn$H=I|bRR<+45>}uPs;86XmÑ_5Iir!*kca-5MtF zVol`SU$?Bbyx4j$B{Vi}rTOYt3xVpQwYDx^6*rsj(5;>B7dhk^5C%Y6R*5B@W6rDXMT zqpABR*G#I7oHzHUa&Y8a)5yuM|LcA!zJ0c>PWUD7Q_-%U+wRTz|Kp)jrNjL>y*H<< zp7x=t{@LN0TV;zGNzWk+3=0nbV?5QeYl38_oFP!ZYKdz^NlIc#s#S7PDv)9@GB7gG zH89sTGzl>@vNANVG6iw13=Fi|OdL=&Qx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq#8g3;(KATp15l8?#M9T6{RulC50{a~9f?Yyh08o$978H@y}je#5gRVc z{^9+U5}rnfNxmK~vzE+CD0AAiLBVyywil~jJH_r0H187lAGk5|V91$8(&c)0G+Tpo z8r4i$xMQa%P0NefF(Jga!%^tJY5lB8@#4kLCsw{cn-X`a^0~^-nl$6@=W5^oz4x&8 z`JC!^JM|fXuAv&(VZ1fMetq#)J#($EcYg87+C=lO`Tt<^*CgF-dHmCIvtk*VpMU;) zO_itYIs3{#D@rAGDi@S8^32POJ-~H8BbMQ`%NFt7QQ{X0O~0E8wyx{cDDib!n61PW zD;)UZmeXq{iICS!$9|-g9JwnasNiJb%`|aVfpl ztp`%I6IuVPj4Ajobwj&P))?r|n5^ zphNJ=vtM_0+?yV=;N6iFjc-r>ir$|6IcwgWXxnLeUk;T7ZnrbvR%`12)aCV}2X&^F zS8Sr$^Q2y!tKM;Ym+b=M%SlE1`21Q*;)LDT-e$Hkw$*s+bPFW0+I4BDNAz~~lC-ZI zwm|G#BRV}(F?NNr64&R=WeLk#O}?(_IJD=EmeFTEuzT)UnOt5sd0Cw3#p*d%UCVp# z{yaJ5>#X%#^tyS|RMXV+?&i-u5xmoCTfSla%$KtnuAi5>8~4KXy->an?~B{gA^{0! zZl$-Whu@j8ttR)2zqDE8lNga>XQVEy{rZlLEyN}9Ob+AS_;hoV1xj4WzqnR(9GbC@ zNo$e8vh@vJ8a*?4POj8sv^7``<)pvYSRn3JexzpCzR>5ZUmeLfpZ==)>-|-$Zk1l% z{NK$bv2?QH?@O{@7lFCbUi;g$>scQTNuBZH^P3!<-=Fb)!11uKLn1 z$~^UN?bQAGN!I39zvm?VXV-5Uy}3Evc<03RPq-H+@3Z>zZZSjlj^4f^*}X5kzxvIU z{HEhCF1xdhF0=j9i6gR0w>Zr_p&DiuQ$!`a;YxNtJB|VtgrGjw@=+u?|G2k(@QUud?r1~dHpP5X8wwo zF0yC&?Jqt*y?=7f-b|qvRsZIvM2k(jbE1Bd&a=gLB>w&lUaYxP#a+Da&Mwyl+FK*s zpKo)k%l*G%{?t+)s%34EK?VK4CET*Ma@>)-D+1)ImbgZgq$HN4S|t~y0x1R~10w@n z19M$NlMq8AD?N&PEETh{4m<&t;ucLK6TBOK4XB literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-150_contrast-white.png b/res/terminal/images-Pre/Wide310x150Logo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc7b1a55c2c8cd42bf8f64e069334acb1d4d6f8 GIT binary patch literal 1402 zcmeAS@N?(olHy`uVBq!ia0y~yV7v%qKjdHmlD5a)Ie`>Qx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq#8g3;(KATp15l8?#M9T6{RulC50{a~9f?Yyg&v+Rjv*Dd-rn}_m{KZp z{Nwp9yCK%ayb`nqDMa zSow)Rtxd1uqDH`_Pq!1(+0)a`&JF$kbL#r*#WyP}(teyhyyv_5dE@hwf!0$G#4LTe zXY$P}Nz+!Ys;Ui)KBvF?_4}jwwMO~ryI$WtxMylCf5X1*pNg(KzqmaiJg9Q(>qLWe z*Xzs+-rrouZt!I1I`#uLo!cH=TgQIkLq=YPQ0p>Jky&bi8M9m#W&%0BrM3*uLP~9$ z5`*m|dkbDVDc_ru@tVCz=eYWfx?rf&n<H?IeFrrpu^KF zgQOmo1a9u@v5A}8ziIDl$Ai4tIdZoH*jMkG?b)cvow8|PokVxZO+Oh%=T#d$8Wpcb zEIBYCOD8D7!&mI((JJ3X8+x)Xd8{t;7MbR2DyC`hr0b&27wgQc!9suM7nfeFKbBLb zA8_t+EI)UiK=_>N+xTO{?CaCY7e|UrJ1RQq=C*_d(K6kKj54(YIuCVlGXLHCZr8j< zFA+B%krxYZ71T0M)#%9p%WY$VGdFt3#VK59J}tV!CGkjviu*dP3#HB0Nq$#;Z`~Kv z&v)%l)cb30izoe%4MZY^CV_h$aBnK?6mFREU!ZzXqV>6)~* zKG*(l>)-GF5>e8tzsuLC+w5J=zCB&(_vfnoG&}!1r~d5un^Q!8D&6Pb_H)hu@A0ww zLo;rf{);Wn6RTbMPV!EmRsF6P8+S#7p65xsDE?RPmdWz&f7kb&Zj_Oa{9b71^C|9H zxvhnm>mu_7bARe?PpSWZao?PCFXx=wx32wYlgh2GrSmt}nmW(7ms&p7Or7W>wtRtW`lPMS-DpH^ltAe)Nmb^=W#w|K_bL zXWx=$RbBikYQ9O-r6Q$jqq|?UO_QmvAU zQh^kMk%5tcu7SC(p-G6Lk(Hr=l_`j8WniGyX5xUNAvZrIGp!Q0hUnWpe}Eb!K{f>E rrERK(!v>gTe~DWM4fuAMXk literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-200_contrast-black.png b/res/terminal/images-Pre/Wide310x150Logo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..c33de15b3bab2ca1afd4b13519c268c1058fd93e GIT binary patch literal 1940 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images-Pre/Wide310x150Logo.scale-400_contrast-white.png b/res/terminal/images-Pre/Wide310x150Logo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..357a83f132552e9df66f92aef7655993956a935f GIT binary patch literal 3848 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images/LargeTile.scale-100_contrast-black.png b/res/terminal/images/LargeTile.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9f6ceeec51eb5a251e7fdc478cb1a587076129 GIT binary patch literal 1300 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 Q?E&fVboFyt=akR{0FY=G?EnA( literal 0 HcmV?d00001 diff --git a/res/terminal/images/LargeTile.scale-150_contrast-black.png b/res/terminal/images/LargeTile.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..2b51fefb028b673afaa7baeb504b6c345606ff20 GIT binary patch literal 1818 zcmd5+doi?>X=HeBki_Z*?_2 zH2?tAu^2QC0Oa^Pp`s{bnt$=#ElY}V9{wHxz$%As;+1509|42&2LP%W0OaHYz=n*< zSpk4FYXEo_0{~970HBlH$PIFqUC77!dZPj0`%)8I8B$Hgd`<=cOP`&POQ%v~G5~~v z_4k52fqVkBLlhknasfbD9gFq|$q-0{E+tw--Qibp>bbf%oKZHceS+3wP9=ADBl)Dy z7Cn@f|E$o}C*Wg=app#Ht7~c&2M>BOw-I3cRs zh=AmkoY`f+Azwl2eX;n~n9=xtiehZVimzGfO=CB~H z9E)bRJXF})4!q$AYLn9|jfu9PcGtNwVSvUSNnu=OgB7o zn5GGvFH$fjLSe|q1E6ma{Thay8|j|TnzRA-vaGp0fto?iZxS))^CKs`3X3an}(Ak4|)pQ^}sN?p7`Xe zJdDm|bSKQb3d8OqfI73qlprjd+h$DMb+&Kf*O${PoK&YrMf9Tr?dL4cx`kAP6!w2P z>^F@?x!k`esu6U~7o*9JQ%NHUnYHZsV-gQ@KW6D{Q8#u>a@7Sd7R!%+Gu}WD2kHINc@@o1}kCq3%Qkn%urQ279LsQ zUgyW0xdNd^v_Sos)mN0AE^3IT1wZ2Wy#fWxjx~3;GERbqZ|FL6uL_+4Lk6_0?dRW7 z^l^hBeOlH``FVrf@2D5Ke^^vhhyYtj|`2Fr-E73$twD0Xh+TR1gU>8 zDrESbk~}dQ%g#9@TPmWViX`W&S))6elG|ktYX82T|7Ikp@#2w04Q!k2HMBZ7n&Arj zN=*31(F?C>Ck#Zk3^a6ZGf~YuWq!XE0n4r(xYcpI#m|hN_hPgDPCSG=FiUj~S*^H4 z!h0`O^|={e$k;1=8k-pOq9R!?ruTh#>wAM`(PV}>gYg<3z9f9>{IyX=mQhK#sBN}- za1aWR=W^okAYv+Wof$lpR9+oXc8@mb zojCMGu~96Nr>6B$|9(5eQQtwr_K`*Ix3}-hkSWD0f^rH^AvzIKiLwOPTH9J9t&bpW vP$4!pPIiZ#P&?4c+8R)~RPm33q_d~uPoMkmf|O7Ma;G8ID*%1nGbZmZsh*lD literal 0 HcmV?d00001 diff --git a/res/terminal/images/LargeTile.scale-150_contrast-white.png b/res/terminal/images/LargeTile.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..602efd44f01cf838d3e7ea505e17d8276c1bf220 GIT binary patch literal 1821 zcmeAS@N?(olHy`uVBq!ia0y~yV7v&z94tVQ`KP=EfD}u*qpu?a!^VE@KZ&eBzCyA` zkS_y6l^O#>Lkk1LFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0Vnyg-<-ys89f3`sf6LvlxM#=Ok7M~ax*aSRX978H@y}fJSArmTd z;A4Ex&V~vPDNe5E6P>&}6()J5Ug81iD$eO}h572>P%H z>u&kPpP@WGWR|ev@;+A~%g6WL&aO57eD6)2U9?K$*>|_^-k(16c5S&hBhUeZ8eGXJ z-yef4Yn1oNR7ruS}!wO;3#G7+oI9*lY z3Z1MG;=3rov=b}mEZ->~-~8&5=ZE=(r=1KGS)~@ZVwTIotn%q`2X6cf>aMfw!m1C+ z#1{v?9lN+;`zvOv|Y^Xet^|i9G)%pvg)(T%QGscI#PS`vzADo zoxId}vc}@6rU$qMG)1Oa9x9dxQnp9*&y@oWWly%bK5^1X^E=O8rEv5gv-Z?KI)9`6 zKFz-!w+$0#+BEL8vhrKv_AAyV=9l31Z4OvR;TTHn3qc4t4zc+wQ?V{F_|5p~7d+SeawB$W`^yL3S z73WqqyZr3a)MxEWdOz2jt9#`)Z||KqQFw*R%2^JoURPPP0#~U8bOxC=dQDjsD*U3T zc-hWbCH$7xW?eqJ$whMFIc8hC#~)w$ysx}h7PY9yL$&c3gZqWs>%2-F_JwMM9}>7H z9xhZaB->s7JH{hDs;8IpbPDqW20vZ_jn7_-m@BLvS}~;pQ^kW@SF%kCgBJLxTx8s1 z`tqPu5d}*6egM5x8=6O;z((o3-Kye3i;x^ul8EV)VsLIzkgI`a$~W? zyLlUIwc}quKB8P`@UFA}@#jAAO)~jMiVN${^Ox(|^-NE;{c8`51z@=PJ>8am$jI_y z>ncxpCJ{p6oV}W~_$-rWo+j6KUgBOcD_woI?3A6;9tFM8 z-`n98+sC{yuu3rbxyG#5ZZ^X4Q{!Bw>K)(AbawmZFHFx4e66s*mgN7YbLl1Tl}D;- zB-bDP_+#rAr$Jr%fgG1m@{h4~$BhZH8c|z;T-6fSh?11Vl2ohYqEsNoU}Ruqple{R yYiJT;Xk=wzXk}yycptHiBAH%o30NQbAZpUXO@geCwJK!=6^ literal 0 HcmV?d00001 diff --git a/res/terminal/images/LargeTile.scale-200_contrast-black.png b/res/terminal/images/LargeTile.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..07c342a30c52042ad32bdf730583a1a557193d61 GIT binary patch literal 2512 zcmeHIdo-Kb7XPZfL|wv|DfJ#1t&X821o4jdRrG~Kyi)N@KDERvRJfg#P6>mKR<*R3 zDcVF+Ixz^Qv2KWG8*N0;jzLQ!Ly?-PNAG9uU-yr$HTVBHYn}aD`?t?NkA3#p=bMv3 zzUl|{4gvt6?(gSy8UU0idmVNFV&2@eZ-L-If=8eS06Z*H+a~@E(oJIhP6q-&&Jh48 zU;w~-h$>hFfDCKMBL)C4*8xB$^=9WOXUL#*F2L6d0PZmnNJvvn^}|yEz)5|t?<2ws zeuYStbpJqam3b8nHM?UU%;jGJ0Ibj7%j0aeR6Y}YIWobpe|9CKqG0rAY=kP-Bh2y* zS4)mXPCjGqOEUSDqSG=Bdvo{q{n+BOTFn++$08XQy&qp>{@4n(vWpvHE{WJq;};#y zlonqJL?*p@fkJKG+T3&;cW?H8&puk0>;ixSGev78(U z(`nZOoh?wYGT|Ap)u%$6)(VZQV`%Y8c; zdOtpdFD`GM%Hk0AbVAWE!yfSC5isWj%2yE-cSrtz z;b=I#V8Jo#NflLP$2xZZpceYJ0rAg+{@}{`2qhj>wg6`rDftdq-o+pdR|_d&X>UvO zBS**C_Dv|Ym8uj;h@m4+Vzsd5@?m|>c|51G)0DE4YL21COTd|ddUQY1d0B7xehI6157_|KX0kmH-# zj=`+e<>Fts@N2mneI;zpOV-Bn5Z~u8KU9)y;TkP%!b%Qqi3S7w^zC2-V((-qO@jC&l#;M)_`|SKdJrJ!0~%uA{1`LaRJ&?k^2YEmZfgc0Z6$u;|povIe&H&9t0$m1ZEfT;Opo7RKkB>Gejj zlr>u{^OKfSU zAG@K+rTds7aeZb;9d%Zs9^Ps=8qx6pzOEDB- zP)`-X!is9@#EdG-(B{$|K3&joBRG zZJ8nBMJQ2x#ZAEyWdymzT~cUDF7c2kLlP?~{G43kDN%-`m!$9shJ1eh1iCG8TQXS9 zo6HFVvTEWx9pVIY(;Iai7QBAhxDbzUxYFOeG%`8$H0Oh-e_lLzqvyGELY6D{5(v<1 z|AnBw2xr5wl_U#egPCGvtZjRO)lz@Ndtz7yNx^ZctQ*CR5$li+DfuL7V-#Nu@4AP$ zUno~NqvrxI{FZ<%n=-EEJb%qfB=$NS!hfyM=JH>J(^T>G%0!E0DwLVxz0B<5h}zLLi(%!w=qe=*V zL3Sy)LsK}JQd~O3Ie_QZ8ED7O_UD!cHd1%1nBscfXDL0c*vH(9xcGZqt&pWiF8?6R~!z|q!mrf$4$6;dA;vfK! z)<|nhYkNx@+p{({7&{ck)&^2B*4B6PYs~(~0X$Diil=?tVZszqy%%tQ?;x)hY|O>~ E04=G5*#H0l literal 0 HcmV?d00001 diff --git a/res/terminal/images/LargeTile.scale-200_contrast-white.png b/res/terminal/images/LargeTile.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef86a82225e6a8f452e0a28647763d853396fab GIT binary patch literal 2465 zcmeHIZ8V!{8h#B++L=_!V3qmJXxQX0Vt>Bo$_dqQP2iQW|An_SgRCIXnO7Ip;ptxvuxQ-}k<+ z^E~%k93Do1@3h(p002CQ=zkIbK4EPI%m`9m3*DL^Fk;|C@c__L`sq6DPY~aKj(9Q@ z0J!!5kdqGp?;$B?4gfOHPzDtMu-^fIWvcLTgctPSle57De*kFUqg)}jBb7)_2LMm_ zRv6GsbCw{{gcB4RU@~p8>oWtZjY=jF0AOW7{`ja%%Ebx%wbNfArT>l#se_3ou2DWe zg^&D&PaRQyTjzA-(B3aC`U>RyU^k2WV-H(w^J;=K#!mQO{~@pBLS!F@Vks~1jYzG1 zh&DeM|IZ8*Q*eKv7->yG*BkH;#exa$7o%il~M=l%nIUB7Zxca;53SI4eigN1v>q)* zQsS0mvbDE5lIL8>VrX|iBfV|dkCA)vflUs%OJ$oh9nv+*HF^b}(>z0EIZ7$QORGpq zYjx=>ZJ=q@_=1AF@-2ppdRFYE;u=Leuy7uu+?*QRFc*lP6(x|GW^yqO$s2*ou#j(( zvcMPjD}ohVSL8;w`$DnFt~)PA%u)h!)AHem2#TEF0kO0ORAif`<%XTK@m8{;#b5?z z9bN)%!(g%85X4rW?oC|yUGLm3qHtwx{fn`5T=R6gh+sgx8B)|yc}M;F<$+C!LCO>3 zeTn3%>Ls18Cj4!tA%-d<3ox{+wbX%a)XA%kGtDsxY{P9T#@yVdOh59SIwp1!YlVB6 z1OM*P?&>ohNh9{G2de{Dd%Cb1_0Vj#CYKhPF9P2Ub#}K$6o7km(s2UO`Z$b2n~Y1n z-X4()Nx#L$rk1r2cb^lPPz%Q=%RQ^g(=vZ7?y8)P@sZc|C(ailDNM;qh?ArHk|wK0 zJC_RUi59lI*wPM@l!#IgenN@hgK)eO@ihqdRU(Q(xStYH1j7B5hyoBEphR2+;ekp- zE(j+m>q!b@J9gCU7?;=j^y^6H5874Pny-dYgZ$yH^_hmMMs0&WcvPqHQoqki=!3pp z-r$h5k!}lViD8n<_DV43@vle4xsD$i7o(cQHc0gi5FVpO9X?r4RT>GbNR=&m-GP-&53M zbMp%9f6HLGvz~>Wkrgp)+Nvu9Nm4o4abh{TOtSiPq4D4*3wLbae%8xO?;&UR*Y`xy zLPJ&)uXR}RH(9H0HhaIDH4aH(JmB<}@a=-zbmiFz!p31U8cNot!&ieB>~>hU272^h zyvVgSG;3jF#8wCLtq$yyq7JfpV{Se0nWm9{>o*tU9c9Youvc*+LJ@C|_yELayym4B z=JP;!0#iQt+^TZ7_}6|b?G6={&NqXp!s&b$nCb+b9|2RL>HG^Y)qXnv228a(hOyWZ z`%D|cPvJefNuYH9`N?UErnxtxdweP~2s z7O;U0uK<$85s^H_S3q}um$KwRMi20A*(5^!1-}rC(|AskF{!sRuE?h9*%=mBhAEI! zC$;qW1Kt&1S#&qhT9mmoEZ(n&mUa?cJ|5-1y`U`X%Eg2IO zd3~?623N86`FipCA(H6QWN7?=o2dfhDelp|;W&vnq>kf>X5x|LnTow5kXI;H--IW- zH4xVmt@gYJSx8hEFK>?8C;ei_^1GyOXCF=)qxh_QEPD=ZC7I2t+EKpTlGd^Kl=EDxFrFgp;)$9M~z~QEew1A(UpfNaA32LWFA``@I zMmMTQE|`!TezwSfu40DMPa^`s8oNYdb2ePRM!Y=9g+-sQcst#kmEt|jy@o&C-zP_b zSWj`+!t{)giTf!h^Ue1@voFjcW!<5Ch3dW3HteVzD##9!zdtLL*9z9ss`~u~Hm{w? z;ANqFhD_gZHPHY4kM(f}5UMK%|FW(1ma(Typj`(!0jD^08s|LrT-tdE09Ujt+7a#M x=yEK|#TAQo!Mb7~ibbQ@lbx0SlfX`)Gvl*9p0F>^=)hJTK>=a@O}^B;{{Z)RfUN)k literal 0 HcmV?d00001 diff --git a/res/terminal/images/LargeTile.scale-400_contrast-black.png b/res/terminal/images/LargeTile.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..dcbc2dfec17ec94f6cc735cb68c4b15a7aa0a72a GIT binary patch literal 6134 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-100_contrast-black.png b/res/terminal/images/LockScreenLogo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..931b46f231819bf206e1d4b7f7e3df2ed770ccde GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85r1;K$y{@YUXXA25wIm#}E(iw^MAnnjHjM%Zu4^b!^@E6vVV5 zZgwO*ox7)HZSADj5uNrLK66S%t{>^J_ngY#R`^}_y`}bve`^jhKDhWbd;gS&b2j@e zzgiu3?v7zXpsivbuYt^cxLYeM5DT{**xwkENXDs7PjlA^E za0#b~tDvoK@Uva-EGGv{Sdbgd(d6LMm@2_0;_CRyZV5w*+@e)lDUoik%Ho(N*qnE~ zyv0zZODSmEXQ6=WrV-OjXT9FVcXzu&sddnSJ9j?YWXx*2QtQFk_qgZTzW3el4Ozdl z)vo+-MnqGA=kUi1cVuSH*1al{*}BYg(jHUyZ$2L;*I(RQ|A))`RsFPtH=Gw4pFLS; S=9mKvD+W(jKbLh*2~7aoL6;H$ literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-100_contrast-white.png b/res/terminal/images/LockScreenLogo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..41c3aee350233cd2ff70c74a145c20a9ac7692b5 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlkv$2787-=2-UbS?mw5WRvOi(x&rHQ53wON;ef660rOrG~ ztxYRT{B8=I5dA)N>Z@roQ?s?AjPf-z)+M+IB(ckI%#|(OT)M-1R#tM6Bgc8J2Ia;1 zaxW)LkQSC!I2OYgaif8;nn908*J0B7m$%byFbRCjwG47Q)0nCz{$7dMX0!ND^>+Dt zmsWb+-|_!9i=6IH<1Z3Pl@EbVS1oakC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE}E) qRwl+ku9bnoNruATC>nC}Q!>*kackHSd(s`Kfx*+&&t;ucLK6TOZ;$o> literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-125_contrast-black.png b/res/terminal/images/LockScreenLogo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c78011e6c57d817c0e5ffbb4bcdd24da21f8c2 GIT binary patch literal 491 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGdIRF3&IRRbWvnK!m0f0$FK~zXf?Upf* zf-n?-%iVMr5{65R0}~@|H!6caz?t9S?jK;oA7jGc%zAN9MiK|&bPR}hVYu}A>N{hl zsEIA!;Fmo6`r729*aGB1TNsp5i?#18o_R&WY&Lsy9Ov70-7hRjNs{C>P1BdrX!MCC z89yvOK)hs0kCz%43~=fsX#!S!%y>M8J3u|pqucEktLhQN>-CyT|3as{w&E}hsbLrgIqdqPC~#CAH8IeJ zTq*`m<(6g9&1Qq6x6>#Ff*?4EA#B^mk=to}fRtqkZzb&QVVeyz1>gk;Fex1lhr()o z-^Wok)Wk9=+;Y_j;;O3n**%uRCX+FlOoVyo0_L6~{Kt8olf`0zJwlk2uqPSzM6xWy z>@u>sg1Fo5k|>Hur_&+R>9kP_n5K!@Wn^=uZzm|RGmJewNRN|lDFEWtK5dodRiC$t h;h(qr^nrE=`32Y>^OiXl$msw8002ovPDHLkV1juT*RTKp literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-125_contrast-white.png b/res/terminal/images/LockScreenLogo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1788b2253da4495fd211afb98c2892237a972732 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q%1+0G4}3eb)X=7iKnkC`xACPZY%9+`zD+R3jOqSaSX9IeRZlK|3L?dw)>Mj z0w!+oP+?oF_sCvCrOwCqFZ11>(q+3F*DW)O(ovcy(b9SSLUxtA^4@tz%bnlf`*!l~ z@7ljn-6!N(nXmC|3pmc;8YyM|{rg?t+BM-Xr-`S#RwXdEEU;o?JF`ep=fKI@tm9{j z69Tjk=loB5uDI&f4v#-mo^*Xncih+e;!>i>tO}dLpDLbgYhE7SSx_nXSbW=;#0$dr z_-7_ORo!SPws~vZ$^%-{lkV?a_nhTx$>!KcUJKThTuzVr@qV843uXqj8J>N&R@w=N z9&qm|Xj;ACfT^fo$ja4Uq|at S*pu!+4Gf;HelF{r5}E)9@51H) literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-150_contrast-black.png b/res/terminal/images/LockScreenLogo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..153e67c4ebb6f832aa8336f60ba379d186abf9fb GIT binary patch literal 474 zcmV<00VV#4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dGk}K~z{r?Upf) zf>01ZKU9JoftDUgC_DvsacfV&0jP+#u)%_G0(ue?dkLM9YL(AqA#4C35u5uh=Pgtcs*i6s11Pmh{a>R65Uw*$H7!<@-4S^XpKb zp`L=z8S3--EbjL^t)_z&IvftdvMjOPZbhEwv^xZuUINv+pw$g+$whUcXaayp$r z)3lZp&e&Kp_4dWM*=&SqnzU-T-EQJ?xzK80NQ|W@3UFPw)g27q_bFp|o(gd?tJMm^ zFrC9t(pWx{1mSqW^=hX%H zb&sNm?mXxB2gwEpyNgo${T|{trk&Re`N)=kjPIDG&{uOg3+Cjq@R11d4gCS2#Vx?O QD*ylh07*qoM6N<$g765=6#xJL literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-150_contrast-white.png b/res/terminal/images/LockScreenLogo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee49b96db01a6c13352c7fc7837ce0ce38ede6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FLRskWe64^V{Rg{O;Sh{y4_(;WF29R*zL zCwD|}vQOyPE8M}_X~CwQJ?B8@9A_oHhiqpeeCM4tNU1WoyLU$G{n@Lc_JoA~FS)hA zU={155CN67uKyUOtjx|$xobAbr?X15JcT1=NrCLjEZMz{zp|1!SBqS@`(s^Eq-{NUid3HjJ z&NjAhd$%}shP3zh)btr0oxi_sw-ieV6Uj_v*5%&)Q-yoQLAj2Z&t~ay3h|cp=wAMB z7Iien)Y!_z7|69UFfe@3#egTe~DWM4f?p~>u literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-200_contrast-black.png b/res/terminal/images/LockScreenLogo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..03201095aec16fe49a5a1814e667077c533f5dfb GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nDq z!Y~kk(?vlLJ$aHv#G?g|J&E9P_bt5mU_OLreGpOUB9`8Y9%VLD$8}em^iP^($p?c| zo9KKtlS-LIF%AGwY9?>=YAjYjH7M}O!{>p`kSiR=i6iM;mMA$NYyQ9{#^jwxZupnS zuSGY4vhz7U3KX8Lfq-pdTlD*V*lxEpLJx#Xh!;!Q9b87!=~S=fL?Ta| z&u8GpK3xS2otBeO05L&ADuC!Nkt%@5B)sre9D}Fp4Lli|cQVmi8-HS(r0O5_Av`-8jS@d>GMU8NX&Om$%Y+Ew zHrnlWDZ9gqXUpZ1HJeR(M*~RYiN`x{-Zg)l_o@&feJa5v*ladqm&=7M7K_}!{O#Fi zStKRe$12MC7Xn|`)JS|3m}3$jng!N8$0oiW8j5XV)mQ=57%srrH(NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiUahvM&J4r5PU|`hnba4!cIQ(|n#w;dBfwuow z_1YskS(;?*ImvaB#T+y3GqTAKaZMJunY?%1@ruO2PZ;FSsFJFE4k~g;IW$EQDcb?yLELh#~ zp~C1n@QCMH0xm4U$*_bp8*8glbfGSez?YiO0? Ru>)#g@O1TaS?83{1OU=t*jfMp literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-400_contrast-black.png b/res/terminal/images/LockScreenLogo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..563108e90e9037ec6b9d9a5d81e44dd90926b4c2 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85m^SK$tOhk#Hje19OO{i(^Pd+}peR^KJ!*uoXxfF7SwrQs@jZ zT(Ck}mbrS#K1Sx~c}jPM;ug62RJMM|Pjc{z+%2rhanY-?*~?RP8qYi1XG&WO9^W{A z-A?ph-6hXFnVZ)w<=K)aJpkGX1`cUEz8w6#=liS6;i28*Pw3d@igywz6DcF zzevN0GaL!M@0uJ0m;~AwS`--)IUFRw%!{2H&Ttz1C}81mW;k?2&-H**A3_qWF5(Tt zuDk1sD=J=y_bMt?$sH)Itn@su_-|!*H}~IIj%L}0l|N@YaXj3}#F6!HnShhUMCKPI zR>#_AcQrL7Ok`dWqIE27e+Y+S#FNbnCQlZ&&pJFj{FnBPh0Pqf8zU-~2A!

NxZ#f=Km^3@38TK6f2mwDF?j)f}_0V&CE) z?UyVsFMn<##hbo0>ZR)X)6YMj`}}$HzpVYL{}%npFzLEdQ&do}z+LizJUb`n=TkS! zo)%f=+sM7veY5`v(*v`53z=8CDb7la3w}O~-zz574NXe9|Rf zv3d>bflRx-TUPo7e-+zw(u*O(F8&R}g+CQZtPRhOALnz}_0!zkd`)-lw(f5W@4tV& zx2sQ-Vf)XL!gJI9FZ?;%%FgauwP@@UhIQ-L_gV{vl(=3=``no+ck)r!p0uq|rtc1T zPjvwb=m7<4Ot-}7y}tN5K1jPT_>la3yZ`@B@(Qik2ldEvWu{K(e2t+?cB&7_-`FXZy`^WXdVbLaJ} zt$Uspt(>m5{`%{m_B&Q8W{SOap5y)UN4e>t57R##5@;}BQQ%<&r5X)}DrWWxA3Ydr zqWc{W=-TrCSip8abnj% a7WE8&?}{s?D00<+1U+5-T-G@yGywo|#G>l} literal 0 HcmV?d00001 diff --git a/res/terminal/images/LockScreenLogo.scale-400_contrast-white.png b/res/terminal/images/LockScreenLogo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7950c71504b71352e735c09a27c9e76a1878 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A}ZE2s6em5^e+vvX^-Jy0SlE=i@fjOZ2Je2WpD&ba4!+xb=3{YCmR2k+%Pe z2PY&r1UYg{S6JaXiGh>p_*+(i9iKQtK8aYkWL7jSTFJ)9#?t0AeZm$do+k<%jFZm2 zIpgWO zHdD#{+rm~oKSO5&jfYIhtxp+e>^Loc`H=A`w$dEKx%=dG=SY+ou8LTYEMTZ8ps--S zxEIqMPcSlEQj_TMS2jRjz;wz4fv@F2v(-5Z(m$|jRUA>)x-+NGLR^2SqQY1m z*Kb}O(Au;+qR}ai^&{8M&=&0D%)~r}D7D;Q+mgp#6yl+2bTWG#+qYkyYDpFEjR^^@BtAC;S)cKJs0>;9>r! zhrhXQe2mZR6~6C(pzr=N*0>sZ#*06GG9CK(ndQji_BFk2kKbFc)$hx^7#7GVUU&2L zt0Rwv1@DRr-`H$6qwFuWgH#3(uNI~>{Lr!BT7;dOH!?pi&B9U zgOP!efv$nMuAxbYp`n$jv6YD#kZWaNkbGn5Y7`B*`6-!cmAEwswaSVEH86O(`njxg HN@xNA!{b;} literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-100_contrast-black.png b/res/terminal/images/SmallTile.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4d56193975cc54b0453c7700996e44ea8b69b2 GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^?jX#;0wn+MoHPYUv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i!>V3oBOs5n zz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0SlE=i@fj7F6p2iZE(=x;Tbp+?t70js0Kk0oyLQCB!H>CNUV zS&>%NyW>|H&e^t9c;)9M-@m=M^CBWWDn<0x$>$rb7IzCMi-jl_TD8COoFrGW?)tOK zjn#YtPCS(-C;3e|cfZBxMUD8a=Nl_!XI$2AVGEpXwIr-H`Gbr5(aW>v3G41Gvhw!p z&N)(g`E1nbFEh;cPQ7l#{A{Ap$(UMXtvZ+}~={VZ9w^yG`_6MfTUO_ zQmvAUQh^kMk%5tcu7SC(p-G6Lp_Qqzm5DKsYh_?y_@IjiMMG|WN@iLmZVe85jWz%^ OFnGH9xvX literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-100_contrast-white.png b/res/terminal/images/SmallTile.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..110e3de75f022ffbf9097822d25266933fb0ae08 GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^?jX#;0wn+MoHPYUv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i!>V3oBOs5n zz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0SlE=i^}%`r!7kih+Sq!qdeuB;(%O>5f^497NjY zFYPE1y~QlDq}o3q=0@-FjIecAg)0`#a~9CQD4p>}t0pffsAJ{i!V;mM`){@!pYZ)` z^<>3lwH5&<4#k!o!q41F8B98F-%$-cpU78wFs^w=^t$%jA~&W^dubseaPEAe*VVmg zwpMFiwOQ$|_H&-QkT*$sy8BIa%jh^i`Qqp95py*y8KmdkUSO=$?A_vI{(5e#;*+bJ zE?9|kwO;?Jz2&*?zCOc;0UW7kzfEA4JO1F>zV7Af)x29%?!Qu5^D|X)cjVGD{F!go z#+*v=NveOrIa_L`Wa*i8%O_t8duG3G+2!Zl79RpLoke69pYQtE87sIh@}9Uf|E}-r z?>NqNo#2yrPYL1^0nt7-%Nb4+Y(yRbgH5%>HKHUXu_Vl&Jb v7#dj_7+M)x0J&BM2AlH_D5Ge|%}>cptHiD0kWs~apaup{S3j3^P6$0wn)4Ij8_BmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SknSmE9iY=x6v#vN0ZjO^~4 zdNluSH_PN`8-eGOP2YGFocj4_`?r)6ntqitC(SQxcvyekeC58x`8#|Irke98SACM+ z&e4=`F8cEmKk3KP^C#!4@)e3_x;QTPxmRp3vv|ha#0fH1w^S^1wgeX0O4)cTR+{}X zX-z3QvPbA|!h|iFY)z(@4hlVGp}{*??2sD zz5z5~gX514GWEq?eQX8x^wOx(8~kHfoh3sL`h0w zNvc(HQ7VvPFfuSQ&^0jEH8cq^G_*1`wlXmRa;*#uzPN8`LeY?$pOTqYiCaUf6ptNH O1B0ilpUXO@geCy{U+hl+ literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-125_contrast-white.png b/res/terminal/images/SmallTile.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d864ab7131ce5f0977fa163065c0a3008b43707e GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>$0wn)4Ij8_BmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkPqVJ5 zlYJlbZ>OBhN)ACNxY$@Bkh6=yA)x9{+~kQG&z2Q!%H-&awmcSWxz*F{rONXi%N~17 zl!Q-*T_9bI+-EydvSDPO`qfg^IKMt7Y;u6-!lDe;`}$ZyZTbjU;L`_d~u^A&&mCZ=O=lHm25oY z5`TR{%*O+HCt{z?zv|=`cKT`dROyPdYd$bdUzp!h^Fc&>Vg27v2c74%{!@N#dBe`~ zBy0VGpZ+c0XHSMtZT|0ad;KTx#Da#CO)TeIt8Wf7(D-D;J2VH2ZN?Psa-pLyrw0s~XmGFV0YN@w`bb`==#swJ)wB`Jv|saDBFsX&Us z$iT=z*T7uY&?Lmr$jZRb%FqJHwK6c+oPR(WMMG|WN@iLmZViWwD&_+4;&0%z_E{W`L114cD>RrDiD^5t!3nMvM$@8@9;wCU`?!x&#Ju@d!JN2 z{F$QluU{ zeQFWYQsb2Ge6-B?J#nhgdiCwcv;`|$WaqBkciu7DJ~DQ$?xr9imF&#tWjUK~=+4%v z@7F6;o17W1fA0M4|J_rjz7F}emDl90*R?O!t7dNSh`hAq;)aY!S5=)i)?&J=Z*J&_ z^lfuJ8^!zjE5CO2!qnXb z5!;ksmv>(~_Wf4cwcfqkg{Iyv)xORM3pIv@S$2#Ul0F@t$6$IND5zTE8c~vxSdwa$ zT$Bo=7>o>z40H|5bq!5I3=OSJjjc>ffm|yCgCK+bW+)nR^HVa@DsgL2&SmccS?lTQ K=d#Wzp$Pz8f&%ye literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-150_contrast-white.png b/res/terminal/images/SmallTile.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6f029a17a158bb2699851b57ba9f313e9512bfa9 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^*&xip0wiy3+tLoCSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz#uRigc(aZ=Xe7J*-JcqUD=da|2dYV0gZ=(O(ki@mp3VTE}Q!NOpb_gwot;!-e)&9-)G`pzxGN>Q}%V=XFt{z zJSaEW)wgC&MeNR^d(n*IC-#0#KAWz*|9HBOt!;G5Qx%VEZFg@pPhA-u7FL-beSNLU zOV{1+%J=;5H;Ht<`|@^3YWyazzt@~1X6amZ-JQ5{Q&&{PgKC}7u+xbzH%0M!&-`kh zv+l56%1o}g;fL%>ue9p~FD%r}(GLu}Q0{bd>E5uiI)Tp#>=FMD1!hHAM)zxd+RssL zveLyibHe|dl@0$$L{)Ojl=!z-*RuSo4#)0%U@j2`2{ye9a+x0NoEuM$wR)pOTqYiCe=Vql)<;D?MHPT-G@yGywn!fA@O; literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-200_contrast-black.png b/res/terminal/images/SmallTile.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..ee72b0ec3eed8c3e04abd04dc5780ca60470e619 GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^eIU%i0wjIE{AdPJEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`M6E>5`8NAftrFnT^vIyZoR#|J5ShAqV3^* zjbCw#hicuqZ$Uj;p>qVY?Hpxht4dyP7SZ3dx1?v^+Ppc7yhN!zyn7)pN4+f)}4(oR%N-;oU{) z=kZd-Cm-KktbXpMuhitsb&t6or_6p+m37~`|M|8p;WzD<%ubwI`}0H1+mBmiZ+Ko) zIC|^OhG^Zq+O^C66;*zJ(W(6R(m%I(E6dK_v#oku@$BO}LxsM0x%YC-k1C!5IR<_f z=Y8@!i_7IMXFvM!1Sq2A_hZlTEjm``Qa)Q&e^V=1`zdqP_WP$&%!TIMXpCKNd;Nxa z^`!KO)cEMqxvZCCQoMp^{E&OF#klt4|Cr}Sx8LnpBwM6$R=M`AkfXWlZ2vX))pg-gPI8|{^;_^>a%aEZOu_4kgM zUN%##|9ng23iXY=(rF=hq|-w*{i*GQKC`o@mvnu;sO$1Gd$C*l# literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-200_contrast-white.png b/res/terminal/images/SmallTile.scale-200_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..af58357987fcd3ced84d39a2f756c07e52e464b4 GIT binary patch literal 818 zcmeAS@N?(olHy`uVBq!ia0vp^eIU%i0wjIE{AdPJEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`FI#b^OQ<%0yU|6x;TbZ+mDAX-Ib8O8FGYE!H=PksY6&Gb6ZgJ%~g{V z4WpO3&1onvG!uRubxFK$4#OiB0dA|nma*$n%w^F@@76i-c@Y-bWc>u`)8kAxK`PR z=67MAO3JdzT+e;lp_E=3GjX%cx)qW0(reYv-L721{V3(s<5RcpuHE%+qT9O1C1v*M zY2u>4|7=}7{e0HjYD=A3fxoudwI#JrN<^OTF*Aa zS?=FIKU3c}ZhG3}wK6xJ^3QrKwLG!@f7r=Kf2wCMy2rCMw9u#Zoyy(obM|c4>C5z= zzcv2ztt0nC<~`ibKlg)ebS@J(oWf+{ua{r8nB6J*+$@^oe|0kR?oFAGZVP;!7GL)A zE&B%4*aPu2_b?m{KkCxlE&dnCQ!R0gC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~Mpg!f pRz`+Eu9bnoii##-6b-rgDVb@NxHa5VwOS9d(9_k=Wt~$(698?;Lf!xX literal 0 HcmV?d00001 diff --git a/res/terminal/images/SmallTile.scale-400_contrast-black.png b/res/terminal/images/SmallTile.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..c636747380b56db2630d76fb531671a315feebd2 GIT binary patch literal 1559 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 y!Oi!0n_Hj}=4cBfM9~O@zg6uO#c%Q@15rW literal 0 HcmV?d00001 diff --git a/res/terminal/images/SplashScreen.scale-100_contrast-black.png b/res/terminal/images/SplashScreen.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a4480138b64db10868b307073bff1ccc8b621e18 GIT binary patch literal 1482 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 QuP%D@_T1@l%blP4Co0-bqW}N^ literal 0 HcmV?d00001 diff --git a/res/terminal/images/SplashScreen.scale-125_contrast-white.png b/res/terminal/images/SplashScreen.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..53057953a8ffaf07795f46713ad539bf643221a6 GIT binary patch literal 1776 zcmds2`%jZ+6h5VeuP7}r=Txk~6i|dp%ea;*6e<@H5Or#iOSuUa6u~M3+}0IEQMyv( zCbVdR!KlM@GNmGuDjMht6%}39K*z8Z29#;lA_%gtiDtCp8ei9@ixTdct`m^k6d3?a25$aOgK zIibJao;ksyk6p$)2Xh>U6sP!07@4*YidSD|YI|d!vP~#dry-xT8)pa`mT=)q6SA=d#yQvk3p}_ z;*M=NyN?!p&b5YP4Jz4=BCscqXEhpOsO&U-Lr=+X9rMI#WWyVu7{gs&XR)&aLv~f> z49_p;&=6x_-Ef*Mh_F!6je!U)@SO4>=rezCEG0oXlL+A}5pc@=+9}GlIH8J8Ty6}s z8y*GT2eLw^#_|yHrsIXA6=3r}*@vw0`SLaUw6EK1a}L&e@7ChkQI)LyyLIOV^0!>y zGvm;!fl;r{&)cSxtTwsoS`54Nt_ei2@XfFab-)3wcSW%X!SJHjQ~lfriCr`HW*}*b zZg8klgxcXUPb@yRSJ7{2cuNn^Y3gs(-MrQn=<(Kpkh{#T@x@?&QU2Al&FT;w+h$u# zb9?-|HID?7m9`)$Y`U-4IF?Op3kB|&Bxt8Q9=LVM3lc6mLf_t|2<|aH1YKBm;X#!p zT5V55_)aGiA$4s+sfln!!8PXtAy-5vpE<}MPzf5`MBjHuPG2)N*7dv#3z_wQSaBoC zV+#2zI>@57^O3~U@Lz+JM4!#?+YBio><O1$bBD{R?SVkn(YagZZlFawGVvc+ue8A$z+ex}+^`cuOaA)@|on;w0F;jUUEq{IT2NGJj*9;7I{Fq zU3f2u2rjbcOS5Y_HNs2lhNanPjyvmSyN8aX90KsCGfhx?{s^CUt@%aYbyYnU)t@;D=9v5D_-?S+>nx zC|QM+sbUkA!ieuws)tm+jww=mJw_@!v!q70y}?aLl%5cKpBk!EvNIKJQRSv<{jojh zt3Iv9%C>Yowg<5@@{3k!LP;M`ryBb_la(awN29p`H7_}OMtu4B^m(HV#9gm{Dt7O% zi|uTEzq_B_BW3DHeqs)rQ}V5+Dkly7G{Bj=aThl&nVU{a%}YlOcv3tmWQs4D>b0Hf sNuy9{p57>=Q7G}gO(y++f_*t@d-oK4TtMd7x0@6Z8>5+5g4z6k0Y1|&iU0rr literal 0 HcmV?d00001 diff --git a/res/terminal/images/SplashScreen.scale-150_contrast-black.png b/res/terminal/images/SplashScreen.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..9137cacbf1814b7f5f4284a90b1ef81163611d7a GIT binary patch literal 2240 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 XZ9nke0=pf!W|e~O=})btL>~GZC5nU& literal 0 HcmV?d00001 diff --git a/res/terminal/images/SplashScreen.scale-200_contrast-black.png b/res/terminal/images/SplashScreen.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..38ad367e1097779d75080b517d1aa5b17cfa7e36 GIT binary patch literal 3249 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 z zoFy;Bq?lnAteORvGufqV?W*8LY5Bfx*h9=B7jqE08ceT@EEzs`WbH%x=}7h3vN!hT zUrrYnsWz9jbv`ybgijas7qz|G{r5fcfWn0ORh}-TwG2(Q~{0DSbTf+WDGgY;JkT_i(AY z;*Wz}K61&S7k6T!O>q_-`_)~X5^?%kAmz(PuFmm-Tz@{UN`@AI&muTipHaBN=2WoM zsof}ruKJ8}n7-BZ2P~6o4A``DJ=baHmLsy7Db_>4WK!+%zQS&>PFt8;K|=LK;XjFg z4f9-CJ1^VAH88rb0d%^#OBU;hvFueY+h=@FcRFDX+5e^UeeJG=r#68A*8%Hu;h4G4 z*?SS2^Z*$#{#pZVj)#dhaq8bre+=rGx)A(C;Si+?>WlWY_Xe$%LSg#xEvH7H`lQY8 z5OatEj0yS_yZw(Elox-Tmx&cfl%ZP0}lGYD6>mhgP_$sahr1OTEEzFeWq;8g+ zYDTCWQjN#@m-jK}=;^Vw=UNWDlBeEhC*gfIcytK;@jiP5@3V&m#QW^?b-Fr`n@69y+;3H? z@VlY8h}Q!WzN%iGyC)uL_v0F3ctWmD`g@ionmQ?xvP+Y5D=&#P@nxs<5fagV^FW1r)ZdECbHrBdl1Gbm#p~xVz zB3vQfH%17f!{g7Tn5AXn;-s>nJ_d65jiX~?O=_=3Rq!YsoP?dIBq2ZZ3EhaqI{^iT zGI2vYC&&-eRah1HlJ~e%6`4^wY9Eabjyt|#2C{4;6)ZBWswyPbWp0$2h-?5$Wu>3u zu6>vsDm-^kt8lfKL3i8QG+l|GMh!=dPs!Jyw1&KftVcH0TWz#^^%`^XYV$QFxM@x%`*f6K f|7n7c?@>>8+Fwst6eXhx!EV{)u<_;wYSe!LSU-rC literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square150x150Logo.scale-100_contrast-black.png b/res/terminal/images/Square150x150Logo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a94e09558d5cc18cf399bd8e73cd36cd312dd929 GIT binary patch literal 726 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm1x)VD1X3*Nj=qiz3>*8o|0J>k`3lJ%LB0$O zRcZ_j4J`}|zkoswFBlj~4Hy_+B``2p&0t^2<1Fxq zEM{QfI|9OtQ?>b|fr9KMp1!W^PuTgmO?CR6Bo{Lv2X9)jV*NyT~|hE zr|&IWGeczNW#OOb)Q?EC~xi${W|+nq)k8n=e^b+ ztA86F`@i;Z|Brne%GWlGpl+O6QoXT)W&l(f`x+u$9w_r_Nk-sQz&K=Wz9pX78riH!O^f zVHGcbmwSEH!*y%4%0Fzbkgb2@`+C)_CkynxYZkNHcgVNBN$B}#|L%?SMk@``*V*gq z_i7rutc*yv<-2kua-k+lFatRYw(bA0^umG*246gYJk=7{h?11Vl2ohYqEsNoU}Ruq zple{RYiJT;XlP|>Y-M5sgrXrgKP5A*61Rp{DIPnJ<({s7F6*2UngC+N BB>n&Z literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square150x150Logo.scale-100_contrast-white.png b/res/terminal/images/Square150x150Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8b15f746632193c704c1c7be2661009e7d6fd461 GIT binary patch literal 700 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm1x)VD1X3*Nj=qiz3>*8o|0J>k`3lJ%LB0$O zRcZ_j4J`}|zkoswFBlj~4Hy_+B``2p&0t^2<1Fxq zEM{QfI|9OtQ?>b|fr9KMp1!W^PuTf*7==E#J*;A2U|jF%;uunK>+P+Ld6xr3*d7R< zayinWB_{Gwp=4=o$G)ihEG#}f9xJ4q)I!CVt#a~6wcyb>+G@3O_K&#hf9>?QtxNg+ z$7~D#TYk;4 z(%d;~HD3eo9%JTw9lZES zx#iyAkpD+RU0RnOzIpZDZ;KB3r}+sVq+&P3?A(4f^zhp?TKBDd9&406+OTzXUhwaf zr-}A#9}`d1t~|WoT9#vVb5P>kZ&lx17iw|c?EiUe^_OkAa_h6Fv!jG3kkk5ytt^>O z?dQ};U_>*hmbgZgq$HN4S|t~y0x1R~10w@n19M$NlMq8AD+5C-Lkl3+%D`ZA{sCna c4Y~O#nQ4`{H5@Xkm=Cht)78&qol`;+0A$J#-T(jq literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square150x150Logo.scale-125_contrast-black.png b/res/terminal/images/Square150x150Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..52a0961f9c19d77dba3094b918fa8e3a2575ffb9 GIT binary patch literal 846 zcmeAS@N?(olHy`uVBq!ia0vp^dq9|j1xRK%@F)N&mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkrHp&khl*VitT;)X>oC;+oC>K$JyU?!cvl7~8vcv2Zw%|)^l!nh$9$X8 z&gM6)Mr=acW<_&U34 z{rP#;vF0ZYUT%Kww_WFy0GPHp{S2sQZeHk&vR{>Zgz7pz-2Jk-Li3NnLuEg!m-jjB zU4C>N@BN^<&QI;niGPh*R=UU6?!R*~?o!E`dz0lK6=mq<)QB~c8{{}^mKnry1RVR zjg@`-j1PUddH-(AN1iMFMJul_E%%@Fm*NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkGSY~rJ?pxe9 zmQ#T{w^as&_-!qV`59Pz&F*P?|1HP4ZT|5;b-sVOtXd=Va5BeymA}uVLd~zsiM@Mf zA42TeFW+(h=sC+A(tSo`L%_Q$13+xrubKhI{}DK&p} z-pWJeGW(9$*d3i;vE$)Nl}Aggew}1E{JcK>%NdsGr{BM=+fX<2q_%vB|Y0ggYc_brZZJXI|J z9jHjP#5JNMC9x#cD!C{XNHG{07#ZjqnClvvgcurG85mj_83MUh1_moCnuJj_V3oBOs5n zz$3Dlfk8|Kgc)ax9uolyvX^-Jy0SlE=i@fjOZ2Je2Wr~o>EaktaqI1!y?K`dB-kDZ zw=B|&VTes&(5g~hvsYdsB4gqXt}>C%)@@F6XF9~*oZyk@=Je{D;m6BI{BkD$n6uc% ze|cE%m#4Ma$B!>B@&Z~y7<>`DTp<~L(X&fr*E01i{%PD#uxbT_6 z=czM*9^2|VbM=usl_4u^&)BFwJGa;_P2BQf9?N$xn#;Z@j5f#`Iq;uJ@Z)Z z<*~WuVm}hSS&a_7@?W-DTH1gA^)~tKWro3@(i1oS6018m#&MeR-+-gLg8mN3*&_qKi^^AqP_jl^_}b*6|=04nDn{d zbd7qSz2`$kDd7YJR8e+b|GC%_?oZDBi9nueiEBhjN@7W>RdP`(kYX@0Ff!0JFxNFS w2{AOZGBvg`F#~d~3=EQQEM1MFAvZrIGp!Q02BB72agd8VUHx3vIVCg!0KnaQzW@LL literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square150x150Logo.scale-150_contrast-white.png b/res/terminal/images/Square150x150Logo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..00fb42558e08a090d0f8cb27d826aacd65942edb GIT binary patch literal 910 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square150x150Logo.scale-400_contrast-black.png b/res/terminal/images/Square150x150Logo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb828ac8d54d9fea6988b4cde142a695f3b8593 GIT binary patch literal 2479 zcmeHIc~p~E7XPpj5?K`41Z>KZvNSA#ut->yy~x%nU(x{~n1nb9`wn3nss$1PEohNV zY%Gf=FbPN%q1M!33YsvL5+Y3&bjCJ?(g1v-aEg0 z&wEu-5y9GrOb!76pdA_#@BsiEAnY3)1~K|+QFsVo)RW;S0YFfzxtn+p^36ygAA|!y zp%nm>od{?y7--%1MA_}=qP+@NNLx~Aah z`7#heYc>cs_nbztHR~?)V{LiKu>KL1n)yjirRaUrPytL!{U`Q_0bb7c5`oLjd3NGGElMJ%2?f7@LasYusQ(U|oF0~Z$$sGn<0g(@&o?hQV!Cu@>8fyBBvzi?JtwHY z`FuHy-{jiLoSb{KJ?WXvx3Ewhj|>61KK0%J@}~>cak|sW^=0#ank5m~O-Od0tQfOZ z^_)u39aQ!YcYn#IMkW!u3$3j20ivpW90P7=P3WGIBJcfOnsm5q;rLNE+MTy!J?Ig> zW^^JfgP|PY#q=2oX+K=t_((DqsDfJ<`WT02hQKeH6a0+J5B?5#-s9UnI%uG;>toDz zzJFl!h}~5!;jd7wCx46RvG^p*V{yg``)~TU=>G&>>YmeGgJywot(YtK|EuNfSHA2f zodSOzIzw6W=Fai4q_ij}&9-VQxjh>f$9EWBV5kEZRje z20w*@-R#eVD7n3zMdjAyQ6KhLtY z&4Gi#DAo)D#G_bu5g--Cx`F`nP^=OJSb<{2Bftg}%Lf5=qF6`-cnif+!9g*U4+kfq zd^orWZY65__jE<_)y?s*{P>?>9PtTNoAb;LxD0r)ph$jFUC~>ilc&pDl{}mn z$d^z!F2Q`9yE`7gz*I+olk-eSRq;F%Qux+9Qw0Y*=b4c54f9N>3l;Osc&IzQS+BvC zDhUDQ`_=5}q1La_ME&v8MxB?HC*1d_tB2N{S|MX2m%LVL)1K7R@pAfQ zmij5Zu_pb6{41V)S?r$s%D{VCaQeG=-JWSS)=gzLp2S=oY_`r5YhXCSX45+_|U)r z0a`ooUL_B3tU3*$c@Eutn*UzB$B$XHSbX=_U$kVev5Z0M2+_j~mEV}lAjd(dcn~y{ zT}B=;xP$^4dW9&G6i?YrDQa4aEKtkN@)-p-rqT zt7)wy?7u)l+JuJutz%92Z=%a5ZqT9aR9mmcz06e3_gybP+loyl*Pe|UR89;J%0DI= zV|hXLsSj9k(lOcJ7H-5O5hP6!50(V2-b}SKENdfAD8~cKOR~?Mt=fuNPO2r@3@XD0 zXpP3;Tu1QiPKFzD!-!iWuTYi@>3$RYWE2Vil>QC!8x5=i&spI1HwvwE5ltC`d^o|0Sv5zZXneST^pT N85$T7&~u7d{tH^&aq|EG literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square150x150Logo.scale-400_contrast-white.png b/res/terminal/images/Square150x150Logo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..99fc2a7ff4d1fe9f45d37cd301dc53a427b46e07 GIT binary patch literal 2429 zcmeHIYfw|y7Cy*9q6py?P(%?SP#YcrD)LmZ1i=`dk^}_>5{Q8EkWf(|a)TfR5gRH5 zf!c5*Z^RjUVA6Z2TrVs$M5$CfLmoYuCTW*JuoU00KD~A zO)CzWKLZDK=|KdX?zpbO1}%%_x}-n=K%@ux`yI+2ct7M<97Ec4Pwi|MabB4!;hA#3 z-!U10P0DJxsi$|KkcG?mAxrhNOvif5E3%RJNkZ21z5W*==B12?F8UF3W#PWC^!j$J z+ksxmR6zL8y|$UNcYo{rQ1@Y>gJ3o*_njT~T&X?%R#u0A+xYveDxjS3*8uJ1(lMcj zdAX#ZW?+=Qa4c%Xa)-@}(zbYehM@?5wm)=OTOB?vZG9;nbnke(HlWGMoPt?s&Gf)< zzw$L~?54Sk2K`9nv;|zQQ>tADeMS}YQu}r2$m55o45!W-U(kS3sJJB^EAyzntr{hf zjTY4X*>3N;GDC=D-lybXesOVxI$C4s!HyM7Mr(i~4OIhpu-ne_?rcR)OnWTpM`_y> zPpQ+De4)8GSwUZP&Um#2Y3blrA2w{fCIMj9xpR6frRBS&eJ5zhjb?`2;JfGEd_b3$fRM?#+KxhM zSb1#L*o4ktpqT30`csKBLD{H^ zcqz3mt?sw|S3@Lb*$siO_;|Kfw%gdV_oAJ!XlHT5^Jck3F#W@WlgynPdN{kq7RA)C zx>$W&^9@4NTAQdtcH{>_)Ugtb-jCiUq?QZv|9~lbcc~UR)I2XIDzZ*I-x>rF7d^SB z2TC5Rf1Tzno6X|AEH~2)i0(HPTik1o zelK}9M}kE+U@AHigm;WX=GmXgjJR?~nc|F)0ixbv=Tq7hS-ein48|y2qNuOvM5sT`aw;NxVU&IJ3UWI6(1jNp+~?22IHYb-KqIG z4ReV5DLf|yU(q%4Ix(Q4wvs5ToxgVRxmj(mVuc#oM7H09o|ZhXd5Gdx!MjIkX}gS> zG~xy?=DqnaQL?(2Rf)bw_&0hQx`?v7XY)R1n1)!Xg;Tv(N@utgD5AYaRo$NZPuk&_ zFqp3*`sAFa_Mon;BkrHM<{;#_izgp-RG>+R?8$YWK2fJ|dGN#q6@r`5?-N9e-qVT5 ze3S{-V5p8O$gR`RFi))moD`#PHMFT@PZs^{o73wGqTA-25T zib%`#;YVWFuI1e{)sVVIztK(J-8Od6r?o$C_~b5rSD}jg8@w5wj=W#a#M*?R8@18&dYjhzM0Ym2C?;$^|cXN+81 z#x-ArLHvQ%$wu|?oWEw<+AJ5R1mr&oqT&Q8n4@Kx@U!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4`&PFxJ9)-FP&im6ngFH;uzv_{OuKcz9s_+)(`!g zcJH*DVNu1FfACq7%$}yj-Q@~~{~j{<9W$=rWWQnC!2M+BlqFM>7XEGWju%&WslR@y zgNTsOr{@nkgrbC0432)-bHs6Li`sgPvOLktyJXAKr8l>(PV!!IPvyhmbzNpY$rWaO zZ+e5hEMH%DFXCrPY~Q!>Q1Jxe+}2_r)xA$!V_))Z@Y1hHe9*aZ$#lLC{rpc{^D9js zTIDf(INwS+0~h`sdGx6|vr5{DSYiO7+FxTl&rwuw6`uOnA^2oy`6__o&1E zv!_m9O?&;}X7joiPqyEiFhSsd4Z}<8mu_pe@BIk$wrYuML`h0wNvc(HQ7VvPFfuSQ z&^0jEH8cq^G_*1@v@$UQa;*#uc160dp=ij>PsvQH#I4~p%b#694Gf;HelF{r5}E+< C8@ea} literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.scale-100_contrast-white.png b/res/terminal/images/Square44x44Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..7786af596e0f3dacbe0da4e07527925b27bac825 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!0wlNePU-?uEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4`&PFco+rbJQ~7)LN7dB978;gzrA9}*JQxJdO_bu z?tmn_{zJ*0#l}Z^jdxg7vG!W+EaX1_Amh=aC(ryo$7Wq>bK00&@bW#AO6^ZwRs}V+ zXZI}^v0V+^sKj&l!=7V~ONDs#CRk1P+L+gV_vW!TM?yEIF1Z)-<#1S+nNM!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4aw{yO%6q!~3;BGJb-8+(dwX%0kE{*;BVfu%&EQyE2YrUR5W zJ(-Gw>9y-vDuk}H@viSuJ63s7v$HD-ZglkTiaEUa@UcDDZFifQJy&P8 zZp=@)t~buO>J@bv%fUk*%j6NF`$?b%22WQ%mvv4F FO#m}P(8vG) literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.scale-125_contrast-white.png b/res/terminal/images/Square44x44Logo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..86948693b8afe36d5645721772d6455c4bfdd116 GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^<{-?$0wkF(Nu32!Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4uZ?5 zYX9e%+jno)(N2fUVao~mFhsqy;nT!R!&9n0*!zLS(f&7Zf&a|M@P zU*p9QTzY7#cwND|_1a2z+``4z?YMrOQ(3=d_V4bFPi}+Z3~Z^yDkj*kacekaR52f@ Ofx*+&&t;ucLK6V=OvNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkWdE$VX6xQ_>;ms&xR3hrgnf$6I22b_y!&QO(v+Xu zPEMNe)5us-$U%U`QK02NtNw~ePL6eli{n1u>02QqB*lKUi;F?9UM`B)S>@Wj#T!|s zh!!*3I;a%M*gn+EUdtiL*ZkHqe|8LZ-sLj4wpH{E#qNN;5e^X{&nAO6Kv*Sy%%#?=dtY%E;Od4I9UDXB7-^S3v~%lH=bzGcak@5r3%e`-~n$7Ig;N6r*< z`p1N(IUYQp6;qvb?Vn;^-yebNlPj`J7x7J=u~W}ynL+kfK~_g#puCu;FLd?7g4~8v zpmNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkcgpyXXGLR~_P3|7reg)gja4Kl?LESnD}=H*wpl=1pCx7s;Zz z#Uv`C@5Sf$mqpVm%71riXk7DMYVx+#LOXG9x0uCYGr!)|4<V3oBOs5n zz$3DlfkAj32s3V6n4=C9WH0gbb!C6T&c|)4`@>b!l!1Y9ji-xaNXEUlw>J76a*#Rx zvA&aA@kr|q%O4^eB;^l0H}LE0Ig#|}QMSayNa4BNtLJ=@m(kugv!lG&?We!c$W z``erurv~AM+TdZ;yKePKY3;nr1??%i_(HM{A ze>Q~8K3phZb4_p4I{h1&`!61t6q%xX{C$w{L6-HYwlC+LUvgyAvEG8m2iUjqPdV4| ztoOsdX7NoKLKQl-FHi4C+obxrFaJw*wT6V%{eZCi^bcp{!xbc6vdjNvKCXT{=3McQ zq_rv;67WrX0>GQQ>_2V3oBOs5n zz$3DlfkAj32s3V6n4=C9WH0gbb!C6T&d0+jnx|B9lYxP8x~Gd{NXEUlw>J76a*#Rx zvA%cqL5nZ0F$u*6Klt{wb$1FM>AZNdTwtb5fpMNqTj%WA6DRxD^Bp--VOw?mUhMw~ z_qR*SJiT0$tJlDh++%o5BDrVd-PKcON*sKa8+&)ffs1bMmh!NlR}wnp?jO765T{vD zKz+!Ho1Tv^x>YSqa8YaNE91HSxkleq(C5ScIpGX@^merv#FfZyeP4Cx`@LDa*IFOm z&G*iGfA+@BU8Yw!7z{qe&E0zIR`c;6xtn+&X#dGwBmal(iRyONc;?EJZ=ZiSqNG0e z^xK0oPZ}PGJXv@^^5n(?p-nX*#HHax6w`_en6KYueq1JLm8Uk0DXo7a2OC7#SED=o*;o8k&R{8d(__S{WGvxmE@SD=M0VQ8eV{ ar(~v8;?{6e)oMLZ1B0ilpUXO@geCxN%o3Xb literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.scale-400_contrast-black.png b/res/terminal/images/Square44x44Logo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8ca35feb043b6979fe5c4266ad1796457ec065 GIT binary patch literal 1281 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y1xT{))42+ySkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz@Q!n!i?t+M)Uy%*-JcqUD=0nHfYNX4zUclUOShRYoL zm|kU&2k#`h9iO zeZl?qTqVQS%!HZu%45yHCVzeZ<+xx#{o?ss7cW+v^WOSWO=;?_#~xwwSLW7KR*ObR zz4Ry%%jc{=;dE|~t?}~K7kVEh_smOw`}aTNmn1gt*H`bo>{E{1Yj{`x*fi%I_qMNV zs(<#_+vVDxy~1*}HU>@{Ic^EYOtS@V^c+ZIF;m_k*?9KR_0*l~Gk>c^^hiP^bGzRi z5Ry5}1Cd77@sPW>BYKzG%k0{?swuTW>d~vdeoEJ@U4HJh&x51aD??Y?h3`7OhE?vo zwRfkr;E%U^Hc#Hc+&EqBS?JoTjU{uL8XxqXPv1Rq$$(U$}8=!{7EF&X4v^v;FY$SoohSpDkr3*LJS>I=3#fX8J!pk)zW)yrv7K zeJl{;I(&AXm-r;Hu0)k>cYKvUN-w)TRi*A|nf;6-`V#p&CPx_6FLq4&9qy)bu5O`W zBLCcrM~{WquDtKH-6QBv+W8~3lZ522uhR9lJG%afnq0^wr;W?}Z(Gcmw)M-_zXihE zzr`F05Z?adf#=fCv+`@M&hneKI`P7*$+pp3=1iz?eeQjAL(k5q{n6LLd)M!Z(P&FQ zqWjx>yL9~L#EBwuYv-`<-?%Ec>e7cz6#ayX>{>IqCG;T}3fo z_ul?;KHklCa_v@0n=^aXvdU%Mn>MXu${y=4%loFSOT6Ip0Lb3D>hIF%h#S*^;=fDF z-9F!9UjB6N(%PlgHzJrPUzeJ(XOf{oWxN5a-^pr)8RfoHzowrJI#je--Sj>CLFc=x z(x-8(KR&HU~h~SZ@HDUS3GcEdOYIF;TL=#514!PZ(Q-=#pCdz`7ipO zdG&9eFp)3(d(!Tf^n$Pb&rG#!FDbeGGMiPtYIDb{uD%!Hwi>qg!fY?3%C1^B&5j2n z&jAH)eU+&eoU-DNPR0QsPqoA~q9i4;B-JXpC>2OC7#SED=o*;o8k&R{8d{lJSeY0B mxmE@S`Q=sqC>nC}Q!>*kachv%I`kQ+fx*+&&t;ucLK6U*S4OV@ literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.scale-400_contrast-white.png b/res/terminal/images/Square44x44Logo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3109e7e2233d073517048f188118fa2789cceb GIT binary patch literal 1205 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y1xT{))42+ySkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz@Q!n!i?t+M)Uy%*-JcqUD=#K6G3!qdeuq~g}wJNvUl0wvl$ zng{Z5WQn?L@L8D@pu(uERmCo*q~&Clf1t#3<{|D2r@W-4b(xenni6;%rIp1zmrn{U zX3R5@W^7ocZ%JGoNpN`sU3!8%yh%Gw1YzJckY(ZqK=(TpH3+@kjL8)jM(J zk^H4=*6q1|#n-Im`RjidLaW#8lkK@z`Ih_pWv#M3ih^<5S6`0Wu=Y}Z-Q>;*mC|Vr z!q-CI*gxpwYrpf%tv6xiV&!e3Z{F{hE1NAXwqrxxv$yRX7gT2*-Shq10RzPi#!S}A zsDyF+Op(^o-aTI=yA7M>3f_=xocng`x(n}SXO{IOq_dQ{p%Q8PE^OGbKzowh>(n=U zbEce{{8a6~?}6Doc3bryDNj8ReDwdao_5 zzxeHw3WaYDaJx<{Pg?vyTq;}jw7ThAdk!HXn-704rQf+2@@B7J)JgXh>nj4LWPfN> zDoYTpJ-U~xQ@Z++n0>*s&R~u?rH@RQ(&t!AJ#bUaPrYDSXE4{C)JI#G(q~v~JrF8< z{s`aoJ0SX)ACQhz^)oJT>kQ_d#uoJR^NKQZ0^N~m&JCjo(~WIn>#I5w$<&c54-og%U1)}9?99Xcgp^b2-Wxc zv0j$zXTE-ODlYWXzblq|JEc^%+;S_h{(Mbr$J)wlE0>UyyH{y`SDY^7icOip|RxpRQ8%tPt@aJ(`tH5`fwf!LCGh`I z`ex^rdawHT)H{V|vlYJ8xm~)dS-W9vlKjEk#(WvbG=zrS{FKbJO57TBv*h-Gba=Y@xvXSriH3a51_CT^r)+trA+XS~rcpgu z`6EwU!U`TyQT`o2`i{0}aJ95e^xGZRxwZG|UxC2q>F$x!3Z(BF_1FIBdmdEU=~HYh zHvK{kpV?sp4}s$wUt~T}liQX#E9m}rk8^@tvzASqq~duZs{6}~fCE=bbyaP0Z!7)f z-S3nzFWqA4B8?_%2G@|#sc+^yx3qjdL2mQ!PS?N-7JVLK7XRmzA2Rm4d}L9N;Uev* r>>a!{N(GHyXX&2a|8l|hg;%(zoJ?6<^*nM8&@&94u6{1-oD!Ml9uiDF5-Yx&qAEeOotwy`xXciEvH!}W~c z4p_$+CpTK={(C0A;!4MC$@Zr0K$obNxJHzuB$lLFB^RXvDF!10BLiInb6rD|5JN*N sQwu8-BOuqxz#zZ8${$5TZhlH;S|x4`a$1Kz12r&sy85}Sb4q9e0K?US4FCWD literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-16_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-16_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..26ae28f2a0b12cfd4c2050e0afb1b7e377c2b7c2 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=fx>SriH3a51_CT^r)+trA+XS~rcpgu z`6EwU!U`TyQT`o2`i{0}aJ95e^xGZRxwZG|UxC2q>F$x!3Z(BF_1FIBdmdEU=~HYh zHvK{kpV?sp4}s$wUt~T}liQX#E9m}rk8^@tvzASqq~duZs{6}~fCE=bbyaP0Z!7)f z-S3nzFWqA4B8?_%2G@|#sc+^yx3qjdL2mQ!PS?N-7JVLK7XRmzA2Rm4d}L9N;Uev* r>>a!{N(GHyXX&2a|8l|hg;%(zoJ?6<^*nM8&@&94u6{1-oD!Ml9uiDF5-Yx&qAEeOotwy`xXciEvH!}W~c z4p_$+CpTK={(C0A;!4MC$@Zr0K$obNxJHzuB$lLFB^RXvDF!10BLiInb6rD|5JN*N sQwu8-BOuqxz#zZ8${$5TZhlH;S|x4`a$1Kz12r&sy85}Sb4q9e0K?US4FCWD literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-20_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a036a06ee23b8265c3a6a40baf647c8869b23a0e GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_m~D5N7lZxp5pQ_}tUQF~q|E?3CTS%?1Jvge{j;?a)-TBhfmw#n5gu{(*$qs zdCIPM!k0twgZQ@`v#j~;IWjlpTU^XuAGYB1`5C0>6M4`wJUjThX__CCGRv%GfxFoQ zLq*g2li$_{ibO?CQ%&oCD6_)m{MIQ!T{r()I31fI<`&p;^KXRHgrkLPQamShBuZ@9 zB(MACciibqCZdlmlAcOL-PpD^e49?AzR#Mt>!nGv)ZYA!m^>r#(Owz9MSAVm|I~5% f*W8NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`&*s!i>HlH;w}Z*-JcqUD=t>XyKl1dScAiW85xZiQTK7BsD{-?CpYMqIb zLpnD)>Z~~RbP0l+XkK&ybLU literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-20_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-20_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a036a06ee23b8265c3a6a40baf647c8869b23a0e GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_m~D5N7lZxp5pQ_}tUQF~q|E?3CTS%?1Jvge{j;?a)-TBhfmw#n5gu{(*$qs zdCIPM!k0twgZQ@`v#j~;IWjlpTU^XuAGYB1`5C0>6M4`wJUjThX__CCGRv%GfxFoQ zLq*g2li$_{ibO?CQ%&oCD6_)m{MIQ!T{r()I31fI<`&p;^KXRHgrkLPQamShBuZ@9 zB(MACciibqCZdlmlAcOL-PpD^e49?AzR#Mt>!nGv)ZYA!m^>r#(Owz9MSAVm|I~5% f*W8NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`&*s!i>HlH;w}Z*-JcqUD=t>XyKl1dScAiW85xZiQTK7BsD{-?CpYMqIb zLpnD)>Z~~RbP0l+XkK&ybLU literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-24_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..931b46f231819bf206e1d4b7f7e3df2ed770ccde GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85r1;K$y{@YUXXA25wIm#}E(iw^MAnnjHjM%Zu4^b!^@E6vVV5 zZgwO*ox7)HZSADj5uNrLK66S%t{>^J_ngY#R`^}_y`}bve`^jhKDhWbd;gS&b2j@e zzgiu3?v7zXpsivbuYt^cxLYeM5DT{**xwkENXDs7PjlA^E za0#b~tDvoK@Uva-EGGv{Sdbgd(d6LMm@2_0;_CRyZV5w*+@e)lDUoik%Ho(N*qnE~ zyv0zZODSmEXQ6=WrV-OjXT9FVcXzu&sddnSJ9j?YWXx*2QtQFk_qgZTzW3el4Ozdl z)vo+-MnqGA=kUi1cVuSH*1al{*}BYg(jHUyZ$2L;*I(RQ|A))`RsFPtH=Gw4pFLS; S=9mKvD+W(jKbLh*2~7aoL6;H$ literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-24_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..41c3aee350233cd2ff70c74a145c20a9ac7692b5 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlkv$2787-=2-UbS?mw5WRvOi(x&rHQ53wON;ef660rOrG~ ztxYRT{B8=I5dA)N>Z@roQ?s?AjPf-z)+M+IB(ckI%#|(OT)M-1R#tM6Bgc8J2Ia;1 zaxW)LkQSC!I2OYgaif8;nn908*J0B7m$%byFbRCjwG47Q)0nCz{$7dMX0!ND^>+Dt zmsWb+-|_!9i=6IH<1Z3Pl@EbVS1oakC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE}E) qRwl+ku9bnoNruATC>nC}Q!>*kackHSd(s`Kfx*+&&t;ucLK6TOZ;$o> literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-24_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-24_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..931b46f231819bf206e1d4b7f7e3df2ed770ccde GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85r1;K$y{@YUXXA25wIm#}E(iw^MAnnjHjM%Zu4^b!^@E6vVV5 zZgwO*ox7)HZSADj5uNrLK66S%t{>^J_ngY#R`^}_y`}bve`^jhKDhWbd;gS&b2j@e zzgiu3?v7zXpsivbuYt^cxLYeM5DT{**xwkENXDs7PjlA^E za0#b~tDvoK@Uva-EGGv{Sdbgd(d6LMm@2_0;_CRyZV5w*+@e)lDUoik%Ho(N*qnE~ zyv0zZODSmEXQ6=WrV-OjXT9FVcXzu&sddnSJ9j?YWXx*2QtQFk_qgZTzW3el4Ozdl z)vo+-MnqGA=kUi1cVuSH*1al{*}BYg(jHUyZ$2L;*I(RQ|A))`RsFPtH=Gw4pFLS; S=9mKvD+W(jKbLh*2~7aoL6;H$ literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-24_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-24_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..41c3aee350233cd2ff70c74a145c20a9ac7692b5 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlkv$2787-=2-UbS?mw5WRvOi(x&rHQ53wON;ef660rOrG~ ztxYRT{B8=I5dA)N>Z@roQ?s?AjPf-z)+M+IB(ckI%#|(OT)M-1R#tM6Bgc8J2Ia;1 zaxW)LkQSC!I2OYgaif8;nn908*J0B7m$%byFbRCjwG47Q)0nCz{$7dMX0!ND^>+Dt zmsWb+-|_!9i=6IH<1Z3Pl@EbVS1oakC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE}E) qRwl+ku9bnoNruATC>nC}Q!>*kackHSd(s`Kfx*+&&t;ucLK6TOZ;$o> literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-256_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f89467e732044c8525a4304a73eb8d32c687197f GIT binary patch literal 2701 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 b3|~QIYFx(`YDI88 literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-256_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..665dfbe3a37d5360daad034f6b9b38bcdf5fd14f GIT binary patch literal 2082 zcma)-doU)5Oe?!bS4tO_e@3y7xEP8j;CV*aBJMyu)Bs==OIxcj^t{u zFrlEPY`#BaZ({+ZY$p+pk}nR5{&4--+iT~$g%MeV!-;`PJzB2QpuUMQXU7YCFehv= zBMeo$m4Y=?N;saFI_P!HDVKRC9rdDutb^J%u573qYKkltOjPW++RKl+JASHbpkr8g zTc}w&_fCNPZu8;AhnTK4;ra*La#}`f!bkaL4Hz;9Ac#;;e_br+*!5M=sr#6>->}F0 z*0|q5ZE_X0`(ojVm}(5V?}j8i-X`u$Mv%Pak~ps~q9FdJ#{RE)eWyjN3)6KMzD8z* zDn&>0i1i;Eo@RN`Ni%Fo=<;&~<}+AWK?HZTG2)gBwvba3?mpcmDdTg(C#P;yE>(t} z6ZrNFR@hcjhDH+d&KT9n97CGU+&~-lP_trWZ@t8(UX<$lKEu8BPlp)kArVpTD~aAP zqPm#V+_1^2{w{ASZ+6v{Sus*^(~F(!&{DOX(vN-2_UThpVQdVVh5;{8DWga{9id|d z->mtc`Tvh>9<}g`UG5gle@C!K|A}Y5LH?Z-e=Zn(q5aATGb7xbd35gC8)n{h5MjpB z7C$-6L+#CJS-!ne9B4-hk&od`Dz2}1*@`aL)Z)`n)K3y; z_o?l3&syX=(O4Y(cv9`+<n<+vt zJiM?>X!aI@H9=i^=bHT}D;B8j-uBWTkz}nv&1@64t?AC2uxD<5CoNTXl-+3HhjCW~ z$X2RdtLEi^|-=xezQ4s5qk#nGcw=ko9=N!S>&#hiWoTdJ?AIpANjfQ)rW~M1I`W|W~614l;`!AYQZVO*IL(OPv^Oj(ZW;~w|$_^FxE9t`@v^AYFLm6Cq z9S(J&XY{^hYw9^Gkp>>&G*%OUKp9*a&)HjE?N<7$CM`qq?T*7|-{;u}A7p0h(zT_i z4v)8#ms=a`v~L~qP4e_!EpdD>YgbFeqOis)B zMbU3-H@Y*OX6Im&;Z<#!4ar6623kT?bA_zOv}vEGVLz(5Qq~}5jnK%Q#vr!Z{RfvE zaq7v$JA~!oB>C=j6D#=?N#QFj;BYn7U}Z9Fn-&=KFX({qK^q#vlI#t&eFtceaEVgY zV5Jm4sedo#l9O8Cg`Ai`!TQNx#R)lSa&0(x_j(>y9f%H4K7sD_9;_;a{;wcJ>nQ_K z)v&39Qnu+%*s3_A4O4P( z=mQe>mWsGoUM~sq6{1G9F4H_5W+kTZ?5RWWN0tU@rAbHb$kCmJTf(^IU9hhW<1;jF zRTs=^cuK$-p$IKgpNHe0g?#nlN|yBL*)Ngv6DkMx9g$&iwd(Wr7M(h94p+sYR6eqs z(u*!?9Qsg|V(hR4tD%jX8CAqfjk_Z4TKO2f)H%=!6BdptlLZ^!*&_K4!2{!xZ3zp= z?)AkYcjeMUP#ywwU5l+Ca3N`_4n5qrzO?r^O{6_aU6h47dE7kZQX z-+jfF%|7|THLr`s?08kWIM$u`A|mDfeOu8&B`oJ~1jpmbC5gKIPY&mUs`m7_%~_A0 zO-$s_1itKJx90qmpV~YO7G;(2)!5umLOq=6KEX(dRU(FE%d!#QkGF6AQac;2?kt=| z)Qn77MD?@c{aUHymnSOy9TGC-MlJvkCrI9Zbj~|e-5OO zSpg%h1E=;|)FuO0vT`P`bD$TJv2pgN;?4%d1zQK53x*6Z!I|I;ah8V0W@KYyYjaa; oGZVIMrm7!jVg&Nz{;BO66LUXiQ`fx;bviJvH*V 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 b3|~QIYFx(`YDI88 literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-256_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-256_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..665dfbe3a37d5360daad034f6b9b38bcdf5fd14f GIT binary patch literal 2082 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 literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-30_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1788b2253da4495fd211afb98c2892237a972732 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q%1+0G4}3eb)X=7iKnkC`xACPZY%9+`zD+R3jOqSaSX9IeRZlK|3L?dw)>Mj z0w!+oP+?oF_sCvCrOwCqFZ11>(q+3F*DW)O(ovcy(b9SSLUxtA^4@tz%bnlf`*!l~ z@7ljn-6!N(nXmC|3pmc;8YyM|{rg?t+BM-Xr-`S#RwXdEEU;o?JF`ep=fKI@tm9{j z69Tjk=loB5uDI&f4v#-mo^*Xncih+e;!>i>tO}dLpDLbgYhE7SSx_nXSbW=;#0$dr z_-7_ORo!SPws~vZ$^%-{lkV?a_nhTx$>!KcUJKThTuzVr@qV843uXqj8J>N&R@w=N z9&qm|Xj;ACfT^fo$ja4Uq|at S*pu!+4Gf;HelF{r5}E)9@51H) literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-30_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-30_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c78011e6c57d817c0e5ffbb4bcdd24da21f8c2 GIT binary patch literal 491 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGdIRF3&IRRbWvnK!m0f0$FK~zXf?Upf* zf-n?-%iVMr5{65R0}~@|H!6caz?t9S?jK;oA7jGc%zAN9MiK|&bPR}hVYu}A>N{hl zsEIA!;Fmo6`r729*aGB1TNsp5i?#18o_R&WY&Lsy9Ov70-7hRjNs{C>P1BdrX!MCC z89yvOK)hs0kCz%43~=fsX#!S!%y>M8J3u|pqucEktLhQN>-CyT|3as{w&E}hsbLrgIqdqPC~#CAH8IeJ zTq*`m<(6g9&1Qq6x6>#Ff*?4EA#B^mk=to}fRtqkZzb&QVVeyz1>gk;Fex1lhr()o z-^Wok)Wk9=+;Y_j;;O3n**%uRCX+FlOoVyo0_L6~{Kt8olf`0zJwlk2uqPSzM6xWy z>@u>sg1Fo5k|>Hur_&+R>9kP_n5K!@Wn^=uZzm|RGmJewNRN|lDFEWtK5dodRiC$t h;h(qr^nrE=`32Y>^OiXl$msw8002ovPDHLkV1juT*RTKp literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-30_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-30_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1788b2253da4495fd211afb98c2892237a972732 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfC8xmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1O92q%1+0G4}3eb)X=7iKnkC`xACPZY%9+`zD+R3jOqSaSX9IeRZlK|3L?dw)>Mj z0w!+oP+?oF_sCvCrOwCqFZ11>(q+3F*DW)O(ovcy(b9SSLUxtA^4@tz%bnlf`*!l~ z@7ljn-6!N(nXmC|3pmc;8YyM|{rg?t+BM-Xr-`S#RwXdEEU;o?JF`ep=fKI@tm9{j z69Tjk=loB5uDI&f4v#-mo^*Xncih+e;!>i>tO}dLpDLbgYhE7SSx_nXSbW=;#0$dr z_-7_ORo!SPws~vZ$^%-{lkV?a_nhTx$>!KcUJKThTuzVr@qV843uXqj8J>N&R@w=N z9&qm|Xj;ACfT^fo$ja4Uq|at S*pu!+4Gf;HelF{r5}E)9@51H) literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-32_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e195a888f5f7dd7420505b44ee4bd93eb0adeb9b GIT binary patch literal 430 zcmV;f0a5;mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGd*Z=?t*a63&xvc;I0YgbdK~z{r?Up@` zgD?BGbDCjyx#5Ks~R#}NdS za`1hh;8+RjPk??3Uhf35EMv6`a00iaX$mL8DoGMteIA^E>$;P`9uk~D*LB3U?U_Uz z$Jmt*CjjgzArt^a5}xN_R~~l-fVORkX__;MFbuIPhlgK8!!T&$IO6PzWm!0q1d4Dp zO+yUBnB9F8Mc9>xP+%FZ>pCfl0=shI1pX7=_x-eQOTqpnoPgsv(-R;(&vWeX+`jnM zTEeZs-9qqMI3NmGt0nvjrLJpIRTa+eBjYW2iJxQmcdCjD2%KTSruzb!KiA=h_eIlw Y0e<5FT9O;O7ytkO07*qoM6N<$f@S-#00000 literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-32_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..efc5601809454e3b8d083828e286152c8639adb5 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SUOx&gwB#~18e3lwB8@$_|Nf5OhkEvof-=?oK~&|Oa##}JR>Z>QSw9Wvl)ji24g zyg_klBlCtLwj+{J8^7}C^u#c-NJr-%l$4klVYP9id6mve4V6Dv-W_PzYccVjxOL&A zjth}%uKZ_UxUq<7cH9O9Cb=2wH*`)s*dcB{<2aWkgTz-km)1>!UnCdo<|%rj)M9;^ z)w4+QO~dv$cK4vR70rt0`8G~sJks&(L7&A5h6f$u?KkQRV{IiC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE_&~RwhP3 mu9bnou1FU)6b-rgDVb@NxHX(+`LheCfx*+&&t;ucLK6Tf9;rzH literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-32_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-32_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..e195a888f5f7dd7420505b44ee4bd93eb0adeb9b GIT binary patch literal 430 zcmV;f0a5;mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGd*Z=?t*a63&xvc;I0YgbdK~z{r?Up@` zgD?BGbDCjyx#5Ks~R#}NdS za`1hh;8+RjPk??3Uhf35EMv6`a00iaX$mL8DoGMteIA^E>$;P`9uk~D*LB3U?U_Uz z$Jmt*CjjgzArt^a5}xN_R~~l-fVORkX__;MFbuIPhlgK8!!T&$IO6PzWm!0q1d4Dp zO+yUBnB9F8Mc9>xP+%FZ>pCfl0=shI1pX7=_x-eQOTqpnoPgsv(-R;(&vWeX+`jnM zTEeZs-9qqMI3NmGt0nvjrLJpIRTa+eBjYW2iJxQmcdCjD2%KTSruzb!KiA=h_eIlw Y0e<5FT9O;O7ytkO07*qoM6N<$f@S-#00000 literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-32_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-32_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..efc5601809454e3b8d083828e286152c8639adb5 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SUOx&gwB#~18e3lwB8@$_|Nf5OhkEvof-=?oK~&|Oa##}JR>Z>QSw9Wvl)ji24g zyg_klBlCtLwj+{J8^7}C^u#c-NJr-%l$4klVYP9id6mve4V6Dv-W_PzYccVjxOL&A zjth}%uKZ_UxUq<7cH9O9Cb=2wH*`)s*dcB{<2aWkgTz-km)1>!UnCdo<|%rj)M9;^ z)w4+QO~dv$cK4vR70rt0`8G~sJks&(L7&A5h6f$u?KkQRV{IiC`m~yNwrEYN(E93Mg~R(x(4RDh9)6~hE_&~RwhP3 mu9bnou1FU)6b-rgDVb@NxHX(+`LheCfx*+&&t;ucLK6Tf9;rzH literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-36_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..153e67c4ebb6f832aa8336f60ba379d186abf9fb GIT binary patch literal 474 zcmV<00VV#4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dGk}K~z{r?Upf) zf>01ZKU9JoftDUgC_DvsacfV&0jP+#u)%_G0(ue?dkLM9YL(AqA#4C35u5uh=Pgtcs*i6s11Pmh{a>R65Uw*$H7!<@-4S^XpKb zp`L=z8S3--EbjL^t)_z&IvftdvMjOPZbhEwv^xZuUINv+pw$g+$whUcXaayp$r z)3lZp&e&Kp_4dWM*=&SqnzU-T-EQJ?xzK80NQ|W@3UFPw)g27q_bFp|o(gd?tJMm^ zFrC9t(pWx{1mSqW^=hX%H zb&sNm?mXxB2gwEpyNgo${T|{trk&Re`N)=kjPIDG&{uOg3+Cjq@R11d4gCS2#Vx?O QD*ylh07*qoM6N<$g765=6#xJL literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-36_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee49b96db01a6c13352c7fc7837ce0ce38ede6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FLRskWe64^V{Rg{O;Sh{y4_(;WF29R*zL zCwD|}vQOyPE8M}_X~CwQJ?B8@9A_oHhiqpeeCM4tNU1WoyLU$G{n@Lc_JoA~FS)hA zU={155CN67uKyUOtjx|$xobAbr?X15JcT1=NrCLjEZMz{zp|1!SBqS@`(s^Eq-{NUid3HjJ z&NjAhd$%}shP3zh)btr0oxi_sw-ieV6Uj_v*5%&)Q-yoQLAj2Z&t~ay3h|cp=wAMB z7Iien)Y!_z7|69UFfe@3#egTe~DWM4f?p~>u literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-36_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-36_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..153e67c4ebb6f832aa8336f60ba379d186abf9fb GIT binary patch literal 474 zcmV<00VV#4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dGk}K~z{r?Upf) zf>01ZKU9JoftDUgC_DvsacfV&0jP+#u)%_G0(ue?dkLM9YL(AqA#4C35u5uh=Pgtcs*i6s11Pmh{a>R65Uw*$H7!<@-4S^XpKb zp`L=z8S3--EbjL^t)_z&IvftdvMjOPZbhEwv^xZuUINv+pw$g+$whUcXaayp$r z)3lZp&e&Kp_4dWM*=&SqnzU-T-EQJ?xzK80NQ|W@3UFPw)g27q_bFp|o(gd?tJMm^ zFrC9t(pWx{1mSqW^=hX%H zb&sNm?mXxB2gwEpyNgo${T|{trk&Re`N)=kjPIDG&{uOg3+Cjq@R11d4gCS2#Vx?O QD*ylh07*qoM6N<$g765=6#xJL literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-36_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-36_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee49b96db01a6c13352c7fc7837ce0ce38ede6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>{XE)7O>#2|FLRskWe64^V{Rg{O;Sh{y4_(;WF29R*zL zCwD|}vQOyPE8M}_X~CwQJ?B8@9A_oHhiqpeeCM4tNU1WoyLU$G{n@Lc_JoA~FS)hA zU={155CN67uKyUOtjx|$xobAbr?X15JcT1=NrCLjEZMz{zp|1!SBqS@`(s^Eq-{NUid3HjJ z&NjAhd$%}shP3zh)btr0oxi_sw-ieV6Uj_v*5%&)Q-yoQLAj2Z&t~ay3h|cp=wAMB z7Iien)Y!_z7|69UFfe@3#egTe~DWM4f?p~>u literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-40_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..65b26da3965040a745f1166a929e7f2e00ac1eac GIT binary patch literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGgP5=N5P62;+j3WR50fqbioh}>gpJdp#ZcNZo!_(n?#*LB%Qb8M95$=nSDl@c=x zIvyX5#dty3ceOpA8S{5g^&y#?|ND@fPA4Z#Q#QU7IO0c|rXkDa5{{mY$K#RTnIBYe zwOTQ`?|P*qD!AM22z~P#A&CkC`~6;!^nITk4hP;b4}*e$36i6N04537o6UxI=w(t6 zD9ciigxYSmyh9&Sf_>kUBuNCpAP9JeJ|+c0F3U1O&htD{*ER3b$EYC4<#{g1Efxz> zRTb~j%b?(p9K6Kaw&h*=K?R58!Y~|_>$*I! pZXoyp6Lx79-~?_Ki)9$c`2vYH+1C3(JNW!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`M9lgIBv1#FfcH(d%8G=cpQIw&Cu_#gFx#; zbA^iqJtiKU<_mfkI2LenO=0p<>5^$=(mSZAVZkXoN%>-~$U=>uniH<6Md~YBw+fyy z$zK1b(&qKl+!N+ybN24%@Vd^GWXpJE(%NFj@MR1BUa6gsqHCJ+tf^Bze#+d}{}xG{ zi$1#FsdVol{RaX5Qeu-o+S;eFow3Ngt0$^~CNtsXeDd zzQ?K@oPOqT9;@63E*}e@k~HmrFO^H?=X`x;`-gXa!^+j-Wu{jre%oVl_tt;?!tV$8 zU+_gJFZa0c5*SLVC9V-ADTyViR>?)FK#IZ0z{o(?z+BhRB*f6r%GAQj#01E-GBDs- h?q7PXaYCc)I$ztaD0e0s!Dayr=*G literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-40_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-40_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..65b26da3965040a745f1166a929e7f2e00ac1eac GIT binary patch literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGgP5=N5P62;+j3WR50fqbioh}>gpJdp#ZcNZo!_(n?#*LB%Qb8M95$=nSDl@c=x zIvyX5#dty3ceOpA8S{5g^&y#?|ND@fPA4Z#Q#QU7IO0c|rXkDa5{{mY$K#RTnIBYe zwOTQ`?|P*qD!AM22z~P#A&CkC`~6;!^nITk4hP;b4}*e$36i6N04537o6UxI=w(t6 zD9ciigxYSmyh9&Sf_>kUBuNCpAP9JeJ|+c0F3U1O&htD{*ER3b$EYC4<#{g1Efxz> zRTb~j%b?(p9K6Kaw&h*=K?R58!Y~|_>$*I! pZXoyp6Lx79-~?_Ki)9$c`2vYH+1C3(JNW!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4?NMQuIx|P`M9lgIBv1#FfcH(d%8G=cpQIw&Cu_#gFx#; zbA^iqJtiKU<_mfkI2LenO=0p<>5^$=(mSZAVZkXoN%>-~$U=>uniH<6Md~YBw+fyy z$zK1b(&qKl+!N+ybN24%@Vd^GWXpJE(%NFj@MR1BUa6gsqHCJ+tf^Bze#+d}{}xG{ zi$1#FsdVol{RaX5Qeu-o+S;eFow3Ngt0$^~CNtsXeDd zzQ?K@oPOqT9;@63E*}e@k~HmrFO^H?=X`x;`-gXa!^+j-Wu{jre%oVl_tt;?!tV$8 zU+_gJFZa0c5*SLVC9V-ADTyViR>?)FK#IZ0z{o(?z+BhRB*f6r%GAQj#01E-GBDs- h?q7PXaYCc)I$ztaD0e0s!Dayr=*G literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-48_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..03201095aec16fe49a5a1814e667077c533f5dfb GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nDq z!Y~kk(?vlLJ$aHv#G?g|J&E9P_bt5mU_OLreGpOUB9`8Y9%VLD$8}em^iP^($p?c| zo9KKtlS-LIF%AGwY9?>=YAjYjH7M}O!{>p`kSiR=i6iM;mMA$NYyQ9{#^jwxZupnS zuSGY4vhz7U3KX8Lfq-pdTlD*V*lxEpLJx#Xh!;!Q9b87!=~S=fL?Ta| z&u8GpK3xS2otBeO05L&ADuC!Nkt%@5B)sre9D}Fp4Lli|cQVmi8-HS(r0O5_Av`-8jS@d>GMU8NX&Om$%Y+Ew zHrnlWDZ9gqXUpZ1HJeR(M*~RYiN`x{-Zg)l_o@&feJa5v*ladqm&=7M7K_}!{O#Fi zStKRe$12MC7Xn|`)JS|3m}3$jng!N8$0oiW8j5XV)mQ=57%srrH(NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiUahvM&J4r5PU|`hnba4!cIQ(|n#w;dBfwuow z_1YskS(;?*ImvaB#T+y3GqTAKaZMJunY?%1@ruO2PZ;FSsFJFE4k~g;IW$EQDcb?yLELh#~ zp~C1n@QCMH0xm4U$*_bp8*8glbfGSez?YiO0? Ru>)#g@O1TaS?83{1OU=t*jfMp literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-48_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-48_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..03201095aec16fe49a5a1814e667077c533f5dfb GIT binary patch literal 574 zcmV-E0>S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0nDq z!Y~kk(?vlLJ$aHv#G?g|J&E9P_bt5mU_OLreGpOUB9`8Y9%VLD$8}em^iP^($p?c| zo9KKtlS-LIF%AGwY9?>=YAjYjH7M}O!{>p`kSiR=i6iM;mMA$NYyQ9{#^jwxZupnS zuSGY4vhz7U3KX8Lfq-pdTlD*V*lxEpLJx#Xh!;!Q9b87!=~S=fL?Ta| z&u8GpK3xS2otBeO05L&ADuC!Nkt%@5B)sre9D}Fp4Lli|cQVmi8-HS(r0O5_Av`-8jS@d>GMU8NX&Om$%Y+Ew zHrnlWDZ9gqXUpZ1HJeR(M*~RYiN`x{-Zg)l_o@&feJa5v*ladqm&=7M7K_}!{O#Fi zStKRe$12MC7Xn|`)JS|3m}3$jng!N8$0oiW8j5XV)mQ=57%srrH(NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KiUahvM&J4r5PU|`hnba4!cIQ(|n#w;dBfwuow z_1YskS(;?*ImvaB#T+y3GqTAKaZMJunY?%1@ruO2PZ;FSsFJFE4k~g;IW$EQDcb?yLELh#~ zp~C1n@QCMH0xm4U$*_bp8*8glbfGSez?YiO0? Ru>)#g@O1TaS?83{1OU=t*jfMp literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-60_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..acc3310df63c2291a0a7410caa592290325da6f9 GIT binary patch literal 708 zcmV;#0z3VQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGma{vGma{-JZxd#9M0$E8!K~!i%?V7!6 zGC>rEX9Wd2(JGDLEeIAuQhEUv78W*EHeaql1iQ2W(aImR_9~Jzf{GVlnU6FoR#rNh zvpE|=ob2q+gv{*D11CGX9$xlgv&R)B27|$1FsOqCe<-E5Z1V)`Fj$ry2YL23ERyr? zSl+Y6!v3+HM^+!{Ay8ZxLheEMKU>_`heD#bFz^P#($X{#CJEfe1|uAGVkZn!LEc2r zfcRZunQu!vV1`!IF~U49mka53yQEsJlFep=M>Pe8mK#i#wpuM1Y<6Wb8M;_3@KybA z6+WNOwApNa$~u+JX6bUd#4f#X6`svzSF%p&D(!j?7YYTENbpscqLax4 zyVW9)Ffberh0^o+9J|#aurSc+bhxrk<@0&$RENNymf(S-*X!XPpIWVkD}_LDU#!<_ zn#<+5SJkO{y^h^#;ak{?Y@^Y@ZuRgbERuym)o!=3TTMI*dyyRs2H34Go`jxfJFjG2xOsw!=tSa?=EQk;>HkdXL*@rLAt3brE-M;(rKaILCWb4l9$ zq-##MOYOWjQNKzokLL+FZxN34&TA6BlOXV-p|m&U?HtW#r5q19!eqC-kmT8*vP;ik z(`)rv?c&TAuZhaeI~ZzPy&=*2c~Z6H>AdCjQwp0HQ!EbhhDj}-JNfX39+jWROfOb` zc^>vQ&E|PIPvnb(w{_enZwY?vej`Z#xGvXPsrSV(CwFa(`t9shk`d6#$FF^1a$Uho z!}5}Z`P=SXZ9KTnJ^$r_g!xx1y4e0#S&6=|RK9*TSHV7a>UzI@;ZmmGZhH5IzTGr! zdErfiH=Elx-V|7K=+}lhbJemQrt;10-6Y+}d+}WDp2j^_Hd`EMJtyDDYR9pucjCtI z$FBFfr-hVAoT)s{|L*DUs+|{(=Lf3DbcK;l%`<+L* zA4zPQzGC8StHevkC$Okngw-(06rBssx9Tba#*J!;YeY#(Vo9o1a#1RfVlXl=GSD?J z*EKW=F*LL?HMTM_1#+zn41x^yo1tjP%}>cptHiBAIhVZ)sDZ)L)z4*}Q$iB}UXA$& literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-60_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-60_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..acc3310df63c2291a0a7410caa592290325da6f9 GIT binary patch literal 708 zcmV;#0z3VQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGma{vGma{-JZxd#9M0$E8!K~!i%?V7!6 zGC>rEX9Wd2(JGDLEeIAuQhEUv78W*EHeaql1iQ2W(aImR_9~Jzf{GVlnU6FoR#rNh zvpE|=ob2q+gv{*D11CGX9$xlgv&R)B27|$1FsOqCe<-E5Z1V)`Fj$ry2YL23ERyr? zSl+Y6!v3+HM^+!{Ay8ZxLheEMKU>_`heD#bFz^P#($X{#CJEfe1|uAGVkZn!LEc2r zfcRZunQu!vV1`!IF~U49mka53yQEsJlFep=M>Pe8mK#i#wpuM1Y<6Wb8M;_3@KybA z6+WNOwApNa$~u+JX6bUd#4f#X6`svzSF%p&D(!j?7YYTENbpscqLax4 zyVW9)Ffberh0^o+9J|#aurSc+bhxrk<@0&$RENNymf(S-*X!XPpIWVkD}_LDU#!<_ zn#<+5SJkO{y^h^#;ak{?Y@^Y@ZuRgbERuym)o!=3TTMI*dyyRs2H34Go`jxfJFjG2xOsw!=tSa?=EQk;>HkdXL*@rLAt3brE-M;(rKaILCWb4l9$ zq-##MOYOWjQNKzokLL+FZxN34&TA6BlOXV-p|m&U?HtW#r5q19!eqC-kmT8*vP;ik z(`)rv?c&TAuZhaeI~ZzPy&=*2c~Z6H>AdCjQwp0HQ!EbhhDj}-JNfX39+jWROfOb` zc^>vQ&E|PIPvnb(w{_enZwY?vej`Z#xGvXPsrSV(CwFa(`t9shk`d6#$FF^1a$Uho z!}5}Z`P=SXZ9KTnJ^$r_g!xx1y4e0#S&6=|RK9*TSHV7a>UzI@;ZmmGZhH5IzTGr! zdErfiH=Elx-V|7K=+}lhbJemQrt;10-6Y+}d+}WDp2j^_Hd`EMJtyDDYR9pucjCtI z$FBFfr-hVAoT)s{|L*DUs+|{(=Lf3DbcK;l%`<+L* zA4zPQzGC8StHevkC$Okngw-(06rBssx9Tba#*J!;YeY#(Vo9o1a#1RfVlXl=GSD?J z*EKW=F*LL?HMTM_1#+zn41x^yo1tjP%}>cptHiBAIhVZ)sDZ)L)z4*}Q$iB}UXA$& literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-64_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..01686eaccf76d5498ecf6a85d9ebef18c3172542 GIT binary patch literal 714 zcmV;*0yX`KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGnt^fcNt^u*3Y$pH!0$)i)K~#8N?V7ue z+CUVBF&!d^W<^KAThJlO6jXT%v;`#2&&R zKFD}Hrg!ZoQowvZ|Eu{R5Mw)$0$Qz>vH2jjONbOOnM{n0hhwt@)*688-PCwEwyp^* z0idiB*aAQqCBzZ{$|fPU0Kk#Z>-A`Mu}LHVa3plQU7B575(~KB?`kv}85<9$-|y2A z#U!x+013n4(Aao5tJR8*C?2VP4qva=%JF!ly?@i`bZD!9kcilv&u9M{M~VMsu~^U% z#Uzn{vNR833*aTnIFht^V5*mOI7H6c zZnu7;uf@|e4_@o#5e}?byWLLJ>-A^hB-i{a;S#Isz#%c>XQ$^30koT zhPhlW>U28MUOI~MHR%35PNP_y0G+SLrbuoO@cXeXl20sxcwGLc&Uc+}cvS#+K>SnZ w9RmDUq~aDq8pYxS&?pusfJU(h7f`AE0TOe>p7;90n*aa+07*qoM6N<$g6@$%XaE2J literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-64_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..63fb5b06cd7b7589f89bf6ebe388ea10e224e87d GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz#zO1gc&z3%uxplvX^-Jy0SlE=i@fj{o$%<%D}*w>*?Ycl5y|tbVEO8Ljl+Q zmlr8??d9;j6u6*(eVt>o%hV1nRnc;VC5syPE@wY>dUN_4}U4--Fb7Uz?*ew(`Lz4vmRtRp$^ z7wqbu%$TsCCe28+;SEFIOnZ(^;R@CbpX7cV7JZ?8fJ521#i4)JB$ef_-hE#^VWs5u zS1RKtv`ljSFJa5YFL)?bO(SE0!;@5;AM2ELtvx73*!_+LbSvomC{ zc*q?e9X9`sz%|1s^B&2*dt|D!|G6zg#pze?*>{}gD&P)@NLc$WHujiQ_=-(>`&X=3 zA^wX+bKmWQg))&mz_?H?ag8WRNi0dVN-jzTQVd20Mh3bD=DLO^A%=!lrp8t#ra-Qh kfkBYLelrvex%nxXX_dG&DCe?w0W~mqy85}Sb4q9e0A=FsaR2}S literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-64_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-64_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..01686eaccf76d5498ecf6a85d9ebef18c3172542 GIT binary patch literal 714 zcmV;*0yX`KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGnt^fcNt^u*3Y$pH!0$)i)K~#8N?V7ue z+CUVBF&!d^W<^KAThJlO6jXT%v;`#2&&R zKFD}Hrg!ZoQowvZ|Eu{R5Mw)$0$Qz>vH2jjONbOOnM{n0hhwt@)*688-PCwEwyp^* z0idiB*aAQqCBzZ{$|fPU0Kk#Z>-A`Mu}LHVa3plQU7B575(~KB?`kv}85<9$-|y2A z#U!x+013n4(Aao5tJR8*C?2VP4qva=%JF!ly?@i`bZD!9kcilv&u9M{M~VMsu~^U% z#Uzn{vNR833*aTnIFht^V5*mOI7H6c zZnu7;uf@|e4_@o#5e}?byWLLJ>-A^hB-i{a;S#Isz#%c>XQ$^30koT zhPhlW>U28MUOI~MHR%35PNP_y0G+SLrbuoO@cXeXl20sxcwGLc&Uc+}cvS#+K>SnZ w9RmDUq~aDq8pYxS&?pusfJU(h7f`AE0TOe>p7;90n*aa+07*qoM6N<$g6@$%XaE2J literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-64_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-64_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..63fb5b06cd7b7589f89bf6ebe388ea10e224e87d GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz#zO1gc&z3%uxplvX^-Jy0SlE=i@fj{o$%<%D}*w>*?Ycl5y|tbVEO8Ljl+Q zmlr8??d9;j6u6*(eVt>o%hV1nRnc;VC5syPE@wY>dUN_4}U4--Fb7Uz?*ew(`Lz4vmRtRp$^ z7wqbu%$TsCCe28+;SEFIOnZ(^;R@CbpX7cV7JZ?8fJ521#i4)JB$ef_-hE#^VWs5u zS1RKtv`ljSFJa5YFL)?bO(SE0!;@5;AM2ELtvx73*!_+LbSvomC{ zc*q?e9X9`sz%|1s^B&2*dt|D!|G6zg#pze?*>{}gD&P)@NLc$WHujiQ_=-(>`&X=3 zA^wX+bKmWQg))&mz_?H?ag8WRNi0dVN-jzTQVd20Mh3bD=DLO^A%=!lrp8t#ra-Qh kfkBYLelrvex%nxXX_dG&DCe?w0W~mqy85}Sb4q9e0A=FsaR2}S literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-72_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..110249863df597f565c86d78d0fa43b7449ee9dd GIT binary patch literal 788 zcmV+v1MB>WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqBme*wBmtWh#uNYm0;x$vK~#8N?VHPr z;y@IJlUW2eK7elActPLB7ns+Wjl#I=0iUAxBDnE__y~$`;Kpv(g5a*Ee!CnpGo|O` zQcb6FKKQXZrYhYZMP1TKAPAWVl~SfC*!X5Xg$IZr0ue+Yf(S$qfe0diph)MJ&YKSA z{9F=-;h)&P&m#`6anyOyiLeer;fGGH=wI5D^c5YgwLak*FA#*DQ~UTiKRgli4na;@ z_C$~j(i9?yKm-wpAOaCYfN8+Z@b3xIg9t_Pf;I;mc-XB88V zZv!`55GbRhM1nxsBqbIE$|Nb3Ai$LrhM^jbMy6KrNG%9(B_V^sz|<-hnFImfC1n-_ zxa%ZjI-QzY#UPjaLG^k)7!HSj{jdBHlgY%C3W5=p39OzUZD!-atadmYOs!&&S&;2E zh%Jz_-EK{-;*d#@?{YwDL0mc2YE|uaJ5#H8q!PrH({8tKGhC5LET~L!Kq5h9lLOd- zT+6`%($=1fBw4Jo1g+O=mK?06)Ak%&doII;b!M~Kv|c2hEOLOYO_$-q+G^Bl&mW`K za)QlfbK7!whY|G@^o&QF(X2h^j;(E%;le)Cc3UIQ*(%=dXM_v?Obuk*C3U;q+~k0N z{{YwFl1LD^TrNtFH|l&on!YgJm zywp3=`L5&PULh5DsTUpRCj{M&2zF$UCJ;dcB8Wf)5r`lH5kw$@2t?3Rg5WpJP|_;k S%6PH>00009In0r*OX-BxcT-_j~+b_5Vc9ZUN|(rmMucb&FedEGnc zF=x8wr0oxN&9x_O(pxcclfLG}PkLTUbmdtnJgKWGE3#34=pa*HXKNf+x&P(*%iyTZ>P^|{Koz>=5yEPti)Bh9w}7~ z>-Av1q@Wx%nxXX_dG&2(`+J12r&sy85}Sb4q9e0Miu{ AivR!s literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-72_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-72_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..110249863df597f565c86d78d0fa43b7449ee9dd GIT binary patch literal 788 zcmV+v1MB>WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqBme*wBmtWh#uNYm0;x$vK~#8N?VHPr z;y@IJlUW2eK7elActPLB7ns+Wjl#I=0iUAxBDnE__y~$`;Kpv(g5a*Ee!CnpGo|O` zQcb6FKKQXZrYhYZMP1TKAPAWVl~SfC*!X5Xg$IZr0ue+Yf(S$qfe0diph)MJ&YKSA z{9F=-;h)&P&m#`6anyOyiLeer;fGGH=wI5D^c5YgwLak*FA#*DQ~UTiKRgli4na;@ z_C$~j(i9?yKm-wpAOaCYfN8+Z@b3xIg9t_Pf;I;mc-XB88V zZv!`55GbRhM1nxsBqbIE$|Nb3Ai$LrhM^jbMy6KrNG%9(B_V^sz|<-hnFImfC1n-_ zxa%ZjI-QzY#UPjaLG^k)7!HSj{jdBHlgY%C3W5=p39OzUZD!-atadmYOs!&&S&;2E zh%Jz_-EK{-;*d#@?{YwDL0mc2YE|uaJ5#H8q!PrH({8tKGhC5LET~L!Kq5h9lLOd- zT+6`%($=1fBw4Jo1g+O=mK?06)Ak%&doII;b!M~Kv|c2hEOLOYO_$-q+G^Bl&mW`K za)QlfbK7!whY|G@^o&QF(X2h^j;(E%;le)Cc3UIQ*(%=dXM_v?Obuk*C3U;q+~k0N z{{YwFl1LD^TrNtFH|l&on!YgJm zywp3=`L5&PULh5DsTUpRCj{M&2zF$UCJ;dcB8Wf)5r`lH5kw$@2t?3Rg5WpJP|_;k S%6PH>00009In0r*OX-BxcT-_j~+b_5Vc9ZUN|(rmMucb&FedEGnc zF=x8wr0oxN&9x_O(pxcclfLG}PkLTUbmdtnJgKWGE3#34=pa*HXKNf+x&P(*%iyTZ>P^|{Koz>=5yEPti)Bh9w}7~ z>-Av1q@Wx%nxXX_dG&2(`+J12r&sy85}Sb4q9e0Miu{ AivR!s literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-80_altform-unplated_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..81f6b28749e3428c3f24d988e33aeb428536e947 GIT binary patch literal 883 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

NxZ#f=Km^3@38TK6f2mwDF?j)f}_0V&CE) z?UyVsFMn<##hbo0>ZR)X)6YMj`}}$HzpVYL{}%npFzLEdQ&do}z+LizJUb`n=TkS! zo)%f=+sM7veY5`v(*v`53z=8CDb7la3w}O~-zz574NXe9|Rf zv3d>bflRx-TUPo7e-+zw(u*O(F8&R}g+CQZtPRhOALnz}_0!zkd`)-lw(f5W@4tV& zx2sQ-Vf)XL!gJI9FZ?;%%FgauwP@@UhIQ-L_gV{vl(=3=``no+ck)r!p0uq|rtc1T zPjvwb=m7<4Ot-}7y}tN5K1jPT_>la3yZ`@B@(Qik2ldEvWu{K(e2t+?cB&7_-`FXZy`^WXdVbLaJ} zt$Uspt(>m5{`%{m_B&Q8W{SOap5y)UN4e>t57R##5@;}BQQ%<&r5X)}DrWWxA3Ydr zqWc{W=-TrCSip8abnj% a7WE8&?}{s?D00<+1U+5-T-G@yGywo|#G>l} literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-96_altform-unplated_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7950c71504b71352e735c09a27c9e76a1878 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A}ZE2s6em5^e+vvX^-Jy0SlE=i@fjOZ2Je2WpD&ba4!+xb=3{YCmR2k+%Pe z2PY&r1UYg{S6JaXiGh>p_*+(i9iKQtK8aYkWL7jSTFJ)9#?t0AeZm$do+k<%jFZm2 zIpgWO zHdD#{+rm~oKSO5&jfYIhtxp+e>^Loc`H=A`w$dEKx%=dG=SY+ou8LTYEMTZ8ps--S zxEIqMPcSlEQj_TMS2jRjz;wz4fv@F2v(-5Z(m$|jRUA>)x-+NGLR^2SqQY1m z*Kb}O(Au;+qR}ai^&{8M&=&0D%)~r}D7D;Q+mgp#6yl+2bTWG#+qYkyYDpFEjR^^@BtAC;S)cKJs0>;9>r! zhrhXQe2mZR6~6C(pzr=N*0>sZ#*06GG9CK(ndQji_BFk2kKbFc)$hx^7#7GVUU&2L zt0Rwv1@DRr-`H$6qwFuWgH#3(uNI~>{Lr!BT7;dOH!?pi&B9U zgOP!efv$nMuAxbYp`n$jv6YD#kZWaNkbGn5Y7`B*`6-!cmAEwswaSVEH86O(`njxg HN@xNA!{b;} literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-96_contrast-black.png b/res/terminal/images/Square44x44Logo.targetsize-96_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..563108e90e9037ec6b9d9a5d81e44dd90926b4c2 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85m^SK$tOhk#Hje19OO{i(^Pd+}peR^KJ!*uoXxfF7SwrQs@jZ zT(Ck}mbrS#K1Sx~c}jPM;ug62RJMM|Pjc{z+%2rhanY-?*~?RP8qYi1XG&WO9^W{A z-A?ph-6hXFnVZ)w<=K)aJpkGX1`cUEz8w6#=liS6;i28*Pw3d@igywz6DcF zzevN0GaL!M@0uJ0m;~AwS`--)IUFRw%!{2H&Ttz1C}81mW;k?2&-H**A3_qWF5(Tt zuDk1sD=J=y_bMt?$sH)Itn@su_-|!*H}~IIj%L}0l|N@YaXj3}#F6!HnShhUMCKPI zR>#_AcQrL7Ok`dWqIE27e+Y+S#FNbnCQlZ&&pJFj{FnBPh0Pqf8zU-~2A!

NxZ#f=Km^3@38TK6f2mwDF?j)f}_0V&CE) z?UyVsFMn<##hbo0>ZR)X)6YMj`}}$HzpVYL{}%npFzLEdQ&do}z+LizJUb`n=TkS! zo)%f=+sM7veY5`v(*v`53z=8CDb7la3w}O~-zz574NXe9|Rf zv3d>bflRx-TUPo7e-+zw(u*O(F8&R}g+CQZtPRhOALnz}_0!zkd`)-lw(f5W@4tV& zx2sQ-Vf)XL!gJI9FZ?;%%FgauwP@@UhIQ-L_gV{vl(=3=``no+ck)r!p0uq|rtc1T zPjvwb=m7<4Ot-}7y}tN5K1jPT_>la3yZ`@B@(Qik2ldEvWu{K(e2t+?cB&7_-`FXZy`^WXdVbLaJ} zt$Uspt(>m5{`%{m_B&Q8W{SOap5y)UN4e>t57R##5@;}BQQ%<&r5X)}DrWWxA3Ydr zqWc{W=-TrCSip8abnj% a7WE8&?}{s?D00<+1U+5-T-G@yGywo|#G>l} literal 0 HcmV?d00001 diff --git a/res/terminal/images/Square44x44Logo.targetsize-96_contrast-white.png b/res/terminal/images/Square44x44Logo.targetsize-96_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7950c71504b71352e735c09a27c9e76a1878 GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A}ZE2s6em5^e+vvX^-Jy0SlE=i@fjOZ2Je2WpD&ba4!+xb=3{YCmR2k+%Pe z2PY&r1UYg{S6JaXiGh>p_*+(i9iKQtK8aYkWL7jSTFJ)9#?t0AeZm$do+k<%jFZm2 zIpgWO zHdD#{+rm~oKSO5&jfYIhtxp+e>^Loc`H=A`w$dEKx%=dG=SY+ou8LTYEMTZ8ps--S zxEIqMPcSlEQj_TMS2jRjz;wz4fv@F2v(-5Z(m$|jRUA>)x-+NGLR^2SqQY1m z*Kb}O(Au;+qR}ai^&{8M&=&0D%)~r}D7D;Q+mgp#6yl+2bTWG#+qYkyYDpFEjR^^@BtAC;S)cKJs0>;9>r! zhrhXQe2mZR6~6C(pzr=N*0>sZ#*06GG9CK(ndQji_BFk2kKbFc)$hx^7#7GVUU&2L zt0Rwv1@DRr-`H$6qwFuWgH#3(uNI~>{Lr!BT7;dOH!?pi&B9U zgOP!efv$nMuAxbYp`n$jv6YD#kZWaNkbGn5Y7`B*`6-!cmAEwswaSVEH86O(`njxg HN@xNA!{b;} literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-100_contrast-black.png b/res/terminal/images/StoreLogo.scale-100_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..c52aafcc5ddd969f598df095dd468ca02657f00b GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQHmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk-s=0 z=S@s5v*jjeY+`uzhV|8&2G$);H(7Z_1i2HKJv_cxlmxEullok2bCKtpgyt;cUelx2 zyT0F?wA4XC-~*>Jm%yQ?^Dch9qM^RfL)P=q!?><>&&*!EST5$dPS5$*q~dJPPXW#o zcI($I&c8pY-1fEW%Kn7o{$*~=iocfJX$qaREy?qemvikeFDCDK0!}42r}`vKnQ}S8 zThFwAO|55wqw(b}bK)3RAC-T(a8{Nna;stM`Uv2uOTJ(JXKcT0pkG+NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkK|O@ISc4N!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e46XM}0Q30wEoGbQaa z>D2jMZ9GkhSAnBRf#bi>yp5s)TOLN(o93Rn5FU}=y^P_4(A|x3D=)3x{)YdGv*fm^ ze&&;U8o#<(uesZuC%xlW(uGIu>;9F$p1-00_MFOD^(Wo)1Z6&U6@Iv6Up!fXLu`-V zlI3!vXeD;lZn^wxFJ)8B|?dj?{&vN$Z-G8uV`=0i=>F+z0W2*HGSOri9K!4 z_mp+3y8kK7{AY9XB+%PU3O9Z*_3rD=Ns&x`4Gd}364!{5l*E!$tK_0oAjM#0U}T_c zV6JOu5@Kj*Wom3?Vglq^85n$V-_nGlAvZrIGp!Q0hE^#aJD>&zPgg&ebxsLQ0FZU$ AMF0Q* literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-125_contrast-white.png b/res/terminal/images/StoreLogo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..5e741ef242fb7eca59fb4e94b1cb25b6af07c45f GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^_8`o`0wn*2-3S3vEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4zuQePiAs0}r4_?~oq$B&IK`%8uIq7lo3m&0YSC&TaUn=xUeuHSIsM9osST>a@2^;euHCg%uj)wwe}jzXynS$I-i67r{g)0$-~M`x z{dZ2wlT%e|WgKQE%A{@&`{SN%*;I7j`~0H!7x=#}W;>NTS@sX}jl_&QS(4)J_YVoN z8}U4PJ%1zPAGQag|9M|0Gw25&xLnPD;A%DBf$QST43lsCy3DZoM%5wfO)(AY%=cbi z7QHy|-Tf(-4lND#+;YaW=J`DvSL?Ko-Je9`lJxd2`on*AhWxyAOaJv;pDd-)*|r2a z{*Q`W$NFIJ-|2yJ5&i)`OwLu7?tMC8=?eG#TMSc77x!#GV;q;7_jbm@*V_-qbavNC z`Pg%sZ36mNfkW-vXZK&}^Z7#N0RvdI#5JNMC9x#cD!C{XNHG{07#ZjqnClvvgcurG s85mj_S^&9L1_qn+4=AH($jwj5OsmAL;gC_qe4qvfPgg&ebxsLQ070tYNB{r; literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-150_contrast-black.png b/res/terminal/images/StoreLogo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d843bd16ae1e902f4bc56158ab4a7ddf2a62b5b9 GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4EalYaqsO7d%wd5GHnm_ zb0aMnR%!7aIKb)P5!1ACjZSFfLl>SLkDfKQ49r1RWeV&LuY^=S88!$M-o5d0{*A-$ z-(J!3n}2KCBB==~o|AxR$^445v*tD~(Cp66I`_57>GUdt*KOhq9RITeM2~;dd3?8N zV?YM0^5Y#UoU8qBP2GA!Xd>&(bJtwHCw@A4s&re6=$x%bMbB;U%gwd--@ZqML+<0* z9~JNBE3baW`tkRyO=ns||1ErUV2*g9r0BCVSt1cPY@eO!;{Kd)w54)mSz@x?^8-rK z_qHV{+dTy`^h9oCtAwpjPij=<`@c8;!=>~c`M>KTPiAIs^Siku{)lP1?iJ4cm)`4& zmddd_JsA{e&N%J-Y*GHF2RAt%{1n=rSgWz3RXppv$nl9=A2te3ZE&?K$Z=3joY+4{ z!mKJ|+S8xcxTMc~|HJ%l$HaH{URk_#IG(({;N-?=oiNiI-}iq{y!*IVAf$KqK{W?Z z*Z`5tZ?=Z(pAIXOs{aN?iE4>!L`h0wNvc(HQ7VvPFfuSQ&^0jEH8cq^G_*1`wlXmV ma;*#uf(-VXp=ij>PsvQH#H~R&m%R(9fx*+&&t;ucLK6UHk@@Wa literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-150_contrast-white.png b/res/terminal/images/StoreLogo.scale-150_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8dac64a4fe876c72b2da84695e0a1be19cb46cc4 GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4a$xjrHA zSKsrFH4~!B#m;SB${}&-=Bf108D?vd4dHbhL@m~bjxXWCRrvGb?6yc7Sn>lWT&pLXEECdS`~ zJmn*pnpd(~pE$zxOU-HB)3qNz1fF<&vh>WFLwhzxoi})DUdUg{{Ix0Y=jPPKa-{*8 zI?|O{!y@qYXi&k2&(|sh^F8gE52Q3r$7I{ zw(!lVx2IPA^t)}5&$7YDY)QOwbJEr9>i;?^AC7!wj(J%%ee+gbhGcN4Osr*2y#8?S z)%xGjz(`Onag8WRNi0dVN-jzTQVd20Mh3bD=DLO^A%;d)28LFK7C^3*fx+hd1Ij2G ca`RI%(<*UmIAl~YAE<%B)78&qol`;+0OTC_6951J literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-200_contrast-black.png b/res/terminal/images/StoreLogo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb88aad7d15136791956aee314e3e3df8972d17 GIT binary patch literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^DImQK%ZOfg@eH3usM{92a#Ia#-@HYKeAwSL8Y0tvvDav#c{#U8yKo64>}h%KD_w%l*eExu^Ty4NMNteDmPs!Zu;SsmBC^ zmP_%u9Lk6g=Un2EjjG5J@On;ZDVA^7n8j%N)!{@vQE zZv669s$kRE^htA7#HPCSuD2%^+V;P@ek)Q$ z{)3L!<|&ojWME)??CIhdQgQ3;ti67R4Mg1X z1y>0O87pyfS3eYF2rPA6b!4@{=8#2CO)D7ZEn5*P&Nl0vjwrXhGvmc$T-zSs|1{Uf zH~F=k^}cPBI|Q6K6k8y~C)a4XB_c0mw7;y|s$n>N;+D6rZu1Up(l%Vfy){%j=+wk@ z#wM$>Ba#$b*K*jjr3Nl~_egefRZyGKO2>&;R`^O8oQQI4O1*Zfe$RxZ^wTM#U~Y7MYi< zvZGC2aOyE>zuK%H0)d%6fj_Pm=nHus2Aatm&oBSQm_WV#+$~;?ITs`sljg7mzmgzdrtd5)YT6TTW z{U?uo5K*xywT5X`$x)Y(Xq8*Q6rft-8c~vxSdwa$T$Bo=7>o>z40H|5bq!5I42`S| r46Td|fm|yCgB2A`!YCSY^HVa@DsgMLscN+zsDZ)L)z4*}Q$iB}8FC=N literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-400_contrast-black.png b/res/terminal/images/StoreLogo.scale-400_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d6616c8ab55727854d542cc1a048138f84f9536a GIT binary patch literal 1409 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k1xT_7rilV6mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk4|lIiaPS(?at!gZ>)dsJHNU3{&_RY8GC1b|C^Scm;UUV3eW{Oz=PE< zKRwwJzdqBo{i{Q#uh&twT6gc%YlYtSS+U}?Zr^pEuV}kS|I3vc_bs)P#SBiwN?Tp~ zbFK7?vG?!Nr7nGPEED%#FM7B7$-XyJ`A$E1(W)GEwl=G7g6R9e_A;aIoj-T4nQax2 zrek{})ie5R^IbRl%^^8DdpQ=V6{meJkJM;VI4GbZ(Zu3BA%R1P$FWJ#!+?de4J0_@ z4|m8@KjyE@&o}*Q1Pj#e^nW6-Y4@FGi&Me-~UQm_LE$B;llTC@6Jnp9xf5Cc;Y|vge9>b6(+0CSIOmK&zxT|$tTR@gsJWR z(@Wy7b4ykB+s|3#cyG4RLuFajlYFktHRh$9liq}woJej<^)OoZLi%w2mpT8;YS!EB z3+4HFtROPo_o(Hb|I0u0?{$tfSevxv_4(v#&yVJ9=_U8J2;G~0C-mVJPS3Q!r%#kT z-)P11D|Uu%Rr%Z-lWkUN^9esX`_N1wds1{& zSp4<-HtBlbQzIw;St|ZLMrgV8Q;$o>-kv*ZeC%>xwQlF*wM&+J8Z~}iK55={>1Fqy z-(AityUtAW^MvZgQ-70_)_Tfa*Z&-usH(VLB8unh!pxl$zqf@wl1o|Az3l0;U*d*L z#e7NoXZ`DY-xl_`if7|}rZ20mWuHAUN9Td#-8!a^Eqdj#k)_<_0q@KEYWy5eTs)@A zVR_4vW#e;;ozIIbST;V(_|j-sJVPM==6sFm$LBpx-uu)@@!qO^PA3dwk19ObutKaw z#%yZSgu|yEPL{bfadC4>nXastk6o>z40H|5bq!5I3=OSJjjc>T lTq^?u29606Q8eV{r(~v8;?__Ys-X*VhNr8a%Q~loCIH;UWw`(V literal 0 HcmV?d00001 diff --git a/res/terminal/images/StoreLogo.scale-400_contrast-white.png b/res/terminal/images/StoreLogo.scale-400_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8c622de1d48bc2145c794380c6764eb1d86a5fd8 GIT binary patch literal 1363 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k1xT_7rilV6mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkxSlMx(@|He6{1HRUrul>oUY&`ys(q+ zZHVYACBxv^(Ok>k7GCHuuiE>3-tRfZ|DIdkKOZZ!<9zMB=QYLg^NQu?c>tY&11w0n z{dKF@m5JG(wynGAUi*2Q=`|~>S=TdjPftx=FLy*@T~qU(J-V6xKNjRkJ-S)wKmW*! zH*NQ})NOlJd8bq-^V3%?wl9t!y!?-xyvW7=CG^FjhmQMB?7hBBmOIwqkLB)Fa|^#M zWz~-ia#v2|Zp)v@9e3$-V>h4Bp9>H5BRiTDjtLx*Xp(RiNajf5aqLm-Fk~@o0}0M} za8gD*S8uhfnc?)Sd|<&G&RBy-=A5CAB~g_k>Gu>%*}g8*ReRU6yF0(%+~V^5TVIyn z;@|FfM^Pjcon%3qf8H0zLhl5oFzLdxP5j&fCZ+Ewl@l9TXzwa%>CCPbTG zR98;o-0LaV8Ey05`+nH->G+o4=YRe<-0Qw)muK7Ts|r`uHcBtKq%y5JWag2w30#vS z_=94FemiP;2RThxHED|Al0_;@Sw8w-DxCjJ?uu2@5B136_9FglS;ti#L17cPCQT7@ zd3U-@T~puV^kkM(HKCV;cfHuk`9I5PzuCq^B~0#Szf+THC;wU3KRYr}Ybo2reOD#> ztJgmLy_`8wr>^yN@|n*@FYBM*yWnEP{_(%r-<@dL1 z+1K-{`+Vy+?V6b;F0@wj;mq#erb}gaEuAlYuT^mF<-po2Uryv~SR?(*P4++QDeI|Q zp6Z-SO)P+>Q>4Vl$!~PPF}w92SFC}}iF{D{dvKAHzsUBx-E1)%tB1vrx3?_lyz@Kv z$|AL`V%su)7(dy`_qy(#t$AjkyHoLr*Y~TxY+AKC>YCnLt+%@jE|z@h-gmv{-LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq_>O=u<5X=vX`mo`iKnkC`xACPZd09pC&|S?P12q&jv*Dd-rjP|5)NcI z{;+;Ylfted)u67^T=N{bu1>vo$d~__V$ADp*8B?FjgfvlqsSAifUrwuFbn|(38cVAaTl~|5ktBq$z9a zZ605&dn?J;cw>@EYO1#M@o5uZ&v_E|mhr=X0qMPh(tAJZ7>1hJAN5*Sye8*M#`v)8v<4Z+{vpoHdv?B_@ac>Es($ zPt0~bN%;0s=Xl<-lC?Xzd{2GM$$kAQEvmYX=R}Rv-REH-Mv_b{gi$2-dFNfd_eb5# z*KwuTZQuLJFGu>*B|XpE_ND5T^Df`KH}_A}??3-m&i?T-dFlI~*KX_%ueLCscO$Cy zT=$&w-`+iUe#^K~dfNO=dht=d+u5J4*5@cmF3mcBs=qf#Seo~?uWydYpXjWe$JETC zOb%Dv@_4r5PmK1~qj$2-=S$Q`$9^jK_EICic>A}48>VMNUwk_2czg4#skyOrH~lvK zU`w2I{pVcswX1KH>fNe|zo(#*w0pzbt?oIU>1I_bW>w1DR_aIF{@(HJOPga(uzEC4 z(wxb+E;AE|CkBQG$9^%Fw_I4TF>`hgP_b%>YeY#(Vo9o1a#1RfVlXl=GSD?J*EKW= uF*LL?HMTM_0dlPj48FK;X+qJEo1c=IR*73fs}zqN$T^;_elF{r5}E+yCpAj| literal 0 HcmV?d00001 diff --git a/res/terminal/images/Wide310x150Logo.scale-100_contrast-white.png b/res/terminal/images/Wide310x150Logo.scale-100_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce5b04031638643118daa2afcc5d9ce39c7b217 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0y~yU^D}=r*W_V$$$59Du5JAx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq_>O=u<5X=vX`mo`iKnkC`xACP9!8-LZV#(~PI&I=;uunK>+Nm(Zed3W z_6O!!sXK!Bq&e#Za`*lgs59N)xhQN}Q;hoZlZnZyN=;(xT~F*Px_LJC+xayoKl^Mx zeZa{0PeuA>XCoGHaEu$r^yeqtl;qrnHJ&vi#CWnq? zwB&ZX#vF0g@#1f04z-S{nj&v({JGdJ&%R}sZ?l)KgnZFsBk@DmlyAQz++B zFYS&J-8EnT^ZI#a!7H8|C~WrPlQCbBQhlfHsc_;LPW{qwdsk zMZ4S8ZmAGhzIFHerR|3sZv^$4sdHxE|FrOwn|_(g+w6J28Xf$j7JoDIulcpW{IHwv zjTJjXujD!1$Oz&-_B$#i?s?7n6|vpY4=*1Vi(j?cyim^Gi@&`&c(v2)$<52kO{eC@ z{|npl&0pr(N2PbiJ|A0EHu=q&sQmuPt`X9^zC}F$aPC+~OYcRF+qbSR@QboFyt=akR{0N2tM AWdHyG literal 0 HcmV?d00001 diff --git a/res/terminal/images/Wide310x150Logo.scale-125_contrast-black.png b/res/terminal/images/Wide310x150Logo.scale-125_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..33010325e98d0e15bdf75afe8fc7037d2ca9d95b GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h_i(TP$xE*Ub$}F0x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LjzFpFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0V%z?iW|X(u~SkiEpy*OmPVJ0G{H?hjW@Q=q0zo-U3d6}R5r-Pk1@D8lw& z@&fL%O<`tD>lGq8GHV&Qxw&Vr)%n8fvf(y+#D)o>7jLnD5M>FkVel504qvn8PO|bN zpGjxm6s5njsEc3K;`waenV-*#CM$LVZ6gC*JMEe$B01aq)xNun%FbSx#Q(YCgM!TS z=3AxyN7sB~Sf<4P_|vnsX@V1FQamnRfc+wr#rS1$7SfFbEc|0~&Ft!0}@dw;uZpE%1u@w4A*{;IRpx-Trd8=TmC zp?h_&`8SQcqmFMC4+`8$fA!ol{|r~{TG6cQyu7D%t$aj4jMcMBIyA1Vla>nGp7}p; zMXb5Wn(QlOBF}z$3Cvjcb?vRbLpt$XOu?l=o8RfXKI~O6@KxXb`mvjU(t3_VCw@5P zGO%yFUiHN9t)ip-wfURvpDevrQ?UI;O@doO%C6%N;too1FezWwW!qd6V#3yR;6zFH z!OMpX1z6mc`SGwcPPDA%c_d=)nDAuQ+n<`-qs7DCh<6-Z1$0lfR!#qf?(KzNuJ5h1 z>7IMbxk=IF{N?+fquOsC=sECYi}aW1xc6IJ#8}i)cOKpUtk-6~zFF<7$h&# z{V2Vubxqz$`NG7<#{R_|)5;&&Upe)`Of2a29UYF;A6Ga)fzPsV&S931ye?WTpQ;+9)xZ_Q>SBYiM51pa3A642%1cxJo?s9&|jHKHUXu_Vl&Jb7#doc8e5r|0=ZTO20;e<%}_Mt=BH$)RpQp5oXg$?a-pZIpUXO@ GgeCx1aa6Pb literal 0 HcmV?d00001 diff --git a/res/terminal/images/Wide310x150Logo.scale-125_contrast-white.png b/res/terminal/images/Wide310x150Logo.scale-125_contrast-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b5745ff70f6cdfd81fa7cdc8aca6a7fc00c4a93c GIT binary patch literal 920 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h_i(TP$xE*Ub$}F0x}&cn1H;CC?mvmFK)yn< zN02WALzNl>LjzFpFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j&mC3(BMFfgp@RW<_h zI14-?iy0V%z?iW|X(u~SkiEpy*OmPVJ0B0DXr5BZO`xW3PZ!6Kid%2*Z0r(tlsNEF z|KKqi8#ZkG!1zX&Wxk`14G=zUIi0Q=V^)6h zj^XUc>-Y6T`)rM7pQ)dIQ>PPX6&c{#4EMaMlxN3s&uzTB=c}Ic_017Ewk@tUxqELX z8)n)zT(s!Oo^5_gqx!V>_U`wp>rbUQtx)wgUnSM#zhP45YsLct9E?sJ0)kEr9UHE! zQtK8w{nfXoDbzyQ!6hckwqavI!oTg7$_^ZiN?=tlE}G0c{(Hy8Dv1rDbFH1#cg~+V z)BbbV#lOqM>kcf?@jaip@6>+2Vt0-|=F^rv-)pn-y2y${QVYf7lL{Z*)Ui9__ge8_ zSV`ZN{!bMz*Ic+A#mJ^Ay_BJOQg2X$<4HHo0}E0jxsF%HbM!<^Tejf@yHmoJYd+WR zP8E5_)i^QAIyU~vru9w|67ef?51u>4e`#;Ft;&m&GmpQS{c~}#T}5{9feg{~56424 z-PUL{yY5>vyHP-5#v-11SI#+b@c7K;X*qBp#-jPN0F(1}6WjIA6Q3XJy2~XwXBJcF z54nZnEj+U;N4Qtm(|@EXS4`JFb7We39xV0g35THLXtf|Fo9R z+wp30Wr)ndi2_xRw`XTtmU_kY#f$$wZtTFmtXoNt_A4_67c2q-AE1e|xA z9RBxO)%N2~99!R*MyRH|*?KSc#jNiI-gkc;e|v2=4;gXKz|j1S{ie(DjY;eo%Ygb- zOI#yLQW8s2t&)pUffR$0fsui(fw``sNr<75m4Ts^ks*+4Wni$PqDdGFVdQ&MBb@0B`_B`Tzg` literal 0 HcmV?d00001 diff --git a/res/terminal/images/Wide310x150Logo.scale-150_contrast-black.png b/res/terminal/images/Wide310x150Logo.scale-150_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..7844cda30cf5650538b84cdd3991195f87f13166 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0y~yV7v%qKjdHmlD5a)Ie`>Qx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq#8g0-akl6&5uhM@iKnkC`xACPZd1KPpNf7424(|K7srr_TW@b~^b>KE zIPlRjS2z{A+!EUf6YWzj~{?z5K+x zngj3MOP@^hY5Sf2t*qRO5oih3zz=)FzVJdRZOy<%Yrb7OEo0dGSK|6Seh;;8)m-n2 z+}~WC$A7Lji@#x}h3@Rt`^vxhcboqEb<4d*KKJT8!8DawE^98HXXu5UZJLUS*CEpYpzU9tt-zcbh>|@^Ay9>h?eyedX5@(NE7p%irg8J9-Yp8K4k(D$otNd8{CmFe z-G%<;+2`3+E>AnzeFGuLr+=()Gv{9Y!nE*;)QjWum{_Hz)f?N)xjmz-F8@n#zIb6K{#dnJX8PJ&%}uwn3T0>4=j_X7-P+}} z{+7|t-Hf?gSMLyNy|=~Pymzj~$CRVDb%4B>DRjpirxHs{@cl-dIf6RIUgkUApgQx}&cn1H;CC?mvmFK)yn< zN02WALzNl>LqiJ#!!Mvv!wUw6QUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryD%`U>Qy!Z z@;D1TB8wRq#8g0-akl6&5uhM@iKnkC`xACP9!AkTrIMRKP47Hi978H@y}i59Pb5&J z;bFI-baGPeony!3YFSK$q=bdykKSr?d0<+@IG>Gq;l>F|w=0^-al06AX13mJRNVie zHu!DYv^zY%pYxTcIcWmzpdR?25yp3Fk<0wIPWx-G|2UF)Q-AZVcIHhtwbD~0 zXtKr~UZdUbY*gR{F@|KkG9ODDzp8rnR>G%pC81e&5036$aK z{*qoZLBmI*%}r{fcHj&jm2Q!Y2ua`TrI$KnJMR^})BBaLb1Ki>@_iOR_q&d%pKp~t z-uCPC)Vs^m0%siQO4(+`T>CITaE8Y^2URXzX6CQ=O0 zw7mCTzLBjt!?MzAReQAp5`4Uu&pLbiS$~y|kmbeJk0mLezB6vATfIXF$Zj+0Kiu)- z(r2S?mqeTJlnC}Q!>*kacj7#YPB9@ Np{J{#%Q~loCICnWSkM3f literal 0 HcmV?d00001 diff --git a/res/terminal/images/Wide310x150Logo.scale-200_contrast-black.png b/res/terminal/images/Wide310x150Logo.scale-200_contrast-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a4480138b64db10868b307073bff1ccc8b621e18 GIT binary patch literal 1482 zcmeAS@N?(olHy`uVBq!ia0y~yV9H@&VASDY0g7DFQI7{wEa{HEjtmSN`?>!lvI6-E z$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4oMF309jzj}UQdBKl{Js$IWtIphedD6Dtq48Jh+B;jG&a+?OP`f!S z>sHZu`G5uM5^5@yvL`CZK6y7|!^M;5UuTpoec1bBbLnr#n6tJ|l5OhxRquCgx)v>a zd%dWbS%dH{y^nSNpRaXayrkz*3^L(eij7b8+)VA~*)4ZIvx{Venk<{J4a_PvJLMn! z?k6+X7Co7z%XPp1VPuV(-?!=VwCaBiOkX?QPiCIBt)FsulAF}uOCO?ZB(wnd!ba8pJN2o3(*a*Uvcn{<U!H+kKXxcs}jJg+^-;grs@n(7$_=+r^gNxV}qfI@#6I`xl+9dzZ3Ui(YSUrzqA;yF|Q zd zkh9@ayIYldUFY?p{-g!VKmL1D_|7qaD?P^~t^d*99fk+FFS*{CWI9N)GXul9WA*I; zebsNYKcoZQq*~${QIe8al4_M)lnSI6j0}tnbPddP4NXD}4XsR#txU{-Tq^^E!lvI6-E z$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4a???skYTaMTj*vPv60DdnL=ZB~9iF7I!GkQ+OHN&LpLwaYD`7 zbIDz$Od(mWHl7pTdh|C}_wnCg9CNPrg~mz0cZ>lOx<9I%>%VQ{dSuJx%tvx@NAvzvCb_rGw47YcAoAq*#z^f0 zKY!?b7tm;zl-538SoUVw&GZ~W_riB7d|bsUIct`zoSnuyd-KfiFZ^=Y_oE<;Chg2GB32=uY2D5V)vJ&-hm4QqEFrOHRo?gI%A!Eh;7Ra zr)zmnPtV%GsH>Lt*7uiE`n49`3`5QA_LrOYL<*ZNIJ#%ET8=|^WxDT;2C>iQKnnc~ zvdgdk$=tWTxg`2VL!(=2?)K|BSyk79yk4%{z{p(6^7!?+3p!P4y4xmgoib^|#qRHl z8!k<3yZ?CdwXgb*s{YvIUT=Qe^KasR;r#Cjiw|Gh>b!|TSInOklq~^S#~>~oL=qs#R!KwzWHBNEsg<%1rGTKI zQb0Pzh=qa`2xA5csECe|un2}t3W1Yi0|f$e(KA2h%$fd}nV;sI-0yqd_uhM+`#kS^ zznsH|ym1QJ3IG6{uaC!30MG&ekU_i9FrqzCq5&W17&kvR0PYqlZidT2Y!Kmd)DM93 zrT}oV0a%A2&Km&E5drvx0f1vU0DI!A?jLc63FOIx-W~un<`Zlol8^T}kqCejZs(5( zSK%zdAU4U@&l5Y1RaUh7WZPV91%P6$uZLSe>WFxpe8n_ImnWHMOTpgH{US)-o$?*J z<#A43(J1reROa;LB2~c>?{+#NgW^+UZgkhy&*v;!NdfaHr_^_8Bxp=7PxaYIn!Hc) z!yx0y@keoSa}_bOtBal0gS44cvz5w}@U>qbIjwj>79V~e6!=30rWcyAVB`f^-M=T! z`J+*$Sh8JT>pEY4%yiA*RX$#_v6TGG4fS|8ikiYwXA9%_}Ak0WPBSLU5C(4~dhIg=-MKpYbPoQcc#a>0l53 zy|X6l08YfukEeJ)|GoG8108>A>T1-G6zDA=l%QMD8{@SpVHzy38=BC%YT6mrjGz(( z9AT$znqnV@_yq$M&2D7i`!MlIS-5iX#@X8pO9%p%Jds{?+iM%%l1pu&Tr;v_hH6R< z@&GIig;vqGZ9&{?-t$NuxV*851qL8vlRx7apFoOU%?K;VTEmybG1*0`vFO7bu4bSt zN?4!;vUY^9jDgZL5Q12B7SG5SPjSh@1zm|mHF$Cnxy3ASZY?LA5xHL2rQh^6=Cuu9 zznOe_|HVyRt%P9U6^o&zHK$u{U6;8TtFd@R&ymEV_JaNr@lacZ>`1LD3@yWLEM$Xg%^+rdV)*b4rUveeOwSy6-uRp{neP#^^2eCAM=mo+Ob!;|Z z(Ij1u37f3w;7v+a81+fZmBA<#T#*+S@!e1A#}!-GL!|<6%IX1%Fc7M4J*j~z%imwP^DJ=XlsZkg|vQa2wk$Sr5=J{M;P-VZPpa186^ z7?H8u4!uGRzOT&b0L|$JWT^>@@}8_QhmLY+N8^d3w2~ho|6|bCRvYStE;_0l%6~89 z>f5+>46*c1E0S>RjH95?OjJtfOzERD#o4oUs2WYEKC50d)0SGB5*&guH+)~^1mj9N z${co!g~tft&d;#nZDDX;)yjI4Q_9}mcF(s?9&4dZZP}8LHLpu z!rs3zxtvI112Ad45HqrnF?Qy+A#Z)zw_6X}w|^qAZ;@B}LRZ3K)+_(kTP$0}j!a4N zcs}`&sb-33y3piH6v zi-DMI&*tPyt9NcksMli0B7$_)UtbHBgdiWjkA&@fa^8ED;jpDf6CPtV$ku{alclN@ z=3lr7!nioqm3=w?H(EO;58gG(Ppb=#N7%E!!X*(pN5xSph#z_t@bR2D8@<8_{za({ zK8k$NdYE%*XYLEK4moc{a(FS)KjE((`pZ2`iF=9}TlEjWf*+C}6o3kF9?DeQcBO0T zcn>;3Xp-a^loT1B6y+F^5CtE=mS{_~CfZx?+aIuRpQGKUj{EmP=tv~iWmKB{%YxHq aB2Pu9{pSV4MudtT$$dQ!c{I5*viWh&4Q=L_)xofQTTJ zhXR7uMb56~kSGW%)d0&&Ah4n)0R$T?U>AgJB~TIEq3xctd-iO*`@i2g-)v!CILXj ztp7-uKL0foqLcj&c%xsU^*%yO*Q#TE0nm;0^YS>7HZu3zz5e*=trFGrl`)GwsfNLy zFgy-F@g~NmJbu!aedt=`F1-+Ay0NaODf3n?YliXMG&eWl(;1T8XZvN&4D`9{FRoK6 zxTO`?!n5I(OJiyCE7XTcSEt99zTfMgvo!X7mD9px-~6gE0=@X~ePH017$`br%>}g$ z^hrgtfqwT{|4`2I#6$6xn_p_Hl>_p;`OZ_tpPK?o9X{7M!aXOd@SaV^w;PORyG!NL zwNvOgafhba%d9j@x5jr-PRW8fTlf6Izf|8ihSuTI)qv(V(c42(dY++jHEJ!WY>E6U zReIH<=7p~L2JhK!!DPXWO7tVR$Ayf&1X*tGu!^nLqPb>cOzs!CN_@B$&^5e$-iC;K z%Kg%F!zYSth#q6-1!6nQ5lcB=6!x~JBK;eT9@*NFsI)u?_(}~dpe1BuKrN+B69iSU zP+(U;0|GuKz{`K$hz&reHu=}oMjzopeT<2iAZH)@Z8Yl~?msQYUd^ww!y?H20) zw&|~(?YPW*XQ2+aKVC2xUAO^oEHJ|t{X0fOuPn>R3jk1_+!$+ixs`5CmF&#vv^y0Ni4gh9x1Cq42JwMtH zwcF!BNk-Idy8E{BJ7`Txv<8-_;L6UlMxq#nER@yC>PU<)nV+IXW{Jy9rI*-%PLT6^ zc_zVFX)y$irLG`oXr$(_%VzuT&K%tg>#KbaWan@7OLVAg8v69)<>qIcahdYm>|c?K zNSkJ|xdKe>kn;m}VkJxs>`*}@szSg*Im5k@4A`{bVoa?&)Ur~5bR#zHG=%nTn*B5} z@@A);e-wJcgAN+?Y7XVIP|-US;O&A@heST&zQ)VE?XH{Y>Q=LA^HSu1vbNEcFuGas zflVj62;v%n&3YoE5R<=|vgdl$AytDst3<}-tj*&cn*GAXui4YeX!Q)Rgkd7Z7?w_( zrj4fCknT%-V|g07D>}pPuB~j%WImtj7uc=*iCoF`k;J(` zRn|Z+iEjuUtS8CF=W%R_4|F>Gr6~;yWnMz$?k2Xx0zxW;G$FFzT+UZOi&#kGohIf= zsEdURtob(}cjEdQt0~y`J$PL0N09P*TbZ!Cv217s&I?e~=eoRSb3JM!;z&l|B0Q zT4!O-T)-dREH4b!X-{#ulnEXI0D*H^%a)G8JJxe}YBpvjdc8H(=0x`JcJHwWcfwcA z?~SdP3cYa4wH;Bh@#Np0-NYq=~OHop}a< zIF%@A>WV%N5K3`SWi`!Nh2o5$74U&|7;8|ZJf}S=$shTx{%_VLst%~q{~m+SN2a&ViWA7Ht7SR z=gnKo>t>gZ{zOebKG1Hx>bU<$h&^1ZGipmH_QP%Qs1qI Date: Wed, 15 Jul 2020 08:53:38 -0700 Subject: [PATCH 03/14] Replace the color table init code with two const arrays (#6913) This results in smaller code and faster copying. I chose til::color even though it results in slightly worse codegen (byteswapping in a tight loop) than COLORREF (SSE-enlightened block copy) because eventually the internal representations of the color tables will also be til::color and _then_ it will become a block copy. --- src/types/utils.cpp | 556 ++++++++++++++++++++++---------------------- 1 file changed, 280 insertions(+), 276 deletions(-) diff --git a/src/types/utils.cpp b/src/types/utils.cpp index 5d1fe7d9234..033799de69e 100644 --- a/src/types/utils.cpp +++ b/src/types/utils.cpp @@ -6,6 +6,284 @@ using namespace Microsoft::Console; +static constexpr std::array campbellColorTable{ + til::color{ 0x0C, 0x0C, 0x0C }, + til::color{ 0xC5, 0x0F, 0x1F }, + til::color{ 0x13, 0xA1, 0x0E }, + til::color{ 0xC1, 0x9C, 0x00 }, + til::color{ 0x00, 0x37, 0xDA }, + til::color{ 0x88, 0x17, 0x98 }, + til::color{ 0x3A, 0x96, 0xDD }, + til::color{ 0xCC, 0xCC, 0xCC }, + til::color{ 0x76, 0x76, 0x76 }, + til::color{ 0xE7, 0x48, 0x56 }, + til::color{ 0x16, 0xC6, 0x0C }, + til::color{ 0xF9, 0xF1, 0xA5 }, + til::color{ 0x3B, 0x78, 0xFF }, + til::color{ 0xB4, 0x00, 0x9E }, + til::color{ 0x61, 0xD6, 0xD6 }, + til::color{ 0xF2, 0xF2, 0xF2 }, +}; + +static constexpr std::array standardXterm256ColorTable{ + til::color{ 0x00, 0x00, 0x00 }, + til::color{ 0x80, 0x00, 0x00 }, + til::color{ 0x00, 0x80, 0x00 }, + til::color{ 0x80, 0x80, 0x00 }, + til::color{ 0x00, 0x00, 0x80 }, + til::color{ 0x80, 0x00, 0x80 }, + til::color{ 0x00, 0x80, 0x80 }, + til::color{ 0xC0, 0xC0, 0xC0 }, + til::color{ 0x80, 0x80, 0x80 }, + til::color{ 0xFF, 0x00, 0x00 }, + til::color{ 0x00, 0xFF, 0x00 }, + til::color{ 0xFF, 0xFF, 0x00 }, + til::color{ 0x00, 0x00, 0xFF }, + til::color{ 0xFF, 0x00, 0xFF }, + til::color{ 0x00, 0xFF, 0xFF }, + til::color{ 0xFF, 0xFF, 0xFF }, + til::color{ 0x00, 0x00, 0x00 }, + til::color{ 0x00, 0x00, 0x5F }, + til::color{ 0x00, 0x00, 0x87 }, + til::color{ 0x00, 0x00, 0xAF }, + til::color{ 0x00, 0x00, 0xD7 }, + til::color{ 0x00, 0x00, 0xFF }, + til::color{ 0x00, 0x5F, 0x00 }, + til::color{ 0x00, 0x5F, 0x5F }, + til::color{ 0x00, 0x5F, 0x87 }, + til::color{ 0x00, 0x5F, 0xAF }, + til::color{ 0x00, 0x5F, 0xD7 }, + til::color{ 0x00, 0x5F, 0xFF }, + til::color{ 0x00, 0x87, 0x00 }, + til::color{ 0x00, 0x87, 0x5F }, + til::color{ 0x00, 0x87, 0x87 }, + til::color{ 0x00, 0x87, 0xAF }, + til::color{ 0x00, 0x87, 0xD7 }, + til::color{ 0x00, 0x87, 0xFF }, + til::color{ 0x00, 0xAF, 0x00 }, + til::color{ 0x00, 0xAF, 0x5F }, + til::color{ 0x00, 0xAF, 0x87 }, + til::color{ 0x00, 0xAF, 0xAF }, + til::color{ 0x00, 0xAF, 0xD7 }, + til::color{ 0x00, 0xAF, 0xFF }, + til::color{ 0x00, 0xD7, 0x00 }, + til::color{ 0x00, 0xD7, 0x5F }, + til::color{ 0x00, 0xD7, 0x87 }, + til::color{ 0x00, 0xD7, 0xAF }, + til::color{ 0x00, 0xD7, 0xD7 }, + til::color{ 0x00, 0xD7, 0xFF }, + til::color{ 0x00, 0xFF, 0x00 }, + til::color{ 0x00, 0xFF, 0x5F }, + til::color{ 0x00, 0xFF, 0x87 }, + til::color{ 0x00, 0xFF, 0xAF }, + til::color{ 0x00, 0xFF, 0xD7 }, + til::color{ 0x00, 0xFF, 0xFF }, + til::color{ 0x5F, 0x00, 0x00 }, + til::color{ 0x5F, 0x00, 0x5F }, + til::color{ 0x5F, 0x00, 0x87 }, + til::color{ 0x5F, 0x00, 0xAF }, + til::color{ 0x5F, 0x00, 0xD7 }, + til::color{ 0x5F, 0x00, 0xFF }, + til::color{ 0x5F, 0x5F, 0x00 }, + til::color{ 0x5F, 0x5F, 0x5F }, + til::color{ 0x5F, 0x5F, 0x87 }, + til::color{ 0x5F, 0x5F, 0xAF }, + til::color{ 0x5F, 0x5F, 0xD7 }, + til::color{ 0x5F, 0x5F, 0xFF }, + til::color{ 0x5F, 0x87, 0x00 }, + til::color{ 0x5F, 0x87, 0x5F }, + til::color{ 0x5F, 0x87, 0x87 }, + til::color{ 0x5F, 0x87, 0xAF }, + til::color{ 0x5F, 0x87, 0xD7 }, + til::color{ 0x5F, 0x87, 0xFF }, + til::color{ 0x5F, 0xAF, 0x00 }, + til::color{ 0x5F, 0xAF, 0x5F }, + til::color{ 0x5F, 0xAF, 0x87 }, + til::color{ 0x5F, 0xAF, 0xAF }, + til::color{ 0x5F, 0xAF, 0xD7 }, + til::color{ 0x5F, 0xAF, 0xFF }, + til::color{ 0x5F, 0xD7, 0x00 }, + til::color{ 0x5F, 0xD7, 0x5F }, + til::color{ 0x5F, 0xD7, 0x87 }, + til::color{ 0x5F, 0xD7, 0xAF }, + til::color{ 0x5F, 0xD7, 0xD7 }, + til::color{ 0x5F, 0xD7, 0xFF }, + til::color{ 0x5F, 0xFF, 0x00 }, + til::color{ 0x5F, 0xFF, 0x5F }, + til::color{ 0x5F, 0xFF, 0x87 }, + til::color{ 0x5F, 0xFF, 0xAF }, + til::color{ 0x5F, 0xFF, 0xD7 }, + til::color{ 0x5F, 0xFF, 0xFF }, + til::color{ 0x87, 0x00, 0x00 }, + til::color{ 0x87, 0x00, 0x5F }, + til::color{ 0x87, 0x00, 0x87 }, + til::color{ 0x87, 0x00, 0xAF }, + til::color{ 0x87, 0x00, 0xD7 }, + til::color{ 0x87, 0x00, 0xFF }, + til::color{ 0x87, 0x5F, 0x00 }, + til::color{ 0x87, 0x5F, 0x5F }, + til::color{ 0x87, 0x5F, 0x87 }, + til::color{ 0x87, 0x5F, 0xAF }, + til::color{ 0x87, 0x5F, 0xD7 }, + til::color{ 0x87, 0x5F, 0xFF }, + til::color{ 0x87, 0x87, 0x00 }, + til::color{ 0x87, 0x87, 0x5F }, + til::color{ 0x87, 0x87, 0x87 }, + til::color{ 0x87, 0x87, 0xAF }, + til::color{ 0x87, 0x87, 0xD7 }, + til::color{ 0x87, 0x87, 0xFF }, + til::color{ 0x87, 0xAF, 0x00 }, + til::color{ 0x87, 0xAF, 0x5F }, + til::color{ 0x87, 0xAF, 0x87 }, + til::color{ 0x87, 0xAF, 0xAF }, + til::color{ 0x87, 0xAF, 0xD7 }, + til::color{ 0x87, 0xAF, 0xFF }, + til::color{ 0x87, 0xD7, 0x00 }, + til::color{ 0x87, 0xD7, 0x5F }, + til::color{ 0x87, 0xD7, 0x87 }, + til::color{ 0x87, 0xD7, 0xAF }, + til::color{ 0x87, 0xD7, 0xD7 }, + til::color{ 0x87, 0xD7, 0xFF }, + til::color{ 0x87, 0xFF, 0x00 }, + til::color{ 0x87, 0xFF, 0x5F }, + til::color{ 0x87, 0xFF, 0x87 }, + til::color{ 0x87, 0xFF, 0xAF }, + til::color{ 0x87, 0xFF, 0xD7 }, + til::color{ 0x87, 0xFF, 0xFF }, + til::color{ 0xAF, 0x00, 0x00 }, + til::color{ 0xAF, 0x00, 0x5F }, + til::color{ 0xAF, 0x00, 0x87 }, + til::color{ 0xAF, 0x00, 0xAF }, + til::color{ 0xAF, 0x00, 0xD7 }, + til::color{ 0xAF, 0x00, 0xFF }, + til::color{ 0xAF, 0x5F, 0x00 }, + til::color{ 0xAF, 0x5F, 0x5F }, + til::color{ 0xAF, 0x5F, 0x87 }, + til::color{ 0xAF, 0x5F, 0xAF }, + til::color{ 0xAF, 0x5F, 0xD7 }, + til::color{ 0xAF, 0x5F, 0xFF }, + til::color{ 0xAF, 0x87, 0x00 }, + til::color{ 0xAF, 0x87, 0x5F }, + til::color{ 0xAF, 0x87, 0x87 }, + til::color{ 0xAF, 0x87, 0xAF }, + til::color{ 0xAF, 0x87, 0xD7 }, + til::color{ 0xAF, 0x87, 0xFF }, + til::color{ 0xAF, 0xAF, 0x00 }, + til::color{ 0xAF, 0xAF, 0x5F }, + til::color{ 0xAF, 0xAF, 0x87 }, + til::color{ 0xAF, 0xAF, 0xAF }, + til::color{ 0xAF, 0xAF, 0xD7 }, + til::color{ 0xAF, 0xAF, 0xFF }, + til::color{ 0xAF, 0xD7, 0x00 }, + til::color{ 0xAF, 0xD7, 0x5F }, + til::color{ 0xAF, 0xD7, 0x87 }, + til::color{ 0xAF, 0xD7, 0xAF }, + til::color{ 0xAF, 0xD7, 0xD7 }, + til::color{ 0xAF, 0xD7, 0xFF }, + til::color{ 0xAF, 0xFF, 0x00 }, + til::color{ 0xAF, 0xFF, 0x5F }, + til::color{ 0xAF, 0xFF, 0x87 }, + til::color{ 0xAF, 0xFF, 0xAF }, + til::color{ 0xAF, 0xFF, 0xD7 }, + til::color{ 0xAF, 0xFF, 0xFF }, + til::color{ 0xD7, 0x00, 0x00 }, + til::color{ 0xD7, 0x00, 0x5F }, + til::color{ 0xD7, 0x00, 0x87 }, + til::color{ 0xD7, 0x00, 0xAF }, + til::color{ 0xD7, 0x00, 0xD7 }, + til::color{ 0xD7, 0x00, 0xFF }, + til::color{ 0xD7, 0x5F, 0x00 }, + til::color{ 0xD7, 0x5F, 0x5F }, + til::color{ 0xD7, 0x5F, 0x87 }, + til::color{ 0xD7, 0x5F, 0xAF }, + til::color{ 0xD7, 0x5F, 0xD7 }, + til::color{ 0xD7, 0x5F, 0xFF }, + til::color{ 0xD7, 0x87, 0x00 }, + til::color{ 0xD7, 0x87, 0x5F }, + til::color{ 0xD7, 0x87, 0x87 }, + til::color{ 0xD7, 0x87, 0xAF }, + til::color{ 0xD7, 0x87, 0xD7 }, + til::color{ 0xD7, 0x87, 0xFF }, + til::color{ 0xD7, 0xAF, 0x00 }, + til::color{ 0xD7, 0xAF, 0x5F }, + til::color{ 0xD7, 0xAF, 0x87 }, + til::color{ 0xD7, 0xAF, 0xAF }, + til::color{ 0xD7, 0xAF, 0xD7 }, + til::color{ 0xD7, 0xAF, 0xFF }, + til::color{ 0xD7, 0xD7, 0x00 }, + til::color{ 0xD7, 0xD7, 0x5F }, + til::color{ 0xD7, 0xD7, 0x87 }, + til::color{ 0xD7, 0xD7, 0xAF }, + til::color{ 0xD7, 0xD7, 0xD7 }, + til::color{ 0xD7, 0xD7, 0xFF }, + til::color{ 0xD7, 0xFF, 0x00 }, + til::color{ 0xD7, 0xFF, 0x5F }, + til::color{ 0xD7, 0xFF, 0x87 }, + til::color{ 0xD7, 0xFF, 0xAF }, + til::color{ 0xD7, 0xFF, 0xD7 }, + til::color{ 0xD7, 0xFF, 0xFF }, + til::color{ 0xFF, 0x00, 0x00 }, + til::color{ 0xFF, 0x00, 0x5F }, + til::color{ 0xFF, 0x00, 0x87 }, + til::color{ 0xFF, 0x00, 0xAF }, + til::color{ 0xFF, 0x00, 0xD7 }, + til::color{ 0xFF, 0x00, 0xFF }, + til::color{ 0xFF, 0x5F, 0x00 }, + til::color{ 0xFF, 0x5F, 0x5F }, + til::color{ 0xFF, 0x5F, 0x87 }, + til::color{ 0xFF, 0x5F, 0xAF }, + til::color{ 0xFF, 0x5F, 0xD7 }, + til::color{ 0xFF, 0x5F, 0xFF }, + til::color{ 0xFF, 0x87, 0x00 }, + til::color{ 0xFF, 0x87, 0x5F }, + til::color{ 0xFF, 0x87, 0x87 }, + til::color{ 0xFF, 0x87, 0xAF }, + til::color{ 0xFF, 0x87, 0xD7 }, + til::color{ 0xFF, 0x87, 0xFF }, + til::color{ 0xFF, 0xAF, 0x00 }, + til::color{ 0xFF, 0xAF, 0x5F }, + til::color{ 0xFF, 0xAF, 0x87 }, + til::color{ 0xFF, 0xAF, 0xAF }, + til::color{ 0xFF, 0xAF, 0xD7 }, + til::color{ 0xFF, 0xAF, 0xFF }, + til::color{ 0xFF, 0xD7, 0x00 }, + til::color{ 0xFF, 0xD7, 0x5F }, + til::color{ 0xFF, 0xD7, 0x87 }, + til::color{ 0xFF, 0xD7, 0xAF }, + til::color{ 0xFF, 0xD7, 0xD7 }, + til::color{ 0xFF, 0xD7, 0xFF }, + til::color{ 0xFF, 0xFF, 0x00 }, + til::color{ 0xFF, 0xFF, 0x5F }, + til::color{ 0xFF, 0xFF, 0x87 }, + til::color{ 0xFF, 0xFF, 0xAF }, + til::color{ 0xFF, 0xFF, 0xD7 }, + til::color{ 0xFF, 0xFF, 0xFF }, + til::color{ 0x08, 0x08, 0x08 }, + til::color{ 0x12, 0x12, 0x12 }, + til::color{ 0x1C, 0x1C, 0x1C }, + til::color{ 0x26, 0x26, 0x26 }, + til::color{ 0x30, 0x30, 0x30 }, + til::color{ 0x3A, 0x3A, 0x3A }, + til::color{ 0x44, 0x44, 0x44 }, + til::color{ 0x4E, 0x4E, 0x4E }, + til::color{ 0x58, 0x58, 0x58 }, + til::color{ 0x62, 0x62, 0x62 }, + til::color{ 0x6C, 0x6C, 0x6C }, + til::color{ 0x76, 0x76, 0x76 }, + til::color{ 0x80, 0x80, 0x80 }, + til::color{ 0x8A, 0x8A, 0x8A }, + til::color{ 0x94, 0x94, 0x94 }, + til::color{ 0x9E, 0x9E, 0x9E }, + til::color{ 0xA8, 0xA8, 0xA8 }, + til::color{ 0xB2, 0xB2, 0xB2 }, + til::color{ 0xBC, 0xBC, 0xBC }, + til::color{ 0xC6, 0xC6, 0xC6 }, + til::color{ 0xD0, 0xD0, 0xD0 }, + til::color{ 0xDA, 0xDA, 0xDA }, + til::color{ 0xE4, 0xE4, 0xE4 }, + til::color{ 0xEE, 0xEE, 0xEE }, +}; + // Function Description: // - Creates a String representation of a guid, in the format // "{12345678-ABCD-EF12-3456-7890ABCDEF12}" @@ -121,24 +399,7 @@ void Utils::InitializeCampbellColorTable(const gsl::span table) { THROW_HR_IF(E_INVALIDARG, table.size() < 16); - // clang-format off - gsl::at(table, 0) = RGB(12, 12, 12); - gsl::at(table, 1) = RGB(197, 15, 31); - gsl::at(table, 2) = RGB(19, 161, 14); - gsl::at(table, 3) = RGB(193, 156, 0); - gsl::at(table, 4) = RGB(0, 55, 218); - gsl::at(table, 5) = RGB(136, 23, 152); - gsl::at(table, 6) = RGB(58, 150, 221); - gsl::at(table, 7) = RGB(204, 204, 204); - gsl::at(table, 8) = RGB(118, 118, 118); - gsl::at(table, 9) = RGB(231, 72, 86); - gsl::at(table, 10) = RGB(22, 198, 12); - gsl::at(table, 11) = RGB(249, 241, 165); - gsl::at(table, 12) = RGB(59, 120, 255); - gsl::at(table, 13) = RGB(180, 0, 158); - gsl::at(table, 14) = RGB(97, 214, 214); - gsl::at(table, 15) = RGB(242, 242, 242); - // clang-format on + std::copy(campbellColorTable.begin(), campbellColorTable.end(), table.begin()); } // Function Description: @@ -181,264 +442,7 @@ void Utils::Initialize256ColorTable(const gsl::span table) { THROW_HR_IF(E_INVALIDARG, table.size() < 256); - // clang-format off - gsl::at(table, 0) = RGB(0x00, 0x00, 0x00); - gsl::at(table, 1) = RGB(0x80, 0x00, 0x00); - gsl::at(table, 2) = RGB(0x00, 0x80, 0x00); - gsl::at(table, 3) = RGB(0x80, 0x80, 0x00); - gsl::at(table, 4) = RGB(0x00, 0x00, 0x80); - gsl::at(table, 5) = RGB(0x80, 0x00, 0x80); - gsl::at(table, 6) = RGB(0x00, 0x80, 0x80); - gsl::at(table, 7) = RGB(0xc0, 0xc0, 0xc0); - gsl::at(table, 8) = RGB(0x80, 0x80, 0x80); - gsl::at(table, 9) = RGB(0xff, 0x00, 0x00); - gsl::at(table, 10) = RGB(0x00, 0xff, 0x00); - gsl::at(table, 11) = RGB(0xff, 0xff, 0x00); - gsl::at(table, 12) = RGB(0x00, 0x00, 0xff); - gsl::at(table, 13) = RGB(0xff, 0x00, 0xff); - gsl::at(table, 14) = RGB(0x00, 0xff, 0xff); - gsl::at(table, 15) = RGB(0xff, 0xff, 0xff); - gsl::at(table, 16) = RGB(0x00, 0x00, 0x00); - gsl::at(table, 17) = RGB(0x00, 0x00, 0x5f); - gsl::at(table, 18) = RGB(0x00, 0x00, 0x87); - gsl::at(table, 19) = RGB(0x00, 0x00, 0xaf); - gsl::at(table, 20) = RGB(0x00, 0x00, 0xd7); - gsl::at(table, 21) = RGB(0x00, 0x00, 0xff); - gsl::at(table, 22) = RGB(0x00, 0x5f, 0x00); - gsl::at(table, 23) = RGB(0x00, 0x5f, 0x5f); - gsl::at(table, 24) = RGB(0x00, 0x5f, 0x87); - gsl::at(table, 25) = RGB(0x00, 0x5f, 0xaf); - gsl::at(table, 26) = RGB(0x00, 0x5f, 0xd7); - gsl::at(table, 27) = RGB(0x00, 0x5f, 0xff); - gsl::at(table, 28) = RGB(0x00, 0x87, 0x00); - gsl::at(table, 29) = RGB(0x00, 0x87, 0x5f); - gsl::at(table, 30) = RGB(0x00, 0x87, 0x87); - gsl::at(table, 31) = RGB(0x00, 0x87, 0xaf); - gsl::at(table, 32) = RGB(0x00, 0x87, 0xd7); - gsl::at(table, 33) = RGB(0x00, 0x87, 0xff); - gsl::at(table, 34) = RGB(0x00, 0xaf, 0x00); - gsl::at(table, 35) = RGB(0x00, 0xaf, 0x5f); - gsl::at(table, 36) = RGB(0x00, 0xaf, 0x87); - gsl::at(table, 37) = RGB(0x00, 0xaf, 0xaf); - gsl::at(table, 38) = RGB(0x00, 0xaf, 0xd7); - gsl::at(table, 39) = RGB(0x00, 0xaf, 0xff); - gsl::at(table, 40) = RGB(0x00, 0xd7, 0x00); - gsl::at(table, 41) = RGB(0x00, 0xd7, 0x5f); - gsl::at(table, 42) = RGB(0x00, 0xd7, 0x87); - gsl::at(table, 43) = RGB(0x00, 0xd7, 0xaf); - gsl::at(table, 44) = RGB(0x00, 0xd7, 0xd7); - gsl::at(table, 45) = RGB(0x00, 0xd7, 0xff); - gsl::at(table, 46) = RGB(0x00, 0xff, 0x00); - gsl::at(table, 47) = RGB(0x00, 0xff, 0x5f); - gsl::at(table, 48) = RGB(0x00, 0xff, 0x87); - gsl::at(table, 49) = RGB(0x00, 0xff, 0xaf); - gsl::at(table, 50) = RGB(0x00, 0xff, 0xd7); - gsl::at(table, 51) = RGB(0x00, 0xff, 0xff); - gsl::at(table, 52) = RGB(0x5f, 0x00, 0x00); - gsl::at(table, 53) = RGB(0x5f, 0x00, 0x5f); - gsl::at(table, 54) = RGB(0x5f, 0x00, 0x87); - gsl::at(table, 55) = RGB(0x5f, 0x00, 0xaf); - gsl::at(table, 56) = RGB(0x5f, 0x00, 0xd7); - gsl::at(table, 57) = RGB(0x5f, 0x00, 0xff); - gsl::at(table, 58) = RGB(0x5f, 0x5f, 0x00); - gsl::at(table, 59) = RGB(0x5f, 0x5f, 0x5f); - gsl::at(table, 60) = RGB(0x5f, 0x5f, 0x87); - gsl::at(table, 61) = RGB(0x5f, 0x5f, 0xaf); - gsl::at(table, 62) = RGB(0x5f, 0x5f, 0xd7); - gsl::at(table, 63) = RGB(0x5f, 0x5f, 0xff); - gsl::at(table, 64) = RGB(0x5f, 0x87, 0x00); - gsl::at(table, 65) = RGB(0x5f, 0x87, 0x5f); - gsl::at(table, 66) = RGB(0x5f, 0x87, 0x87); - gsl::at(table, 67) = RGB(0x5f, 0x87, 0xaf); - gsl::at(table, 68) = RGB(0x5f, 0x87, 0xd7); - gsl::at(table, 69) = RGB(0x5f, 0x87, 0xff); - gsl::at(table, 70) = RGB(0x5f, 0xaf, 0x00); - gsl::at(table, 71) = RGB(0x5f, 0xaf, 0x5f); - gsl::at(table, 72) = RGB(0x5f, 0xaf, 0x87); - gsl::at(table, 73) = RGB(0x5f, 0xaf, 0xaf); - gsl::at(table, 74) = RGB(0x5f, 0xaf, 0xd7); - gsl::at(table, 75) = RGB(0x5f, 0xaf, 0xff); - gsl::at(table, 76) = RGB(0x5f, 0xd7, 0x00); - gsl::at(table, 77) = RGB(0x5f, 0xd7, 0x5f); - gsl::at(table, 78) = RGB(0x5f, 0xd7, 0x87); - gsl::at(table, 79) = RGB(0x5f, 0xd7, 0xaf); - gsl::at(table, 80) = RGB(0x5f, 0xd7, 0xd7); - gsl::at(table, 81) = RGB(0x5f, 0xd7, 0xff); - gsl::at(table, 82) = RGB(0x5f, 0xff, 0x00); - gsl::at(table, 83) = RGB(0x5f, 0xff, 0x5f); - gsl::at(table, 84) = RGB(0x5f, 0xff, 0x87); - gsl::at(table, 85) = RGB(0x5f, 0xff, 0xaf); - gsl::at(table, 86) = RGB(0x5f, 0xff, 0xd7); - gsl::at(table, 87) = RGB(0x5f, 0xff, 0xff); - gsl::at(table, 88) = RGB(0x87, 0x00, 0x00); - gsl::at(table, 89) = RGB(0x87, 0x00, 0x5f); - gsl::at(table, 90) = RGB(0x87, 0x00, 0x87); - gsl::at(table, 91) = RGB(0x87, 0x00, 0xaf); - gsl::at(table, 92) = RGB(0x87, 0x00, 0xd7); - gsl::at(table, 93) = RGB(0x87, 0x00, 0xff); - gsl::at(table, 94) = RGB(0x87, 0x5f, 0x00); - gsl::at(table, 95) = RGB(0x87, 0x5f, 0x5f); - gsl::at(table, 96) = RGB(0x87, 0x5f, 0x87); - gsl::at(table, 97) = RGB(0x87, 0x5f, 0xaf); - gsl::at(table, 98) = RGB(0x87, 0x5f, 0xd7); - gsl::at(table, 99) = RGB(0x87, 0x5f, 0xff); - gsl::at(table, 100) = RGB(0x87, 0x87, 0x00); - gsl::at(table, 101) = RGB(0x87, 0x87, 0x5f); - gsl::at(table, 102) = RGB(0x87, 0x87, 0x87); - gsl::at(table, 103) = RGB(0x87, 0x87, 0xaf); - gsl::at(table, 104) = RGB(0x87, 0x87, 0xd7); - gsl::at(table, 105) = RGB(0x87, 0x87, 0xff); - gsl::at(table, 106) = RGB(0x87, 0xaf, 0x00); - gsl::at(table, 107) = RGB(0x87, 0xaf, 0x5f); - gsl::at(table, 108) = RGB(0x87, 0xaf, 0x87); - gsl::at(table, 109) = RGB(0x87, 0xaf, 0xaf); - gsl::at(table, 110) = RGB(0x87, 0xaf, 0xd7); - gsl::at(table, 111) = RGB(0x87, 0xaf, 0xff); - gsl::at(table, 112) = RGB(0x87, 0xd7, 0x00); - gsl::at(table, 113) = RGB(0x87, 0xd7, 0x5f); - gsl::at(table, 114) = RGB(0x87, 0xd7, 0x87); - gsl::at(table, 115) = RGB(0x87, 0xd7, 0xaf); - gsl::at(table, 116) = RGB(0x87, 0xd7, 0xd7); - gsl::at(table, 117) = RGB(0x87, 0xd7, 0xff); - gsl::at(table, 118) = RGB(0x87, 0xff, 0x00); - gsl::at(table, 119) = RGB(0x87, 0xff, 0x5f); - gsl::at(table, 120) = RGB(0x87, 0xff, 0x87); - gsl::at(table, 121) = RGB(0x87, 0xff, 0xaf); - gsl::at(table, 122) = RGB(0x87, 0xff, 0xd7); - gsl::at(table, 123) = RGB(0x87, 0xff, 0xff); - gsl::at(table, 124) = RGB(0xaf, 0x00, 0x00); - gsl::at(table, 125) = RGB(0xaf, 0x00, 0x5f); - gsl::at(table, 126) = RGB(0xaf, 0x00, 0x87); - gsl::at(table, 127) = RGB(0xaf, 0x00, 0xaf); - gsl::at(table, 128) = RGB(0xaf, 0x00, 0xd7); - gsl::at(table, 129) = RGB(0xaf, 0x00, 0xff); - gsl::at(table, 130) = RGB(0xaf, 0x5f, 0x00); - gsl::at(table, 131) = RGB(0xaf, 0x5f, 0x5f); - gsl::at(table, 132) = RGB(0xaf, 0x5f, 0x87); - gsl::at(table, 133) = RGB(0xaf, 0x5f, 0xaf); - gsl::at(table, 134) = RGB(0xaf, 0x5f, 0xd7); - gsl::at(table, 135) = RGB(0xaf, 0x5f, 0xff); - gsl::at(table, 136) = RGB(0xaf, 0x87, 0x00); - gsl::at(table, 137) = RGB(0xaf, 0x87, 0x5f); - gsl::at(table, 138) = RGB(0xaf, 0x87, 0x87); - gsl::at(table, 139) = RGB(0xaf, 0x87, 0xaf); - gsl::at(table, 140) = RGB(0xaf, 0x87, 0xd7); - gsl::at(table, 141) = RGB(0xaf, 0x87, 0xff); - gsl::at(table, 142) = RGB(0xaf, 0xaf, 0x00); - gsl::at(table, 143) = RGB(0xaf, 0xaf, 0x5f); - gsl::at(table, 144) = RGB(0xaf, 0xaf, 0x87); - gsl::at(table, 145) = RGB(0xaf, 0xaf, 0xaf); - gsl::at(table, 146) = RGB(0xaf, 0xaf, 0xd7); - gsl::at(table, 147) = RGB(0xaf, 0xaf, 0xff); - gsl::at(table, 148) = RGB(0xaf, 0xd7, 0x00); - gsl::at(table, 149) = RGB(0xaf, 0xd7, 0x5f); - gsl::at(table, 150) = RGB(0xaf, 0xd7, 0x87); - gsl::at(table, 151) = RGB(0xaf, 0xd7, 0xaf); - gsl::at(table, 152) = RGB(0xaf, 0xd7, 0xd7); - gsl::at(table, 153) = RGB(0xaf, 0xd7, 0xff); - gsl::at(table, 154) = RGB(0xaf, 0xff, 0x00); - gsl::at(table, 155) = RGB(0xaf, 0xff, 0x5f); - gsl::at(table, 156) = RGB(0xaf, 0xff, 0x87); - gsl::at(table, 157) = RGB(0xaf, 0xff, 0xaf); - gsl::at(table, 158) = RGB(0xaf, 0xff, 0xd7); - gsl::at(table, 159) = RGB(0xaf, 0xff, 0xff); - gsl::at(table, 160) = RGB(0xd7, 0x00, 0x00); - gsl::at(table, 161) = RGB(0xd7, 0x00, 0x5f); - gsl::at(table, 162) = RGB(0xd7, 0x00, 0x87); - gsl::at(table, 163) = RGB(0xd7, 0x00, 0xaf); - gsl::at(table, 164) = RGB(0xd7, 0x00, 0xd7); - gsl::at(table, 165) = RGB(0xd7, 0x00, 0xff); - gsl::at(table, 166) = RGB(0xd7, 0x5f, 0x00); - gsl::at(table, 167) = RGB(0xd7, 0x5f, 0x5f); - gsl::at(table, 168) = RGB(0xd7, 0x5f, 0x87); - gsl::at(table, 169) = RGB(0xd7, 0x5f, 0xaf); - gsl::at(table, 170) = RGB(0xd7, 0x5f, 0xd7); - gsl::at(table, 171) = RGB(0xd7, 0x5f, 0xff); - gsl::at(table, 172) = RGB(0xd7, 0x87, 0x00); - gsl::at(table, 173) = RGB(0xd7, 0x87, 0x5f); - gsl::at(table, 174) = RGB(0xd7, 0x87, 0x87); - gsl::at(table, 175) = RGB(0xd7, 0x87, 0xaf); - gsl::at(table, 176) = RGB(0xd7, 0x87, 0xd7); - gsl::at(table, 177) = RGB(0xd7, 0x87, 0xff); - gsl::at(table, 178) = RGB(0xd7, 0xaf, 0x00); - gsl::at(table, 179) = RGB(0xd7, 0xaf, 0x5f); - gsl::at(table, 180) = RGB(0xd7, 0xaf, 0x87); - gsl::at(table, 181) = RGB(0xd7, 0xaf, 0xaf); - gsl::at(table, 182) = RGB(0xd7, 0xaf, 0xd7); - gsl::at(table, 183) = RGB(0xd7, 0xaf, 0xff); - gsl::at(table, 184) = RGB(0xd7, 0xd7, 0x00); - gsl::at(table, 185) = RGB(0xd7, 0xd7, 0x5f); - gsl::at(table, 186) = RGB(0xd7, 0xd7, 0x87); - gsl::at(table, 187) = RGB(0xd7, 0xd7, 0xaf); - gsl::at(table, 188) = RGB(0xd7, 0xd7, 0xd7); - gsl::at(table, 189) = RGB(0xd7, 0xd7, 0xff); - gsl::at(table, 190) = RGB(0xd7, 0xff, 0x00); - gsl::at(table, 191) = RGB(0xd7, 0xff, 0x5f); - gsl::at(table, 192) = RGB(0xd7, 0xff, 0x87); - gsl::at(table, 193) = RGB(0xd7, 0xff, 0xaf); - gsl::at(table, 194) = RGB(0xd7, 0xff, 0xd7); - gsl::at(table, 195) = RGB(0xd7, 0xff, 0xff); - gsl::at(table, 196) = RGB(0xff, 0x00, 0x00); - gsl::at(table, 197) = RGB(0xff, 0x00, 0x5f); - gsl::at(table, 198) = RGB(0xff, 0x00, 0x87); - gsl::at(table, 199) = RGB(0xff, 0x00, 0xaf); - gsl::at(table, 200) = RGB(0xff, 0x00, 0xd7); - gsl::at(table, 201) = RGB(0xff, 0x00, 0xff); - gsl::at(table, 202) = RGB(0xff, 0x5f, 0x00); - gsl::at(table, 203) = RGB(0xff, 0x5f, 0x5f); - gsl::at(table, 204) = RGB(0xff, 0x5f, 0x87); - gsl::at(table, 205) = RGB(0xff, 0x5f, 0xaf); - gsl::at(table, 206) = RGB(0xff, 0x5f, 0xd7); - gsl::at(table, 207) = RGB(0xff, 0x5f, 0xff); - gsl::at(table, 208) = RGB(0xff, 0x87, 0x00); - gsl::at(table, 209) = RGB(0xff, 0x87, 0x5f); - gsl::at(table, 210) = RGB(0xff, 0x87, 0x87); - gsl::at(table, 211) = RGB(0xff, 0x87, 0xaf); - gsl::at(table, 212) = RGB(0xff, 0x87, 0xd7); - gsl::at(table, 213) = RGB(0xff, 0x87, 0xff); - gsl::at(table, 214) = RGB(0xff, 0xaf, 0x00); - gsl::at(table, 215) = RGB(0xff, 0xaf, 0x5f); - gsl::at(table, 216) = RGB(0xff, 0xaf, 0x87); - gsl::at(table, 217) = RGB(0xff, 0xaf, 0xaf); - gsl::at(table, 218) = RGB(0xff, 0xaf, 0xd7); - gsl::at(table, 219) = RGB(0xff, 0xaf, 0xff); - gsl::at(table, 220) = RGB(0xff, 0xd7, 0x00); - gsl::at(table, 221) = RGB(0xff, 0xd7, 0x5f); - gsl::at(table, 222) = RGB(0xff, 0xd7, 0x87); - gsl::at(table, 223) = RGB(0xff, 0xd7, 0xaf); - gsl::at(table, 224) = RGB(0xff, 0xd7, 0xd7); - gsl::at(table, 225) = RGB(0xff, 0xd7, 0xff); - gsl::at(table, 226) = RGB(0xff, 0xff, 0x00); - gsl::at(table, 227) = RGB(0xff, 0xff, 0x5f); - gsl::at(table, 228) = RGB(0xff, 0xff, 0x87); - gsl::at(table, 229) = RGB(0xff, 0xff, 0xaf); - gsl::at(table, 230) = RGB(0xff, 0xff, 0xd7); - gsl::at(table, 231) = RGB(0xff, 0xff, 0xff); - gsl::at(table, 232) = RGB(0x08, 0x08, 0x08); - gsl::at(table, 233) = RGB(0x12, 0x12, 0x12); - gsl::at(table, 234) = RGB(0x1c, 0x1c, 0x1c); - gsl::at(table, 235) = RGB(0x26, 0x26, 0x26); - gsl::at(table, 236) = RGB(0x30, 0x30, 0x30); - gsl::at(table, 237) = RGB(0x3a, 0x3a, 0x3a); - gsl::at(table, 238) = RGB(0x44, 0x44, 0x44); - gsl::at(table, 239) = RGB(0x4e, 0x4e, 0x4e); - gsl::at(table, 240) = RGB(0x58, 0x58, 0x58); - gsl::at(table, 241) = RGB(0x62, 0x62, 0x62); - gsl::at(table, 242) = RGB(0x6c, 0x6c, 0x6c); - gsl::at(table, 243) = RGB(0x76, 0x76, 0x76); - gsl::at(table, 244) = RGB(0x80, 0x80, 0x80); - gsl::at(table, 245) = RGB(0x8a, 0x8a, 0x8a); - gsl::at(table, 246) = RGB(0x94, 0x94, 0x94); - gsl::at(table, 247) = RGB(0x9e, 0x9e, 0x9e); - gsl::at(table, 248) = RGB(0xa8, 0xa8, 0xa8); - gsl::at(table, 249) = RGB(0xb2, 0xb2, 0xb2); - gsl::at(table, 250) = RGB(0xbc, 0xbc, 0xbc); - gsl::at(table, 251) = RGB(0xc6, 0xc6, 0xc6); - gsl::at(table, 252) = RGB(0xd0, 0xd0, 0xd0); - gsl::at(table, 253) = RGB(0xda, 0xda, 0xda); - gsl::at(table, 254) = RGB(0xe4, 0xe4, 0xe4); - gsl::at(table, 255) = RGB(0xee, 0xee, 0xee); - // clang-format on + std::copy(standardXterm256ColorTable.begin(), standardXterm256ColorTable.end(), table.begin()); } // Function Description: From 80da24ecf8c5a6137b1dd9fbc362be0c7ed77880 Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Wed, 15 Jul 2020 09:40:42 -0700 Subject: [PATCH 04/14] Replace basic_string_view with span (#6921) We were using std::basic_string_view as a stand-in for std::span so that we could change over all at once when C++20 dropped with full span support. That day's not here yet, but as of 54a7fce3e we're using GSL 3, whose span is C++20-compliant. This commit replaces every instance of basic_string_view that was not referring to an actual string with a span of the appropriate type. I moved the `const` qualifier into span's `T` because while `basic_string_view.at()` returns `const T&`, `span.at()` returns `T&` (without the const). I wanted to maintain the invariant that members of the span were immutable. * Mechanical Changes * `sv.at(x)` -> `gsl::at(sp, x)` * `sv.c{begin,end}` -> `sp.{begin,end}` (span's iterators are const) I had to replace a `std::basic_string<>` with a `std::vector<>` in ConImeInfo, and I chose to replace a manual array walk in ScreenInfoUiaProviderBase with a ranged-for. Please review those specifically. This will almost certainly cause a code size regression in Windows because I'm blowing out all the PGO counts. Whoops. Related: #3956, #975. --- src/buffer/out/AttrRow.cpp | 6 +- src/buffer/out/AttrRow.hpp | 2 +- src/buffer/out/OutputCellIterator.cpp | 24 +++---- src/buffer/out/OutputCellIterator.hpp | 14 ++--- src/buffer/out/OutputCellRect.cpp | 2 +- src/buffer/out/TextAttribute.cpp | 2 +- src/buffer/out/TextAttribute.hpp | 2 +- src/buffer/out/TextColor.cpp | 10 +-- src/buffer/out/TextColor.h | 2 +- .../out/ut_textbuffer/TextAttributeTests.cpp | 6 +- .../out/ut_textbuffer/TextColorTests.cpp | 6 +- src/cascadia/TerminalApp/CascadiaSettings.cpp | 2 +- src/cascadia/TerminalApp/CascadiaSettings.h | 2 +- .../TerminalCore/TerminalDispatch.cpp | 6 +- .../TerminalCore/TerminalDispatch.hpp | 10 +-- .../TerminalCore/TerminalDispatchGraphics.cpp | 8 +-- src/host/ApiRoutines.h | 6 +- src/host/_output.cpp | 2 +- src/host/conareainfo.cpp | 2 +- src/host/conimeinfo.cpp | 20 +++--- src/host/conimeinfo.h | 20 +++--- src/host/convarea.cpp | 4 +- src/host/directio.cpp | 6 +- src/host/settings.cpp | 6 +- src/host/settings.hpp | 4 +- src/host/ut_host/OutputCellIteratorTests.cpp | 6 +- src/inc/conime.h | 4 +- src/interactivity/onecore/BgfxEngine.cpp | 2 +- src/interactivity/onecore/BgfxEngine.hpp | 2 +- src/renderer/dx/CustomTextLayout.cpp | 2 +- src/renderer/dx/CustomTextLayout.h | 2 +- src/renderer/dx/DxRenderer.cpp | 2 +- src/renderer/dx/DxRenderer.hpp | 2 +- src/renderer/gdi/gdirenderer.hpp | 2 +- src/renderer/gdi/paint.cpp | 4 +- src/renderer/inc/IRenderEngine.hpp | 2 +- src/renderer/uia/UiaRenderer.cpp | 2 +- src/renderer/uia/UiaRenderer.hpp | 2 +- src/renderer/vt/XtermEngine.cpp | 2 +- src/renderer/vt/XtermEngine.hpp | 2 +- src/renderer/vt/paint.cpp | 6 +- src/renderer/vt/vtrenderer.hpp | 6 +- src/renderer/wddmcon/WddmConRenderer.cpp | 2 +- src/renderer/wddmcon/WddmConRenderer.hpp | 2 +- src/server/ApiDispatchers.cpp | 4 +- src/server/IApiRoutines.h | 6 +- src/terminal/adapter/IInteractDispatch.hpp | 2 +- src/terminal/adapter/ITermDispatch.hpp | 8 +-- src/terminal/adapter/InteractDispatch.cpp | 2 +- src/terminal/adapter/InteractDispatch.hpp | 2 +- src/terminal/adapter/adaptDispatch.cpp | 8 +-- src/terminal/adapter/adaptDispatch.hpp | 12 ++-- .../adapter/adaptDispatchGraphics.cpp | 8 +-- src/terminal/adapter/termDispatch.hpp | 8 +-- src/terminal/input/terminalInput.cpp | 12 ++-- src/terminal/parser/IStateMachineEngine.hpp | 12 ++-- .../parser/InputStateMachineEngine.cpp | 50 +++++++-------- .../parser/InputStateMachineEngine.hpp | 30 ++++----- .../parser/OutputStateMachineEngine.cpp | 62 +++++++++---------- .../parser/OutputStateMachineEngine.hpp | 52 ++++++++-------- .../parser/ut_parser/InputEngineTest.cpp | 6 +- .../parser/ut_parser/OutputEngineTest.cpp | 18 +++--- .../parser/ut_parser/StateMachineTest.cpp | 14 ++--- src/tsf/TfConvArea.cpp | 4 +- src/types/ScreenInfoUiaProviderBase.cpp | 12 ++-- 65 files changed, 280 insertions(+), 280 deletions(-) diff --git a/src/buffer/out/AttrRow.cpp b/src/buffer/out/AttrRow.cpp index 42f1790b261..548999bccc7 100644 --- a/src/buffer/out/AttrRow.cpp +++ b/src/buffer/out/AttrRow.cpp @@ -223,7 +223,7 @@ void ATTR_ROW::ReplaceAttrs(const TextAttribute& toBeReplacedAttr, const TextAtt // Return Value: // - STATUS_NO_MEMORY if there wasn't enough memory to insert the runs // otherwise STATUS_SUCCESS if we were successful. -[[nodiscard]] HRESULT ATTR_ROW::InsertAttrRuns(const std::basic_string_view newAttrs, +[[nodiscard]] HRESULT ATTR_ROW::InsertAttrRuns(const gsl::span newAttrs, const size_t iStart, const size_t iEnd, const size_t cBufferWidth) @@ -250,7 +250,7 @@ void ATTR_ROW::ReplaceAttrs(const TextAttribute& toBeReplacedAttr, const TextAtt if (newAttrs.size() == 1) { // Get the new color attribute we're trying to apply - const TextAttribute NewAttr = newAttrs.at(0).GetAttributes(); + const TextAttribute NewAttr = gsl::at(newAttrs, 0).GetAttributes(); // If the existing run was only 1 element... // ...and the new color is the same as the old, we don't have to do anything and can exit quick. @@ -372,7 +372,7 @@ void ATTR_ROW::ReplaceAttrs(const TextAttribute& toBeReplacedAttr, const TextAtt if (iStart == 0 && iEnd == iLastBufferCol) { // Just dump what we're given over what we have and call it a day. - _list.assign(newAttrs.cbegin(), newAttrs.cend()); + _list.assign(newAttrs.begin(), newAttrs.end()); return S_OK; } diff --git a/src/buffer/out/AttrRow.hpp b/src/buffer/out/AttrRow.hpp index 29f0ee1e470..2f0a07794c3 100644 --- a/src/buffer/out/AttrRow.hpp +++ b/src/buffer/out/AttrRow.hpp @@ -46,7 +46,7 @@ class ATTR_ROW final void Resize(const size_t newWidth); - [[nodiscard]] HRESULT InsertAttrRuns(const std::basic_string_view newAttrs, + [[nodiscard]] HRESULT InsertAttrRuns(const gsl::span newAttrs, const size_t iStart, const size_t iEnd, const size_t cBufferWidth); diff --git a/src/buffer/out/OutputCellIterator.cpp b/src/buffer/out/OutputCellIterator.cpp index 9b5437041b5..9dc5b14574c 100644 --- a/src/buffer/out/OutputCellIterator.cpp +++ b/src/buffer/out/OutputCellIterator.cpp @@ -112,9 +112,9 @@ OutputCellIterator::OutputCellIterator(const std::wstring_view utf16Text, const // - This is an iterator over legacy colors only. The text is not modified. // Arguments: // - legacyAttrs - One legacy color item per cell -OutputCellIterator::OutputCellIterator(const std::basic_string_view legacyAttrs) noexcept : +OutputCellIterator::OutputCellIterator(const gsl::span legacyAttrs) noexcept : _mode(Mode::LegacyAttr), - _currentView(s_GenerateViewLegacyAttr(legacyAttrs.at(0))), + _currentView(s_GenerateViewLegacyAttr(gsl::at(legacyAttrs, 0))), _run(legacyAttrs), _attr(InvalidTextAttribute), _distance(0), @@ -127,9 +127,9 @@ OutputCellIterator::OutputCellIterator(const std::basic_string_view legacy // - This is an iterator over legacy cell data. We will use the unicode text and the legacy color attribute. // Arguments: // - charInfos - Multiple cell with unicode text and legacy color data. -OutputCellIterator::OutputCellIterator(const std::basic_string_view charInfos) noexcept : +OutputCellIterator::OutputCellIterator(const gsl::span charInfos) noexcept : _mode(Mode::CharInfo), - _currentView(s_GenerateView(charInfos.at(0))), + _currentView(s_GenerateView(gsl::at(charInfos, 0))), _run(charInfos), _attr(InvalidTextAttribute), _distance(0), @@ -142,9 +142,9 @@ OutputCellIterator::OutputCellIterator(const std::basic_string_view c // - This is an iterator over existing OutputCells with full text and color data. // Arguments: // - cells - Multiple cells in a run -OutputCellIterator::OutputCellIterator(const std::basic_string_view cells) : +OutputCellIterator::OutputCellIterator(const gsl::span cells) : _mode(Mode::Cell), - _currentView(s_GenerateView(cells.at(0))), + _currentView(s_GenerateView(gsl::at(cells, 0))), _run(cells), _attr(InvalidTextAttribute), _distance(0), @@ -180,15 +180,15 @@ OutputCellIterator::operator bool() const noexcept } case Mode::Cell: { - return _pos < std::get>(_run).length(); + return _pos < std::get>(_run).size(); } case Mode::CharInfo: { - return _pos < std::get>(_run).length(); + return _pos < std::get>(_run).size(); } case Mode::LegacyAttr: { - return _pos < std::get>(_run).length(); + return _pos < std::get>(_run).size(); } default: FAIL_FAST_HR(E_NOTIMPL); @@ -265,7 +265,7 @@ OutputCellIterator& OutputCellIterator::operator++() _pos++; if (operator bool()) { - _currentView = s_GenerateView(std::get>(_run).at(_pos)); + _currentView = s_GenerateView(gsl::at(std::get>(_run), _pos)); } break; } @@ -275,7 +275,7 @@ OutputCellIterator& OutputCellIterator::operator++() _pos++; if (operator bool()) { - _currentView = s_GenerateView(std::get>(_run).at(_pos)); + _currentView = s_GenerateView(gsl::at(std::get>(_run), _pos)); } break; } @@ -285,7 +285,7 @@ OutputCellIterator& OutputCellIterator::operator++() _pos++; if (operator bool()) { - _currentView = s_GenerateViewLegacyAttr(std::get>(_run).at(_pos)); + _currentView = s_GenerateViewLegacyAttr(gsl::at(std::get>(_run), _pos)); } break; } diff --git a/src/buffer/out/OutputCellIterator.hpp b/src/buffer/out/OutputCellIterator.hpp index 0d4b866e7c5..59c6007aa3a 100644 --- a/src/buffer/out/OutputCellIterator.hpp +++ b/src/buffer/out/OutputCellIterator.hpp @@ -39,9 +39,9 @@ class OutputCellIterator final OutputCellIterator(const CHAR_INFO& charInfo, const size_t fillLimit = 0) noexcept; OutputCellIterator(const std::wstring_view utf16Text); OutputCellIterator(const std::wstring_view utf16Text, const TextAttribute attribute); - OutputCellIterator(const std::basic_string_view legacyAttributes) noexcept; - OutputCellIterator(const std::basic_string_view charInfos) noexcept; - OutputCellIterator(const std::basic_string_view cells); + OutputCellIterator(const gsl::span legacyAttributes) noexcept; + OutputCellIterator(const gsl::span charInfos) noexcept; + OutputCellIterator(const gsl::span cells); ~OutputCellIterator() = default; OutputCellIterator& operator=(const OutputCellIterator& it) = default; @@ -86,13 +86,13 @@ class OutputCellIterator final }; Mode _mode; - std::basic_string_view _legacyAttrs; + gsl::span _legacyAttrs; std::variant< std::wstring_view, - std::basic_string_view, - std::basic_string_view, - std::basic_string_view, + gsl::span, + gsl::span, + gsl::span, std::monostate> _run; diff --git a/src/buffer/out/OutputCellRect.cpp b/src/buffer/out/OutputCellRect.cpp index e9cdc275b98..9dd0f74dfb9 100644 --- a/src/buffer/out/OutputCellRect.cpp +++ b/src/buffer/out/OutputCellRect.cpp @@ -50,7 +50,7 @@ gsl::span OutputCellRect::GetRow(const size_t row) // - Read-only iterator of OutputCells OutputCellIterator OutputCellRect::GetRowIter(const size_t row) const { - const std::basic_string_view view(_FindRowOffset(row), _cols); + const gsl::span view(_FindRowOffset(row), _cols); return OutputCellIterator(view); } diff --git a/src/buffer/out/TextAttribute.cpp b/src/buffer/out/TextAttribute.cpp index dd4ef450316..b58975f9a85 100644 --- a/src/buffer/out/TextAttribute.cpp +++ b/src/buffer/out/TextAttribute.cpp @@ -90,7 +90,7 @@ bool TextAttribute::IsLegacy() const noexcept // - reverseScreenMode: true if the screen mode is reversed. // Return Value: // - the foreground and background colors that should be displayed. -std::pair TextAttribute::CalculateRgbColors(const std::basic_string_view colorTable, +std::pair TextAttribute::CalculateRgbColors(const gsl::span colorTable, const COLORREF defaultFgColor, const COLORREF defaultBgColor, const bool reverseScreenMode) const noexcept diff --git a/src/buffer/out/TextAttribute.hpp b/src/buffer/out/TextAttribute.hpp index f33a92ea1bb..cccd9aaff7c 100644 --- a/src/buffer/out/TextAttribute.hpp +++ b/src/buffer/out/TextAttribute.hpp @@ -63,7 +63,7 @@ class TextAttribute final static TextAttribute StripErroneousVT16VersionsOfLegacyDefaults(const TextAttribute& attribute) noexcept; WORD GetLegacyAttributes() const noexcept; - std::pair CalculateRgbColors(const std::basic_string_view colorTable, + std::pair CalculateRgbColors(const gsl::span colorTable, const COLORREF defaultFgColor, const COLORREF defaultBgColor, const bool reverseScreenMode = false) const noexcept; diff --git a/src/buffer/out/TextColor.cpp b/src/buffer/out/TextColor.cpp index 3a664dff316..e340e198abf 100644 --- a/src/buffer/out/TextColor.cpp +++ b/src/buffer/out/TextColor.cpp @@ -138,7 +138,7 @@ void TextColor::SetDefault() noexcept // - brighten: if true, we'll brighten a dark color table index. // Return Value: // - a COLORREF containing the real value of this TextColor. -COLORREF TextColor::GetColor(std::basic_string_view colorTable, +COLORREF TextColor::GetColor(gsl::span colorTable, const COLORREF defaultColor, bool brighten) const noexcept { @@ -158,9 +158,9 @@ COLORREF TextColor::GetColor(std::basic_string_view colorTable, // If we find a match, return instead the bright version of this color for (size_t i = 0; i < 8; i++) { - if (colorTable.at(i) == defaultColor) + if (gsl::at(colorTable, i) == defaultColor) { - return colorTable.at(i + 8); + return gsl::at(colorTable, i + 8); } } } @@ -173,11 +173,11 @@ COLORREF TextColor::GetColor(std::basic_string_view colorTable, } else if (IsIndex16() && brighten) { - return colorTable.at(_index | 8); + return gsl::at(colorTable, _index | 8); } else { - return colorTable.at(_index); + return gsl::at(colorTable, _index); } } diff --git a/src/buffer/out/TextColor.h b/src/buffer/out/TextColor.h index 6085dbd3381..d0186f62219 100644 --- a/src/buffer/out/TextColor.h +++ b/src/buffer/out/TextColor.h @@ -88,7 +88,7 @@ struct TextColor void SetIndex(const BYTE index, const bool isIndex256) noexcept; void SetDefault() noexcept; - COLORREF GetColor(std::basic_string_view colorTable, + COLORREF GetColor(gsl::span colorTable, const COLORREF defaultColor, const bool brighten = false) const noexcept; diff --git a/src/buffer/out/ut_textbuffer/TextAttributeTests.cpp b/src/buffer/out/ut_textbuffer/TextAttributeTests.cpp index 13472d4437d..44acc35519d 100644 --- a/src/buffer/out/ut_textbuffer/TextAttributeTests.cpp +++ b/src/buffer/out/ut_textbuffer/TextAttributeTests.cpp @@ -27,7 +27,7 @@ class TextAttributeTests COLORREF _colorTable[COLOR_TABLE_SIZE]; COLORREF _defaultFg = RGB(1, 2, 3); COLORREF _defaultBg = RGB(4, 5, 6); - std::basic_string_view _GetTableView(); + gsl::span _GetTableView(); }; bool TextAttributeTests::ClassSetup() @@ -51,9 +51,9 @@ bool TextAttributeTests::ClassSetup() return true; } -std::basic_string_view TextAttributeTests::_GetTableView() +gsl::span TextAttributeTests::_GetTableView() { - return std::basic_string_view(&_colorTable[0], COLOR_TABLE_SIZE); + return gsl::span(&_colorTable[0], COLOR_TABLE_SIZE); } void TextAttributeTests::TestRoundtripLegacy() diff --git a/src/buffer/out/ut_textbuffer/TextColorTests.cpp b/src/buffer/out/ut_textbuffer/TextColorTests.cpp index 794331fee3d..8d068658b8e 100644 --- a/src/buffer/out/ut_textbuffer/TextColorTests.cpp +++ b/src/buffer/out/ut_textbuffer/TextColorTests.cpp @@ -27,7 +27,7 @@ class TextColorTests COLORREF _colorTable[COLOR_TABLE_SIZE]; COLORREF _defaultFg = RGB(1, 2, 3); COLORREF _defaultBg = RGB(4, 5, 6); - std::basic_string_view _GetTableView(); + gsl::span _GetTableView(); }; bool TextColorTests::ClassSetup() @@ -51,9 +51,9 @@ bool TextColorTests::ClassSetup() return true; } -std::basic_string_view TextColorTests::_GetTableView() +gsl::span TextColorTests::_GetTableView() { - return std::basic_string_view(&_colorTable[0], COLOR_TABLE_SIZE); + return gsl::span(&_colorTable[0], COLOR_TABLE_SIZE); } void TextColorTests::TestDefaultColor() diff --git a/src/cascadia/TerminalApp/CascadiaSettings.cpp b/src/cascadia/TerminalApp/CascadiaSettings.cpp index 6a38214c478..96e947e952d 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettings.cpp @@ -93,7 +93,7 @@ const Profile* CascadiaSettings::FindProfile(GUID profileGuid) const noexcept // - // Return Value: // - an iterable collection of all of our Profiles. -std::basic_string_view CascadiaSettings::GetProfiles() const noexcept +gsl::span CascadiaSettings::GetProfiles() const noexcept { return { &_profiles[0], _profiles.size() }; } diff --git a/src/cascadia/TerminalApp/CascadiaSettings.h b/src/cascadia/TerminalApp/CascadiaSettings.h index bed41c0d623..004f3809423 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.h +++ b/src/cascadia/TerminalApp/CascadiaSettings.h @@ -59,7 +59,7 @@ class TerminalApp::CascadiaSettings final GlobalAppSettings& GlobalSettings(); - std::basic_string_view GetProfiles() const noexcept; + gsl::span GetProfiles() const noexcept; winrt::TerminalApp::AppKeyBindings GetKeybindings() const noexcept; diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index 26826ddf34e..cf79384f70c 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -354,12 +354,12 @@ bool TerminalDispatch::EnableAlternateScroll(const bool enabled) noexcept return true; } -bool TerminalDispatch::SetPrivateModes(const std::basic_string_view params) noexcept +bool TerminalDispatch::SetPrivateModes(const gsl::span params) noexcept { return _SetResetPrivateModes(params, true); } -bool TerminalDispatch::ResetPrivateModes(const std::basic_string_view params) noexcept +bool TerminalDispatch::ResetPrivateModes(const gsl::span params) noexcept { return _SetResetPrivateModes(params, false); } @@ -374,7 +374,7 @@ bool TerminalDispatch::ResetPrivateModes(const std::basic_string_view params, const bool enable) noexcept +bool TerminalDispatch::_SetResetPrivateModes(const gsl::span params, const bool enable) noexcept { // because the user might chain together params we don't support with params we DO support, execute all // params in the sequence, and only return failure if we failed at least one of them diff --git a/src/cascadia/TerminalCore/TerminalDispatch.hpp b/src/cascadia/TerminalCore/TerminalDispatch.hpp index c916bb35895..640f8eb242f 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.hpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.hpp @@ -13,7 +13,7 @@ class TerminalDispatch : public Microsoft::Console::VirtualTerminal::TermDispatc void Print(const wchar_t wchPrintable) noexcept override; void PrintString(const std::wstring_view string) noexcept override; - bool SetGraphicsRendition(const std::basic_string_view<::Microsoft::Console::VirtualTerminal::DispatchTypes::GraphicsOptions> options) noexcept override; + bool SetGraphicsRendition(const gsl::span options) noexcept override; bool CursorPosition(const size_t line, const size_t column) noexcept override; // CUP @@ -59,16 +59,16 @@ class TerminalDispatch : public Microsoft::Console::VirtualTerminal::TermDispatc bool EnableAnyEventMouseMode(const bool enabled) noexcept override; // ?1003 bool EnableAlternateScroll(const bool enabled) noexcept override; // ?1007 - bool SetPrivateModes(const std::basic_string_view<::Microsoft::Console::VirtualTerminal::DispatchTypes::PrivateModeParams> /*params*/) noexcept override; // DECSET - bool ResetPrivateModes(const std::basic_string_view<::Microsoft::Console::VirtualTerminal::DispatchTypes::PrivateModeParams> /*params*/) noexcept override; // DECRST + bool SetPrivateModes(const gsl::span /*params*/) noexcept override; // DECSET + bool ResetPrivateModes(const gsl::span /*params*/) noexcept override; // DECRST private: ::Microsoft::Terminal::Core::ITerminalApi& _terminalApi; - size_t _SetRgbColorsHelper(const std::basic_string_view<::Microsoft::Console::VirtualTerminal::DispatchTypes::GraphicsOptions> options, + size_t _SetRgbColorsHelper(const gsl::span options, TextAttribute& attr, const bool isForeground) noexcept; - bool _SetResetPrivateModes(const std::basic_string_view<::Microsoft::Console::VirtualTerminal::DispatchTypes::PrivateModeParams> params, const bool enable) noexcept; + bool _SetResetPrivateModes(const gsl::span params, const bool enable) noexcept; bool _PrivateModeParamsHelper(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::PrivateModeParams param, const bool enable) noexcept; }; diff --git a/src/cascadia/TerminalCore/TerminalDispatchGraphics.cpp b/src/cascadia/TerminalCore/TerminalDispatchGraphics.cpp index 195b68bf126..b03cae1c7b8 100644 --- a/src/cascadia/TerminalCore/TerminalDispatchGraphics.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatchGraphics.cpp @@ -41,7 +41,7 @@ const BYTE BRIGHT_WHITE = BRIGHT_ATTR | RED_ATTR | GREEN_ATTR | BLUE_ATTR; // - isForeground - Whether or not the parsed color is for the foreground. // Return Value: // - The number of options consumed, not including the initial 38/48. -size_t TerminalDispatch::_SetRgbColorsHelper(const std::basic_string_view options, +size_t TerminalDispatch::_SetRgbColorsHelper(const gsl::span options, TextAttribute& attr, const bool isForeground) noexcept { @@ -94,7 +94,7 @@ size_t TerminalDispatch::_SetRgbColorsHelper(const std::basic_string_view options) noexcept +bool TerminalDispatch::SetGraphicsRendition(const gsl::span options) noexcept { TextAttribute attr = _terminalApi.GetTextAttributes(); @@ -264,10 +264,10 @@ bool TerminalDispatch::SetGraphicsRendition(const std::basic_string_view buffer, + const gsl::span buffer, size_t& written, const bool append) noexcept override; [[nodiscard]] HRESULT WriteConsoleInputWImpl(InputBuffer& context, - const std::basic_string_view buffer, + const gsl::span buffer, size_t& written, const bool append) noexcept override; @@ -228,7 +228,7 @@ class ApiRoutines : public IApiRoutines Microsoft::Console::Types::Viewport& writtenRectangle) noexcept override; [[nodiscard]] HRESULT WriteConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const std::basic_string_view attrs, + const gsl::span attrs, const COORD target, size_t& used) noexcept override; diff --git a/src/host/_output.cpp b/src/host/_output.cpp index 65413033a48..28f82dad861 100644 --- a/src/host/_output.cpp +++ b/src/host/_output.cpp @@ -69,7 +69,7 @@ void WriteToScreen(SCREEN_INFORMATION& screenInfo, const Viewport& region) // Return Value: // - S_OK, E_INVALIDARG or similar HRESULT error. [[nodiscard]] HRESULT ApiRoutines::WriteConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const std::basic_string_view attrs, + const gsl::span attrs, const COORD target, size_t& used) noexcept { diff --git a/src/host/conareainfo.cpp b/src/host/conareainfo.cpp index 5be0b5edb7f..b336c0d782c 100644 --- a/src/host/conareainfo.cpp +++ b/src/host/conareainfo.cpp @@ -112,7 +112,7 @@ void ConversionAreaInfo::SetAttributes(const TextAttribute& attr) void ConversionAreaInfo::WriteText(const std::vector& text, const SHORT column) { - std::basic_string_view view(text.data(), text.size()); + gsl::span view(text.data(), text.size()); _screenBuffer->Write(view, { column, 0 }); } diff --git a/src/host/conimeinfo.cpp b/src/host/conimeinfo.cpp index 56b3891c2fa..5a9012d2ae6 100644 --- a/src/host/conimeinfo.cpp +++ b/src/host/conimeinfo.cpp @@ -57,15 +57,15 @@ void ConsoleImeInfo::RedrawCompMessage() // - attributes - Encoded attributes including the cursor position and the color index (to the array) // - colorArray - An array of colors to use for the text void ConsoleImeInfo::WriteCompMessage(const std::wstring_view text, - const std::basic_string_view attributes, - const std::basic_string_view colorArray) + const gsl::span attributes, + const gsl::span colorArray) { ClearAllAreas(); // Save copies of the composition message in case we need to redraw it as things scroll/resize _text = text; - _attributes = attributes; - _colorArray = colorArray; + _attributes.assign(attributes.begin(), attributes.end()); + _colorArray.assign(colorArray.begin(), colorArray.end()); _WriteUndeterminedChars(text, attributes, colorArray); } @@ -177,8 +177,8 @@ void ConsoleImeInfo::ClearAllAreas() // Return Value: // - TextAttribute object with color and cursor and line drawing data. TextAttribute ConsoleImeInfo::s_RetrieveAttributeAt(const size_t pos, - const std::basic_string_view attributes, - const std::basic_string_view colorArray) + const gsl::span attributes, + const gsl::span colorArray) { // Encoded attribute is the shorthand information passed from the IME // that contains a cursor position packed in along with which color in the @@ -214,8 +214,8 @@ TextAttribute ConsoleImeInfo::s_RetrieveAttributeAt(const size_t pos, // Return Value: // - Vector of OutputCells where each one represents one cell of the output buffer. std::vector ConsoleImeInfo::s_ConvertToCells(const std::wstring_view text, - const std::basic_string_view attributes, - const std::basic_string_view colorArray) + const gsl::span attributes, + const gsl::span colorArray) { std::vector cells; @@ -389,8 +389,8 @@ std::vector::const_iterator ConsoleImeInfo::_WriteConversionArea(con // each text character. This view must be the same size as the text view. // - colorArray - 8 colors to be used to format the text for display void ConsoleImeInfo::_WriteUndeterminedChars(const std::wstring_view text, - const std::basic_string_view attributes, - const std::basic_string_view colorArray) + const gsl::span attributes, + const gsl::span colorArray) { CONSOLE_INFORMATION& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); SCREEN_INFORMATION& screenInfo = gci.GetActiveOutputBuffer(); diff --git a/src/host/conimeinfo.h b/src/host/conimeinfo.h index 7caec15be9d..2a3016ff0f6 100644 --- a/src/host/conimeinfo.h +++ b/src/host/conimeinfo.h @@ -48,8 +48,8 @@ class ConsoleImeInfo final [[nodiscard]] HRESULT ResizeAllAreas(const COORD newSize); void WriteCompMessage(const std::wstring_view text, - const std::basic_string_view attributes, - const std::basic_string_view colorArray); + const gsl::span attributes, + const gsl::span colorArray); void WriteResultMessage(const std::wstring_view text); @@ -64,18 +64,18 @@ class ConsoleImeInfo final void _ClearComposition(); void _WriteUndeterminedChars(const std::wstring_view text, - const std::basic_string_view attributes, - const std::basic_string_view colorArray); + const gsl::span attributes, + const gsl::span colorArray); void _InsertConvertedString(const std::wstring_view text); static TextAttribute s_RetrieveAttributeAt(const size_t pos, - const std::basic_string_view attributes, - const std::basic_string_view colorArray); + const gsl::span attributes, + const gsl::span colorArray); static std::vector s_ConvertToCells(const std::wstring_view text, - const std::basic_string_view attributes, - const std::basic_string_view colorArray); + const gsl::span attributes, + const gsl::span colorArray); std::vector::const_iterator _WriteConversionArea(const std::vector::const_iterator begin, const std::vector::const_iterator end, @@ -86,6 +86,6 @@ class ConsoleImeInfo final bool _isSavedCursorVisible; std::wstring _text; - std::basic_string _attributes; - std::basic_string _colorArray; + std::vector _attributes; + std::vector _colorArray; }; diff --git a/src/host/convarea.cpp b/src/host/convarea.cpp index face646ebf0..98546d8babf 100644 --- a/src/host/convarea.cpp +++ b/src/host/convarea.cpp @@ -125,8 +125,8 @@ void WriteConvRegionToScreen(const SCREEN_INFORMATION& ScreenInfo, } [[nodiscard]] HRESULT ImeComposeData(std::wstring_view text, - std::basic_string_view attributes, - std::basic_string_view colorArray) + gsl::span attributes, + gsl::span colorArray) { try { diff --git a/src/host/directio.cpp b/src/host/directio.cpp index 9216f755a03..2ff831c2971 100644 --- a/src/host/directio.cpp +++ b/src/host/directio.cpp @@ -472,7 +472,7 @@ void EventsToUnicode(_Inout_ std::deque>& inEvents, // Return Value: // - HRESULT indicating success or failure [[nodiscard]] HRESULT ApiRoutines::WriteConsoleInputAImpl(InputBuffer& context, - const std::basic_string_view buffer, + const gsl::span buffer, size_t& written, const bool append) noexcept { @@ -516,7 +516,7 @@ void EventsToUnicode(_Inout_ std::deque>& inEvents, // Return Value: // - HRESULT indicating success or failure [[nodiscard]] HRESULT ApiRoutines::WriteConsoleInputWImpl(InputBuffer& context, - const std::basic_string_view buffer, + const gsl::span buffer, size_t& written, const bool append) noexcept { @@ -1042,7 +1042,7 @@ void EventsToUnicode(_Inout_ std::deque>& inEvents, const auto subspan = buffer.subspan(totalOffset, writeRectangle.Width()); // Convert to a CHAR_INFO view to fit into the iterator - const auto charInfos = std::basic_string_view(subspan.data(), subspan.size()); + const auto charInfos = gsl::span(subspan.data(), subspan.size()); // Make the iterator and write to the target position. OutputCellIterator it(charInfos); diff --git a/src/host/settings.cpp b/src/host/settings.cpp index f5ff47f6328..13faafa4933 100644 --- a/src/host/settings.cpp +++ b/src/host/settings.cpp @@ -726,12 +726,12 @@ void Settings::SetHistoryNoDup(const bool bHistoryNoDup) _bHistoryNoDup = bHistoryNoDup; } -std::basic_string_view Settings::Get16ColorTable() const +gsl::span Settings::Get16ColorTable() const { - return Get256ColorTable().substr(0, 16); + return Get256ColorTable().subspan(0, 16); } -std::basic_string_view Settings::Get256ColorTable() const +gsl::span Settings::Get256ColorTable() const { return { _colorTable.data(), _colorTable.size() }; } diff --git a/src/host/settings.hpp b/src/host/settings.hpp index ed13b65f6e6..decd30d72c1 100644 --- a/src/host/settings.hpp +++ b/src/host/settings.hpp @@ -159,8 +159,8 @@ class Settings bool GetHistoryNoDup() const; void SetHistoryNoDup(const bool fHistoryNoDup); - std::basic_string_view Get16ColorTable() const; - std::basic_string_view Get256ColorTable() const; + gsl::span Get16ColorTable() const; + gsl::span Get256ColorTable() const; void SetColorTableEntry(const size_t index, const COLORREF ColorValue); COLORREF GetColorTableEntry(const size_t index) const; diff --git a/src/host/ut_host/OutputCellIteratorTests.cpp b/src/host/ut_host/OutputCellIteratorTests.cpp index 4d22fabb17b..a71eca8eb77 100644 --- a/src/host/ut_host/OutputCellIteratorTests.cpp +++ b/src/host/ut_host/OutputCellIteratorTests.cpp @@ -367,7 +367,7 @@ class OutputCellIteratorTests SetVerifyOutput settings(VerifyOutputSettings::LogOnlyFailures); const std::vector colors{ FOREGROUND_GREEN, FOREGROUND_RED | BACKGROUND_BLUE, FOREGROUND_BLUE | FOREGROUND_INTENSITY, BACKGROUND_GREEN }; - const std::basic_string_view view{ colors.data(), colors.size() }; + const gsl::span view{ colors.data(), colors.size() }; OutputCellIterator it(view); @@ -401,7 +401,7 @@ class OutputCellIteratorTests charInfos.push_back(ci); } - const std::basic_string_view view{ charInfos.data(), charInfos.size() }; + const gsl::span view{ charInfos.data(), charInfos.size() }; OutputCellIterator it(view); @@ -433,7 +433,7 @@ class OutputCellIteratorTests cells.push_back(cell); } - const std::basic_string_view view{ cells.data(), cells.size() }; + const gsl::span view{ cells.data(), cells.size() }; OutputCellIterator it(view); diff --git a/src/inc/conime.h b/src/inc/conime.h index 16f66808f5a..18ebf245f00 100644 --- a/src/inc/conime.h +++ b/src/inc/conime.h @@ -32,8 +32,8 @@ constexpr BYTE CONIME_CURSOR_LEFT = 0x20; [[nodiscard]] HRESULT ImeEndComposition(); [[nodiscard]] HRESULT ImeComposeData(std::wstring_view text, - std::basic_string_view attributes, - std::basic_string_view colorArray); + gsl::span attributes, + gsl::span colorArray); [[nodiscard]] HRESULT ImeClearComposeData(); diff --git a/src/interactivity/onecore/BgfxEngine.cpp b/src/interactivity/onecore/BgfxEngine.cpp index 8480540a65f..a800e2c2a0b 100644 --- a/src/interactivity/onecore/BgfxEngine.cpp +++ b/src/interactivity/onecore/BgfxEngine.cpp @@ -145,7 +145,7 @@ BgfxEngine::BgfxEngine(PVOID SharedViewBase, LONG DisplayHeight, LONG DisplayWid return S_OK; } -[[nodiscard]] HRESULT BgfxEngine::PaintBufferLine(const std::basic_string_view clusters, +[[nodiscard]] HRESULT BgfxEngine::PaintBufferLine(const gsl::span clusters, const COORD coord, const bool /*trimLeft*/, const bool /*lineWrapped*/) noexcept diff --git a/src/interactivity/onecore/BgfxEngine.hpp b/src/interactivity/onecore/BgfxEngine.hpp index d68be91470c..cebedfbda41 100644 --- a/src/interactivity/onecore/BgfxEngine.hpp +++ b/src/interactivity/onecore/BgfxEngine.hpp @@ -49,7 +49,7 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT ScrollFrame() noexcept override; [[nodiscard]] HRESULT PaintBackground() noexcept override; - [[nodiscard]] HRESULT PaintBufferLine(const std::basic_string_view clusters, + [[nodiscard]] HRESULT PaintBufferLine(const gsl::span clusters, const COORD coord, const bool trimLeft, const bool lineWrapped) noexcept override; diff --git a/src/renderer/dx/CustomTextLayout.cpp b/src/renderer/dx/CustomTextLayout.cpp index 7c14d646134..c9f30c039a7 100644 --- a/src/renderer/dx/CustomTextLayout.cpp +++ b/src/renderer/dx/CustomTextLayout.cpp @@ -78,7 +78,7 @@ CATCH_RETURN() // - clusters - From the backing buffer, the text to be displayed clustered by the columns it should consume. // Return Value: // - S_OK or suitable memory management issue. -[[nodiscard]] HRESULT STDMETHODCALLTYPE CustomTextLayout::AppendClusters(const std::basic_string_view<::Microsoft::Console::Render::Cluster> clusters) +[[nodiscard]] HRESULT STDMETHODCALLTYPE CustomTextLayout::AppendClusters(const gsl::span clusters) try { _textClusterColumns.reserve(_textClusterColumns.size() + clusters.size()); diff --git a/src/renderer/dx/CustomTextLayout.h b/src/renderer/dx/CustomTextLayout.h index dac30b06c12..cf2a63b574b 100644 --- a/src/renderer/dx/CustomTextLayout.h +++ b/src/renderer/dx/CustomTextLayout.h @@ -27,7 +27,7 @@ namespace Microsoft::Console::Render size_t const width, IBoxDrawingEffect* const boxEffect); - [[nodiscard]] HRESULT STDMETHODCALLTYPE AppendClusters(const std::basic_string_view<::Microsoft::Console::Render::Cluster> clusters); + [[nodiscard]] HRESULT STDMETHODCALLTYPE AppendClusters(const gsl::span clusters); [[nodiscard]] HRESULT STDMETHODCALLTYPE Reset() noexcept; diff --git a/src/renderer/dx/DxRenderer.cpp b/src/renderer/dx/DxRenderer.cpp index 5d36ff3527c..1714b6e10bd 100644 --- a/src/renderer/dx/DxRenderer.cpp +++ b/src/renderer/dx/DxRenderer.cpp @@ -1419,7 +1419,7 @@ CATCH_RETURN() // - fTrimLeft - Whether or not to trim off the left half of a double wide character // Return Value: // - S_OK or relevant DirectX error -[[nodiscard]] HRESULT DxEngine::PaintBufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT DxEngine::PaintBufferLine(gsl::span const clusters, COORD const coord, const bool /*trimLeft*/, const bool /*lineWrapped*/) noexcept diff --git a/src/renderer/dx/DxRenderer.hpp b/src/renderer/dx/DxRenderer.hpp index 5bd24df1cfb..708f3418e87 100644 --- a/src/renderer/dx/DxRenderer.hpp +++ b/src/renderer/dx/DxRenderer.hpp @@ -86,7 +86,7 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT PrepareRenderInfo(const RenderFrameInfo& info) noexcept override; [[nodiscard]] HRESULT PaintBackground() noexcept override; - [[nodiscard]] HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT PaintBufferLine(gsl::span const clusters, COORD const coord, bool const fTrimLeft, const bool lineWrapped) noexcept override; diff --git a/src/renderer/gdi/gdirenderer.hpp b/src/renderer/gdi/gdirenderer.hpp index bae4ea2eda2..c375f8b764a 100644 --- a/src/renderer/gdi/gdirenderer.hpp +++ b/src/renderer/gdi/gdirenderer.hpp @@ -42,7 +42,7 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT ScrollFrame() noexcept override; [[nodiscard]] HRESULT PaintBackground() noexcept override; - [[nodiscard]] HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT PaintBufferLine(gsl::span const clusters, const COORD coord, const bool trimLeft, const bool lineWrapped) noexcept override; diff --git a/src/renderer/gdi/paint.cpp b/src/renderer/gdi/paint.cpp index 7654790df09..1b68dafc93e 100644 --- a/src/renderer/gdi/paint.cpp +++ b/src/renderer/gdi/paint.cpp @@ -284,7 +284,7 @@ using namespace Microsoft::Console::Render; // See: Win7: 390673, 447839 and then superseded by http://osgvsowi/638274 when FE/non-FE rendering condensed. //#define CONSOLE_EXTTEXTOUT_FLAGS ETO_OPAQUE | ETO_CLIPPED //#define MAX_POLY_LINES 80 -[[nodiscard]] HRESULT GdiEngine::PaintBufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT GdiEngine::PaintBufferLine(gsl::span const clusters, const COORD coord, const bool trimLeft, const bool /*lineWrapped*/) noexcept @@ -316,7 +316,7 @@ using namespace Microsoft::Console::Render; // Convert data from clusters into the text array and the widths array. for (size_t i = 0; i < cchLine; i++) { - const auto& cluster = clusters.at(i); + const auto& cluster = gsl::at(clusters, i); // Our GDI renderer hasn't and isn't going to handle things above U+FFFF or sequences. // So replace anything complicated with a replacement character for drawing purposes. diff --git a/src/renderer/inc/IRenderEngine.hpp b/src/renderer/inc/IRenderEngine.hpp index 8df30a60035..a70960754c0 100644 --- a/src/renderer/inc/IRenderEngine.hpp +++ b/src/renderer/inc/IRenderEngine.hpp @@ -71,7 +71,7 @@ namespace Microsoft::Console::Render [[nodiscard]] virtual HRESULT PrepareRenderInfo(const RenderFrameInfo& info) noexcept = 0; [[nodiscard]] virtual HRESULT PaintBackground() noexcept = 0; - [[nodiscard]] virtual HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] virtual HRESULT PaintBufferLine(gsl::span const clusters, const COORD coord, const bool fTrimLeft, const bool lineWrapped) noexcept = 0; diff --git a/src/renderer/uia/UiaRenderer.cpp b/src/renderer/uia/UiaRenderer.cpp index e6bdbe19e4f..124fb5307c4 100644 --- a/src/renderer/uia/UiaRenderer.cpp +++ b/src/renderer/uia/UiaRenderer.cpp @@ -305,7 +305,7 @@ CATCH_RETURN(); // - fTrimLeft - Whether or not to trim off the left half of a double wide character // Return Value: // - S_FALSE -[[nodiscard]] HRESULT UiaEngine::PaintBufferLine(std::basic_string_view const /*clusters*/, +[[nodiscard]] HRESULT UiaEngine::PaintBufferLine(gsl::span const /*clusters*/, COORD const /*coord*/, const bool /*trimLeft*/, const bool /*lineWrapped*/) noexcept diff --git a/src/renderer/uia/UiaRenderer.hpp b/src/renderer/uia/UiaRenderer.hpp index 1bc595510cb..68c2308504c 100644 --- a/src/renderer/uia/UiaRenderer.hpp +++ b/src/renderer/uia/UiaRenderer.hpp @@ -51,7 +51,7 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT InvalidateCircling(_Out_ bool* const pForcePaint) noexcept override; [[nodiscard]] HRESULT PaintBackground() noexcept override; - [[nodiscard]] HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT PaintBufferLine(gsl::span const clusters, COORD const coord, bool const fTrimLeft, const bool lineWrapped) noexcept override; diff --git a/src/renderer/vt/XtermEngine.cpp b/src/renderer/vt/XtermEngine.cpp index a67568a4836..64a29f26e82 100644 --- a/src/renderer/vt/XtermEngine.cpp +++ b/src/renderer/vt/XtermEngine.cpp @@ -498,7 +498,7 @@ CATCH_RETURN(); // will be false. // Return Value: // - S_OK or suitable HRESULT error from writing pipe. -[[nodiscard]] HRESULT XtermEngine::PaintBufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT XtermEngine::PaintBufferLine(gsl::span const clusters, const COORD coord, const bool /*trimLeft*/, const bool lineWrapped) noexcept diff --git a/src/renderer/vt/XtermEngine.hpp b/src/renderer/vt/XtermEngine.hpp index cfcbbaef6d2..9e4680fe642 100644 --- a/src/renderer/vt/XtermEngine.hpp +++ b/src/renderer/vt/XtermEngine.hpp @@ -41,7 +41,7 @@ namespace Microsoft::Console::Render [[nodiscard]] virtual HRESULT UpdateDrawingBrushes(const TextAttribute& textAttributes, const gsl::not_null pData, const bool isSettingDefaultBrushes) noexcept override; - [[nodiscard]] HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT PaintBufferLine(gsl::span const clusters, const COORD coord, const bool trimLeft, const bool lineWrapped) noexcept override; diff --git a/src/renderer/vt/paint.cpp b/src/renderer/vt/paint.cpp index cf345211e97..1604d48131c 100644 --- a/src/renderer/vt/paint.cpp +++ b/src/renderer/vt/paint.cpp @@ -125,7 +125,7 @@ using namespace Microsoft::Console::Types; // will be false. // Return Value: // - S_OK or suitable HRESULT error from writing pipe. -[[nodiscard]] HRESULT VtEngine::PaintBufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT VtEngine::PaintBufferLine(gsl::span const clusters, const COORD coord, const bool /*trimLeft*/, const bool /*lineWrapped*/) noexcept @@ -327,7 +327,7 @@ using namespace Microsoft::Console::Types; // - coord - character coordinate target to render within viewport // Return Value: // - S_OK or suitable HRESULT error from writing pipe. -[[nodiscard]] HRESULT VtEngine::_PaintAsciiBufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT VtEngine::_PaintAsciiBufferLine(gsl::span const clusters, const COORD coord) noexcept { try @@ -362,7 +362,7 @@ using namespace Microsoft::Console::Types; // - coord - character coordinate target to render within viewport // Return Value: // - S_OK or suitable HRESULT error from writing pipe. -[[nodiscard]] HRESULT VtEngine::_PaintUtf8BufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT VtEngine::_PaintUtf8BufferLine(gsl::span const clusters, const COORD coord, const bool lineWrapped) noexcept { diff --git a/src/renderer/vt/vtrenderer.hpp b/src/renderer/vt/vtrenderer.hpp index cb6739d702d..952be678925 100644 --- a/src/renderer/vt/vtrenderer.hpp +++ b/src/renderer/vt/vtrenderer.hpp @@ -61,7 +61,7 @@ namespace Microsoft::Console::Render [[nodiscard]] virtual HRESULT ScrollFrame() noexcept = 0; [[nodiscard]] HRESULT PaintBackground() noexcept override; - [[nodiscard]] virtual HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] virtual HRESULT PaintBufferLine(gsl::span const clusters, const COORD coord, const bool trimLeft, const bool lineWrapped) noexcept override; @@ -208,11 +208,11 @@ namespace Microsoft::Console::Render // buffer space for these two functions to build their lines // so they don't have to alloc/free in a tight loop std::wstring _bufferLine; - [[nodiscard]] HRESULT _PaintUtf8BufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT _PaintUtf8BufferLine(gsl::span const clusters, const COORD coord, const bool lineWrapped) noexcept; - [[nodiscard]] HRESULT _PaintAsciiBufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT _PaintAsciiBufferLine(gsl::span const clusters, const COORD coord) noexcept; [[nodiscard]] HRESULT _WriteTerminalUtf8(const std::wstring_view str) noexcept; diff --git a/src/renderer/wddmcon/WddmConRenderer.cpp b/src/renderer/wddmcon/WddmConRenderer.cpp index 77409bb6b03..277dd2bcf39 100644 --- a/src/renderer/wddmcon/WddmConRenderer.cpp +++ b/src/renderer/wddmcon/WddmConRenderer.cpp @@ -258,7 +258,7 @@ bool WddmConEngine::IsInitialized() return S_OK; } -[[nodiscard]] HRESULT WddmConEngine::PaintBufferLine(std::basic_string_view const clusters, +[[nodiscard]] HRESULT WddmConEngine::PaintBufferLine(gsl::span const clusters, const COORD coord, const bool /*trimLeft*/, const bool /*lineWrapped*/) noexcept diff --git a/src/renderer/wddmcon/WddmConRenderer.hpp b/src/renderer/wddmcon/WddmConRenderer.hpp index e4acac3fc96..370a03acb6e 100644 --- a/src/renderer/wddmcon/WddmConRenderer.hpp +++ b/src/renderer/wddmcon/WddmConRenderer.hpp @@ -41,7 +41,7 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT ScrollFrame() noexcept override; [[nodiscard]] HRESULT PaintBackground() noexcept override; - [[nodiscard]] HRESULT PaintBufferLine(std::basic_string_view const clusters, + [[nodiscard]] HRESULT PaintBufferLine(gsl::span const clusters, const COORD coord, const bool trimLeft, const bool lineWrapped) noexcept override; diff --git a/src/server/ApiDispatchers.cpp b/src/server/ApiDispatchers.cpp index 5ba2d547014..db0134d482f 100644 --- a/src/server/ApiDispatchers.cpp +++ b/src/server/ApiDispatchers.cpp @@ -881,7 +881,7 @@ RETURN_IF_FAILED(pObjectHandle->GetInputBuffer(GENERIC_WRITE, &pInputBuffer)); size_t written; - std::basic_string_view buffer(reinterpret_cast(pvBuffer), cbSize / sizeof(INPUT_RECORD)); + gsl::span buffer(reinterpret_cast(pvBuffer), cbSize / sizeof(INPUT_RECORD)); if (!a->Unicode) { RETURN_IF_FAILED(m->_pApiRoutines->WriteConsoleInputAImpl(*pInputBuffer, buffer, written, !!a->Append)); @@ -1008,7 +1008,7 @@ } case CONSOLE_ATTRIBUTE: { - const std::basic_string_view text(reinterpret_cast(pvBuffer), cbBufferSize / sizeof(WORD)); + const gsl::span text(reinterpret_cast(pvBuffer), cbBufferSize / sizeof(WORD)); hr = m->_pApiRoutines->WriteConsoleOutputAttributeImpl(*pScreenInfo, text, diff --git a/src/server/IApiRoutines.h b/src/server/IApiRoutines.h index 7b32a727223..996227f0636 100644 --- a/src/server/IApiRoutines.h +++ b/src/server/IApiRoutines.h @@ -219,12 +219,12 @@ class IApiRoutines size_t& written) noexcept = 0; [[nodiscard]] virtual HRESULT WriteConsoleInputAImpl(IConsoleInputObject& context, - const std::basic_string_view buffer, + const gsl::span buffer, size_t& written, const bool append) noexcept = 0; [[nodiscard]] virtual HRESULT WriteConsoleInputWImpl(IConsoleInputObject& context, - const std::basic_string_view buffer, + const gsl::span buffer, size_t& written, const bool append) noexcept = 0; @@ -239,7 +239,7 @@ class IApiRoutines Microsoft::Console::Types::Viewport& writtenRectangle) noexcept = 0; [[nodiscard]] virtual HRESULT WriteConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const std::basic_string_view attrs, + const gsl::span attrs, const COORD target, size_t& used) noexcept = 0; diff --git a/src/terminal/adapter/IInteractDispatch.hpp b/src/terminal/adapter/IInteractDispatch.hpp index d8551042a60..a7a936ad58e 100644 --- a/src/terminal/adapter/IInteractDispatch.hpp +++ b/src/terminal/adapter/IInteractDispatch.hpp @@ -35,7 +35,7 @@ namespace Microsoft::Console::VirtualTerminal virtual bool WriteString(const std::wstring_view string) = 0; virtual bool WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) = 0; + const gsl::span parameters) = 0; virtual bool MoveCursor(const size_t row, const size_t col) = 0; diff --git a/src/terminal/adapter/ITermDispatch.hpp b/src/terminal/adapter/ITermDispatch.hpp index 22cd9725d47..93f1dffeccd 100644 --- a/src/terminal/adapter/ITermDispatch.hpp +++ b/src/terminal/adapter/ITermDispatch.hpp @@ -86,11 +86,11 @@ class Microsoft::Console::VirtualTerminal::ITermDispatch virtual bool EraseInLine(const DispatchTypes::EraseType eraseType) = 0; // EL virtual bool EraseCharacters(const size_t numChars) = 0; // ECH - virtual bool SetGraphicsRendition(const std::basic_string_view options) = 0; // SGR + virtual bool SetGraphicsRendition(const gsl::span options) = 0; // SGR - virtual bool SetPrivateModes(const std::basic_string_view params) = 0; // DECSET + virtual bool SetPrivateModes(const gsl::span params) = 0; // DECSET - virtual bool ResetPrivateModes(const std::basic_string_view params) = 0; // DECRST + virtual bool ResetPrivateModes(const gsl::span params) = 0; // DECRST virtual bool DeviceStatusReport(const DispatchTypes::AnsiStatusType statusType) = 0; // DSR, DSR-OS, DSR-CPR virtual bool DeviceAttributes() = 0; // DA1 @@ -116,7 +116,7 @@ class Microsoft::Console::VirtualTerminal::ITermDispatch // DTTERM_WindowManipulation virtual bool WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) = 0; + const gsl::span parameters) = 0; }; inline Microsoft::Console::VirtualTerminal::ITermDispatch::~ITermDispatch() {} #pragma warning(pop) diff --git a/src/terminal/adapter/InteractDispatch.cpp b/src/terminal/adapter/InteractDispatch.cpp index 51f176164c9..8a89cba04d7 100644 --- a/src/terminal/adapter/InteractDispatch.cpp +++ b/src/terminal/adapter/InteractDispatch.cpp @@ -96,7 +96,7 @@ bool InteractDispatch::WriteString(const std::wstring_view string) // Return value: // True if handled successfully. False otherwise. bool InteractDispatch::WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) + const gsl::span parameters) { bool success = false; // Other Window Manipulation functions: diff --git a/src/terminal/adapter/InteractDispatch.hpp b/src/terminal/adapter/InteractDispatch.hpp index da00c2374c7..c8fa8a02a76 100644 --- a/src/terminal/adapter/InteractDispatch.hpp +++ b/src/terminal/adapter/InteractDispatch.hpp @@ -29,7 +29,7 @@ namespace Microsoft::Console::VirtualTerminal bool WriteCtrlKey(const KeyEvent& event) override; bool WriteString(const std::wstring_view string) override; bool WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) override; // DTTERM_WindowManipulation + const gsl::span parameters) override; // DTTERM_WindowManipulation bool MoveCursor(const size_t row, const size_t col) override; bool IsVtInputEnabled() const override; diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index e34b8bd2a96..7578e4fbc9a 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -1078,7 +1078,7 @@ bool AdaptDispatch::_PrivateModeParamsHelper(const DispatchTypes::PrivateModePar // - enable - True for set, false for unset. // Return Value: // - True if ALL params were handled successfully. False otherwise. -bool AdaptDispatch::_SetResetPrivateModes(const std::basic_string_view params, const bool enable) +bool AdaptDispatch::_SetResetPrivateModes(const gsl::span params, const bool enable) { // because the user might chain together params we don't support with params we DO support, execute all // params in the sequence, and only return failure if we failed at least one of them @@ -1096,7 +1096,7 @@ bool AdaptDispatch::_SetResetPrivateModes(const std::basic_string_view params) +bool AdaptDispatch::SetPrivateModes(const gsl::span params) { return _SetResetPrivateModes(params, true); } @@ -1107,7 +1107,7 @@ bool AdaptDispatch::SetPrivateModes(const std::basic_string_view params) +bool AdaptDispatch::ResetPrivateModes(const gsl::span params) { return _SetResetPrivateModes(params, false); } @@ -2308,7 +2308,7 @@ bool Microsoft::Console::VirtualTerminal::AdaptDispatch::SetDefaultBackground(co // Return value: // True if handled successfully. False otherwise. bool AdaptDispatch::WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) + const gsl::span parameters) { bool success = false; // Other Window Manipulation functions: diff --git a/src/terminal/adapter/adaptDispatch.hpp b/src/terminal/adapter/adaptDispatch.hpp index 85621f389eb..12a0c902104 100644 --- a/src/terminal/adapter/adaptDispatch.hpp +++ b/src/terminal/adapter/adaptDispatch.hpp @@ -55,7 +55,7 @@ namespace Microsoft::Console::VirtualTerminal bool EraseCharacters(const size_t numChars) override; // ECH bool InsertCharacter(const size_t count) override; // ICH bool DeleteCharacter(const size_t count) override; // DCH - bool SetGraphicsRendition(const std::basic_string_view options) override; // SGR + bool SetGraphicsRendition(const gsl::span options) override; // SGR bool DeviceStatusReport(const DispatchTypes::AnsiStatusType statusType) override; // DSR, DSR-OS, DSR-CPR bool DeviceAttributes() override; // DA1 bool SecondaryDeviceAttributes() override; // DA2 @@ -66,8 +66,8 @@ namespace Microsoft::Console::VirtualTerminal bool InsertLine(const size_t distance) override; // IL bool DeleteLine(const size_t distance) override; // DL bool SetColumns(const size_t columns) override; // DECCOLM - bool SetPrivateModes(const std::basic_string_view params) override; // DECSET - bool ResetPrivateModes(const std::basic_string_view params) override; // DECRST + bool SetPrivateModes(const gsl::span params) override; // DECSET + bool ResetPrivateModes(const gsl::span params) override; // DECRST bool SetCursorKeysMode(const bool applicationMode) override; // DECCKM bool SetKeypadMode(const bool applicationMode) override; // DECKPAM, DECKPNM bool EnableWin32InputMode(const bool win32InputMode) override; // win32-input-mode @@ -116,7 +116,7 @@ namespace Microsoft::Console::VirtualTerminal bool SetDefaultBackground(const DWORD color) override; // OSCDefaultBackground bool WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) override; // DTTERM_WindowManipulation + const gsl::span parameters) override; // DTTERM_WindowManipulation private: enum class ScrollDirection @@ -159,7 +159,7 @@ namespace Microsoft::Console::VirtualTerminal bool _CursorPositionReport() const; bool _WriteResponse(const std::wstring_view reply) const; - bool _SetResetPrivateModes(const std::basic_string_view params, const bool enable); + bool _SetResetPrivateModes(const gsl::span params, const bool enable); bool _PrivateModeParamsHelper(const DispatchTypes::PrivateModeParams param, const bool enable); bool _DoDECCOLMHelper(const size_t columns); @@ -192,7 +192,7 @@ namespace Microsoft::Console::VirtualTerminal bool _isDECCOLMAllowed; - size_t _SetRgbColorsHelper(const std::basic_string_view options, + size_t _SetRgbColorsHelper(const gsl::span options, TextAttribute& attr, const bool isForeground) noexcept; }; diff --git a/src/terminal/adapter/adaptDispatchGraphics.cpp b/src/terminal/adapter/adaptDispatchGraphics.cpp index 9216eeebe08..ada5924cc8e 100644 --- a/src/terminal/adapter/adaptDispatchGraphics.cpp +++ b/src/terminal/adapter/adaptDispatchGraphics.cpp @@ -47,7 +47,7 @@ const BYTE BRIGHT_WHITE = BRIGHT_ATTR | RED_ATTR | GREEN_ATTR | BLUE_ATTR; // - isForeground - Whether or not the parsed color is for the foreground. // Return Value: // - The number of options consumed, not including the initial 38/48. -size_t AdaptDispatch::_SetRgbColorsHelper(const std::basic_string_view options, +size_t AdaptDispatch::_SetRgbColorsHelper(const gsl::span options, TextAttribute& attr, const bool isForeground) noexcept { @@ -100,7 +100,7 @@ size_t AdaptDispatch::_SetRgbColorsHelper(const std::basic_string_view options) +bool AdaptDispatch::SetGraphicsRendition(const gsl::span options) { TextAttribute attr; bool success = _pConApi->PrivateGetTextAttributes(attr); @@ -273,10 +273,10 @@ bool AdaptDispatch::SetGraphicsRendition(const std::basic_string_view /*options*/) noexcept override { return false; } // SGR + bool SetGraphicsRendition(const gsl::span /*options*/) noexcept override { return false; } // SGR - bool SetPrivateModes(const std::basic_string_view /*params*/) noexcept override { return false; } // DECSET + bool SetPrivateModes(const gsl::span /*params*/) noexcept override { return false; } // DECSET - bool ResetPrivateModes(const std::basic_string_view /*params*/) noexcept override { return false; } // DECRST + bool ResetPrivateModes(const gsl::span /*params*/) noexcept override { return false; } // DECRST bool DeviceStatusReport(const DispatchTypes::AnsiStatusType /*statusType*/) noexcept override { return false; } // DSR, DSR-OS, DSR-CPR bool DeviceAttributes() noexcept override { return false; } // DA1 @@ -110,5 +110,5 @@ class Microsoft::Console::VirtualTerminal::TermDispatch : public Microsoft::Cons // DTTERM_WindowManipulation bool WindowManipulation(const DispatchTypes::WindowManipulationType /*function*/, - const std::basic_string_view /*params*/) noexcept override { return false; } + const gsl::span /*params*/) noexcept override { return false; } }; diff --git a/src/terminal/input/terminalInput.cpp b/src/terminal/input/terminalInput.cpp index 7ebabde1a6c..54a99a925cd 100644 --- a/src/terminal/input/terminalInput.cpp +++ b/src/terminal/input/terminalInput.cpp @@ -276,10 +276,10 @@ void TerminalInput::ForceDisableWin32InputMode(const bool win32InputMode) noexce _forceDisableWin32InputMode = win32InputMode; } -static const std::basic_string_view _getKeyMapping(const KeyEvent& keyEvent, - const bool ansiMode, - const bool cursorApplicationMode, - const bool keypadApplicationMode) noexcept +static const gsl::span _getKeyMapping(const KeyEvent& keyEvent, + const bool ansiMode, + const bool cursorApplicationMode, + const bool keypadApplicationMode) noexcept { if (ansiMode) { @@ -327,7 +327,7 @@ static const std::basic_string_view _getKeyMapping(const KeyEvent& k // Return Value: // - Has value if there was a match to a key translation. static std::optional _searchKeyMapping(const KeyEvent& keyEvent, - std::basic_string_view keyMapping) noexcept + gsl::span keyMapping) noexcept { for (auto& map : keyMapping) { @@ -490,7 +490,7 @@ static bool _searchWithModifier(const KeyEvent& keyEvent, InputSender sender) // Return Value: // - True if there was a match to a key translation, and we successfully sent it to the input static bool _translateDefaultMapping(const KeyEvent& keyEvent, - const std::basic_string_view keyMapping, + const gsl::span keyMapping, InputSender sender) { const auto match = _searchKeyMapping(keyEvent, keyMapping); diff --git a/src/terminal/parser/IStateMachineEngine.hpp b/src/terminal/parser/IStateMachineEngine.hpp index 9b024438d63..c1a668fb72c 100644 --- a/src/terminal/parser/IStateMachineEngine.hpp +++ b/src/terminal/parser/IStateMachineEngine.hpp @@ -31,13 +31,13 @@ namespace Microsoft::Console::VirtualTerminal virtual bool ActionPassThroughString(const std::wstring_view string) = 0; virtual bool ActionEscDispatch(const wchar_t wch, - const std::basic_string_view intermediates) = 0; + const gsl::span intermediates) = 0; virtual bool ActionVt52EscDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) = 0; + const gsl::span intermediates, + const gsl::span parameters) = 0; virtual bool ActionCsiDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) = 0; + const gsl::span intermediates, + const gsl::span parameters) = 0; virtual bool ActionClear() = 0; @@ -48,7 +48,7 @@ namespace Microsoft::Console::VirtualTerminal const std::wstring_view string) = 0; virtual bool ActionSs3Dispatch(const wchar_t wch, - const std::basic_string_view parameters) = 0; + const gsl::span parameters) = 0; virtual bool ParseControlSequenceAfterSs3() const = 0; virtual bool FlushAtEndOfString() const = 0; diff --git a/src/terminal/parser/InputStateMachineEngine.cpp b/src/terminal/parser/InputStateMachineEngine.cpp index c364f95654f..55188cdb6d8 100644 --- a/src/terminal/parser/InputStateMachineEngine.cpp +++ b/src/terminal/parser/InputStateMachineEngine.cpp @@ -303,7 +303,7 @@ bool InputStateMachineEngine::ActionPassThroughString(const std::wstring_view st // Return Value: // - true iff we successfully dispatched the sequence. bool InputStateMachineEngine::ActionEscDispatch(const wchar_t wch, - const std::basic_string_view /*intermediates*/) + const gsl::span /*intermediates*/) { if (_pDispatch->IsVtInputEnabled() && _pfnFlushToInputQueue) { @@ -345,8 +345,8 @@ bool InputStateMachineEngine::ActionEscDispatch(const wchar_t wch, // Return Value: // - true iff we successfully dispatched the sequence. bool InputStateMachineEngine::ActionVt52EscDispatch(const wchar_t /*wch*/, - const std::basic_string_view /*intermediates*/, - const std::basic_string_view /*parameters*/) noexcept + const gsl::span /*intermediates*/, + const gsl::span /*parameters*/) noexcept { // VT52 escape sequences are not used in the input state machine. return false; @@ -363,8 +363,8 @@ bool InputStateMachineEngine::ActionVt52EscDispatch(const wchar_t /*wch*/, // Return Value: // - true iff we successfully dispatched the sequence. bool InputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) + const gsl::span intermediates, + const gsl::span parameters) { const auto actionCode = static_cast(wch); @@ -389,13 +389,13 @@ bool InputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, KeyEvent key; // This is all the args after the first arg, and the count of args not including the first one. - const auto remainingArgs = parameters.size() > 1 ? parameters.substr(1) : std::basic_string_view{}; + const auto remainingArgs = parameters.size() > 1 ? parameters.subspan(1) : gsl::span{}; bool success = false; // Handle intermediate characters, if any if (!intermediates.empty()) { - switch (static_cast(intermediates.at(0))) + switch (static_cast(gsl::at(intermediates, 0))) { case CsiIntermediateCodes::MOUSE_SGR: { @@ -522,7 +522,7 @@ bool InputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, // Return Value: // - true iff we successfully dispatched the sequence. bool InputStateMachineEngine::ActionSs3Dispatch(const wchar_t wch, - const std::basic_string_view /*parameters*/) + const gsl::span /*parameters*/) { if (_pDispatch->IsVtInputEnabled() && _pfnFlushToInputQueue) { @@ -800,12 +800,12 @@ bool InputStateMachineEngine::_WriteMouseEvent(const size_t column, const size_t // - actionCode - the actionCode for the sequence we're operating on. // Return Value: // - the INPUT_RECORD compatible modifier state. -DWORD InputStateMachineEngine::_GetCursorKeysModifierState(const std::basic_string_view parameters, const CsiActionCodes actionCode) noexcept +DWORD InputStateMachineEngine::_GetCursorKeysModifierState(const gsl::span parameters, const CsiActionCodes actionCode) noexcept { DWORD modifiers = 0; if (_IsModified(parameters.size()) && parameters.size() >= 2) { - modifiers = _GetModifier(parameters.at(1)); + modifiers = _GetModifier(gsl::at(parameters, 1)); } // Enhanced Keys (from https://docs.microsoft.com/en-us/windows/console/key-event-record-str): @@ -829,12 +829,12 @@ DWORD InputStateMachineEngine::_GetCursorKeysModifierState(const std::basic_stri // - parameters - the set of parameters to get the modifier state from. // Return Value: // - the INPUT_RECORD compatible modifier state. -DWORD InputStateMachineEngine::_GetGenericKeysModifierState(const std::basic_string_view parameters) noexcept +DWORD InputStateMachineEngine::_GetGenericKeysModifierState(const gsl::span parameters) noexcept { DWORD modifiers = 0; if (_IsModified(parameters.size()) && parameters.size() >= 2) { - modifiers = _GetModifier(parameters.at(1)); + modifiers = _GetModifier(gsl::at(parameters, 1)); } // Enhanced Keys (from https://docs.microsoft.com/en-us/windows/console/key-event-record-str): @@ -858,7 +858,7 @@ DWORD InputStateMachineEngine::_GetGenericKeysModifierState(const std::basic_str // - parameters - the set of parameters to get the modifier state from. // Return Value: // - the INPUT_RECORD compatible modifier state. -DWORD InputStateMachineEngine::_GetSGRMouseModifierState(const std::basic_string_view parameters) noexcept +DWORD InputStateMachineEngine::_GetSGRMouseModifierState(const gsl::span parameters) noexcept { DWORD modifiers = 0; if (parameters.size() == 3) @@ -922,7 +922,7 @@ DWORD InputStateMachineEngine::_GetModifier(const size_t modifierParam) noexcept // Return Value: // true iff we were able to synthesize buttonState bool InputStateMachineEngine::_UpdateSGRMouseButtonState(const wchar_t wch, - const std::basic_string_view parameters, + const gsl::span parameters, DWORD& buttonState, DWORD& eventFlags) noexcept { @@ -1024,7 +1024,7 @@ bool InputStateMachineEngine::_UpdateSGRMouseButtonState(const wchar_t wch, // - vkey: Receives the vkey // Return Value: // true iff we found the key -bool InputStateMachineEngine::_GetGenericVkey(const std::basic_string_view parameters, short& vkey) const +bool InputStateMachineEngine::_GetGenericVkey(const gsl::span parameters, short& vkey) const { vkey = 0; if (parameters.empty()) @@ -1200,7 +1200,7 @@ void InputStateMachineEngine::SetFlushToInputQueueCallback(std::function // - function - Receives the function type // Return Value: // - True iff we successfully pulled the function type from the parameters -bool InputStateMachineEngine::_GetWindowManipulationType(const std::basic_string_view parameters, +bool InputStateMachineEngine::_GetWindowManipulationType(const gsl::span parameters, unsigned int& function) const noexcept { bool success = false; @@ -1234,7 +1234,7 @@ bool InputStateMachineEngine::_GetWindowManipulationType(const std::basic_string // - column - Receives the X/Column position // Return Value: // - True if we successfully pulled the cursor coordinates from the parameters we've stored. False otherwise. -bool InputStateMachineEngine::_GetXYPosition(const std::basic_string_view parameters, +bool InputStateMachineEngine::_GetXYPosition(const gsl::span parameters, size_t& line, size_t& column) const noexcept { @@ -1283,7 +1283,7 @@ bool InputStateMachineEngine::_GetXYPosition(const std::basic_string_view parameters, +bool InputStateMachineEngine::_GetSGRXYPosition(const gsl::span parameters, size_t& line, size_t& column) const noexcept { @@ -1322,7 +1322,7 @@ bool InputStateMachineEngine::_GetSGRXYPosition(const std::basic_string_view parameters, +bool InputStateMachineEngine::_GenerateWin32Key(const gsl::span parameters, KeyEvent& key) { // Sequences are formatted as follows: @@ -1347,22 +1347,22 @@ bool InputStateMachineEngine::_GenerateWin32Key(const std::basic_string_view(parameters.at(5))); + key.SetRepeatCount(::base::saturated_cast(gsl::at(parameters, 5))); [[fallthrough]]; case 5: - key.SetActiveModifierKeys(::base::saturated_cast(parameters.at(4))); + key.SetActiveModifierKeys(::base::saturated_cast(gsl::at(parameters, 4))); [[fallthrough]]; case 4: - key.SetKeyDown(static_cast(parameters.at(3))); + key.SetKeyDown(static_cast(gsl::at(parameters, 3))); [[fallthrough]]; case 3: - key.SetCharData(static_cast(parameters.at(2))); + key.SetCharData(static_cast(gsl::at(parameters, 2))); [[fallthrough]]; case 2: - key.SetVirtualScanCode(::base::saturated_cast(parameters.at(1))); + key.SetVirtualScanCode(::base::saturated_cast(gsl::at(parameters, 1))); [[fallthrough]]; case 1: - key.SetVirtualKeyCode(::base::saturated_cast(parameters.at(0))); + key.SetVirtualKeyCode(::base::saturated_cast(gsl::at(parameters, 0))); break; } diff --git a/src/terminal/parser/InputStateMachineEngine.hpp b/src/terminal/parser/InputStateMachineEngine.hpp index 922b3623613..14f6cedc188 100644 --- a/src/terminal/parser/InputStateMachineEngine.hpp +++ b/src/terminal/parser/InputStateMachineEngine.hpp @@ -146,15 +146,15 @@ namespace Microsoft::Console::VirtualTerminal bool ActionPassThroughString(const std::wstring_view string) override; bool ActionEscDispatch(const wchar_t wch, - const std::basic_string_view intermediates) override; + const gsl::span intermediates) override; bool ActionVt52EscDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) noexcept override; + const gsl::span intermediates, + const gsl::span parameters) noexcept override; bool ActionCsiDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) override; + const gsl::span intermediates, + const gsl::span parameters) override; bool ActionClear() noexcept override; @@ -165,7 +165,7 @@ namespace Microsoft::Console::VirtualTerminal const std::wstring_view string) noexcept override; bool ActionSs3Dispatch(const wchar_t wch, - const std::basic_string_view parameters) override; + const gsl::span parameters) override; bool ParseControlSequenceAfterSs3() const noexcept override; bool FlushAtEndOfString() const noexcept override; @@ -180,19 +180,19 @@ namespace Microsoft::Console::VirtualTerminal bool _lookingForDSR; DWORD _mouseButtonState = 0; - DWORD _GetCursorKeysModifierState(const std::basic_string_view parameters, const CsiActionCodes actionCode) noexcept; - DWORD _GetGenericKeysModifierState(const std::basic_string_view parameters) noexcept; - DWORD _GetSGRMouseModifierState(const std::basic_string_view parameters) noexcept; + DWORD _GetCursorKeysModifierState(const gsl::span parameters, const CsiActionCodes actionCode) noexcept; + DWORD _GetGenericKeysModifierState(const gsl::span parameters) noexcept; + DWORD _GetSGRMouseModifierState(const gsl::span parameters) noexcept; bool _GenerateKeyFromChar(const wchar_t wch, short& vkey, DWORD& modifierState) noexcept; bool _IsModified(const size_t paramCount) noexcept; DWORD _GetModifier(const size_t parameter) noexcept; bool _UpdateSGRMouseButtonState(const wchar_t wch, - const std::basic_string_view parameters, + const gsl::span parameters, DWORD& buttonState, DWORD& eventFlags) noexcept; - bool _GetGenericVkey(const std::basic_string_view parameters, + bool _GetGenericVkey(const gsl::span parameters, short& vkey) const; bool _GetCursorKeysVkey(const wchar_t wch, short& vkey) const; bool _GetSs3KeysVkey(const wchar_t wch, short& vkey) const; @@ -212,17 +212,17 @@ namespace Microsoft::Console::VirtualTerminal const DWORD modifierState, std::vector& input); - bool _GetWindowManipulationType(const std::basic_string_view parameters, + bool _GetWindowManipulationType(const gsl::span parameters, unsigned int& function) const noexcept; - bool _GenerateWin32Key(const std::basic_string_view parameters, KeyEvent& key); + bool _GenerateWin32Key(const gsl::span parameters, KeyEvent& key); static constexpr size_t DefaultLine = 1; static constexpr size_t DefaultColumn = 1; - bool _GetXYPosition(const std::basic_string_view parameters, + bool _GetXYPosition(const gsl::span parameters, size_t& line, size_t& column) const noexcept; - bool _GetSGRXYPosition(const std::basic_string_view parameters, + bool _GetSGRXYPosition(const gsl::span parameters, size_t& line, size_t& column) const noexcept; diff --git a/src/terminal/parser/OutputStateMachineEngine.cpp b/src/terminal/parser/OutputStateMachineEngine.cpp index 584548199cf..363221caccc 100644 --- a/src/terminal/parser/OutputStateMachineEngine.cpp +++ b/src/terminal/parser/OutputStateMachineEngine.cpp @@ -184,7 +184,7 @@ bool OutputStateMachineEngine::ActionPassThroughString(const std::wstring_view s // Return Value: // - true iff we successfully dispatched the sequence. bool OutputStateMachineEngine::ActionEscDispatch(const wchar_t wch, - const std::basic_string_view intermediates) + const gsl::span intermediates) { bool success = false; @@ -317,8 +317,8 @@ bool OutputStateMachineEngine::ActionEscDispatch(const wchar_t wch, // Return Value: // - true iff we successfully dispatched the sequence. bool OutputStateMachineEngine::ActionVt52EscDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) + const gsl::span intermediates, + const gsl::span parameters) { bool success = false; @@ -360,7 +360,7 @@ bool OutputStateMachineEngine::ActionVt52EscDispatch(const wchar_t wch, case Vt52ActionCodes::DirectCursorAddress: // VT52 cursor addresses are provided as ASCII characters, with // the lowest value being a space, representing an address of 1. - success = _dispatch->CursorPosition(parameters.at(0) - ' ' + 1, parameters.at(1) - ' ' + 1); + success = _dispatch->CursorPosition(gsl::at(parameters, 0) - ' ' + 1, gsl::at(parameters, 1) - ' ' + 1); break; case Vt52ActionCodes::Identify: success = _dispatch->Vt52DeviceAttributes(); @@ -397,15 +397,15 @@ bool OutputStateMachineEngine::ActionVt52EscDispatch(const wchar_t wch, // Return Value: // - True if handled successfully. False otherwise. bool OutputStateMachineEngine::_IntermediateScsDispatch(const wchar_t wch, - const std::basic_string_view intermediates) + const gsl::span intermediates) { bool success = false; // If we have more than one intermediate, the second intermediate forms part of // the charset identifier. Otherwise it's identified by just the final character. - const auto charset = intermediates.size() > 1 ? std::make_pair(intermediates.at(1), wch) : std::make_pair(wch, L'\0'); + const auto charset = intermediates.size() > 1 ? std::make_pair(gsl::at(intermediates, 1), wch) : std::make_pair(wch, L'\0'); - switch (intermediates.at(0)) + switch (gsl::at(intermediates, 0)) { case L'(': success = _dispatch->Designate94Charset(0, charset); @@ -451,8 +451,8 @@ bool OutputStateMachineEngine::_IntermediateScsDispatch(const wchar_t wch, // Return Value: // - true iff we successfully dispatched the sequence. bool OutputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - std::basic_string_view parameters) + const gsl::span intermediates, + gsl::span parameters) { bool success = false; size_t distance = 0; @@ -470,7 +470,7 @@ bool OutputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, DispatchTypes::AnsiStatusType deviceStatusType = static_cast(0); // there is no default status type. size_t repeatCount = 0; // This is all the args after the first arg, and the count of args not including the first one. - const auto remainingParams = parameters.size() > 1 ? parameters.substr(1) : std::basic_string_view{}; + const auto remainingParams = parameters.size() > 1 ? parameters.subspan(1) : gsl::span{}; if (intermediates.empty()) { @@ -737,7 +737,7 @@ bool OutputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, // Return Value: // - True if handled successfully. False otherwise. bool OutputStateMachineEngine::_IntermediateQuestionMarkDispatch(const wchar_t wchAction, - const std::basic_string_view parameters) + const gsl::span parameters) { bool success = false; @@ -787,7 +787,7 @@ bool OutputStateMachineEngine::_IntermediateQuestionMarkDispatch(const wchar_t w // - True if handled successfully. False otherwise. bool OutputStateMachineEngine::_IntermediateGreaterThanOrEqualDispatch(const wchar_t wch, const wchar_t intermediate, - const std::basic_string_view parameters) + const gsl::span parameters) { bool success = false; @@ -846,7 +846,7 @@ bool OutputStateMachineEngine::_IntermediateExclamationDispatch(const wchar_t wc // Return Value: // - True if handled successfully. False otherwise. bool OutputStateMachineEngine::_IntermediateSpaceDispatch(const wchar_t wchAction, - const std::basic_string_view parameters) + const gsl::span parameters) { bool success = false; DispatchTypes::CursorStyle cursorStyle = DefaultCursorStyle; @@ -1022,7 +1022,7 @@ bool OutputStateMachineEngine::ActionOscDispatch(const wchar_t /*wch*/, // Return Value: // - true iff we successfully dispatched the sequence. bool OutputStateMachineEngine::ActionSs3Dispatch(const wchar_t /*wch*/, - const std::basic_string_view /*parameters*/) noexcept + const gsl::span /*parameters*/) noexcept { // The output engine doesn't handle any SS3 sequences. _ClearLastChar(); @@ -1036,7 +1036,7 @@ bool OutputStateMachineEngine::ActionSs3Dispatch(const wchar_t /*wch*/, // - options - Space that will be filled with valid options from the GraphicsOptions enum // Return Value: // - True if we successfully retrieved an array of valid graphics options from the parameters we've stored. False otherwise. -bool OutputStateMachineEngine::_GetGraphicsOptions(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetGraphicsOptions(const gsl::span parameters, std::vector& options) const { bool success = false; @@ -1072,7 +1072,7 @@ bool OutputStateMachineEngine::_GetGraphicsOptions(const std::basic_string_view< // - eraseType - Receives the erase type parameter // Return Value: // - True if we successfully pulled an erase type from the parameters we've stored. False otherwise. -bool OutputStateMachineEngine::_GetEraseOperation(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetEraseOperation(const gsl::span parameters, DispatchTypes::EraseType& eraseType) const noexcept { bool success = false; // If we have too many parameters or don't know what to do with the given value, return false. @@ -1111,7 +1111,7 @@ bool OutputStateMachineEngine::_GetEraseOperation(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetCursorDistance(const gsl::span parameters, size_t& distance) const noexcept { bool success = false; @@ -1145,7 +1145,7 @@ bool OutputStateMachineEngine::_GetCursorDistance(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetScrollDistance(const gsl::span parameters, size_t& distance) const noexcept { bool success = false; @@ -1179,7 +1179,7 @@ bool OutputStateMachineEngine::_GetScrollDistance(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetConsoleWidth(const gsl::span parameters, size_t& consoleWidth) const noexcept { bool success = false; @@ -1214,7 +1214,7 @@ bool OutputStateMachineEngine::_GetConsoleWidth(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetXYPosition(const gsl::span parameters, size_t& line, size_t& column) const noexcept { @@ -1263,7 +1263,7 @@ bool OutputStateMachineEngine::_GetXYPosition(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetTopBottomMargins(const gsl::span parameters, size_t& topMargin, size_t& bottomMargin) const noexcept { @@ -1308,7 +1308,7 @@ bool OutputStateMachineEngine::_GetTopBottomMargins(const std::basic_string_view // - statusType - Receives the Status Type parameter // Return Value: // - True if we successfully found a device operation in the parameters stored. False otherwise. -bool OutputStateMachineEngine::_GetDeviceStatusOperation(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetDeviceStatusOperation(const gsl::span parameters, DispatchTypes::AnsiStatusType& statusType) const noexcept { bool success = false; @@ -1343,7 +1343,7 @@ bool OutputStateMachineEngine::_GetDeviceStatusOperation(const std::basic_string // - privateModes - Space that will be filled with valid params from the PrivateModeParams enum // Return Value: // - True if we successfully retrieved an array of private mode params from the parameters we've stored. False otherwise. -bool OutputStateMachineEngine::_GetPrivateModeParams(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetPrivateModeParams(const gsl::span parameters, std::vector& privateModes) const { bool success = false; @@ -1364,7 +1364,7 @@ bool OutputStateMachineEngine::_GetPrivateModeParams(const std::basic_string_vie // - parameters - The parameters to parse // Return Value: // - True if there were no parameters. False otherwise. -bool OutputStateMachineEngine::_VerifyHasNoParameters(const std::basic_string_view parameters) const noexcept +bool OutputStateMachineEngine::_VerifyHasNoParameters(const gsl::span parameters) const noexcept { return parameters.empty(); } @@ -1376,7 +1376,7 @@ bool OutputStateMachineEngine::_VerifyHasNoParameters(const std::basic_string_vi // - parameters - The parameters to parse // Return Value: // - True if the DA params were valid. False otherwise. -bool OutputStateMachineEngine::_VerifyDeviceAttributesParams(const std::basic_string_view parameters) const noexcept +bool OutputStateMachineEngine::_VerifyDeviceAttributesParams(const gsl::span parameters) const noexcept { bool success = false; @@ -1417,7 +1417,7 @@ bool OutputStateMachineEngine::_GetOscTitle(const std::wstring_view string, // - distance - Receives the distance // Return Value: // - True if we successfully pulled the tab distance from the parameters we've stored. False otherwise. -bool OutputStateMachineEngine::_GetTabDistance(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetTabDistance(const gsl::span parameters, size_t& distance) const noexcept { bool success = false; @@ -1451,7 +1451,7 @@ bool OutputStateMachineEngine::_GetTabDistance(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetTabClearType(const gsl::span parameters, size_t& clearType) const noexcept { bool success = false; @@ -1628,7 +1628,7 @@ bool OutputStateMachineEngine::s_ParseColorSpec(const std::wstring_view string, for (size_t component = 0; component < 3; component++) { bool foundColor = false; - auto& value = colorValues.at(component); + auto& value = gsl::at(colorValues, component); for (size_t i = 0; i < 3; i++) { const wchar_t wch = *curr++; @@ -1803,7 +1803,7 @@ bool OutputStateMachineEngine::_GetOscSetColor(const std::wstring_view string, // - function - Receives the function type // Return Value: // - True iff we successfully pulled the function type from the parameters -bool OutputStateMachineEngine::_GetWindowManipulationType(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetWindowManipulationType(const gsl::span parameters, unsigned int& function) const noexcept { bool success = false; @@ -1837,7 +1837,7 @@ bool OutputStateMachineEngine::_GetWindowManipulationType(const std::basic_strin // - cursorStyle - Receives the cursorStyle // Return Value: // - True if we successfully pulled the cursor style from the parameters we've stored. False otherwise. -bool OutputStateMachineEngine::_GetCursorStyle(const std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetCursorStyle(const gsl::span parameters, DispatchTypes::CursorStyle& cursorStyle) const noexcept { bool success = false; @@ -1886,7 +1886,7 @@ void OutputStateMachineEngine::SetTerminalConnection(ITerminalOutputConnection* // Return Value: // - True if we successfully pulled the repeat count from the parameters. // False otherwise. -bool OutputStateMachineEngine::_GetRepeatCount(std::basic_string_view parameters, +bool OutputStateMachineEngine::_GetRepeatCount(gsl::span parameters, size_t& repeatCount) const noexcept { bool success = false; diff --git a/src/terminal/parser/OutputStateMachineEngine.hpp b/src/terminal/parser/OutputStateMachineEngine.hpp index 924239289a6..bce98255e0e 100644 --- a/src/terminal/parser/OutputStateMachineEngine.hpp +++ b/src/terminal/parser/OutputStateMachineEngine.hpp @@ -34,15 +34,15 @@ namespace Microsoft::Console::VirtualTerminal bool ActionPassThroughString(const std::wstring_view string) override; bool ActionEscDispatch(const wchar_t wch, - const std::basic_string_view intermediates) override; + const gsl::span intermediates) override; bool ActionVt52EscDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) override; + const gsl::span intermediates, + const gsl::span parameters) override; bool ActionCsiDispatch(const wchar_t wch, - const std::basic_string_view intermediates, - const std::basic_string_view parameters) override; + const gsl::span intermediates, + const gsl::span parameters) override; bool ActionClear() noexcept override; @@ -53,7 +53,7 @@ namespace Microsoft::Console::VirtualTerminal const std::wstring_view string) override; bool ActionSs3Dispatch(const wchar_t wch, - const std::basic_string_view parameters) noexcept override; + const gsl::span parameters) noexcept override; bool ParseControlSequenceAfterSs3() const noexcept override; bool FlushAtEndOfString() const noexcept override; @@ -74,15 +74,15 @@ namespace Microsoft::Console::VirtualTerminal std::vector _graphicsOptions; bool _IntermediateScsDispatch(const wchar_t wch, - const std::basic_string_view intermediates); + const gsl::span intermediates); bool _IntermediateQuestionMarkDispatch(const wchar_t wchAction, - const std::basic_string_view parameters); + const gsl::span parameters); bool _IntermediateGreaterThanOrEqualDispatch(const wchar_t wch, const wchar_t intermediate, - const std::basic_string_view parameters); + const gsl::span parameters); bool _IntermediateExclamationDispatch(const wchar_t wch); bool _IntermediateSpaceDispatch(const wchar_t wchAction, - const std::basic_string_view parameters); + const gsl::span parameters); enum VTActionCodes : wchar_t { @@ -180,44 +180,44 @@ namespace Microsoft::Console::VirtualTerminal }; static constexpr DispatchTypes::GraphicsOptions DefaultGraphicsOption = DispatchTypes::GraphicsOptions::Off; - bool _GetGraphicsOptions(const std::basic_string_view parameters, + bool _GetGraphicsOptions(const gsl::span parameters, std::vector& options) const; static constexpr DispatchTypes::EraseType DefaultEraseType = DispatchTypes::EraseType::ToEnd; - bool _GetEraseOperation(const std::basic_string_view parameters, + bool _GetEraseOperation(const gsl::span parameters, DispatchTypes::EraseType& eraseType) const noexcept; static constexpr size_t DefaultCursorDistance = 1; - bool _GetCursorDistance(const std::basic_string_view parameters, + bool _GetCursorDistance(const gsl::span parameters, size_t& distance) const noexcept; static constexpr size_t DefaultScrollDistance = 1; - bool _GetScrollDistance(const std::basic_string_view parameters, + bool _GetScrollDistance(const gsl::span parameters, size_t& distance) const noexcept; static constexpr size_t DefaultConsoleWidth = 80; - bool _GetConsoleWidth(const std::basic_string_view parameters, + bool _GetConsoleWidth(const gsl::span parameters, size_t& consoleWidth) const noexcept; static constexpr size_t DefaultLine = 1; static constexpr size_t DefaultColumn = 1; - bool _GetXYPosition(const std::basic_string_view parameters, + bool _GetXYPosition(const gsl::span parameters, size_t& line, size_t& column) const noexcept; - bool _GetDeviceStatusOperation(const std::basic_string_view parameters, + bool _GetDeviceStatusOperation(const gsl::span parameters, DispatchTypes::AnsiStatusType& statusType) const noexcept; - bool _VerifyHasNoParameters(const std::basic_string_view parameters) const noexcept; + bool _VerifyHasNoParameters(const gsl::span parameters) const noexcept; - bool _VerifyDeviceAttributesParams(const std::basic_string_view parameters) const noexcept; + bool _VerifyDeviceAttributesParams(const gsl::span parameters) const noexcept; - bool _GetPrivateModeParams(const std::basic_string_view parameters, + bool _GetPrivateModeParams(const gsl::span parameters, std::vector& privateModes) const; static constexpr size_t DefaultTopMargin = 0; static constexpr size_t DefaultBottomMargin = 0; - bool _GetTopBottomMargins(const std::basic_string_view parameters, + bool _GetTopBottomMargins(const gsl::span parameters, size_t& topMargin, size_t& bottomMargin) const noexcept; @@ -225,15 +225,15 @@ namespace Microsoft::Console::VirtualTerminal std::wstring& title) const; static constexpr size_t DefaultTabDistance = 1; - bool _GetTabDistance(const std::basic_string_view parameters, + bool _GetTabDistance(const gsl::span parameters, size_t& distance) const noexcept; static constexpr size_t DefaultTabClearType = 0; - bool _GetTabClearType(const std::basic_string_view parameters, + bool _GetTabClearType(const gsl::span parameters, size_t& clearType) const noexcept; static constexpr DispatchTypes::WindowManipulationType DefaultWindowManipulationType = DispatchTypes::WindowManipulationType::Invalid; - bool _GetWindowManipulationType(const std::basic_string_view parameters, + bool _GetWindowManipulationType(const gsl::span parameters, unsigned int& function) const noexcept; static bool s_HexToUint(const wchar_t wch, @@ -249,11 +249,11 @@ namespace Microsoft::Console::VirtualTerminal DWORD& rgb) const noexcept; static constexpr DispatchTypes::CursorStyle DefaultCursorStyle = DispatchTypes::CursorStyle::BlinkingBlockDefault; - bool _GetCursorStyle(const std::basic_string_view parameters, + bool _GetCursorStyle(const gsl::span parameters, DispatchTypes::CursorStyle& cursorStyle) const noexcept; static constexpr size_t DefaultRepeatCount = 1; - bool _GetRepeatCount(const std::basic_string_view parameters, + bool _GetRepeatCount(const gsl::span parameters, size_t& repeatCount) const noexcept; bool _GetOscSetClipboard(const std::wstring_view string, diff --git a/src/terminal/parser/ut_parser/InputEngineTest.cpp b/src/terminal/parser/ut_parser/InputEngineTest.cpp index b631dfa4a62..6873df476aa 100644 --- a/src/terminal/parser/ut_parser/InputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/InputEngineTest.cpp @@ -327,7 +327,7 @@ class Microsoft::Console::VirtualTerminal::TestInteractDispatch final : public I virtual bool WriteCtrlKey(const KeyEvent& event) override; virtual bool WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) override; // DTTERM_WindowManipulation + const gsl::span parameters) override; // DTTERM_WindowManipulation virtual bool WriteString(const std::wstring_view string) override; virtual bool MoveCursor(const size_t row, @@ -362,14 +362,14 @@ bool TestInteractDispatch::WriteCtrlKey(const KeyEvent& event) } bool TestInteractDispatch::WindowManipulation(const DispatchTypes::WindowManipulationType function, - const std::basic_string_view parameters) + const gsl::span parameters) { VERIFY_ARE_EQUAL(true, _testState->_expectedToCallWindowManipulation); VERIFY_ARE_EQUAL(_testState->_expectedWindowManipulation, function); for (size_t i = 0; i < parameters.size(); i++) { unsigned short actual; - VERIFY_SUCCEEDED(SizeTToUShort(parameters.at(i), &actual)); + VERIFY_SUCCEEDED(SizeTToUShort(gsl::at(parameters, i), &actual)); VERIFY_ARE_EQUAL(_testState->_expectedParams[i], actual); } return true; diff --git a/src/terminal/parser/ut_parser/OutputEngineTest.cpp b/src/terminal/parser/ut_parser/OutputEngineTest.cpp index 9ad20cddb35..3fed8788791 100644 --- a/src/terminal/parser/ut_parser/OutputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/OutputEngineTest.cpp @@ -748,10 +748,10 @@ class StatefulDispatch final : public TermDispatch return true; } - bool SetGraphicsRendition(const std::basic_string_view options) noexcept override + bool SetGraphicsRendition(const gsl::span options) noexcept override try { - _options.assign(options.cbegin(), options.cend()); + _options.assign(options.begin(), options.end()); _setGraphics = true; return true; } @@ -841,7 +841,7 @@ class StatefulDispatch final : public TermDispatch return fSuccess; } - bool _SetResetPrivateModesHelper(const std::basic_string_view params, + bool _SetResetPrivateModesHelper(const gsl::span params, const bool enable) { size_t cFailures = 0; @@ -852,12 +852,12 @@ class StatefulDispatch final : public TermDispatch return cFailures == 0; } - bool SetPrivateModes(const std::basic_string_view params) noexcept override + bool SetPrivateModes(const gsl::span params) noexcept override { return _SetResetPrivateModesHelper(params, true); } - bool ResetPrivateModes(const std::basic_string_view params) noexcept override + bool ResetPrivateModes(const gsl::span params) noexcept override { return _SetResetPrivateModesHelper(params, false); } @@ -1545,7 +1545,7 @@ class StateMachineExternalTest final VERIFY_ARE_EQUAL(expectedDispatchTypes, pDispatch->_eraseType); } - void VerifyDispatchTypes(const std::basic_string_view expectedOptions, + void VerifyDispatchTypes(const gsl::span expectedOptions, const StatefulDispatch& dispatch) { VERIFY_ARE_EQUAL(expectedOptions.size(), dispatch._options.size()); @@ -1557,14 +1557,14 @@ class StateMachineExternalTest final if (i < expectedOptions.size()) { - expectedOption = expectedOptions.at(i); + expectedOption = gsl::at(expectedOptions, i); } - optionsValid = expectedOption == dispatch._options.at(i); + optionsValid = expectedOption == gsl::at(dispatch._options, i); if (!optionsValid) { - Log::Comment(NoThrowString().Format(L"Graphics option match failed, index [%zu]. Expected: '%d' Actual: '%d'", i, expectedOption, dispatch._options.at(i))); + Log::Comment(NoThrowString().Format(L"Graphics option match failed, index [%zu]. Expected: '%d' Actual: '%d'", i, expectedOption, gsl::at(dispatch._options, i))); break; } } diff --git a/src/terminal/parser/ut_parser/StateMachineTest.cpp b/src/terminal/parser/ut_parser/StateMachineTest.cpp index d82a46b87d6..74e29ea72af 100644 --- a/src/terminal/parser/ut_parser/StateMachineTest.cpp +++ b/src/terminal/parser/ut_parser/StateMachineTest.cpp @@ -51,11 +51,11 @@ class Microsoft::Console::VirtualTerminal::TestStateMachineEngine : public IStat }; bool ActionEscDispatch(const wchar_t /* wch */, - const std::basic_string_view /* intermediates */) override { return true; }; + const gsl::span /* intermediates */) override { return true; }; bool ActionVt52EscDispatch(const wchar_t /*wch*/, - const std::basic_string_view /*intermediates*/, - const std::basic_string_view /*parameters*/) override { return true; }; + const gsl::span /*intermediates*/, + const gsl::span /*parameters*/) override { return true; }; bool ActionClear() override { return true; }; @@ -74,7 +74,7 @@ class Microsoft::Console::VirtualTerminal::TestStateMachineEngine : public IStat }; bool ActionSs3Dispatch(const wchar_t /* wch */, - const std::basic_string_view /* parameters */) override { return true; }; + const gsl::span /* parameters */) override { return true; }; bool ParseControlSequenceAfterSs3() const override { return false; } bool FlushAtEndOfString() const override { return false; }; @@ -83,8 +83,8 @@ class Microsoft::Console::VirtualTerminal::TestStateMachineEngine : public IStat // ActionCsiDispatch is the only method that's actually implemented. bool ActionCsiDispatch(const wchar_t /*wch*/, - const std::basic_string_view /*intermediates*/, - const std::basic_string_view parameters) override + const gsl::span /*intermediates*/, + const gsl::span parameters) override { // If flush to terminal is registered for a test, then use it. if (pfnFlushToTerminal) @@ -94,7 +94,7 @@ class Microsoft::Console::VirtualTerminal::TestStateMachineEngine : public IStat } else { - csiParams.emplace(parameters.cbegin(), parameters.cend()); + csiParams.emplace(parameters.begin(), parameters.end()); return true; } } diff --git a/src/tsf/TfConvArea.cpp b/src/tsf/TfConvArea.cpp index a9de302ebb4..b9ab24b4f65 100644 --- a/src/tsf/TfConvArea.cpp +++ b/src/tsf/TfConvArea.cpp @@ -45,8 +45,8 @@ Revision History: const auto encodedAttributes = _DisplayAttributesToEncodedAttributes(DisplayAttributes, CompCursorPos); - std::basic_string_view attributes(encodedAttributes.data(), encodedAttributes.size()); - std::basic_string_view colorArray(colors.data(), colors.size()); + gsl::span attributes(encodedAttributes.data(), encodedAttributes.size()); + gsl::span colorArray(colors.data(), colors.size()); return ImeComposeData(CompStr, attributes, colorArray); } diff --git a/src/types/ScreenInfoUiaProviderBase.cpp b/src/types/ScreenInfoUiaProviderBase.cpp index d92bb4b458b..b5cb4d44263 100644 --- a/src/types/ScreenInfoUiaProviderBase.cpp +++ b/src/types/ScreenInfoUiaProviderBase.cpp @@ -9,21 +9,21 @@ using namespace Microsoft::Console::Types; // A helper function to create a SafeArray Version of an int array of a specified length -SAFEARRAY* BuildIntSafeArray(std::basic_string_view data) +SAFEARRAY* BuildIntSafeArray(gsl::span data) { SAFEARRAY* psa = SafeArrayCreateVector(VT_I4, 0, gsl::narrow(data.size())); if (psa != nullptr) { - for (size_t i = 0; i < data.size(); i++) + LONG lIndex{ 0 }; + for (auto val : data) { - LONG lIndex = 0; - if (FAILED(SizeTToLong(i, &lIndex)) || - FAILED(SafeArrayPutElement(psa, &lIndex, (void*)&(data.at(i))))) + if (FAILED(SafeArrayPutElement(psa, &lIndex, (void*)&val))) { SafeArrayDestroy(psa); psa = nullptr; break; } + ++lIndex; } } @@ -191,7 +191,7 @@ IFACEMETHODIMP ScreenInfoUiaProviderBase::GetRuntimeId(_Outptr_result_maybenull_ // AppendRuntimeId is a magic Number that tells UIAutomation to Append its own Runtime ID(From the HWND) const std::array rId{ UiaAppendRuntimeId, -1 }; - const std::basic_string_view span{ rId.data(), rId.size() }; + const gsl::span span{ rId.data(), rId.size() }; // BuildIntSafeArray is a custom function to hide the SafeArray creation *ppRuntimeId = BuildIntSafeArray(span); RETURN_IF_NULL_ALLOC(*ppRuntimeId); From 09471c3753d888abcfd160dae524988003da862a Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Wed, 15 Jul 2020 10:29:36 -0700 Subject: [PATCH 05/14] Replace gsl::at with a new til::at(span) for pre-checked bounds (#6925) The recent changes to use gsl::span everywhere added a few bounds checks along codepaths where we were already checking bounds. Some of them may be non-obvious to the optimizer, so we can now use til::at to help them along. To accomplish this, I've added a new overload of til::at that takes a span and directly accesses its backing buffer. --- src/buffer/out/AttrRow.cpp | 2 +- src/buffer/out/OutputCellIterator.cpp | 12 +++--- src/buffer/out/TextColor.cpp | 8 ++-- src/host/alias.cpp | 12 +++--- src/host/dbcs.cpp | 4 +- src/host/getset.cpp | 6 +-- src/host/history.cpp | 4 +- src/inc/til/at.h | 37 ++++++++++++++++++- src/renderer/gdi/paint.cpp | 2 +- .../parser/InputStateMachineEngine.cpp | 18 ++++----- .../parser/OutputStateMachineEngine.cpp | 6 +-- .../parser/ut_parser/InputEngineTest.cpp | 2 +- .../parser/ut_parser/OutputEngineTest.cpp | 6 +-- src/types/utils.cpp | 8 ++-- 14 files changed, 81 insertions(+), 46 deletions(-) diff --git a/src/buffer/out/AttrRow.cpp b/src/buffer/out/AttrRow.cpp index 548999bccc7..5df4da3978d 100644 --- a/src/buffer/out/AttrRow.cpp +++ b/src/buffer/out/AttrRow.cpp @@ -250,7 +250,7 @@ void ATTR_ROW::ReplaceAttrs(const TextAttribute& toBeReplacedAttr, const TextAtt if (newAttrs.size() == 1) { // Get the new color attribute we're trying to apply - const TextAttribute NewAttr = gsl::at(newAttrs, 0).GetAttributes(); + const TextAttribute NewAttr = til::at(newAttrs, 0).GetAttributes(); // If the existing run was only 1 element... // ...and the new color is the same as the old, we don't have to do anything and can exit quick. diff --git a/src/buffer/out/OutputCellIterator.cpp b/src/buffer/out/OutputCellIterator.cpp index 9dc5b14574c..d32087fe9e6 100644 --- a/src/buffer/out/OutputCellIterator.cpp +++ b/src/buffer/out/OutputCellIterator.cpp @@ -114,7 +114,7 @@ OutputCellIterator::OutputCellIterator(const std::wstring_view utf16Text, const // - legacyAttrs - One legacy color item per cell OutputCellIterator::OutputCellIterator(const gsl::span legacyAttrs) noexcept : _mode(Mode::LegacyAttr), - _currentView(s_GenerateViewLegacyAttr(gsl::at(legacyAttrs, 0))), + _currentView(s_GenerateViewLegacyAttr(til::at(legacyAttrs, 0))), _run(legacyAttrs), _attr(InvalidTextAttribute), _distance(0), @@ -129,7 +129,7 @@ OutputCellIterator::OutputCellIterator(const gsl::span legacyAttrs) // - charInfos - Multiple cell with unicode text and legacy color data. OutputCellIterator::OutputCellIterator(const gsl::span charInfos) noexcept : _mode(Mode::CharInfo), - _currentView(s_GenerateView(gsl::at(charInfos, 0))), + _currentView(s_GenerateView(til::at(charInfos, 0))), _run(charInfos), _attr(InvalidTextAttribute), _distance(0), @@ -144,7 +144,7 @@ OutputCellIterator::OutputCellIterator(const gsl::span charInfo // - cells - Multiple cells in a run OutputCellIterator::OutputCellIterator(const gsl::span cells) : _mode(Mode::Cell), - _currentView(s_GenerateView(gsl::at(cells, 0))), + _currentView(s_GenerateView(til::at(cells, 0))), _run(cells), _attr(InvalidTextAttribute), _distance(0), @@ -265,7 +265,7 @@ OutputCellIterator& OutputCellIterator::operator++() _pos++; if (operator bool()) { - _currentView = s_GenerateView(gsl::at(std::get>(_run), _pos)); + _currentView = s_GenerateView(til::at(std::get>(_run), _pos)); } break; } @@ -275,7 +275,7 @@ OutputCellIterator& OutputCellIterator::operator++() _pos++; if (operator bool()) { - _currentView = s_GenerateView(gsl::at(std::get>(_run), _pos)); + _currentView = s_GenerateView(til::at(std::get>(_run), _pos)); } break; } @@ -285,7 +285,7 @@ OutputCellIterator& OutputCellIterator::operator++() _pos++; if (operator bool()) { - _currentView = s_GenerateViewLegacyAttr(gsl::at(std::get>(_run), _pos)); + _currentView = s_GenerateViewLegacyAttr(til::at(std::get>(_run), _pos)); } break; } diff --git a/src/buffer/out/TextColor.cpp b/src/buffer/out/TextColor.cpp index e340e198abf..20405022984 100644 --- a/src/buffer/out/TextColor.cpp +++ b/src/buffer/out/TextColor.cpp @@ -158,9 +158,9 @@ COLORREF TextColor::GetColor(gsl::span colorTable, // If we find a match, return instead the bright version of this color for (size_t i = 0; i < 8; i++) { - if (gsl::at(colorTable, i) == defaultColor) + if (til::at(colorTable, i) == defaultColor) { - return gsl::at(colorTable, i + 8); + return til::at(colorTable, i + 8); } } } @@ -173,11 +173,11 @@ COLORREF TextColor::GetColor(gsl::span colorTable, } else if (IsIndex16() && brighten) { - return gsl::at(colorTable, _index | 8); + return til::at(colorTable, _index | 8); } else { - return gsl::at(colorTable, _index); + return til::at(colorTable, _index); } } diff --git a/src/host/alias.cpp b/src/host/alias.cpp index 5c44a843ab4..e58fbdb0e91 100644 --- a/src/host/alias.cpp +++ b/src/host/alias.cpp @@ -149,7 +149,7 @@ std::unordered_mapsize() > 0) { - gsl::at(*target, 0) = UNICODE_NULL; + til::at(*target, 0) = UNICODE_NULL; } std::wstring exeNameString(exeName); @@ -211,7 +211,7 @@ std::unordered_map 0) { - gsl::at(target, 0) = ANSI_NULL; + til::at(target, 0) = ANSI_NULL; } LockConsole(); @@ -451,7 +451,7 @@ void Alias::s_ClearCmdExeAliases() if (aliasBuffer.has_value() && aliasBuffer->size() > 0) { - gsl::at(*aliasBuffer, 0) = UNICODE_NULL; + til::at(*aliasBuffer, 0) = UNICODE_NULL; } std::wstring exeNameString(exeName); @@ -543,7 +543,7 @@ void Alias::s_ClearCmdExeAliases() { if (alias.size() > 0) { - gsl::at(alias, 0) = '\0'; + til::at(alias, 0) = '\0'; } LockConsole(); @@ -698,7 +698,7 @@ void Alias::s_ClearCmdExeAliases() writtenOrNeeded = 0; if (aliasExesBuffer.has_value() && aliasExesBuffer->size() > 0) { - gsl::at(*aliasExesBuffer, 0) = UNICODE_NULL; + til::at(*aliasExesBuffer, 0) = UNICODE_NULL; } LPWSTR AliasExesBufferPtrW = aliasExesBuffer.has_value() ? aliasExesBuffer->data() : nullptr; @@ -761,7 +761,7 @@ void Alias::s_ClearCmdExeAliases() { if (aliasExes.size() > 0) { - gsl::at(aliasExes, 0) = '\0'; + til::at(aliasExes, 0) = '\0'; } LockConsole(); diff --git a/src/host/dbcs.cpp b/src/host/dbcs.cpp index fc4fd4586c0..eebfcf52a7e 100644 --- a/src/host/dbcs.cpp +++ b/src/host/dbcs.cpp @@ -67,10 +67,10 @@ DWORD UnicodeRasterFontCellMungeOnRead(const gsl::span buffer) for (DWORD iSrc = 0; iSrc < buffer.size(); iSrc++) { // If it's not a trailing byte, copy it straight over, stripping out the Leading/Trailing flags from the attributes field. - auto& src{ gsl::at(buffer, iSrc) }; + auto& src{ til::at(buffer, iSrc) }; if (!WI_IsFlagSet(src.Attributes, COMMON_LVB_TRAILING_BYTE)) { - auto& dst{ gsl::at(buffer, iDst) }; + auto& dst{ til::at(buffer, iDst) }; dst = src; WI_ClearAllFlags(dst.Attributes, COMMON_LVB_SBCSDBCS); iDst++; diff --git a/src/host/getset.cpp b/src/host/getset.cpp index 77c830aedfe..9c2d0e26494 100644 --- a/src/host/getset.cpp +++ b/src/host/getset.cpp @@ -1604,7 +1604,7 @@ void DoSrvPrivateRefreshWindow(_In_ const SCREEN_INFORMATION& screenInfo) if (title.has_value() && title->size() > 0) { - gsl::at(*title, 0) = ANSI_NULL; + til::at(*title, 0) = ANSI_NULL; } // Get the appropriate title and length depending on the mode. @@ -1667,7 +1667,7 @@ void DoSrvPrivateRefreshWindow(_In_ const SCREEN_INFORMATION& screenInfo) if (title.size() > 0) { - gsl::at(title, 0) = ANSI_NULL; + til::at(title, 0) = ANSI_NULL; } // Figure out how big our temporary Unicode buffer must be to get the title. @@ -1722,7 +1722,7 @@ void DoSrvPrivateRefreshWindow(_In_ const SCREEN_INFORMATION& screenInfo) // If we didn't copy anything back and there is space, null terminate the given buffer and return. if (title.size() > 0) { - gsl::at(title, 0) = ANSI_NULL; + til::at(title, 0) = ANSI_NULL; written = 1; } } diff --git a/src/host/history.cpp b/src/host/history.cpp index 74752131260..e9da38a2a28 100644 --- a/src/host/history.cpp +++ b/src/host/history.cpp @@ -782,7 +782,7 @@ HRESULT GetConsoleCommandHistoryWImplHelper(const std::wstring_view exeName, writtenOrNeeded = 0; if (historyBuffer.size() > 0) { - gsl::at(historyBuffer, 0) = UNICODE_NULL; + til::at(historyBuffer, 0) = UNICODE_NULL; } CommandHistory* const CommandHistory = CommandHistory::s_FindByExe(exeName); @@ -859,7 +859,7 @@ HRESULT ApiRoutines::GetConsoleCommandHistoryAImpl(const std::string_view exeNam { if (commandHistory.size() > 0) { - gsl::at(commandHistory, 0) = ANSI_NULL; + til::at(commandHistory, 0) = ANSI_NULL; } LockConsole(); diff --git a/src/inc/til/at.h b/src/inc/til/at.h index 56001dfe879..f08f7bb08bb 100644 --- a/src/inc/til/at.h +++ b/src/inc/til/at.h @@ -5,17 +5,52 @@ namespace til { + namespace details + { + // This was lifted from gsl::details::is_span. + template + struct is_span_oracle : std::false_type + { + }; + +#ifdef GSL_SPAN_H + template + struct is_span_oracle> : std::true_type + { + }; +#endif + + template + struct is_span : public is_span_oracle> + { + }; + } + // The at function declares that you've already sufficiently checked that your array access // is in range before retrieving an item inside it at an offset. // This is to save double/triple/quadruple testing in circumstances where you are already // pivoting on the length of a set and now want to pull elements out of it by offset // without checking again. // gsl::at will do the check again. As will .at(). And using [] will have a warning in audit. - template + // This template is explicitly disabled if T is of type gsl::span, as it would interfere with + // the overload below. + template::value, int> = 0> constexpr auto at(T& cont, const size_t i) -> decltype(cont[cont.size()]) { #pragma warning(suppress : 26482) // Suppress bounds.2 check for indexing with constant expressions #pragma warning(suppress : 26446) // Suppress bounds.4 check for subscript operator. return cont[i]; } + +#ifdef GSL_SPAN_H + // This is an overload of til::at for span that access its backing buffer directly (UNCHECKED) + template + constexpr auto at(gsl::span span, const std::ptrdiff_t i) -> decltype(span[span.size()]) + { +#pragma warning(suppress : 26481) // Suppress bounds.1 check for doing pointer arithmetic +#pragma warning(suppress : 26482) // Suppress bounds.2 check for indexing with constant expressions +#pragma warning(suppress : 26446) // Suppress bounds.4 check for subscript operator. + return span.data()[i]; + } +#endif } diff --git a/src/renderer/gdi/paint.cpp b/src/renderer/gdi/paint.cpp index 1b68dafc93e..b416510f99e 100644 --- a/src/renderer/gdi/paint.cpp +++ b/src/renderer/gdi/paint.cpp @@ -316,7 +316,7 @@ using namespace Microsoft::Console::Render; // Convert data from clusters into the text array and the widths array. for (size_t i = 0; i < cchLine; i++) { - const auto& cluster = gsl::at(clusters, i); + const auto& cluster = til::at(clusters, i); // Our GDI renderer hasn't and isn't going to handle things above U+FFFF or sequences. // So replace anything complicated with a replacement character for drawing purposes. diff --git a/src/terminal/parser/InputStateMachineEngine.cpp b/src/terminal/parser/InputStateMachineEngine.cpp index 55188cdb6d8..59f34e20ab9 100644 --- a/src/terminal/parser/InputStateMachineEngine.cpp +++ b/src/terminal/parser/InputStateMachineEngine.cpp @@ -395,7 +395,7 @@ bool InputStateMachineEngine::ActionCsiDispatch(const wchar_t wch, // Handle intermediate characters, if any if (!intermediates.empty()) { - switch (static_cast(gsl::at(intermediates, 0))) + switch (static_cast(til::at(intermediates, 0))) { case CsiIntermediateCodes::MOUSE_SGR: { @@ -805,7 +805,7 @@ DWORD InputStateMachineEngine::_GetCursorKeysModifierState(const gsl::span= 2) { - modifiers = _GetModifier(gsl::at(parameters, 1)); + modifiers = _GetModifier(til::at(parameters, 1)); } // Enhanced Keys (from https://docs.microsoft.com/en-us/windows/console/key-event-record-str): @@ -834,7 +834,7 @@ DWORD InputStateMachineEngine::_GetGenericKeysModifierState(const gsl::span= 2) { - modifiers = _GetModifier(gsl::at(parameters, 1)); + modifiers = _GetModifier(til::at(parameters, 1)); } // Enhanced Keys (from https://docs.microsoft.com/en-us/windows/console/key-event-record-str): @@ -1347,22 +1347,22 @@ bool InputStateMachineEngine::_GenerateWin32Key(const gsl::span pa switch (parameters.size()) { case 6: - key.SetRepeatCount(::base::saturated_cast(gsl::at(parameters, 5))); + key.SetRepeatCount(::base::saturated_cast(til::at(parameters, 5))); [[fallthrough]]; case 5: - key.SetActiveModifierKeys(::base::saturated_cast(gsl::at(parameters, 4))); + key.SetActiveModifierKeys(::base::saturated_cast(til::at(parameters, 4))); [[fallthrough]]; case 4: - key.SetKeyDown(static_cast(gsl::at(parameters, 3))); + key.SetKeyDown(static_cast(til::at(parameters, 3))); [[fallthrough]]; case 3: - key.SetCharData(static_cast(gsl::at(parameters, 2))); + key.SetCharData(static_cast(til::at(parameters, 2))); [[fallthrough]]; case 2: - key.SetVirtualScanCode(::base::saturated_cast(gsl::at(parameters, 1))); + key.SetVirtualScanCode(::base::saturated_cast(til::at(parameters, 1))); [[fallthrough]]; case 1: - key.SetVirtualKeyCode(::base::saturated_cast(gsl::at(parameters, 0))); + key.SetVirtualKeyCode(::base::saturated_cast(til::at(parameters, 0))); break; } diff --git a/src/terminal/parser/OutputStateMachineEngine.cpp b/src/terminal/parser/OutputStateMachineEngine.cpp index 363221caccc..4d5b4d0c8ac 100644 --- a/src/terminal/parser/OutputStateMachineEngine.cpp +++ b/src/terminal/parser/OutputStateMachineEngine.cpp @@ -403,9 +403,9 @@ bool OutputStateMachineEngine::_IntermediateScsDispatch(const wchar_t wch, // If we have more than one intermediate, the second intermediate forms part of // the charset identifier. Otherwise it's identified by just the final character. - const auto charset = intermediates.size() > 1 ? std::make_pair(gsl::at(intermediates, 1), wch) : std::make_pair(wch, L'\0'); + const auto charset = intermediates.size() > 1 ? std::make_pair(til::at(intermediates, 1), wch) : std::make_pair(wch, L'\0'); - switch (gsl::at(intermediates, 0)) + switch (til::at(intermediates, 0)) { case L'(': success = _dispatch->Designate94Charset(0, charset); @@ -1628,7 +1628,7 @@ bool OutputStateMachineEngine::s_ParseColorSpec(const std::wstring_view string, for (size_t component = 0; component < 3; component++) { bool foundColor = false; - auto& value = gsl::at(colorValues, component); + auto& value = til::at(colorValues, component); for (size_t i = 0; i < 3; i++) { const wchar_t wch = *curr++; diff --git a/src/terminal/parser/ut_parser/InputEngineTest.cpp b/src/terminal/parser/ut_parser/InputEngineTest.cpp index 6873df476aa..b97fa263c1c 100644 --- a/src/terminal/parser/ut_parser/InputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/InputEngineTest.cpp @@ -369,7 +369,7 @@ bool TestInteractDispatch::WindowManipulation(const DispatchTypes::WindowManipul for (size_t i = 0; i < parameters.size(); i++) { unsigned short actual; - VERIFY_SUCCEEDED(SizeTToUShort(gsl::at(parameters, i), &actual)); + VERIFY_SUCCEEDED(SizeTToUShort(til::at(parameters, i), &actual)); VERIFY_ARE_EQUAL(_testState->_expectedParams[i], actual); } return true; diff --git a/src/terminal/parser/ut_parser/OutputEngineTest.cpp b/src/terminal/parser/ut_parser/OutputEngineTest.cpp index 3fed8788791..17caebefada 100644 --- a/src/terminal/parser/ut_parser/OutputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/OutputEngineTest.cpp @@ -1557,14 +1557,14 @@ class StateMachineExternalTest final if (i < expectedOptions.size()) { - expectedOption = gsl::at(expectedOptions, i); + expectedOption = til::at(expectedOptions, i); } - optionsValid = expectedOption == gsl::at(dispatch._options, i); + optionsValid = expectedOption == til::at(dispatch._options, i); if (!optionsValid) { - Log::Comment(NoThrowString().Format(L"Graphics option match failed, index [%zu]. Expected: '%d' Actual: '%d'", i, expectedOption, gsl::at(dispatch._options, i))); + Log::Comment(NoThrowString().Format(L"Graphics option match failed, index [%zu]. Expected: '%d' Actual: '%d'", i, expectedOption, til::at(dispatch._options, i))); break; } } diff --git a/src/types/utils.cpp b/src/types/utils.cpp index 033799de69e..86ff8b522aa 100644 --- a/src/types/utils.cpp +++ b/src/types/utils.cpp @@ -425,10 +425,10 @@ void Utils::InitializeCampbellColorTableForConhost(const gsl::span tab void Utils::SwapANSIColorOrderForConhost(const gsl::span table) { THROW_HR_IF(E_INVALIDARG, table.size() < 16); - std::swap(gsl::at(table, 1), gsl::at(table, 4)); - std::swap(gsl::at(table, 3), gsl::at(table, 6)); - std::swap(gsl::at(table, 9), gsl::at(table, 12)); - std::swap(gsl::at(table, 11), gsl::at(table, 14)); + std::swap(til::at(table, 1), til::at(table, 4)); + std::swap(til::at(table, 3), til::at(table, 6)); + std::swap(til::at(table, 9), til::at(table, 12)); + std::swap(til::at(table, 11), til::at(table, 14)); } // Function Description: From b62f5ea85051fbe38d467cccca4d4de42d29ae8c Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Thu, 16 Jul 2020 22:49:06 +0200 Subject: [PATCH 06/14] Added til::spsc, a lock-free, single-producer/-consumer FIFO queue (#6751) ## Summary of the Pull Request This PR adds the `til::spsc` namespace, which implements a lock-free, single-producer, single-consumer FIFO queue ("channel"). The queue efficiently blocks the caller using Futexes if no data can be written to / read from the queue (e.g. using `WaitOnAddress` on Windows). Furthermore it allows batching of data and contains logic to signal the caller if the other side has been dropped/destructed. ## PR Checklist * [ ] Closes #xxx * [x] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/Terminal) and sign the CLA * [x] Tests added/passed * [ ] Documentation updated. If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/terminal) and link it here: #xxx * [ ] Schema updated. * [x] I've discussed this with core contributors already. If not checked, I'm ready to accept this work might be rejected in favor of a different grand plan. Issue number where discussion took place: #xxx ## Detailed Description of the Pull Request / Additional comments `til::spsc::details::arc` contains most of the queue's logic and as such has the relevant documentation for its design. ## Validation Steps Performed The queue was tested on Windows, Linux and macOS using MSVC, gcc and llvm and each of their available runtime introspection utilities in order to ensure no race conditions or memory leaks occur. --- .../actions/spell-check/dictionary/apis.txt | 7 + src/inc/til.h | 1 + src/inc/til/spsc.h | 643 ++++++++++++++++++ src/til/ut_til/SPSCTests.cpp | 194 ++++++ src/til/ut_til/til.unit.tests.vcxproj | 1 + src/til/ut_til/til.unit.tests.vcxproj.filters | 1 + 6 files changed, 847 insertions(+) create mode 100644 src/inc/til/spsc.h create mode 100644 src/til/ut_til/SPSCTests.cpp diff --git a/.github/actions/spell-check/dictionary/apis.txt b/.github/actions/spell-check/dictionary/apis.txt index fdb6a2dcd05..88494b86f64 100644 --- a/.github/actions/spell-check/dictionary/apis.txt +++ b/.github/actions/spell-check/dictionary/apis.txt @@ -1,11 +1,13 @@ ACCEPTFILES ACCESSDENIED +alignof bitfield bitfields CLASSNOTAVAILABLE EXPCMDFLAGS EXPCMDSTATE fullkbd +futex href IAsync IBind @@ -33,5 +35,10 @@ RETURNCMD rfind roundf RSHIFT +rx SIZENS +spsc +STDCPP +syscall tmp +tx diff --git a/src/inc/til.h b/src/inc/til.h index b1773062cbc..e9504535708 100644 --- a/src/inc/til.h +++ b/src/inc/til.h @@ -15,6 +15,7 @@ #include "til/rectangle.h" #include "til/bitmap.h" #include "til/u8u16convert.h" +#include "til/spsc.h" namespace til // Terminal Implementation Library. Also: "Today I Learned" { diff --git a/src/inc/til/spsc.h b/src/inc/til/spsc.h new file mode 100644 index 00000000000..374306637fb --- /dev/null +++ b/src/inc/til/spsc.h @@ -0,0 +1,643 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#pragma once + +// til::spsc::details::arc requires std::atomic::wait() and ::notify_one() and at the time of writing no +// STL supports these. Since both Windows and Linux offer a Futex implementation we can easily implement this though. +// On other platforms we fall back to using a std::condition_variable. +#if __cpp_lib_atomic_wait >= 201907 +#define _TIL_SPSC_DETAIL_POSITION_IMPL_NATIVE 1 +#elif defined(_WIN32_WINNT) && _WIN32_WINNT >= _WIN32_WINNT_WIN8 +#define _TIL_SPSC_DETAIL_POSITION_IMPL_WIN 1 +#elif __linux__ +#define _TIL_SPSC_DETAIL_POSITION_IMPL_LINUX 1 +#else +#define _TIL_SPSC_DETAIL_POSITION_IMPL_FALLBACK 1 +#endif + +// til: Terminal Implementation Library. Also: "Today I Learned". +// spsc: Single Producer Single Consumer. A SPSC queue/channel sends data from exactly one sender to one receiver. +namespace til::spsc +{ + using size_type = uint32_t; + + namespace details + { + static constexpr size_type position_mask = std::numeric_limits::max() >> 2u; // 0b00111.... + static constexpr size_type revolution_flag = 1u << (std::numeric_limits::digits - 2u); // 0b01000.... + static constexpr size_type drop_flag = 1u << (std::numeric_limits::digits - 1u); // 0b10000.... + + struct block_initially_policy + { + using _spsc_policy = int; + static constexpr bool _block_forever = false; + }; + + struct block_forever_policy + { + using _spsc_policy = int; + static constexpr bool _block_forever = true; + }; + + template + using enable_if_wait_policy_t = typename std::remove_reference_t::_spsc_policy; + +#if _TIL_SPSC_DETAIL_POSITION_IMPL_NATIVE + using atomic_size_type = std::atomic; +#else + // atomic_size_type is a fallback if native std::atomic::wait() + // and ::notify_one() methods are unavailable in the STL. + struct atomic_size_type + { + size_type load(std::memory_order order) const noexcept + { + return _value.load(order); + } + + void store(size_type desired, std::memory_order order) noexcept + { +#if _TIL_SPSC_DETAIL_POSITION_IMPL_FALLBACK + // We must use a lock here to prevent us from modifying the value + // in between wait() reading the value and the thread being suspended. + std::lock_guard lock{ _m }; +#endif + _value.store(desired, order); + } + + void wait(size_type old, [[maybe_unused]] std::memory_order order) const noexcept + { +#if _TIL_SPSC_DETAIL_POSITION_IMPL_WIN +#pragma warning(suppress : 26492) // Don't use const_cast to cast away const or volatile + WaitOnAddress(const_cast*>(&_value), &old, sizeof(_value), INFINITE); +#elif _TIL_SPSC_DETAIL_POSITION_IMPL_LINUX + futex(FUTEX_WAIT_PRIVATE, old); +#elif _TIL_SPSC_DETAIL_POSITION_IMPL_FALLBACK + std::unique_lock lock{ _m }; + _cv.wait(lock, [&]() { return _value.load(order) != old; }); +#endif + } + + void notify_one() noexcept + { +#if _TIL_SPSC_DETAIL_POSITION_IMPL_WIN + WakeByAddressSingle(&_value); +#elif _TIL_SPSC_DETAIL_POSITION_IMPL_LINUX + futex(FUTEX_WAKE_PRIVATE, 1); +#elif _TIL_SPSC_DETAIL_POSITION_IMPL_FALLBACK + _cv.notify_one(); +#endif + } + + private: +#if _TIL_SPSC_DETAIL_POSITION_IMPL_LINUX + inline void futex(int futex_op, size_type val) const noexcept + { + // See: https://man7.org/linux/man-pages/man2/futex.2.html + static_assert(sizeof(std::atomic) == 4); + syscall(SYS_futex, &_value, futex_op, val, nullptr, nullptr, 0); + } +#endif + + std::atomic _value{ 0 }; + +#if _TIL_SPSC_DETAIL_POSITION_IMPL_FALLBACK + private: + std::mutex _m; + std::condition_variable _cv; +#endif + }; +#endif + + template + inline T* alloc_raw_memory(size_t size) + { + constexpr auto alignment = alignof(T); + if constexpr (alignment <= __STDCPP_DEFAULT_NEW_ALIGNMENT__) + { + return static_cast(::operator new(size)); + } + else + { + return static_cast(::operator new(size, std::align_val_t(alignment))); + } + } + + template + inline void free_raw_memory(T* ptr) noexcept + { + constexpr auto alignment = alignof(T); + if constexpr (alignment <= __STDCPP_DEFAULT_NEW_ALIGNMENT__) + { + ::operator delete(ptr); + } + else + { + ::operator delete(ptr, std::align_val_t(alignment)); + } + } + + struct acquisition + { + // The index range [begin, end) is the range of slots in the array returned by + // arc::data() that may be written to / read from respectively. + // If a range has been successfully acquired "end > begin" is true. end thus can't be 0. + size_type begin; + size_type end; + + // Upon release() of an acquisition, next is the value that's written to the consumer/producer position. + // It's basically the same as end, but with the revolution flag mixed in. + // If end is equal to capacity, next will be 0 (mixed with the next revolution flag). + size_type next; + + // If the other side of the queue hasn't been destroyed yet, alive will be true. + bool alive; + + constexpr acquisition(size_type begin, size_type end, size_type next, bool alive) : + begin(begin), + end(end), + next(next), + alive(alive) + { + } + }; + + // The following assumes you know what ring/circular buffers are. You can read about them here: + // https://en.wikipedia.org/wiki/Circular_buffer + // + // Furthermore the implementation solves a problem known as the producer-consumer problem: + // https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem + // + // arc follows the classic spsc design and manages a ring buffer with two positions: _producer and _consumer. + // They contain the position the producer / consumer will next write to / read from respectively. + // As usual with ring buffers, these positions are modulo to the _capacity of the underlying buffer. + // The producer's writable range is [_producer, _consumer) and the consumer's readable is [_consumer, _producer). + // + // After you wrote the numbers 0 to 6 into a queue of size 10, a typical state of the ring buffer might be: + // [ 0 | 1 | 2 | 3 | 4 | 5 | 6 | _ | _ | _ | _ ] + // ^ ^ ^ + // _consumer = 0 _producer = 7 _capacity = 10 + // + // As you can see the readable range currently is [_consumer, _producer) = [0, 7). + // The remaining writable range on the other hand is [_producer, _consumer) = [7, 0). + // Wait, what? [7, 0)? How does that work? As all positions are modulo _capacity, 0 mod 10 is the same as 10 mod 10. + // If we only want to read forward in the buffer [7, 0) is thus the same as [7, 10). + // + // If we read 3 items from the queue the contents will be: + // [ _ | _ | _ | 3 | 4 | 5 | 6 | _ | _ | _ | _ ] + // ^ ^ + // _consumer = 3 _producer = 7 + // + // Now the writable range is still [_producer, _consumer), but it wraps around the end of the ring buffer. + // In this case arc will split the range in two and return each separately in acquire(). + // The first returned range will be [_producer, _capacity) and the second [0, _consumer). + // The same logic applies if the readable range wraps around the end of the ring buffer. + // + // As these are symmetric, the logic for acquiring and releasing ranges is the same for both sides. + // The producer will acquire() and release() ranges with its own position as "mine" and the consumer's + // position as "theirs". These arguments are correspondingly flipped for the consumer. + // + // As part of the producer-consumer problem, the producer cannot write more values ahead of the + // consumer than the buffer's capacity. Since both positions are modulo to the capacity we can only + // determine positional differences smaller than the capacity. Due to that both producer and + // consumer store a "revolution_flag" as the second highest bit within their positions. + // This bit is flipped each time the producer/consumer wrap around the end of the ring buffer. + // If the positions are identical, except for their "revolution_flag" value, the producer thus must + // be capacity-many positions ahead of the consumer and must wait until items have been consumed. + // + // Inversely the consumer must wait until the producer has written at least one value ahead. + // This can be detected by checking whether the positions are identical including the revolution_flag. + template + struct arc + { + explicit arc(size_type capacity) noexcept : + _data(alloc_raw_memory(size_t(capacity) * sizeof(T))), + _capacity(capacity) + { + } + + ~arc() + { + auto beg = _consumer.load(std::memory_order_acquire); + auto end = _producer.load(std::memory_order_acquire); + auto differentRevolution = ((beg ^ end) & revolution_flag) != 0; + + beg &= position_mask; + end &= position_mask; + + // The producer position will always be ahead of the consumer, but since we're dealing + // with a ring buffer the producer may be wrapped around the end of the buffer. + // We thus need to deal with 3 potential cases: + // * No valid data. + // If both positions including their revolution bits are identical. + // * Valid data in the middle of the ring buffer. + // If _producer > _consumer. + // * Valid data at both ends of the ring buffer. + // If the revolution bits differ, even if the positions are otherwise identical, + // which they might be if the channel contains exactly as many values as its capacity. + if (end > beg) + { + std::destroy(_data + beg, _data + end); + } + else if (differentRevolution) + { + std::destroy(_data, _data + end); + std::destroy(_data + beg, _data + _capacity); + } + + free_raw_memory(_data); + } + + void drop_producer() + { + drop(_producer); + } + + void drop_consumer() + { + drop(_consumer); + } + + acquisition producer_acquire(size_type slots, bool blocking) noexcept + { + return acquire(_producer, _consumer, revolution_flag, slots, blocking); + } + + void producer_release(acquisition acquisition) noexcept + { + release(_producer, acquisition); + } + + acquisition consumer_acquire(size_type slots, bool blocking) noexcept + { + return acquire(_consumer, _producer, 0, slots, blocking); + } + + void consumer_release(acquisition acquisition) noexcept + { + release(_consumer, acquisition); + } + + T* data() const noexcept + { + return _data; + } + + private: + void drop(atomic_size_type& mine) + { + // Signal the other side we're dropped. See acquire() for the handling of the drop_flag. + // We don't need to use release ordering like release() does as each call to + // any of the producer/consumer methods already results in a call to release(). + // Another release ordered write can't possibly synchronize any more data anyways at this point. + const auto myPos = mine.load(std::memory_order_relaxed); + mine.store(myPos | drop_flag, std::memory_order_relaxed); + mine.notify_one(); + + // The first time SPSCBase is dropped (destroyed) we'll set + // the flag to true and get false, causing us to return early. + // Only the second time we'll get true. + // --> The contents are only deleted when both sides have been dropped. + if (_eitherSideDropped.exchange(true, std::memory_order_relaxed)) + { + delete this; + } + } + + // NOTE: waitMask MUST be either 0 (consumer) or revolution_flag (producer). + acquisition acquire(atomic_size_type& mine, atomic_size_type& theirs, size_type waitMask, size_type slots, bool blocking) noexcept + { + size_type myPos = mine.load(std::memory_order_relaxed); + size_type theirPos; + + while (true) + { + // This acquire read synchronizes with the release write in release(). + theirPos = theirs.load(std::memory_order_acquire); + if ((myPos ^ theirPos) != waitMask) + { + break; + } + if (!blocking) + { + return { + 0, + 0, + 0, + true, + }; + } + + theirs.wait(theirPos, std::memory_order_relaxed); + } + + // If the other side's position contains a drop flag, as a X -> we need to... + // * producer -> stop immediately + // FYI: isProducer == (waitMask != 0). + // * consumer -> finish consuming all values and then stop + // We're finished if the only difference between our + // and the other side's position is the drop flag. + if ((theirPos & drop_flag) != 0 && (waitMask != 0 || (myPos ^ theirPos) == drop_flag)) + { + return { + 0, + 0, + 0, + false, + }; + } + + auto begin = myPos & position_mask; + auto end = theirPos & position_mask; + + // [begin, end) is the writable/readable range for the producer/consumer. + // The following detects whether we'd be wrapping around the end of the ring buffer + // and splits the range into the first half [mine, _capacity). + // If acquire() is called again it'll return [0, theirs). + end = end > begin ? end : _capacity; + + // Of course we also need to ensure to not return more than we've been asked for. + end = std::min(end, begin + slots); + + // "next" will contain the value that's stored into "mine" when release() is called. + // It's basically the same as "end", but with the revolution flag spliced in. + // If we acquired the range [mine, _capacity) "end" will equal _capacity + // and thus wrap around the ring buffer. The next value for "mine" is thus the + // position zero | the flipped "revolution" (and 0 | x == x). + auto revolution = myPos & revolution_flag; + auto next = end != _capacity ? end | revolution : revolution ^ revolution_flag; + + return { + begin, + end, + next, + true, + }; + } + + void release(atomic_size_type& mine, acquisition acquisition) noexcept + { + // This release write synchronizes with the acquire read in acquire(). + mine.store(acquisition.next, std::memory_order_release); + mine.notify_one(); + } + + T* const _data; + const size_type _capacity; + + std::atomic _eitherSideDropped{ false }; + + atomic_size_type _producer; + atomic_size_type _consumer; + }; + + inline void validate_size(size_t v) + { + if (v > static_cast(position_mask)) + { + throw std::overflow_error{ "size too large for spsc" }; + } + } + } + + // Block until at least one item has been written into the sender / read from the receiver. + inline constexpr details::block_initially_policy block_initially{}; + + // Block until all items have been written into the sender / read from the receiver. + inline constexpr details::block_forever_policy block_forever{}; + + template + struct producer + { + explicit producer(details::arc* arc) noexcept : + _arc(arc) {} + + producer(const producer&) = delete; + producer& operator=(const producer&) = delete; + + producer(producer&& other) noexcept + { + drop(); + _arc = std::exchange(other._arc, nullptr); + } + + producer& operator=(producer&& other) noexcept + { + drop(); + _arc = std::exchange(other._arc, nullptr); + } + + ~producer() + { + drop(); + } + + // emplace constructs an item in-place at the end of the queue. + // It returns true, if the item was successfully placed within the queue. + // The return value will be false, if the consumer is gone. + template + bool emplace(Args&&... args) const + { + auto acquisition = _arc->producer_acquire(1, true); + if (!acquisition.end) + { + return false; + } + + auto data = _arc->data(); + auto begin = data + acquisition.begin; + new (begin) T(std::forward(args)...); + + _arc->producer_release(acquisition); + return true; + } + + template + std::pair push(InputIt first, InputIt last) const + { + return push_n(block_forever, first, std::distance(first, last)); + } + + // push writes the items between first and last into the queue. + // The amount of successfully written items is returned as the first pair field. + // The second pair field will be false if the consumer is gone. + template = 0> + std::pair push(WaitPolicy&& policy, InputIt first, InputIt last) const + { + return push_n(std::forward(policy), first, std::distance(first, last)); + } + + template + std::pair push_n(InputIt first, size_t count) const + { + return push_n(block_forever, first, count); + } + + // push_n writes count items from first into the queue. + // The amount of successfully written items is returned as the first pair field. + // The second pair field will be false if the consumer is gone. + template = 0> + std::pair push_n(WaitPolicy&&, InputIt first, size_t count) const + { + details::validate_size(count); + + const auto data = _arc->data(); + auto remaining = static_cast(count); + auto blocking = true; + auto ok = true; + + while (remaining != 0) + { + auto acquisition = _arc->producer_acquire(remaining, blocking); + if (!acquisition.end) + { + ok = acquisition.alive; + break; + } + + const auto begin = data + acquisition.begin; + const auto got = acquisition.end - acquisition.begin; + std::uninitialized_copy_n(first, got, begin); + first += got; + remaining -= got; + + _arc->producer_release(acquisition); + + if constexpr (!std::remove_reference_t::_block_forever) + { + blocking = false; + } + } + + return { count - remaining, ok }; + } + + private: + void drop() + { + if (_arc) + { + _arc->drop_producer(); + } + } + + details::arc* _arc = nullptr; + }; + + template + struct consumer + { + explicit consumer(details::arc* arc) noexcept : + _arc(arc) {} + + consumer(const consumer&) = delete; + consumer& operator=(const consumer&) = delete; + + consumer(consumer&& other) noexcept + { + drop(); + _arc = std::exchange(other._arc, nullptr); + } + + consumer& operator=(consumer&& other) noexcept + { + drop(); + _arc = std::exchange(other._arc, nullptr); + } + + ~consumer() + { + drop(); + } + + // pop returns the next item in the queue, or std::nullopt if the producer is gone. + std::optional pop() const + { + auto acquisition = _arc->consumer_acquire(1, true); + if (!acquisition.end) + { + return std::nullopt; + } + + auto data = _arc->data(); + auto begin = data + acquisition.begin; + + auto item = std::move(*begin); + std::destroy_at(begin); + + _arc->consumer_release(acquisition); + return item; + } + + template + std::pair pop_n(OutputIt first, size_t count) const + { + return pop_n(block_forever, first, count); + } + + // pop_n reads up to count items into first. + // The amount of successfully read items is returned as the first pair field. + // The second pair field will be false if the consumer is gone. + template = 0> + std::pair pop_n(WaitPolicy&&, OutputIt first, size_t count) const + { + details::validate_size(count); + + const auto data = _arc->data(); + auto remaining = static_cast(count); + auto blocking = true; + auto ok = true; + + while (remaining != 0) + { + auto acquisition = _arc->consumer_acquire(remaining, blocking); + if (!acquisition.end) + { + ok = acquisition.alive; + break; + } + + auto beg = data + acquisition.begin; + auto end = data + acquisition.end; + auto got = acquisition.end - acquisition.begin; + first = std::move(beg, end, first); + std::destroy(beg, end); + remaining -= got; + + _arc->consumer_release(acquisition); + + if constexpr (!std::remove_reference_t::_block_forever) + { + blocking = false; + } + } + + return { count - remaining, ok }; + } + + private: + void drop() + { + if (_arc) + { + _arc->drop_consumer(); + } + } + + details::arc* _arc = nullptr; + }; + + // channel returns a bounded, lock-free, single-producer, single-consumer + // FIFO queue ("channel") with the given maximum capacity. + template + std::pair, consumer> channel(uint32_t capacity) + { + if (capacity == 0) + { + throw std::invalid_argument{ "invalid capacity" }; + } + + const auto arc = new details::arc(capacity); + return { std::piecewise_construct, std::forward_as_tuple(arc), std::forward_as_tuple(arc) }; + } +} diff --git a/src/til/ut_til/SPSCTests.cpp b/src/til/ut_til/SPSCTests.cpp new file mode 100644 index 00000000000..6558bb439c1 --- /dev/null +++ b/src/til/ut_til/SPSCTests.cpp @@ -0,0 +1,194 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#include "precomp.h" +#include "WexTestClass.h" + +using namespace WEX::Common; +using namespace WEX::Logging; +using namespace WEX::TestExecution; + +struct drop_indicator +{ + explicit drop_indicator(int& counter) noexcept : + _counter(&counter) {} + + drop_indicator(const drop_indicator&) = delete; + drop_indicator& operator=(const drop_indicator&) = delete; + + drop_indicator(drop_indicator&& other) noexcept + { + _counter = std::exchange(other._counter, nullptr); + } + + drop_indicator& operator=(drop_indicator&& other) noexcept + { + _counter = std::exchange(other._counter, nullptr); + } + + ~drop_indicator() + { + if (_counter) + { + ++*_counter; + } + } + +private: + int* _counter = nullptr; +}; + +template +void drop(T&& val) +{ + auto _ = std::move(val); +} + +class SPSCTests +{ + BEGIN_TEST_CLASS(SPSCTests) + TEST_CLASS_PROPERTY(L"TestTimeout", L"0:0:10") // 10s timeout + END_TEST_CLASS() + + TEST_METHOD(DropEmptyTest); + TEST_METHOD(DropSameRevolutionTest); + TEST_METHOD(DropDifferentRevolutionTest); + TEST_METHOD(IntegrationTest); +}; + +void SPSCTests::DropEmptyTest() +{ + auto [tx, rx] = til::spsc::channel(5); + int counter = 0; + + for (int i = 0; i < 5; ++i) + { + tx.emplace(counter); + } + VERIFY_ARE_EQUAL(counter, 0); + + for (int i = 0; i < 5; ++i) + { + rx.pop(); + } + VERIFY_ARE_EQUAL(counter, 5); + + for (int i = 0; i < 3; ++i) + { + tx.emplace(counter); + } + VERIFY_ARE_EQUAL(counter, 5); + + drop(tx); + VERIFY_ARE_EQUAL(counter, 5); + + for (int i = 0; i < 3; ++i) + { + rx.pop(); + } + VERIFY_ARE_EQUAL(counter, 8); + + drop(rx); + VERIFY_ARE_EQUAL(counter, 8); +} + +void SPSCTests::DropSameRevolutionTest() +{ + auto [tx, rx] = til::spsc::channel(5); + int counter = 0; + + for (int i = 0; i < 5; ++i) + { + tx.emplace(counter); + } + VERIFY_ARE_EQUAL(counter, 0); + + drop(tx); + VERIFY_ARE_EQUAL(counter, 0); + + for (int i = 0; i < 3; ++i) + { + rx.pop(); + } + VERIFY_ARE_EQUAL(counter, 3); + + drop(rx); + VERIFY_ARE_EQUAL(counter, 5); +} + +void SPSCTests::DropDifferentRevolutionTest() +{ + auto [tx, rx] = til::spsc::channel(5); + int counter = 0; + + for (int i = 0; i < 4; ++i) + { + tx.emplace(counter); + } + VERIFY_ARE_EQUAL(counter, 0); + + for (int i = 0; i < 3; ++i) + { + rx.pop(); + } + VERIFY_ARE_EQUAL(counter, 3); + + for (int i = 0; i < 4; ++i) + { + tx.emplace(counter); + } + VERIFY_ARE_EQUAL(counter, 3); + + // At this point we emplace()d 8 items and pop()ed 3 in a channel with a capacity of 5. + // Both producer and consumer positions will be 3 and only differ in their revolution flag. + // This ensures that the arc destructor works even if + + drop(tx); + VERIFY_ARE_EQUAL(counter, 3); + + drop(rx); + VERIFY_ARE_EQUAL(counter, 8); +} + +void SPSCTests::IntegrationTest() +{ + auto [tx, rx] = til::spsc::channel(7); + + std::thread t([tx = std::move(tx)]() { + std::array buffer{}; + std::generate(buffer.begin(), buffer.end(), [v = 0]() mutable { return v++; }); + + for (int i = 0; i < 37; ++i) + { + tx.emplace(i); + } + for (int i = 0; i < 3; ++i) + { + tx.push(buffer.begin(), buffer.end()); + } + }); + + std::array buffer{}; + + for (int i = 0; i < 3; ++i) + { + rx.pop_n(buffer.data(), buffer.size()); + for (int j = 0; j < 11; ++j) + { + VERIFY_ARE_EQUAL(i * 11 + j, buffer[j]); + } + } + for (int i = 33; i < 37; ++i) + { + auto actual = rx.pop(); + VERIFY_ARE_EQUAL(i, actual); + } + for (int i = 0; i < 33; ++i) + { + auto expected = i % 11; + auto actual = rx.pop(); + VERIFY_ARE_EQUAL(expected, actual); + } + + t.join(); +} diff --git a/src/til/ut_til/til.unit.tests.vcxproj b/src/til/ut_til/til.unit.tests.vcxproj index 84ee72de877..82b7908bb7c 100644 --- a/src/til/ut_til/til.unit.tests.vcxproj +++ b/src/til/ut_til/til.unit.tests.vcxproj @@ -22,6 +22,7 @@ Create + diff --git a/src/til/ut_til/til.unit.tests.vcxproj.filters b/src/til/ut_til/til.unit.tests.vcxproj.filters index 20492e2c64c..5633f453b7d 100644 --- a/src/til/ut_til/til.unit.tests.vcxproj.filters +++ b/src/til/ut_til/til.unit.tests.vcxproj.filters @@ -15,6 +15,7 @@ + From 3255177dd0c6245e362f9a35d9c6c922d1eba489 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Thu, 16 Jul 2020 13:53:56 -0700 Subject: [PATCH 07/14] Correct comment in this SPSC test as a quick follow up to merge. --- src/til/ut_til/SPSCTests.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/til/ut_til/SPSCTests.cpp b/src/til/ut_til/SPSCTests.cpp index 6558bb439c1..77f3d111613 100644 --- a/src/til/ut_til/SPSCTests.cpp +++ b/src/til/ut_til/SPSCTests.cpp @@ -141,7 +141,8 @@ void SPSCTests::DropDifferentRevolutionTest() // At this point we emplace()d 8 items and pop()ed 3 in a channel with a capacity of 5. // Both producer and consumer positions will be 3 and only differ in their revolution flag. - // This ensures that the arc destructor works even if + // This ensures that the arc destructor works even if the + // two positions within the circular buffer are identical (modulo the capacity). drop(tx); VERIFY_ARE_EQUAL(counter, 3); From 81b7e546592a5743dac65b01c0cb280a75751624 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Thu, 16 Jul 2020 14:46:10 -0700 Subject: [PATCH 08/14] Cache the viewport to make invalidation faster (#6918) In `Renderer::TriggerRedraw`, the act of fetching the viewport from the `pData` over and over is wasted time. We already have a cached variable of the viewport that is updated on every scroll check (on `TriggerScroll` and on `PaintFrame`.) Scrolling wouldn't be working correctly if the clients weren't already notifying us that the viewport has changed for scroll purposes, so we can just keep using that cached value for the invalidation restriction to speed things up over fetching it again. ## Validation Steps Performed - Run `time cat big.txt`. Checked average time before/after, WPR traces before/after. ## PR Checklist * [x] Closes perf itch * [x] I work here * [x] Manual test * [x] Documentation irrelevant. * [x] Schema irrelevant. * [x] Am core contributor. --- src/host/ut_host/VtIoTests.cpp | 145 ++++++++++++++++++++++++++++++++- src/renderer/base/renderer.cpp | 13 ++- src/renderer/base/renderer.hpp | 2 +- 3 files changed, 150 insertions(+), 10 deletions(-) diff --git a/src/host/ut_host/VtIoTests.cpp b/src/host/ut_host/VtIoTests.cpp index 6ef1113b86b..599a29caec4 100644 --- a/src/host/ut_host/VtIoTests.cpp +++ b/src/host/ut_host/VtIoTests.cpp @@ -254,6 +254,145 @@ void VtIoTests::DtorTestStackAllocMany() } } +class MockRenderData : public IRenderData, IUiaData +{ +public: + Microsoft::Console::Types::Viewport GetViewport() noexcept override + { + return Microsoft::Console::Types::Viewport{}; + } + + COORD GetTextBufferEndPosition() const noexcept override + { + return COORD{}; + } + + const TextBuffer& GetTextBuffer() noexcept override + { + FAIL_FAST_HR(E_NOTIMPL); + } + + const FontInfo& GetFontInfo() noexcept override + { + FAIL_FAST_HR(E_NOTIMPL); + } + + std::vector GetSelectionRects() noexcept override + { + return std::vector{}; + } + + void LockConsole() noexcept override + { + } + + void UnlockConsole() noexcept override + { + } + + const TextAttribute GetDefaultBrushColors() noexcept override + { + return TextAttribute{}; + } + + std::pair GetAttributeColors(const TextAttribute& /*attr*/) const noexcept override + { + return std::make_pair(COLORREF{}, COLORREF{}); + } + + COORD GetCursorPosition() const noexcept override + { + return COORD{}; + } + + bool IsCursorVisible() const noexcept override + { + return false; + } + + bool IsCursorOn() const noexcept override + { + return false; + } + + ULONG GetCursorHeight() const noexcept override + { + return 42ul; + } + + CursorType GetCursorStyle() const noexcept override + { + return CursorType::FullBox; + } + + ULONG GetCursorPixelWidth() const noexcept override + { + return 12ul; + } + + COLORREF GetCursorColor() const noexcept override + { + return COLORREF{}; + } + + bool IsCursorDoubleWidth() const override + { + return false; + } + + bool IsScreenReversed() const noexcept override + { + return false; + } + + const std::vector GetOverlays() const noexcept override + { + return std::vector{}; + } + + const bool IsGridLineDrawingAllowed() noexcept override + { + return false; + } + + const std::wstring GetConsoleTitle() const noexcept override + { + return std::wstring{}; + } + + const bool IsSelectionActive() const override + { + return false; + } + + const bool IsBlockSelection() const noexcept override + { + return false; + } + + void ClearSelection() override + { + } + + void SelectNewRegion(const COORD /*coordStart*/, const COORD /*coordEnd*/) override + { + } + + const COORD GetSelectionAnchor() const noexcept + { + return COORD{}; + } + + const COORD GetSelectionEnd() const noexcept + { + return COORD{}; + } + + void ColorSelection(const COORD /*coordSelectionStart*/, const COORD /*coordSelectionEnd*/, const TextAttribute /*attr*/) + { + } +}; + void VtIoTests::RendererDtorAndThread() { Log::Comment(NoThrowString().Format( @@ -261,9 +400,10 @@ void VtIoTests::RendererDtorAndThread() for (int i = 0; i < 16; ++i) { + auto data = std::make_unique(); auto thread = std::make_unique(); auto* pThread = thread.get(); - auto pRenderer = std::make_unique(nullptr, nullptr, 0, std::move(thread)); + auto pRenderer = std::make_unique(data.get(), nullptr, 0, std::move(thread)); VERIFY_SUCCEEDED(pThread->Initialize(pRenderer.get())); // Sleep for a hot sec to make sure the thread starts before we enable painting // If you don't, the thread might wait on the paint enabled event AFTER @@ -286,9 +426,10 @@ void VtIoTests::RendererDtorAndThreadAndDx() for (int i = 0; i < 16; ++i) { + auto data = std::make_unique(); auto thread = std::make_unique(); auto* pThread = thread.get(); - auto pRenderer = std::make_unique(nullptr, nullptr, 0, std::move(thread)); + auto pRenderer = std::make_unique(data.get(), nullptr, 0, std::move(thread)); VERIFY_SUCCEEDED(pThread->Initialize(pRenderer.get())); auto dxEngine = std::make_unique<::Microsoft::Console::Render::DxEngine>(); diff --git a/src/renderer/base/renderer.cpp b/src/renderer/base/renderer.cpp index f382dbd7c07..bdda98bc3cf 100644 --- a/src/renderer/base/renderer.cpp +++ b/src/renderer/base/renderer.cpp @@ -26,13 +26,12 @@ Renderer::Renderer(IRenderData* pData, _In_reads_(cEngines) IRenderEngine** const rgpEngines, const size_t cEngines, std::unique_ptr thread) : - _pData(pData), + _pData(THROW_HR_IF_NULL(E_INVALIDARG, pData)), _pThread{ std::move(thread) }, _destructing{ false }, - _clusterBuffer{} + _clusterBuffer{}, + _viewport{ pData->GetViewport() } { - _srViewportPrevious = { 0 }; - for (size_t i = 0; i < cEngines; i++) { IRenderEngine* engine = rgpEngines[i]; @@ -208,7 +207,7 @@ void Renderer::TriggerSystemRedraw(const RECT* const prcDirtyClient) // - void Renderer::TriggerRedraw(const Viewport& region) { - Viewport view = _pData->GetViewport(); + Viewport view = _viewport; SMALL_RECT srUpdateRegion = region.ToExclusive(); if (view.TrimToViewport(&srUpdateRegion)) @@ -357,7 +356,7 @@ void Renderer::TriggerSelection() // - True if something changed and we scrolled. False otherwise. bool Renderer::_CheckViewportAndScroll() { - SMALL_RECT const srOldViewport = _srViewportPrevious; + SMALL_RECT const srOldViewport = _viewport.ToInclusive(); SMALL_RECT const srNewViewport = _pData->GetViewport().ToInclusive(); COORD coordDelta; @@ -369,7 +368,7 @@ bool Renderer::_CheckViewportAndScroll() LOG_IF_FAILED(engine->UpdateViewport(srNewViewport)); } - _srViewportPrevious = srNewViewport; + _viewport = Viewport::FromInclusive(srNewViewport); // If we're keeping some buffers between calls, let them know about the viewport size // so they can prepare the buffers for changes to either preallocate memory at once diff --git a/src/renderer/base/renderer.hpp b/src/renderer/base/renderer.hpp index 6c30e0f4ee6..db6dc6d3875 100644 --- a/src/renderer/base/renderer.hpp +++ b/src/renderer/base/renderer.hpp @@ -120,7 +120,7 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT _PerformScrolling(_In_ IRenderEngine* const pEngine); - SMALL_RECT _srViewportPrevious; + Microsoft::Console::Types::Viewport _viewport; static constexpr float _shrinkThreshold = 0.8f; std::vector _clusterBuffer; From 53df6c7f96bd4b18182090e5818f8995b18d373f Mon Sep 17 00:00:00 2001 From: Dan Thompson Date: Thu, 16 Jul 2020 16:58:48 -0700 Subject: [PATCH 09/14] Fix 'bcz exclusive' typo (#6938) Without this fix, you'd end up with an empty target variable, and so msbuild would complain and tell you to give it a target. --- tools/bcz.cmd | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/bcz.cmd b/tools/bcz.cmd index f70269aaf34..3262b0b39e1 100644 --- a/tools/bcz.cmd +++ b/tools/bcz.cmd @@ -116,8 +116,12 @@ set "__PROJECT_NAME=!_OUTPUT!" rem If we're trying to clean build, make sure to update the target here. if "%_MSBUILD_TARGET%" == "Build" ( set __MSBUILD_TARGET=%__PROJECT_NAME% -) else if "%_MSBUILD_TARGET%" == "Clean,Build" ( +) else if "%_MSBUILD_TARGET%" == "Clean;Build" ( set __MSBUILD_TARGET=%__PROJECT_NAME%:Rebuild +) else ( + echo. + echo Oops... build bug in the neighborhood of configuring a build target. + echo. ) rem This statement will propagate our internal variables up to the calling rem scope. Because they're all on one line, the value of our local variables From 7062a830b844a6dbfa6d2c06c9c001545b6483c4 Mon Sep 17 00:00:00 2001 From: jtippet Date: Thu, 16 Jul 2020 17:33:03 -0700 Subject: [PATCH 10/14] Smooth animation of command palette filtering (#6939) The command palette is a ListView of commands. As you type into the search box, commands are added or removed from the ListView. Currently, each update is done by completely clearing the backing list, then adding back any items that should be displayed. However, this defeats the ListView's built-in animations: upon every keystroke, ListView displays its list-clearing animation, then animates the insertion of every item that wasn't deleted. This results in noticeable flickering. This PR changes the update logic so that it updates the list using (roughly) the minimum number of Insert and Remove calls, so the ListView makes smoother transitions as you type. I implemented it by keeping the existing code that builds the filtered list, but I changed it to build into a scratch list. Then I grafted on a generic delta algorithm to make the real list look like the scratch list. To verify the delta algorithm, I tested all 360,000 permutations of pairs of up to 5 element lists in a toy C# app. ## Validation I'm not sure if my screen capture tool really caught all the flickering here, but the screencasts below should give a rough idea of the difference. (All the flickering was becoming a nuisance while I was testing out the HC changes.) See the images in #6939 for more info. Co-authored-by: Jeffrey Tippet --- src/cascadia/TerminalApp/CommandPalette.cpp | 64 ++++++++++++++++++--- src/cascadia/TerminalApp/CommandPalette.h | 1 + 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/cascadia/TerminalApp/CommandPalette.cpp b/src/cascadia/TerminalApp/CommandPalette.cpp index 6fac2d35d62..33d32defe7e 100644 --- a/src/cascadia/TerminalApp/CommandPalette.cpp +++ b/src/cascadia/TerminalApp/CommandPalette.cpp @@ -271,16 +271,17 @@ namespace winrt::TerminalApp::implementation }; // Method Description: - // - Update our list of filtered actions to reflect the current contents of + // - Produce a list of filtered actions to reflect the current contents of // the input box. For more details on which commands will be displayed, // see `_getWeight`. // Arguments: - // - + // - A collection that will receive the filtered actions // Return Value: // - - void CommandPalette::_updateFilteredActions() + std::vector CommandPalette::_collectFilteredActions() { - _filteredActions.Clear(); + std::vector actions; + auto searchText = _searchBox().Text(); const bool addAll = searchText.empty(); @@ -303,10 +304,10 @@ namespace winrt::TerminalApp::implementation for (auto action : sortedCommands) { - _filteredActions.Append(action); + actions.push_back(action); } - return; + return actions; } // Here, there was some filter text. @@ -343,7 +344,56 @@ namespace winrt::TerminalApp::implementation { auto top = heap.top(); heap.pop(); - _filteredActions.Append(top.command); + actions.push_back(top.command); + } + + return actions; + } + + // Method Description: + // - Update our list of filtered actions to reflect the current contents of + // the input box. For more details on which commands will be displayed, + // see `_getWeight`. + // Arguments: + // - + // Return Value: + // - + void CommandPalette::_updateFilteredActions() + { + auto actions = _collectFilteredActions(); + + // Make _filteredActions look identical to actions, using only Insert and Remove. + // This allows WinUI to nicely animate the ListView as it changes. + for (uint32_t i = 0; i < _filteredActions.Size() && i < actions.size(); i++) + { + for (uint32_t j = i; j < _filteredActions.Size(); j++) + { + if (_filteredActions.GetAt(j) == actions[i]) + { + for (uint32_t k = i; k < j; k++) + { + _filteredActions.RemoveAt(i); + } + break; + } + } + + if (_filteredActions.GetAt(i) != actions[i]) + { + _filteredActions.InsertAt(i, actions[i]); + } + } + + // Remove any extra trailing items from the destination + while (_filteredActions.Size() > actions.size()) + { + _filteredActions.RemoveAtEnd(); + } + + // Add any extra trailing items from the source + while (_filteredActions.Size() < actions.size()) + { + _filteredActions.Append(actions[_filteredActions.Size()]); } } diff --git a/src/cascadia/TerminalApp/CommandPalette.h b/src/cascadia/TerminalApp/CommandPalette.h index 2d396070518..a14466f4f36 100644 --- a/src/cascadia/TerminalApp/CommandPalette.h +++ b/src/cascadia/TerminalApp/CommandPalette.h @@ -37,6 +37,7 @@ namespace winrt::TerminalApp::implementation void _selectNextItem(const bool moveDown); void _updateFilteredActions(); + std::vector _collectFilteredActions(); static int _getWeight(const winrt::hstring& searchText, const winrt::hstring& name); void _close(); From 03e25f12e9828f65549ec0d4fedeae7aff363fdf Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Thu, 16 Jul 2020 17:33:23 -0700 Subject: [PATCH 11/14] Move to the TerminalDependencies NuGet feed (#6954) After we stood up our own NuGet feed in Azure blob storage, Azure DevOps came out with a public artifact feed feature. I've migrated all our packages over, and the only thing left to do is switch our project's NuGet config to use it. Fixes #6952 --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index de105e187bc..00b1de60c4f 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -8,7 +8,7 @@ - + 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

j+zVyRO>L;D4YjeM?QBm2)&aasxWNP{0Xz(N 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 kFey;Cx6Q46a_wjSTK3DhL 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 delta 88821 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 z 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 G{Qm$|k0dz& diff --git a/res/README.md b/res/README.md index 8ae4844d54c..f0929cfff73 100644 --- a/res/README.md +++ b/res/README.md @@ -17,5 +17,5 @@ Please consult the [license](https://raw.githubusercontent.com/microsoft/cascadi ### Fonts Included -* Cascadia Code, Cascadia Mono (2007.01) - * from microsoft/cascadia-code@311cc603f30635da704b6a7d13050e245e61667b +* Cascadia Code, Cascadia Mono (2007.15) + * from microsoft/cascadia-code@2a54363b2c867f7ae811b9a034c0024cef67de96 From 7bc5de613c47f1de90cddfac27637dba74a2c373 Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Thu, 16 Jul 2020 18:18:33 -0700 Subject: [PATCH 13/14] version: bump to 1.3 on master --- custom.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom.props b/custom.props index 272e30a61fa..c4bf1eefda0 100644 --- a/custom.props +++ b/custom.props @@ -5,7 +5,7 @@ true 2020 1 - 2 + 3 Windows Terminal From efb1fddb991dc1e6b614d1637daca7314a229925 Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett" Date: Thu, 16 Jul 2020 18:31:09 -0700 Subject: [PATCH 14/14] Convert most of our JSON deserializers to use type-based conversion (#6590) This pull request converts the following JSON deserializers to use the new JSON deserializer pattern: * Profile * Command * ColorScheme * Action/Args * GlobalSettings * CascadiaSettingsSerialization This is the completion of a long-term JSON refactoring that makes our parser and deserializer more type-safe and robust. We're finally able to get rid of all our manual enum conversion code and unify JSON conversion around _types_ instead of around _keys_. I've introduced another file filled with template specializations, TerminalSettingsSerializationHelpers.h, which comprises a single unit that holds all of the JSON deserializers (and eventually serializers) for every type that comes from TerminalApp or TerminalSettings. I've also moved some types out of Profile and GlobalAppSettings into a new SettingsTypes.h to improve settings locality. This does to some extent constitute a breaking change for already-broken settings. Instead of parsing "successfully" (where invalid values are null or 0 or unknown or unset), deserialization will now fail when there's a type mismatch. Because of that, some tests had to be removed. While I was on a refactoring spree, I removed a number of helpless helpers, like GetWstringFromJson (which converted a u8 string to an hstring to make a wstring out of its data pointer :|) and _ConvertJsonToBool. In the future, we can make the error types more robust and give them position and type information such that a conformant application can display rich error information ("line 3 column 3, I expected a string, you gave me an integer"). Closes #2550. --- .../LocalTests_TerminalApp/CommandTests.cpp | 26 +- .../KeyBindingsTests.cpp | 36 +- .../LocalTests_TerminalApp/SettingsTests.cpp | 5 - src/cascadia/TerminalApp/ActionAndArgs.cpp | 12 +- src/cascadia/TerminalApp/ActionArgs.h | 182 +----- .../CascadiaSettingsSerialization.cpp | 4 +- src/cascadia/TerminalApp/ColorScheme.cpp | 47 +- src/cascadia/TerminalApp/Command.cpp | 18 +- .../TerminalApp/GlobalAppSettings.cpp | 190 +----- src/cascadia/TerminalApp/GlobalAppSettings.h | 16 +- src/cascadia/TerminalApp/JsonUtils.cpp | 125 ---- src/cascadia/TerminalApp/JsonUtils.h | 545 ++++++++++++++---- src/cascadia/TerminalApp/JsonUtilsNew.h | 490 ---------------- src/cascadia/TerminalApp/Profile.cpp | 501 ++-------------- src/cascadia/TerminalApp/Profile.h | 28 +- src/cascadia/TerminalApp/SettingsTypes.h | 28 + .../TerminalSettingsSerializationHelpers.h | 272 +++++++++ src/cascadia/TerminalApp/Utils.cpp | 18 - src/cascadia/TerminalApp/Utils.h | 2 - .../TerminalApp/lib/TerminalAppLib.vcxproj | 3 +- .../lib/TerminalAppLib.vcxproj.filters | 9 +- src/cascadia/ut_app/JsonTests.cpp | 56 -- src/cascadia/ut_app/JsonUtilsTests.cpp | 2 +- 23 files changed, 877 insertions(+), 1738 deletions(-) delete mode 100644 src/cascadia/TerminalApp/JsonUtils.cpp delete mode 100644 src/cascadia/TerminalApp/JsonUtilsNew.h create mode 100644 src/cascadia/TerminalApp/SettingsTypes.h create mode 100644 src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h delete mode 100644 src/cascadia/TerminalApp/Utils.cpp diff --git a/src/cascadia/LocalTests_TerminalApp/CommandTests.cpp b/src/cascadia/LocalTests_TerminalApp/CommandTests.cpp index 129e2469182..1babcf6a2c8 100644 --- a/src/cascadia/LocalTests_TerminalApp/CommandTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/CommandTests.cpp @@ -147,10 +147,8 @@ namespace TerminalAppLocalTests { "name": "command0", "command": { "action": "splitPane", "split": null } }, { "name": "command1", "command": { "action": "splitPane", "split": "vertical" } }, { "name": "command2", "command": { "action": "splitPane", "split": "horizontal" } }, - { "name": "command3", "command": { "action": "splitPane", "split": "none" } }, { "name": "command4", "command": { "action": "splitPane" } }, - { "name": "command5", "command": { "action": "splitPane", "split": "auto" } }, - { "name": "command6", "command": { "action": "splitPane", "split": "foo" } } + { "name": "command5", "command": { "action": "splitPane", "split": "auto" } } ])" }; const auto commands0Json = VerifyParseSucceeded(commands0String); @@ -159,7 +157,7 @@ namespace TerminalAppLocalTests VERIFY_ARE_EQUAL(0u, commands.size()); auto warnings = implementation::Command::LayerJson(commands, commands0Json); VERIFY_ARE_EQUAL(0u, warnings.size()); - VERIFY_ARE_EQUAL(7u, commands.size()); + VERIFY_ARE_EQUAL(5u, commands.size()); { auto command = commands.at(L"command0"); @@ -191,16 +189,6 @@ namespace TerminalAppLocalTests // Verify the args have the expected value VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Horizontal, realArgs.SplitStyle()); } - { - auto command = commands.at(L"command3"); - VERIFY_IS_NOT_NULL(command); - VERIFY_IS_NOT_NULL(command.Action()); - VERIFY_ARE_EQUAL(ShortcutAction::SplitPane, command.Action().Action()); - const auto& realArgs = command.Action().Args().try_as(); - VERIFY_IS_NOT_NULL(realArgs); - // Verify the args have the expected value - VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Automatic, realArgs.SplitStyle()); - } { auto command = commands.at(L"command4"); VERIFY_IS_NOT_NULL(command); @@ -221,16 +209,6 @@ namespace TerminalAppLocalTests // Verify the args have the expected value VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Automatic, realArgs.SplitStyle()); } - { - auto command = commands.at(L"command6"); - VERIFY_IS_NOT_NULL(command); - VERIFY_IS_NOT_NULL(command.Action()); - VERIFY_ARE_EQUAL(ShortcutAction::SplitPane, command.Action().Action()); - const auto& realArgs = command.Action().Args().try_as(); - VERIFY_IS_NOT_NULL(realArgs); - // Verify the args have the expected value - VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Automatic, realArgs.SplitStyle()); - } } void CommandTests::TestResourceKeyName() { diff --git a/src/cascadia/LocalTests_TerminalApp/KeyBindingsTests.cpp b/src/cascadia/LocalTests_TerminalApp/KeyBindingsTests.cpp index 760bfd94c8a..ad51cf8269b 100644 --- a/src/cascadia/LocalTests_TerminalApp/KeyBindingsTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/KeyBindingsTests.cpp @@ -323,10 +323,8 @@ namespace TerminalAppLocalTests { "keys": ["ctrl+c"], "command": { "action": "splitPane", "split": null } }, { "keys": ["ctrl+d"], "command": { "action": "splitPane", "split": "vertical" } }, { "keys": ["ctrl+e"], "command": { "action": "splitPane", "split": "horizontal" } }, - { "keys": ["ctrl+f"], "command": { "action": "splitPane", "split": "none" } }, { "keys": ["ctrl+g"], "command": { "action": "splitPane" } }, - { "keys": ["ctrl+h"], "command": { "action": "splitPane", "split": "auto" } }, - { "keys": ["ctrl+i"], "command": { "action": "splitPane", "split": "foo" } } + { "keys": ["ctrl+h"], "command": { "action": "splitPane", "split": "auto" } } ])" }; const auto bindings0Json = VerifyParseSucceeded(bindings0String); @@ -335,7 +333,7 @@ namespace TerminalAppLocalTests VERIFY_IS_NOT_NULL(appKeyBindings); VERIFY_ARE_EQUAL(0u, appKeyBindings->_keyShortcuts.size()); appKeyBindings->LayerJson(bindings0Json); - VERIFY_ARE_EQUAL(7u, appKeyBindings->_keyShortcuts.size()); + VERIFY_ARE_EQUAL(5u, appKeyBindings->_keyShortcuts.size()); { KeyChord kc{ true, false, false, static_cast('C') }; @@ -364,15 +362,6 @@ namespace TerminalAppLocalTests // Verify the args have the expected value VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Horizontal, realArgs.SplitStyle()); } - { - KeyChord kc{ true, false, false, static_cast('F') }; - auto actionAndArgs = TestUtils::GetActionAndArgs(*appKeyBindings, kc); - VERIFY_ARE_EQUAL(ShortcutAction::SplitPane, actionAndArgs.Action()); - const auto& realArgs = actionAndArgs.Args().try_as(); - VERIFY_IS_NOT_NULL(realArgs); - // Verify the args have the expected value - VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Automatic, realArgs.SplitStyle()); - } { KeyChord kc{ true, false, false, static_cast('G') }; auto actionAndArgs = TestUtils::GetActionAndArgs(*appKeyBindings, kc); @@ -391,15 +380,6 @@ namespace TerminalAppLocalTests // Verify the args have the expected value VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Automatic, realArgs.SplitStyle()); } - { - KeyChord kc{ true, false, false, static_cast('I') }; - auto actionAndArgs = TestUtils::GetActionAndArgs(*appKeyBindings, kc); - VERIFY_ARE_EQUAL(ShortcutAction::SplitPane, actionAndArgs.Action()); - const auto& realArgs = actionAndArgs.Args().try_as(); - VERIFY_IS_NOT_NULL(realArgs); - // Verify the args have the expected value - VERIFY_ARE_EQUAL(winrt::TerminalApp::SplitState::Automatic, realArgs.SplitStyle()); - } } void KeyBindingsTests::TestSetTabColorArgs() @@ -407,7 +387,6 @@ namespace TerminalAppLocalTests const std::string bindings0String{ R"([ { "keys": ["ctrl+c"], "command": { "action": "setTabColor", "color": null } }, { "keys": ["ctrl+d"], "command": { "action": "setTabColor", "color": "#123456" } }, - { "keys": ["ctrl+e"], "command": { "action": "setTabColor", "color": "thisStringObviouslyWontWork" } }, { "keys": ["ctrl+f"], "command": "setTabColor" }, ])" }; @@ -417,7 +396,7 @@ namespace TerminalAppLocalTests VERIFY_IS_NOT_NULL(appKeyBindings); VERIFY_ARE_EQUAL(0u, appKeyBindings->_keyShortcuts.size()); appKeyBindings->LayerJson(bindings0Json); - VERIFY_ARE_EQUAL(4u, appKeyBindings->_keyShortcuts.size()); + VERIFY_ARE_EQUAL(3u, appKeyBindings->_keyShortcuts.size()); { KeyChord kc{ true, false, false, static_cast('C') }; @@ -439,15 +418,6 @@ namespace TerminalAppLocalTests // Remember that COLORREFs are actually BBGGRR order, while the string is in #RRGGBB order VERIFY_ARE_EQUAL(static_cast(til::color(0x563412)), realArgs.TabColor().Value()); } - { - KeyChord kc{ true, false, false, static_cast('E') }; - auto actionAndArgs = TestUtils::GetActionAndArgs(*appKeyBindings, kc); - VERIFY_ARE_EQUAL(ShortcutAction::SetTabColor, actionAndArgs.Action()); - const auto& realArgs = actionAndArgs.Args().try_as(); - VERIFY_IS_NOT_NULL(realArgs); - // Verify the args have the expected value - VERIFY_IS_NULL(realArgs.TabColor()); - } { KeyChord kc{ true, false, false, static_cast('F') }; auto actionAndArgs = TestUtils::GetActionAndArgs(*appKeyBindings, kc); diff --git a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp index 8aed7e4525d..ecd58743f56 100644 --- a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp @@ -1431,10 +1431,6 @@ namespace TerminalAppLocalTests { "name": "profile3", "closeOnExit": null - }, - { - "name": "profile4", - "closeOnExit": { "clearly": "not a string" } } ] })" }; @@ -1449,7 +1445,6 @@ namespace TerminalAppLocalTests // Unknown modes parse as "Graceful" VERIFY_ARE_EQUAL(CloseOnExitMode::Graceful, settings._profiles[3].GetCloseOnExitMode()); - VERIFY_ARE_EQUAL(CloseOnExitMode::Graceful, settings._profiles[4].GetCloseOnExitMode()); } void SettingsTests::TestCloseOnExitCompatibilityShim() { diff --git a/src/cascadia/TerminalApp/ActionAndArgs.cpp b/src/cascadia/TerminalApp/ActionAndArgs.cpp index 5375ea02cb0..a5d98e89bd2 100644 --- a/src/cascadia/TerminalApp/ActionAndArgs.cpp +++ b/src/cascadia/TerminalApp/ActionAndArgs.cpp @@ -2,6 +2,9 @@ #include "ActionArgs.h" #include "ActionAndArgs.h" #include "ActionAndArgs.g.cpp" + +#include "JsonUtils.h" + #include static constexpr std::string_view CopyTextKey{ "copy" }; @@ -44,6 +47,8 @@ static constexpr std::string_view UnboundKey{ "unbound" }; namespace winrt::TerminalApp::implementation { + using namespace ::TerminalApp; + // Specifically use a map here over an unordered_map. We want to be able to // iterate over these entries in-order when we're serializing the keybindings. // HERE BE DRAGONS: @@ -183,11 +188,9 @@ namespace winrt::TerminalApp::implementation } else if (json.isObject()) { - const auto actionVal = json[JsonKey(ActionKey)]; - if (actionVal.isString()) + if (const auto actionString{ JsonUtils::GetValueForKey>(json, ActionKey) }) { - auto actionString = actionVal.asString(); - action = GetActionFromString(actionString); + action = GetActionFromString(*actionString); argsVal = json; } } @@ -281,5 +284,4 @@ namespace winrt::TerminalApp::implementation const auto found = GeneratedActionNames.find(_Action); return found != GeneratedActionNames.end() ? found->second : L""; } - } diff --git a/src/cascadia/TerminalApp/ActionArgs.h b/src/cascadia/TerminalApp/ActionArgs.h index eb233b5967a..93e2b5baf3e 100644 --- a/src/cascadia/TerminalApp/ActionArgs.h +++ b/src/cascadia/TerminalApp/ActionArgs.h @@ -23,6 +23,8 @@ #include "JsonUtils.h" #include "TerminalWarnings.h" +#include "TerminalSettingsSerializationHelpers.h" + // Notes on defining ActionArgs and ActionEventArgs: // * All properties specific to an action should be defined as an ActionArgs // class that implements IActionArgs @@ -31,6 +33,7 @@ namespace winrt::TerminalApp::implementation { + using namespace ::TerminalApp; using FromJsonResult = std::tuple>; struct ActionEventArgs : public ActionEventArgsT @@ -73,26 +76,11 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto commandline{ json[JsonKey(CommandlineKey)] }) - { - args->_Commandline = winrt::to_hstring(commandline.asString()); - } - if (auto startingDirectory{ json[JsonKey(StartingDirectoryKey)] }) - { - args->_StartingDirectory = winrt::to_hstring(startingDirectory.asString()); - } - if (auto tabTitle{ json[JsonKey(TabTitleKey)] }) - { - args->_TabTitle = winrt::to_hstring(tabTitle.asString()); - } - if (auto index{ json[JsonKey(ProfileIndexKey)] }) - { - args->_ProfileIndex = index.asInt(); - } - if (auto profile{ json[JsonKey(ProfileKey)] }) - { - args->_Profile = winrt::to_hstring(profile.asString()); - } + JsonUtils::GetValueForKey(json, CommandlineKey, args->_Commandline); + JsonUtils::GetValueForKey(json, StartingDirectoryKey, args->_StartingDirectory); + JsonUtils::GetValueForKey(json, TabTitleKey, args->_TabTitle); + JsonUtils::GetValueForKey(json, ProfileIndexKey, args->_ProfileIndex); + JsonUtils::GetValueForKey(json, ProfileKey, args->_Profile); return *args; } }; @@ -120,10 +108,7 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto singleLine{ json[JsonKey(SingleLineKey)] }) - { - args->_SingleLine = singleLine.asBool(); - } + JsonUtils::GetValueForKey(json, SingleLineKey, args->_SingleLine); return { *args, {} }; } }; @@ -177,49 +162,11 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto tabIndex{ json[JsonKey(TabIndexKey)] }) - { - args->_TabIndex = tabIndex.asUInt(); - } + JsonUtils::GetValueForKey(json, TabIndexKey, args->_TabIndex); return { *args, {} }; } }; - // Possible Direction values - // TODO:GH#2550/#3475 - move these to a centralized deserializing place - static constexpr std::string_view LeftString{ "left" }; - static constexpr std::string_view RightString{ "right" }; - static constexpr std::string_view UpString{ "up" }; - static constexpr std::string_view DownString{ "down" }; - - // Function Description: - // - Helper function for parsing a Direction from a string - // Arguments: - // - directionString: the string to attempt to parse - // Return Value: - // - The encoded Direction value, or Direction::None if it was an invalid string - static TerminalApp::Direction ParseDirection(const std::string& directionString) - { - if (directionString == LeftString) - { - return TerminalApp::Direction::Left; - } - else if (directionString == RightString) - { - return TerminalApp::Direction::Right; - } - else if (directionString == UpString) - { - return TerminalApp::Direction::Up; - } - else if (directionString == DownString) - { - return TerminalApp::Direction::Down; - } - // default behavior for invalid data - return TerminalApp::Direction::None; - }; - struct ResizePaneArgs : public ResizePaneArgsT { ResizePaneArgs() = default; @@ -243,10 +190,7 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto directionString{ json[JsonKey(DirectionKey)] }) - { - args->_Direction = ParseDirection(directionString.asString()); - } + JsonUtils::GetValueForKey(json, DirectionKey, args->_Direction); if (args->_Direction == TerminalApp::Direction::None) { return { nullptr, { ::TerminalApp::SettingsLoadWarnings::MissingRequiredParameter } }; @@ -281,10 +225,7 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto directionString{ json[JsonKey(DirectionKey)] }) - { - args->_Direction = ParseDirection(directionString.asString()); - } + JsonUtils::GetValueForKey(json, DirectionKey, args->_Direction); if (args->_Direction == TerminalApp::Direction::None) { return { nullptr, { ::TerminalApp::SettingsLoadWarnings::MissingRequiredParameter } }; @@ -319,48 +260,11 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto jsonDelta{ json[JsonKey(AdjustFontSizeDelta)] }) - { - args->_Delta = jsonDelta.asInt(); - } + JsonUtils::GetValueForKey(json, AdjustFontSizeDelta, args->_Delta); return { *args, {} }; } }; - // Possible SplitState values - // TODO:GH#2550/#3475 - move these to a centralized deserializing place - static constexpr std::string_view VerticalKey{ "vertical" }; - static constexpr std::string_view HorizontalKey{ "horizontal" }; - static constexpr std::string_view AutomaticKey{ "auto" }; - static TerminalApp::SplitState ParseSplitState(const std::string& stateString) - { - if (stateString == VerticalKey) - { - return TerminalApp::SplitState::Vertical; - } - else if (stateString == HorizontalKey) - { - return TerminalApp::SplitState::Horizontal; - } - else if (stateString == AutomaticKey) - { - return TerminalApp::SplitState::Automatic; - } - // default behavior for invalid data - return TerminalApp::SplitState::Automatic; - }; - - // Possible SplitType values - static constexpr std::string_view DuplicateKey{ "duplicate" }; - static TerminalApp::SplitType ParseSplitModeState(const std::string& stateString) - { - if (stateString == DuplicateKey) - { - return TerminalApp::SplitType::Duplicate; - } - return TerminalApp::SplitType::Manual; - } - struct SplitPaneArgs : public SplitPaneArgsT { SplitPaneArgs() = default; @@ -391,48 +295,12 @@ namespace winrt::TerminalApp::implementation // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); args->_TerminalArgs = NewTerminalArgs::FromJson(json); - if (auto jsonStyle{ json[JsonKey(SplitKey)] }) - { - args->_SplitStyle = ParseSplitState(jsonStyle.asString()); - } - if (auto jsonStyle{ json[JsonKey(SplitModeKey)] }) - { - args->_SplitMode = ParseSplitModeState(jsonStyle.asString()); - } + JsonUtils::GetValueForKey(json, SplitKey, args->_SplitStyle); + JsonUtils::GetValueForKey(json, SplitModeKey, args->_SplitMode); return { *args, {} }; } }; - // Possible SettingsTarget values - // TODO:GH#2550/#3475 - move these to a centralized deserializing place - static constexpr std::string_view SettingsFileString{ "settingsFile" }; - static constexpr std::string_view DefaultsFileString{ "defaultsFile" }; - static constexpr std::string_view AllFilesString{ "allFiles" }; - - // Function Description: - // - Helper function for parsing a SettingsTarget from a string - // Arguments: - // - targetString: the string to attempt to parse - // Return Value: - // - The encoded SettingsTarget value, or SettingsTarget::SettingsFile if it was an invalid string - static TerminalApp::SettingsTarget ParseSettingsTarget(const std::string& targetString) - { - if (targetString == SettingsFileString) - { - return TerminalApp::SettingsTarget::SettingsFile; - } - else if (targetString == DefaultsFileString) - { - return TerminalApp::SettingsTarget::DefaultsFile; - } - else if (targetString == AllFilesString) - { - return TerminalApp::SettingsTarget::AllFiles; - } - // default behavior for invalid data - return TerminalApp::SettingsTarget::SettingsFile; - }; - struct OpenSettingsArgs : public OpenSettingsArgsT { OpenSettingsArgs() = default; @@ -456,10 +324,7 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto targetString{ json[JsonKey(TargetKey)] }) - { - args->_Target = ParseSettingsTarget(targetString.asString()); - } + JsonUtils::GetValueForKey(json, TargetKey, args->_Target); return { *args, {} }; } }; @@ -487,16 +352,10 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - std::optional temp; - try + if (const auto temp{ JsonUtils::GetValueForKey>(json, ColorKey) }) { - ::TerminalApp::JsonUtils::GetOptionalColor(json, ColorKey, temp); - if (temp.has_value()) - { - args->_TabColor = static_cast(temp.value()); - } + args->_TabColor = static_cast(*temp); } - CATCH_LOG(); return { *args, {} }; } }; @@ -524,10 +383,7 @@ namespace winrt::TerminalApp::implementation { // LOAD BEARING: Not using make_self here _will_ break you in the future! auto args = winrt::make_self(); - if (auto title{ json[JsonKey(TitleKey)] }) - { - args->_Title = winrt::to_hstring(title.asString()); - } + JsonUtils::GetValueForKey(json, TitleKey, args->_Title); return { *args, {} }; } }; diff --git a/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp index 2ed23f8c770..1a8f2b6e71f 100644 --- a/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp @@ -249,9 +249,9 @@ void CascadiaSettings::_LoadDynamicProfiles() const auto disabledProfileSources = CascadiaSettings::_GetDisabledProfileSourcesJsonObject(_userSettings); if (disabledProfileSources.isArray()) { - for (const auto& ns : disabledProfileSources) + for (const auto& json : disabledProfileSources) { - ignoredNamespaces.emplace(GetWstringFromJson(ns)); + ignoredNamespaces.emplace(JsonUtils::GetValue(json)); } } diff --git a/src/cascadia/TerminalApp/ColorScheme.cpp b/src/cascadia/TerminalApp/ColorScheme.cpp index 45d4e7748e4..525d8ec95cd 100644 --- a/src/cascadia/TerminalApp/ColorScheme.cpp +++ b/src/cascadia/TerminalApp/ColorScheme.cpp @@ -105,9 +105,9 @@ ColorScheme ColorScheme::FromJson(const Json::Value& json) // - true iff the json object has the same `name` as we do. bool ColorScheme::ShouldBeLayered(const Json::Value& json) const { - if (const auto name{ json[JsonKey(NameKey)] }) + std::wstring nameFromJson{}; + if (JsonUtils::GetValueForKey(json, NameKey, nameFromJson)) { - const auto nameFromJson = GetWstringFromJson(name); return nameFromJson == _schemeName; } return false; @@ -125,39 +125,16 @@ bool ColorScheme::ShouldBeLayered(const Json::Value& json) const // void ColorScheme::LayerJson(const Json::Value& json) { - if (auto name{ json[JsonKey(NameKey)] }) - { - _schemeName = winrt::to_hstring(name.asString()); - } - if (auto fgString{ json[JsonKey(ForegroundKey)] }) - { - const auto color = Utils::ColorFromHexString(fgString.asString()); - _defaultForeground = color; - } - if (auto bgString{ json[JsonKey(BackgroundKey)] }) - { - const auto color = Utils::ColorFromHexString(bgString.asString()); - _defaultBackground = color; - } - if (auto sbString{ json[JsonKey(SelectionBackgroundKey)] }) - { - const auto color = Utils::ColorFromHexString(sbString.asString()); - _selectionBackground = color; - } - if (auto sbString{ json[JsonKey(CursorColorKey)] }) - { - const auto color = Utils::ColorFromHexString(sbString.asString()); - _cursorColor = color; - } + JsonUtils::GetValueForKey(json, NameKey, _schemeName); + JsonUtils::GetValueForKey(json, ForegroundKey, _defaultForeground); + JsonUtils::GetValueForKey(json, BackgroundKey, _defaultBackground); + JsonUtils::GetValueForKey(json, SelectionBackgroundKey, _selectionBackground); + JsonUtils::GetValueForKey(json, CursorColorKey, _cursorColor); int i = 0; for (const auto& current : TableColors) { - if (auto str{ json[JsonKey(current)] }) - { - const auto color = Utils::ColorFromHexString(str.asString()); - _table.at(i) = color; - } + JsonUtils::GetValueForKey(json, current, _table.at(i)); i++; } } @@ -200,11 +177,7 @@ til::color ColorScheme::GetCursorColor() const noexcept // - the name of the color scheme represented by `json` as a std::wstring optional // i.e. the value of the `name` property. // - returns std::nullopt if `json` doesn't have the `name` property -std::optional TerminalApp::ColorScheme::GetNameFromJson(const Json::Value& json) +std::optional ColorScheme::GetNameFromJson(const Json::Value& json) { - if (const auto name{ json[JsonKey(NameKey)] }) - { - return GetWstringFromJson(name); - } - return std::nullopt; + return JsonUtils::GetValueForKey>(json, NameKey); } diff --git a/src/cascadia/TerminalApp/Command.cpp b/src/cascadia/TerminalApp/Command.cpp index a8e72ec6a84..f3fe1219126 100644 --- a/src/cascadia/TerminalApp/Command.cpp +++ b/src/cascadia/TerminalApp/Command.cpp @@ -7,10 +7,12 @@ #include "Utils.h" #include "ActionAndArgs.h" +#include "JsonUtils.h" #include using namespace winrt::Microsoft::Terminal::Settings; using namespace winrt::TerminalApp; +using namespace ::TerminalApp; static constexpr std::string_view NameKey{ "name" }; static constexpr std::string_view IconPathKey{ "iconPath" }; @@ -35,25 +37,17 @@ namespace winrt::TerminalApp::implementation { if (name.isObject()) { - try + if (const auto resourceKey{ JsonUtils::GetValueForKey>(name, "key") }) { - if (const auto keyJson{ name[JsonKey("key")] }) + if (HasLibraryResourceWithName(*resourceKey)) { - // Make sure the key is present before we try - // loading it. Otherwise we'll crash - const auto resourceKey = GetWstringFromJson(keyJson); - if (HasLibraryResourceWithName(resourceKey)) - { - return GetLibraryResourceString(resourceKey); - } + return GetLibraryResourceString(*resourceKey); } } - CATCH_LOG(); } else if (name.isString()) { - auto nameStr = name.asString(); - return winrt::to_hstring(nameStr); + return JsonUtils::GetValue(name); } } diff --git a/src/cascadia/TerminalApp/GlobalAppSettings.cpp b/src/cascadia/TerminalApp/GlobalAppSettings.cpp index 1e074d86cf2..c214c04896d 100644 --- a/src/cascadia/TerminalApp/GlobalAppSettings.cpp +++ b/src/cascadia/TerminalApp/GlobalAppSettings.cpp @@ -7,11 +7,11 @@ #include "../../inc/DefaultSettings.h" #include "Utils.h" #include "JsonUtils.h" +#include "TerminalSettingsSerializationHelpers.h" using namespace TerminalApp; using namespace winrt::Microsoft::Terminal::Settings; using namespace winrt::TerminalApp; -using namespace winrt::Windows::Data::Json; using namespace winrt::Windows::UI::Xaml; using namespace ::Microsoft::Console; using namespace winrt::Microsoft::UI::Xaml::Controls; @@ -44,21 +44,6 @@ static constexpr std::string_view ForceFullRepaintRenderingKey{ "experimental.re static constexpr std::string_view SoftwareRenderingKey{ "experimental.rendering.software" }; static constexpr std::string_view ForceVTInputKey{ "experimental.input.forceVT" }; -// Launch mode values -static constexpr std::wstring_view DefaultLaunchModeValue{ L"default" }; -static constexpr std::wstring_view MaximizedLaunchModeValue{ L"maximized" }; -static constexpr std::wstring_view FullscreenLaunchModeValue{ L"fullscreen" }; - -// Tab Width Mode values -static constexpr std::wstring_view EqualTabWidthModeValue{ L"equal" }; -static constexpr std::wstring_view TitleLengthTabWidthModeValue{ L"titleLength" }; -static constexpr std::wstring_view TitleLengthCompactModeValue{ L"compact" }; - -// Theme values -static constexpr std::wstring_view LightThemeValue{ L"light" }; -static constexpr std::wstring_view DarkThemeValue{ L"dark" }; -static constexpr std::wstring_view SystemThemeValue{ L"system" }; - #ifdef _DEBUG static constexpr bool debugFeaturesDefault{ true }; #else @@ -149,66 +134,51 @@ GlobalAppSettings GlobalAppSettings::FromJson(const Json::Value& json) void GlobalAppSettings::LayerJson(const Json::Value& json) { - if (auto defaultProfile{ json[JsonKey(DefaultProfileKey)] }) - { - _unparsedDefaultProfile.emplace(GetWstringFromJson(defaultProfile)); - } + JsonUtils::GetValueForKey(json, DefaultProfileKey, _unparsedDefaultProfile); - JsonUtils::GetBool(json, AlwaysShowTabsKey, _AlwaysShowTabs); + JsonUtils::GetValueForKey(json, AlwaysShowTabsKey, _AlwaysShowTabs); - JsonUtils::GetBool(json, ConfirmCloseAllKey, _ConfirmCloseAllTabs); + JsonUtils::GetValueForKey(json, ConfirmCloseAllKey, _ConfirmCloseAllTabs); - JsonUtils::GetInt(json, InitialRowsKey, _InitialRows); + JsonUtils::GetValueForKey(json, InitialRowsKey, _InitialRows); - JsonUtils::GetInt(json, InitialColsKey, _InitialCols); + JsonUtils::GetValueForKey(json, InitialColsKey, _InitialCols); - if (auto initialPosition{ json[JsonKey(InitialPositionKey)] }) - { - _ParseInitialPosition(initialPosition.asString(), _InitialPosition); - } + JsonUtils::GetValueForKey(json, InitialPositionKey, _InitialPosition); - JsonUtils::GetBool(json, ShowTitleInTitlebarKey, _ShowTitleInTitlebar); + JsonUtils::GetValueForKey(json, ShowTitleInTitlebarKey, _ShowTitleInTitlebar); - JsonUtils::GetBool(json, ShowTabsInTitlebarKey, _ShowTabsInTitlebar); + JsonUtils::GetValueForKey(json, ShowTabsInTitlebarKey, _ShowTabsInTitlebar); - JsonUtils::GetWstring(json, WordDelimitersKey, _WordDelimiters); + JsonUtils::GetValueForKey(json, WordDelimitersKey, _WordDelimiters); - JsonUtils::GetBool(json, CopyOnSelectKey, _CopyOnSelect); + JsonUtils::GetValueForKey(json, CopyOnSelectKey, _CopyOnSelect); - JsonUtils::GetBool(json, CopyFormattingKey, _CopyFormatting); + JsonUtils::GetValueForKey(json, CopyFormattingKey, _CopyFormatting); - JsonUtils::GetBool(json, WarnAboutLargePasteKey, _WarnAboutLargePaste); + JsonUtils::GetValueForKey(json, WarnAboutLargePasteKey, _WarnAboutLargePaste); - JsonUtils::GetBool(json, WarnAboutMultiLinePasteKey, _WarnAboutMultiLinePaste); + JsonUtils::GetValueForKey(json, WarnAboutMultiLinePasteKey, _WarnAboutMultiLinePaste); - if (auto launchMode{ json[JsonKey(LaunchModeKey)] }) - { - _LaunchMode = _ParseLaunchMode(GetWstringFromJson(launchMode)); - } + JsonUtils::GetValueForKey(json, LaunchModeKey, _LaunchMode); - if (auto theme{ json[JsonKey(ThemeKey)] }) - { - _Theme = _ParseTheme(GetWstringFromJson(theme)); - } + JsonUtils::GetValueForKey(json, ThemeKey, _Theme); - if (auto tabWidthMode{ json[JsonKey(TabWidthModeKey)] }) - { - _TabWidthMode = _ParseTabWidthMode(GetWstringFromJson(tabWidthMode)); - } + JsonUtils::GetValueForKey(json, TabWidthModeKey, _TabWidthMode); - JsonUtils::GetBool(json, SnapToGridOnResizeKey, _SnapToGridOnResize); + JsonUtils::GetValueForKey(json, SnapToGridOnResizeKey, _SnapToGridOnResize); - JsonUtils::GetBool(json, ForceFullRepaintRenderingKey, _ForceFullRepaintRendering); + // GetValueForKey will only override the current value if the key exists + JsonUtils::GetValueForKey(json, DebugFeaturesKey, _DebugFeaturesEnabled); - JsonUtils::GetBool(json, SoftwareRenderingKey, _SoftwareRendering); - JsonUtils::GetBool(json, ForceVTInputKey, _ForceVTInput); + JsonUtils::GetValueForKey(json, ForceFullRepaintRenderingKey, _ForceFullRepaintRendering); - // GetBool will only override the current value if the key exists - JsonUtils::GetBool(json, DebugFeaturesKey, _DebugFeaturesEnabled); + JsonUtils::GetValueForKey(json, SoftwareRenderingKey, _SoftwareRendering); + JsonUtils::GetValueForKey(json, ForceVTInputKey, _ForceVTInput); - JsonUtils::GetBool(json, EnableStartupTaskKey, _StartOnUserLogin); + JsonUtils::GetValueForKey(json, EnableStartupTaskKey, _StartOnUserLogin); - JsonUtils::GetBool(json, AlwaysOnTopKey, _AlwaysOnTop); + JsonUtils::GetValueForKey(json, AlwaysOnTopKey, _AlwaysOnTop); // This is a helper lambda to get the keybindings and commands out of both // and array of objects. We'll use this twice, once on the legacy @@ -236,116 +206,6 @@ void GlobalAppSettings::LayerJson(const Json::Value& json) parseBindings(BindingsKey); } -// Method Description: -// - Helper function for converting a user-specified cursor style corresponding -// CursorStyle enum value -// Arguments: -// - themeString: The string value from the settings file to parse -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -ElementTheme GlobalAppSettings::_ParseTheme(const std::wstring& themeString) noexcept -{ - if (themeString == LightThemeValue) - { - return ElementTheme::Light; - } - else if (themeString == DarkThemeValue) - { - return ElementTheme::Dark; - } - // default behavior for invalid data or SystemThemeValue - return ElementTheme::Default; -} - -// Method Description: -// - Helper function for converting the initial position string into -// 2 coordinate values. We allow users to only provide one coordinate, -// thus, we use comma as the separator: -// (100, 100): standard input string -// (, 100), (100, ): if a value is missing, we set this value as a default -// (,): both x and y are set to default -// (abc, 100): if a value is not valid, we treat it as default -// (100, 100, 100): we only read the first two values, this is equivalent to (100, 100) -// Arguments: -// - initialPosition: the initial position string from json -// ret: reference to a struct whose optionals will be populated -// Return Value: -// - None -void GlobalAppSettings::_ParseInitialPosition(const std::string& initialPosition, - LaunchPosition& ret) noexcept -{ - static constexpr char singleCharDelim = ','; - std::stringstream tokenStream(initialPosition); - std::string token; - uint8_t initialPosIndex = 0; - - // Get initial position values till we run out of delimiter separated values in the stream - // or we hit max number of allowable values (= 2) - // Non-numeral values or empty string will be caught as exception and we do not assign them - for (; std::getline(tokenStream, token, singleCharDelim) && (initialPosIndex < 2); initialPosIndex++) - { - try - { - int32_t position = std::stoi(token); - if (initialPosIndex == 0) - { - ret.x.emplace(position); - } - - if (initialPosIndex == 1) - { - ret.y.emplace(position); - } - } - catch (...) - { - // Do nothing - } - } -} - -// Method Description: -// - Helper function for converting the user-specified launch mode -// to a LaunchMode enum value -// Arguments: -// - launchModeString: The string value from the settings file to parse -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -LaunchMode GlobalAppSettings::_ParseLaunchMode(const std::wstring& launchModeString) noexcept -{ - if (launchModeString == MaximizedLaunchModeValue) - { - return LaunchMode::MaximizedMode; - } - else if (launchModeString == FullscreenLaunchModeValue) - { - return LaunchMode::FullscreenMode; - } - - return LaunchMode::DefaultMode; -} - -// Method Description: -// - Helper function for converting the user-specified tab width -// to a TabViewWidthMode enum value -// Arguments: -// - tabWidthModeString: The string value from the settings file to parse -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -TabViewWidthMode GlobalAppSettings::_ParseTabWidthMode(const std::wstring& tabWidthModeString) noexcept -{ - if (tabWidthModeString == TitleLengthTabWidthModeValue) - { - return TabViewWidthMode::SizeToContent; - } - else if (tabWidthModeString == TitleLengthCompactModeValue) - { - return TabViewWidthMode::Compact; - } - // default behavior for invalid data or EqualTabWidthValue - return TabViewWidthMode::Equal; -} - // Method Description: // - Adds the given colorscheme to our map of schemes, using its name as the key. // Arguments: diff --git a/src/cascadia/TerminalApp/GlobalAppSettings.h b/src/cascadia/TerminalApp/GlobalAppSettings.h index 988d7fe1c08..7491b433f41 100644 --- a/src/cascadia/TerminalApp/GlobalAppSettings.h +++ b/src/cascadia/TerminalApp/GlobalAppSettings.h @@ -17,6 +17,7 @@ Author(s): #include "AppKeyBindings.h" #include "ColorScheme.h" #include "Command.h" +#include "SettingsTypes.h" // fwdecl unittest classes namespace TerminalAppLocalTests @@ -28,12 +29,6 @@ namespace TerminalAppLocalTests namespace TerminalApp { class GlobalAppSettings; - - struct LaunchPosition - { - std::optional x; - std::optional y; - }; }; class TerminalApp::GlobalAppSettings final @@ -96,15 +91,6 @@ class TerminalApp::GlobalAppSettings final std::unordered_map _colorSchemes; std::unordered_map _commands; - static winrt::Windows::UI::Xaml::ElementTheme _ParseTheme(const std::wstring& themeString) noexcept; - - static winrt::Microsoft::UI::Xaml::Controls::TabViewWidthMode _ParseTabWidthMode(const std::wstring& tabWidthModeString) noexcept; - - static void _ParseInitialPosition(const std::string& initialPosition, - LaunchPosition& ret) noexcept; - - static winrt::TerminalApp::LaunchMode _ParseLaunchMode(const std::wstring& launchModeString) noexcept; - friend class TerminalAppLocalTests::SettingsTests; friend class TerminalAppLocalTests::ColorSchemeTests; }; diff --git a/src/cascadia/TerminalApp/JsonUtils.cpp b/src/cascadia/TerminalApp/JsonUtils.cpp deleted file mode 100644 index f4282097b83..00000000000 --- a/src/cascadia/TerminalApp/JsonUtils.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#include "pch.h" -#include "Utils.h" -#include "JsonUtils.h" -#include "../../types/inc/Utils.hpp" - -void TerminalApp::JsonUtils::GetOptionalColor(const Json::Value& json, - std::string_view key, - std::optional& target) -{ - const auto conversionFn = [](const Json::Value& value) -> til::color { - return ::Microsoft::Console::Utils::ColorFromHexString(value.asString()); - }; - GetOptionalValue(json, - key, - target, - conversionFn); -} - -void TerminalApp::JsonUtils::GetOptionalString(const Json::Value& json, - std::string_view key, - std::optional& target) -{ - const auto conversionFn = [](const Json::Value& value) -> std::wstring { - return GetWstringFromJson(value); - }; - GetOptionalValue(json, - key, - target, - conversionFn); -} - -void TerminalApp::JsonUtils::GetOptionalGuid(const Json::Value& json, - std::string_view key, - std::optional& target) -{ - const auto conversionFn = [](const Json::Value& value) -> GUID { - return ::Microsoft::Console::Utils::GuidFromString(GetWstringFromJson(value)); - }; - GetOptionalValue(json, - key, - target, - conversionFn); -} - -void TerminalApp::JsonUtils::GetOptionalDouble(const Json::Value& json, - std::string_view key, - std::optional& target) -{ - const auto conversionFn = [](const Json::Value& value) -> double { - return value.asFloat(); - }; - const auto validationFn = [](const Json::Value& value) -> bool { - return value.isNumeric(); - }; - GetOptionalValue(json, - key, - target, - conversionFn, - validationFn); -} - -void TerminalApp::JsonUtils::GetInt(const Json::Value& json, - std::string_view key, - int& target) -{ - const auto conversionFn = [](const Json::Value& value) -> int { - return value.asInt(); - }; - const auto validationFn = [](const Json::Value& value) -> bool { - return value.isInt(); - }; - GetValue(json, key, target, conversionFn, validationFn); -} - -void TerminalApp::JsonUtils::GetUInt(const Json::Value& json, - std::string_view key, - uint32_t& target) -{ - const auto conversionFn = [](const Json::Value& value) -> uint32_t { - return value.asUInt(); - }; - const auto validationFn = [](const Json::Value& value) -> bool { - return value.isUInt(); - }; - GetValue(json, key, target, conversionFn, validationFn); -} - -void TerminalApp::JsonUtils::GetDouble(const Json::Value& json, - std::string_view key, - double& target) -{ - const auto conversionFn = [](const Json::Value& value) -> double { - return value.asFloat(); - }; - const auto validationFn = [](const Json::Value& value) -> bool { - return value.isNumeric(); - }; - GetValue(json, key, target, conversionFn, validationFn); -} - -void TerminalApp::JsonUtils::GetBool(const Json::Value& json, - std::string_view key, - bool& target) -{ - const auto conversionFn = [](const Json::Value& value) -> bool { - return value.asBool(); - }; - const auto validationFn = [](const Json::Value& value) -> bool { - return value.isBool(); - }; - GetValue(json, key, target, conversionFn, validationFn); -} - -void TerminalApp::JsonUtils::GetWstring(const Json::Value& json, - std::string_view key, - std::wstring& target) -{ - const auto conversionFn = [](const Json::Value& value) -> std::wstring { - return GetWstringFromJson(value); - }; - GetValue(json, key, target, conversionFn, nullptr); -} diff --git a/src/cascadia/TerminalApp/JsonUtils.h b/src/cascadia/TerminalApp/JsonUtils.h index 1845a9d6524..b98ade1da9d 100644 --- a/src/cascadia/TerminalApp/JsonUtils.h +++ b/src/cascadia/TerminalApp/JsonUtils.h @@ -9,136 +9,483 @@ Module Name: - Helpers for the TerminalApp project Author(s): - Mike Griese - August 2019 - +- Dustin Howett - January 2020 --*/ + #pragma once +#include + +#include "../types/inc/utils.hpp" + +namespace winrt +{ + // If we don't use winrt, nobody will include the ConversionTraits for winrt stuff. + // If nobody includes it, these forward declarations will suffice. + struct guid; + struct hstring; + namespace Windows::Foundation + { + template + struct IReference; + } +} + namespace TerminalApp::JsonUtils { - void GetOptionalColor(const Json::Value& json, - std::string_view key, - std::optional& target); + namespace Detail + { + // Function Description: + // - Returns a string_view to a Json::Value's internal string storage, + // hopefully without copying it. + __declspec(noinline) inline const std::string_view GetStringView(const Json::Value& json) + { + const char* begin{ nullptr }; + const char* end{ nullptr }; + json.getString(&begin, &end); + const std::string_view zeroCopyString{ begin, gsl::narrow_cast(end - begin) }; + return zeroCopyString; + } - void GetOptionalString(const Json::Value& json, - std::string_view key, - std::optional& target); + template + struct DeduceOptional + { + using Type = typename std::decay::type; + static constexpr bool IsOptional = false; + }; - void GetOptionalGuid(const Json::Value& json, - std::string_view key, - std::optional& target); + template + struct DeduceOptional> + { + using Type = typename std::decay::type; + static constexpr bool IsOptional = true; + }; - void GetOptionalDouble(const Json::Value& json, - std::string_view key, - std::optional& target); + template + struct DeduceOptional<::winrt::Windows::Foundation::IReference> + { + using Type = typename std::decay::type; + static constexpr bool IsOptional = true; + }; + } - // Method Description: - // - Helper that can be used for retrieving an optional value from a json - // object, and parsing it's value to layer on a given target object. - // - If the key we're looking for _doesn't_ exist in the json object, - // we'll leave the target object unmodified. - // - If the key exists in the json object, but is set to `null`, then - // we'll instead set the target back to nullopt. - // - Each caller should provide a conversion function that takes a - // Json::Value and returns an object of the same type as target. - // Arguments: - // - json: The json object to search for the given key - // - key: The key to look for in the json object - // - target: the optional object to receive the value from json - // - conversion: a std::function which can be used to - // convert the Json::Value to the appropriate type. - // - validation: optional, if provided, will be called first to ensure that - // the json::value is of the correct type before attempting to call - // `conversion`. - // Return Value: - // - - template - void GetOptionalValue(const Json::Value& json, - std::string_view key, - std::optional& target, - F&& conversion, - const std::function& validation = nullptr) + // These exceptions cannot use localized messages, as we do not have + // guaranteed access to the resource loader. + class TypeMismatchException : public std::runtime_error + { + public: + TypeMismatchException() : + runtime_error("unexpected data type") {} + }; + + class KeyedException : public std::runtime_error + { + public: + KeyedException(const std::string_view key, std::exception_ptr exception) : + runtime_error(fmt::format("error parsing \"{0}\"", key).c_str()), + _key{ key }, + _innerException{ std::move(exception) } {} + + std::string GetKey() const + { + return _key; + } + + [[noreturn]] void RethrowInner() const + { + std::rethrow_exception(_innerException); + } + + private: + std::string _key; + std::exception_ptr _innerException; + }; + + class UnexpectedValueException : public std::runtime_error + { + public: + UnexpectedValueException(const std::string_view value) : + runtime_error(fmt::format("unexpected value \"{0}\"", value).c_str()), + _value{ value } {} + + std::string GetValue() const + { + return _value; + } + + private: + std::string _value; + }; + + template + struct ConversionTrait + { + // Forward-declare these so the linker can pick up specializations from elsewhere! + T FromJson(const Json::Value&); + bool CanConvert(const Json::Value& json); + }; + + template<> + struct ConversionTrait + { + std::string FromJson(const Json::Value& json) + { + return json.asString(); + } + + bool CanConvert(const Json::Value& json) + { + return json.isString(); + } + }; + + template<> + struct ConversionTrait + { + std::wstring FromJson(const Json::Value& json) + { + return til::u8u16(Detail::GetStringView(json)); + } + + bool CanConvert(const Json::Value& json) + { + return json.isString(); + } + }; + +#ifdef WINRT_BASE_H + template<> + struct ConversionTrait : public ConversionTrait + { + // Leverage the wstring converter's validation + winrt::hstring FromJson(const Json::Value& json) + { + return winrt::hstring{ til::u8u16(Detail::GetStringView(json)) }; + } + }; +#endif + + template<> + struct ConversionTrait + { + bool FromJson(const Json::Value& json) + { + return json.asBool(); + } + + bool CanConvert(const Json::Value& json) + { + return json.isBool(); + } + }; + + template<> + struct ConversionTrait + { + int FromJson(const Json::Value& json) + { + return json.asInt(); + } + + bool CanConvert(const Json::Value& json) + { + return json.isInt(); + } + }; + + template<> + struct ConversionTrait + { + unsigned int FromJson(const Json::Value& json) + { + return json.asUInt(); + } + + bool CanConvert(const Json::Value& json) + { + return json.isUInt(); + } + }; + + template<> + struct ConversionTrait + { + float FromJson(const Json::Value& json) + { + return json.asFloat(); + } + + bool CanConvert(const Json::Value& json) + { + return json.isNumeric(); + } + }; + + template<> + struct ConversionTrait + { + double FromJson(const Json::Value& json) + { + return json.asDouble(); + } + + bool CanConvert(const Json::Value& json) + { + return json.isNumeric(); + } + }; + + template<> + struct ConversionTrait + { + GUID FromJson(const Json::Value& json) + { + return ::Microsoft::Console::Utils::GuidFromString(til::u8u16(Detail::GetStringView(json))); + } + + bool CanConvert(const Json::Value& json) + { + if (!json.isString()) + { + return false; + } + + const auto string{ Detail::GetStringView(json) }; + return string.length() == 38 && string.front() == '{' && string.back() == '}'; + } + }; + + // (GUID and winrt::guid are mutually convertible!) + template<> + struct ConversionTrait : public ConversionTrait + { + }; + + template<> + struct ConversionTrait + { + til::color FromJson(const Json::Value& json) + { + return ::Microsoft::Console::Utils::ColorFromHexString(Detail::GetStringView(json)); + } + + bool CanConvert(const Json::Value& json) + { + if (!json.isString()) + { + return false; + } + + const auto string{ Detail::GetStringView(json) }; + return (string.length() == 7 || string.length() == 4) && string.front() == '#'; + } + }; + + template + struct EnumMapper { - if (json.isMember(JsonKey(key))) + using BaseEnumMapper = EnumMapper; + using ValueType = T; + using pair_type = std::pair; + T FromJson(const Json::Value& json) { - if (auto jsonVal{ json[JsonKey(key)] }) + const auto name{ Detail::GetStringView(json) }; + for (const auto& pair : TBase::mappings) { - if (validation == nullptr || validation(jsonVal)) + if (pair.first == name) { - target = conversion(jsonVal); + return pair.second; } } - else + + throw UnexpectedValueException{ name }; + } + + bool CanConvert(const Json::Value& json) + { + return json.isString(); + } + }; + + // FlagMapper is EnumMapper, but it works for bitfields. + // It supports a string (single flag) or an array of strings. + // Does an O(n*m) search; meant for small search spaces! + // + // Cleverly leverage EnumMapper to do the heavy lifting. + template + struct FlagMapper : public EnumMapper + { + private: + // Hide BaseEnumMapper so FlagMapper's consumers cannot see + // it. + using BaseEnumMapper = EnumMapper::BaseEnumMapper; + + public: + using BaseFlagMapper = FlagMapper; + static constexpr T AllSet{ static_cast(~0u) }; + static constexpr T AllClear{ static_cast(0u) }; + + T FromJson(const Json::Value& json) + { + if (json.isString()) + { + return BaseEnumMapper::FromJson(json); + } + else if (json.isArray()) { - // This branch is hit when the json object contained the key, - // but the key was set to `null`. In this case, explicitly clear - // the target. - target = std::nullopt; + unsigned int seen{ 0 }; + T value{}; + for (const auto& element : json) + { + const auto newFlag{ BaseEnumMapper::FromJson(element) }; + if (++seen > 1 && + ((newFlag == AllClear && value != AllClear) || + (value == AllClear && newFlag != AllClear))) + { + // attempt to combine AllClear (explicitly) with anything else + throw UnexpectedValueException{ element.asString() }; + } + value |= newFlag; + } + return value; } + + // We'll only get here if CanConvert has failed us. + return AllClear; } - } + + bool CanConvert(const Json::Value& json) + { + return BaseEnumMapper::CanConvert(json) || json.isArray(); + } + }; // Method Description: - // - Helper that can be used for retrieving a value from a json - // object, and parsing it's value to set on a given target object. - // - If the key we're looking for _doesn't_ exist in the json object, - // we'll leave the target object unmodified. - // - If the key exists in the json object, we'll use the provided - // `validation` function to ensure that the json value is of the - // correct type. - // - If we successfully validate the json value type (or no validation - // function was provided), then we'll use `conversion` to parse the - // value and place the result into `target` - // - Each caller should provide a conversion function that takes a - // Json::Value and returns an object of the same type as target. - // - Unlike GetOptionalValue, if the key exists but is set to `null`, we'll - // just ignore it. + // - Helper that will populate a reference with a value converted from a json object. // Arguments: - // - json: The json object to search for the given key - // - key: The key to look for in the json object - // - target: the optional object to receive the value from json - // - conversion: a std::function which can be used to - // convert the Json::Value to the appropriate type. - // - validation: optional, if provided, will be called first to ensure that - // the json::value is of the correct type before attempting to call - // `conversion`. + // - json: the json object to convert + // - target: the value to populate with the converted result // Return Value: - // - - template - void GetValue(const Json::Value& json, - std::string_view key, - T& target, - F&& conversion, - const std::function& validation = nullptr) + // - a boolean indicating whether the value existed (in this case, was non-null) + // + // GetValue, type-deduced, manual converter + template + bool GetValue(const Json::Value& json, T& target, Converter&& conv) { - if (json.isMember(JsonKey(key))) + if constexpr (Detail::DeduceOptional::IsOptional) { - if (auto jsonVal{ json[JsonKey(key)] }) + // FOR OPTION TYPES + // - If the json object is set to `null`, then + // we'll instead set the target back to the empty optional. + if (json.isNull()) { - if (validation == nullptr || validation(jsonVal)) - { - target = conversion(jsonVal); - } + target = T{}; // zero-construct an empty optional + return true; + } + } + + if (json) + { + if (!conv.CanConvert(json)) + { + throw TypeMismatchException{}; + } + + target = conv.FromJson(json); + return true; + } + return false; + } + + // GetValue, forced return type, manual converter + template + std::decay_t GetValue(const Json::Value& json, Converter&& conv) + { + std::decay_t local{}; + GetValue(json, local, std::forward(conv)); + return local; // returns zero-initialized or value + } + + // GetValueForKey, type-deduced, manual converter + template + bool GetValueForKey(const Json::Value& json, std::string_view key, T& target, Converter&& conv) + { + if (auto found{ json.find(&*key.cbegin(), (&*key.cbegin()) + key.size()) }) + { + try + { + return GetValue(*found, target, std::forward(conv)); + } + catch (...) + { + // Wrap any caught exceptions in one that preserves context. + throw KeyedException(key, std::current_exception()); } } + return false; } - void GetInt(const Json::Value& json, - std::string_view key, - int& target); + // GetValueForKey, forced return type, manual converter + template + std::decay_t GetValueForKey(const Json::Value& json, std::string_view key, Converter&& conv) + { + std::decay_t local{}; + GetValueForKey(json, key, local, std::forward(conv)); + return local; // returns zero-initialized? + } - void GetUInt(const Json::Value& json, - std::string_view key, - uint32_t& target); + // GetValue, type-deduced, with automatic converter + template + bool GetValue(const Json::Value& json, T& target) + { + return GetValue(json, target, ConversionTrait::Type>{}); + } - void GetDouble(const Json::Value& json, - std::string_view key, - double& target); + // GetValue, forced return type, with automatic converter + template + std::decay_t GetValue(const Json::Value& json) + { + std::decay_t local{}; + GetValue(json, local, ConversionTrait::Type>{}); + return local; // returns zero-initialized or value + } - void GetBool(const Json::Value& json, - std::string_view key, - bool& target); + // GetValueForKey, type-deduced, with automatic converter + template + bool GetValueForKey(const Json::Value& json, std::string_view key, T& target) + { + return GetValueForKey(json, key, target, ConversionTrait::Type>{}); + } + + // GetValueForKey, forced return type, with automatic converter + template + std::decay_t GetValueForKey(const Json::Value& json, std::string_view key) + { + return GetValueForKey(json, key, ConversionTrait::Type>{}); + } + + // Get multiple values for keys (json, k, &v, k, &v, k, &v, ...). + // Uses the default converter for each v. + // Careful: this can cause a template explosion. + constexpr void GetValuesForKeys(const Json::Value& /*json*/) {} - void GetWstring(const Json::Value& json, - std::string_view key, - std::wstring& target); + template + void GetValuesForKeys(const Json::Value& json, std::string_view key1, T&& val1, Args&&... args) + { + GetValueForKey(json, key1, val1); + GetValuesForKeys(json, std::forward(args)...); + } }; + +#define JSON_ENUM_MAPPER(...) \ + template<> \ + struct ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__> : \ + public ::TerminalApp::JsonUtils::EnumMapper<__VA_ARGS__, ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__>> + +#define JSON_FLAG_MAPPER(...) \ + template<> \ + struct ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__> : \ + public ::TerminalApp::JsonUtils::FlagMapper<__VA_ARGS__, ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__>> + +#define JSON_MAPPINGS(Count) \ + static constexpr std::array mappings diff --git a/src/cascadia/TerminalApp/JsonUtilsNew.h b/src/cascadia/TerminalApp/JsonUtilsNew.h deleted file mode 100644 index 03e9826f4b2..00000000000 --- a/src/cascadia/TerminalApp/JsonUtilsNew.h +++ /dev/null @@ -1,490 +0,0 @@ -/*++ -Copyright (c) Microsoft Corporation -Licensed under the MIT license. - -Module Name: -- JsonUtils.h - -Abstract: -- Helpers for the TerminalApp project -Author(s): -- Mike Griese - August 2019 -- Dustin Howett - January 2020 ---*/ - -#pragma once - -#include - -#include "../types/inc/utils.hpp" - -namespace winrt -{ - // If we don't use winrt, nobody will include the ConversionTraits for winrt stuff. - // If nobody includes it, these forward declarations will suffice. - struct guid; - struct hstring; - namespace Windows::Foundation - { - template - struct IReference; - } -} - -namespace TerminalApp::JsonUtils -{ - namespace Detail - { - // Function Description: - // - Returns a string_view to a Json::Value's internal string storage, - // hopefully without copying it. - __declspec(noinline) inline const std::string_view GetStringView(const Json::Value& json) - { - const char* begin{ nullptr }; - const char* end{ nullptr }; - json.getString(&begin, &end); - const std::string_view zeroCopyString{ begin, gsl::narrow_cast(end - begin) }; - return zeroCopyString; - } - - template - struct DeduceOptional - { - using Type = typename std::decay::type; - static constexpr bool IsOptional = false; - }; - - template - struct DeduceOptional> - { - using Type = typename std::decay::type; - static constexpr bool IsOptional = true; - }; - - template - struct DeduceOptional<::winrt::Windows::Foundation::IReference> - { - using Type = typename std::decay::type; - static constexpr bool IsOptional = true; - }; - } - - // These exceptions cannot use localized messages, as we do not have - // guaranteed access to the resource loader. - class TypeMismatchException : public std::runtime_error - { - public: - TypeMismatchException() : - runtime_error("unexpected data type") {} - }; - - class KeyedException : public std::runtime_error - { - public: - KeyedException(const std::string_view key, std::exception_ptr exception) : - runtime_error(fmt::format("error parsing \"{0}\"", key).c_str()), - _key{ key }, - _innerException{ std::move(exception) } {} - - std::string GetKey() const - { - return _key; - } - - [[noreturn]] void RethrowInner() const - { - std::rethrow_exception(_innerException); - } - - private: - std::string _key; - std::exception_ptr _innerException; - }; - - class UnexpectedValueException : public std::runtime_error - { - public: - UnexpectedValueException(const std::string_view value) : - runtime_error(fmt::format("unexpected value \"{0}\"", value).c_str()), - _value{ value } {} - - std::string GetValue() const - { - return _value; - } - - private: - std::string _value; - }; - - template - struct ConversionTrait - { - // Forward-declare these so the linker can pick up specializations from elsewhere! - T FromJson(const Json::Value&); - bool CanConvert(const Json::Value& json); - }; - - template<> - struct ConversionTrait - { - std::string FromJson(const Json::Value& json) - { - return json.asString(); - } - - bool CanConvert(const Json::Value& json) - { - return json.isString(); - } - }; - - template<> - struct ConversionTrait - { - std::wstring FromJson(const Json::Value& json) - { - return til::u8u16(Detail::GetStringView(json)); - } - - bool CanConvert(const Json::Value& json) - { - return json.isString(); - } - }; - -#ifdef WINRT_BASE_H - template<> - struct ConversionTrait : public ConversionTrait - { - // Leverage the wstring converter's validation - winrt::hstring FromJson(const Json::Value& json) - { - return winrt::hstring{ til::u8u16(Detail::GetStringView(json)) }; - } - }; -#endif - - template<> - struct ConversionTrait - { - bool FromJson(const Json::Value& json) - { - return json.asBool(); - } - - bool CanConvert(const Json::Value& json) - { - return json.isBool(); - } - }; - - template<> - struct ConversionTrait - { - int FromJson(const Json::Value& json) - { - return json.asInt(); - } - - bool CanConvert(const Json::Value& json) - { - return json.isInt(); - } - }; - - template<> - struct ConversionTrait - { - unsigned int FromJson(const Json::Value& json) - { - return json.asUInt(); - } - - bool CanConvert(const Json::Value& json) - { - return json.isUInt(); - } - }; - - template<> - struct ConversionTrait - { - float FromJson(const Json::Value& json) - { - return json.asFloat(); - } - - bool CanConvert(const Json::Value& json) - { - return json.isNumeric(); - } - }; - - template<> - struct ConversionTrait - { - double FromJson(const Json::Value& json) - { - return json.asDouble(); - } - - bool CanConvert(const Json::Value& json) - { - return json.isNumeric(); - } - }; - - template<> - struct ConversionTrait - { - GUID FromJson(const Json::Value& json) - { - return ::Microsoft::Console::Utils::GuidFromString(til::u8u16(Detail::GetStringView(json))); - } - - bool CanConvert(const Json::Value& json) - { - if (!json.isString()) - { - return false; - } - - const auto string{ Detail::GetStringView(json) }; - return string.length() == 38 && string.front() == '{' && string.back() == '}'; - } - }; - - // (GUID and winrt::guid are mutually convertible!) - template<> - struct ConversionTrait : public ConversionTrait - { - }; - - template<> - struct ConversionTrait - { - til::color FromJson(const Json::Value& json) - { - return ::Microsoft::Console::Utils::ColorFromHexString(Detail::GetStringView(json)); - } - - bool CanConvert(const Json::Value& json) - { - if (!json.isString()) - { - return false; - } - - const auto string{ Detail::GetStringView(json) }; - return (string.length() == 7 || string.length() == 4) && string.front() == '#'; - } - }; - - template - struct EnumMapper - { - using BaseEnumMapper = EnumMapper; - using pair_type = std::pair; - T FromJson(const Json::Value& json) - { - const auto name{ Detail::GetStringView(json) }; - for (const auto& pair : TBase::mappings) - { - if (pair.first == name) - { - return pair.second; - } - } - - throw UnexpectedValueException{ name }; - } - - bool CanConvert(const Json::Value& json) - { - return json.isString(); - } - }; - - // FlagMapper is EnumMapper, but it works for bitfields. - // It supports a string (single flag) or an array of strings. - // Does an O(n*m) search; meant for small search spaces! - // - // Cleverly leverage EnumMapper to do the heavy lifting. - template - struct FlagMapper : public EnumMapper - { - private: - // Hide BaseEnumMapper so FlagMapper's consumers cannot see - // it. - using BaseEnumMapper = EnumMapper::BaseEnumMapper; - - public: - using BaseFlagMapper = FlagMapper; - static constexpr T AllSet{ static_cast(~0u) }; - static constexpr T AllClear{ static_cast(0u) }; - - T FromJson(const Json::Value& json) - { - if (json.isString()) - { - return BaseEnumMapper::FromJson(json); - } - else if (json.isArray()) - { - unsigned int seen{ 0 }; - T value{}; - for (const auto& element : json) - { - const auto newFlag{ BaseEnumMapper::FromJson(element) }; - if (++seen > 1 && - ((newFlag == AllClear && value != AllClear) || - (value == AllClear && newFlag != AllClear))) - { - // attempt to combine AllClear (explicitly) with anything else - throw UnexpectedValueException{ element.asString() }; - } - value |= newFlag; - } - return value; - } - - // We'll only get here if CanConvert has failed us. - return AllClear; - } - - bool CanConvert(const Json::Value& json) - { - return BaseEnumMapper::CanConvert(json) || json.isArray(); - } - }; - - // Method Description: - // - Helper that will populate a reference with a value converted from a json object. - // Arguments: - // - json: the json object to convert - // - target: the value to populate with the converted result - // Return Value: - // - a boolean indicating whether the value existed (in this case, was non-null) - // - // GetValue, type-deduced, manual converter - template - bool GetValue(const Json::Value& json, T& target, Converter&& conv) - { - if constexpr (Detail::DeduceOptional::IsOptional) - { - // FOR OPTION TYPES - // - If the json object is set to `null`, then - // we'll instead set the target back to the empty optional. - if (json.isNull()) - { - target = T{}; // zero-construct an empty optional - return true; - } - } - - if (json) - { - if (!conv.CanConvert(json)) - { - throw TypeMismatchException{}; - } - - target = conv.FromJson(json); - return true; - } - return false; - } - - // GetValue, forced return type, manual converter - template - std::decay_t GetValue(const Json::Value& json, Converter&& conv) - { - std::decay_t local{}; - GetValue(json, local, std::forward(conv)); - return local; // returns zero-initialized or value - } - - // GetValueForKey, type-deduced, manual converter - template - bool GetValueForKey(const Json::Value& json, std::string_view key, T& target, Converter&& conv) - { - if (auto found{ json.find(&*key.cbegin(), (&*key.cbegin()) + key.size()) }) - { - try - { - return GetValue(*found, target, std::forward(conv)); - } - catch (...) - { - // Wrap any caught exceptions in one that preserves context. - throw KeyedException(key, std::current_exception()); - } - } - return false; - } - - // GetValueForKey, forced return type, manual converter - template - std::decay_t GetValueForKey(const Json::Value& json, std::string_view key, Converter&& conv) - { - std::decay_t local{}; - GetValueForKey(json, key, local, std::forward(conv)); - return local; // returns zero-initialized? - } - - // GetValue, type-deduced, with automatic converter - template - bool GetValue(const Json::Value& json, T& target) - { - return GetValue(json, target, ConversionTrait::Type>{}); - } - - // GetValue, forced return type, with automatic converter - template - std::decay_t GetValue(const Json::Value& json) - { - std::decay_t local{}; - GetValue(json, local, ConversionTrait::Type>{}); - return local; // returns zero-initialized or value - } - - // GetValueForKey, type-deduced, with automatic converter - template - bool GetValueForKey(const Json::Value& json, std::string_view key, T& target) - { - return GetValueForKey(json, key, target, ConversionTrait::Type>{}); - } - - // GetValueForKey, forced return type, with automatic converter - template - std::decay_t GetValueForKey(const Json::Value& json, std::string_view key) - { - return GetValueForKey(json, key, ConversionTrait::Type>{}); - } - - // Get multiple values for keys (json, k, &v, k, &v, k, &v, ...). - // Uses the default converter for each v. - // Careful: this can cause a template explosion. - constexpr void GetValuesForKeys(const Json::Value& /*json*/) {} - - template - void GetValuesForKeys(const Json::Value& json, std::string_view key1, T&& val1, Args&&... args) - { - GetValueForKey(json, key1, val1); - GetValuesForKeys(json, std::forward(args)...); - } -}; - -#define JSON_ENUM_MAPPER(...) \ - template<> \ - struct ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__> : \ - public ::TerminalApp::JsonUtils::EnumMapper<__VA_ARGS__, ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__>> - -#define JSON_FLAG_MAPPER(...) \ - template<> \ - struct ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__> : \ - public ::TerminalApp::JsonUtils::FlagMapper<__VA_ARGS__, ::TerminalApp::JsonUtils::ConversionTrait<__VA_ARGS__>> - -#define JSON_MAPPINGS(Count) \ - static constexpr std::array mappings diff --git a/src/cascadia/TerminalApp/Profile.cpp b/src/cascadia/TerminalApp/Profile.cpp index 5ee40fd27a2..7cd80a65b11 100644 --- a/src/cascadia/TerminalApp/Profile.cpp +++ b/src/cascadia/TerminalApp/Profile.cpp @@ -9,6 +9,7 @@ #include #include "LegacyProfileGeneratorNamespaces.h" +#include "TerminalSettingsSerializationHelpers.h" using namespace TerminalApp; using namespace winrt::Microsoft::Terminal::Settings; @@ -52,57 +53,6 @@ static constexpr std::string_view BackgroundImageAlignmentKey{ "backgroundImageA static constexpr std::string_view RetroTerminalEffectKey{ "experimental.retroTerminalEffect" }; static constexpr std::string_view AntialiasingModeKey{ "antialiasingMode" }; -// Possible values for closeOnExit -static constexpr std::string_view CloseOnExitAlways{ "always" }; -static constexpr std::string_view CloseOnExitGraceful{ "graceful" }; -static constexpr std::string_view CloseOnExitNever{ "never" }; - -// Possible values for Scrollbar state -static constexpr std::wstring_view AlwaysVisible{ L"visible" }; -static constexpr std::wstring_view AlwaysHide{ L"hidden" }; - -// Possible values for Cursor Shape -static constexpr std::wstring_view CursorShapeVintage{ L"vintage" }; -static constexpr std::wstring_view CursorShapeBar{ L"bar" }; -static constexpr std::wstring_view CursorShapeUnderscore{ L"underscore" }; -static constexpr std::wstring_view CursorShapeFilledbox{ L"filledBox" }; -static constexpr std::wstring_view CursorShapeEmptybox{ L"emptyBox" }; - -// Possible values for Font Weight -static constexpr std::string_view FontWeightThin{ "thin" }; -static constexpr std::string_view FontWeightExtraLight{ "extra-light" }; -static constexpr std::string_view FontWeightLight{ "light" }; -static constexpr std::string_view FontWeightSemiLight{ "semi-light" }; -static constexpr std::string_view FontWeightNormal{ "normal" }; -static constexpr std::string_view FontWeightMedium{ "medium" }; -static constexpr std::string_view FontWeightSemiBold{ "semi-bold" }; -static constexpr std::string_view FontWeightBold{ "bold" }; -static constexpr std::string_view FontWeightExtraBold{ "extra-bold" }; -static constexpr std::string_view FontWeightBlack{ "black" }; -static constexpr std::string_view FontWeightExtraBlack{ "extra-black" }; - -// Possible values for Image Stretch Mode -static constexpr std::string_view ImageStretchModeNone{ "none" }; -static constexpr std::string_view ImageStretchModeFill{ "fill" }; -static constexpr std::string_view ImageStretchModeUniform{ "uniform" }; -static constexpr std::string_view ImageStretchModeUniformTofill{ "uniformToFill" }; - -// Possible values for Image Alignment -static constexpr std::string_view ImageAlignmentCenter{ "center" }; -static constexpr std::string_view ImageAlignmentLeft{ "left" }; -static constexpr std::string_view ImageAlignmentTop{ "top" }; -static constexpr std::string_view ImageAlignmentRight{ "right" }; -static constexpr std::string_view ImageAlignmentBottom{ "bottom" }; -static constexpr std::string_view ImageAlignmentTopLeft{ "topLeft" }; -static constexpr std::string_view ImageAlignmentTopRight{ "topRight" }; -static constexpr std::string_view ImageAlignmentBottomLeft{ "bottomLeft" }; -static constexpr std::string_view ImageAlignmentBottomRight{ "bottomRight" }; - -// Possible values for TextAntialiasingMode -static constexpr std::wstring_view AntialiasingModeGrayscale{ L"grayscale" }; -static constexpr std::wstring_view AntialiasingModeCleartype{ L"cleartype" }; -static constexpr std::wstring_view AntialiasingModeAliased{ L"aliased" }; - Profile::Profile() : Profile(std::nullopt) { @@ -248,8 +198,7 @@ TerminalSettings Profile::CreateTerminalSettings(const std::unordered_map>(json, GuidKey) }) { - const auto guid{ json[JsonKey(GuidKey)] }; - const auto otherGuid = Utils::GuidFromString(GetWstringFromJson(guid)); - if (_guid.value() != otherGuid) + if (otherGuid != _guid) // optional compare takes care of this { return false; } @@ -368,16 +315,17 @@ bool Profile::ShouldBeLayered(const Json::Value& json) const return false; } - const auto& otherSource = json.isMember(JsonKey(SourceKey)) ? json[JsonKey(SourceKey)] : Json::Value::null; + std::optional otherSource; + bool otherHadSource = JsonUtils::GetValueForKey(json, SourceKey, otherSource); // For profiles with a `source`, also check the `source` property. bool sourceMatches = false; if (_source.has_value()) { - if (json.isMember(JsonKey(SourceKey))) + if (otherHadSource) { - const auto otherSourceString = GetWstringFromJson(otherSource); - sourceMatches = otherSourceString == _source.value(); + // If we have a source and the other has a source, compare them! + sourceMatches = otherSource == _source; } else { @@ -395,52 +343,13 @@ bool Profile::ShouldBeLayered(const Json::Value& json) const } else { - // We do not have a source. The only way we match is if source is set to null or "". - if (otherSource.isNull() || (otherSource.isString() && otherSource == "")) - { - sourceMatches = true; - } + // We do not have a source. The only way we match is if source is unset or set to "". + sourceMatches = (!otherSource.has_value() || otherSource.value() == L""); } return sourceMatches; } -// Method Description: -// - Helper function to convert a json value into a value of the Stretch enum. -// Calls into ParseImageStretchMode. Used with JsonUtils::GetOptionalValue. -// Arguments: -// - json: the Json::Value object to parse. -// Return Value: -// - An appropriate value from Windows.UI.Xaml.Media.Stretch -Media::Stretch Profile::_ConvertJsonToStretchMode(const Json::Value& json) -{ - return Profile::ParseImageStretchMode(json.asString()); -} - -// Method Description: -// - Helper function to convert a json value into a value of the Stretch enum. -// Calls into ParseImageAlignment. Used with JsonUtils::GetOptionalValue. -// Arguments: -// - json: the Json::Value object to parse. -// Return Value: -// - A pair of HorizontalAlignment and VerticalAlignment -std::tuple Profile::_ConvertJsonToAlignment(const Json::Value& json) -{ - return Profile::ParseImageAlignment(json.asString()); -} - -// Method Description: -// - Helper function to convert a json value into a bool. -// Used with JsonUtils::GetOptionalValue. -// Arguments: -// - json: the Json::Value object to parse. -// Return Value: -// - A bool -bool Profile::_ConvertJsonToBool(const Json::Value& json) -{ - return json.asBool(); -} - // Method Description: // - Layer values from the given json object on top of the existing properties // of this object. For any keys we're expecting to be able to parse in the @@ -456,89 +365,45 @@ bool Profile::_ConvertJsonToBool(const Json::Value& json) void Profile::LayerJson(const Json::Value& json) { // Profile-specific Settings - JsonUtils::GetWstring(json, NameKey, _name); - - JsonUtils::GetOptionalGuid(json, GuidKey, _guid); - - JsonUtils::GetBool(json, HiddenKey, _hidden); + JsonUtils::GetValueForKey(json, NameKey, _name); + JsonUtils::GetValueForKey(json, GuidKey, _guid); + JsonUtils::GetValueForKey(json, HiddenKey, _hidden); // Core Settings - JsonUtils::GetOptionalColor(json, ForegroundKey, _defaultForeground); - - JsonUtils::GetOptionalColor(json, BackgroundKey, _defaultBackground); - - JsonUtils::GetOptionalColor(json, SelectionBackgroundKey, _selectionBackground); - - JsonUtils::GetOptionalColor(json, CursorColorKey, _cursorColor); - - JsonUtils::GetOptionalString(json, ColorSchemeKey, _schemeName); + JsonUtils::GetValueForKey(json, ForegroundKey, _defaultForeground); + JsonUtils::GetValueForKey(json, BackgroundKey, _defaultBackground); + JsonUtils::GetValueForKey(json, SelectionBackgroundKey, _selectionBackground); + JsonUtils::GetValueForKey(json, CursorColorKey, _cursorColor); + JsonUtils::GetValueForKey(json, ColorSchemeKey, _schemeName); // TODO:MSFT:20642297 - Use a sentinel value (-1) for "Infinite scrollback" - JsonUtils::GetInt(json, HistorySizeKey, _historySize); - - JsonUtils::GetBool(json, SnapOnInputKey, _snapOnInput); - - JsonUtils::GetBool(json, AltGrAliasingKey, _altGrAliasing); - - JsonUtils::GetUInt(json, CursorHeightKey, _cursorHeight); - - if (json.isMember(JsonKey(CursorShapeKey))) - { - auto cursorShape{ json[JsonKey(CursorShapeKey)] }; - _cursorShape = _ParseCursorShape(GetWstringFromJson(cursorShape)); - } - JsonUtils::GetOptionalString(json, TabTitleKey, _tabTitle); + JsonUtils::GetValueForKey(json, HistorySizeKey, _historySize); + JsonUtils::GetValueForKey(json, SnapOnInputKey, _snapOnInput); + JsonUtils::GetValueForKey(json, AltGrAliasingKey, _altGrAliasing); + JsonUtils::GetValueForKey(json, CursorHeightKey, _cursorHeight); + JsonUtils::GetValueForKey(json, CursorShapeKey, _cursorShape); + JsonUtils::GetValueForKey(json, TabTitleKey, _tabTitle); // Control Settings - JsonUtils::GetOptionalGuid(json, ConnectionTypeKey, _connectionType); - - JsonUtils::GetWstring(json, CommandlineKey, _commandline); - - JsonUtils::GetWstring(json, FontFaceKey, _fontFace); - - JsonUtils::GetInt(json, FontSizeKey, _fontSize); - - if (json.isMember(JsonKey(FontWeightKey))) - { - auto fontWeight{ json[JsonKey(FontWeightKey)] }; - _fontWeight = _ParseFontWeight(fontWeight); - } - - JsonUtils::GetDouble(json, AcrylicTransparencyKey, _acrylicTransparency); - - JsonUtils::GetBool(json, UseAcrylicKey, _useAcrylic); - - JsonUtils::GetBool(json, SuppressApplicationTitleKey, _suppressApplicationTitle); - - if (json.isMember(JsonKey(CloseOnExitKey))) - { - auto closeOnExit{ json[JsonKey(CloseOnExitKey)] }; - _closeOnExitMode = ParseCloseOnExitMode(closeOnExit); - } - - JsonUtils::GetWstring(json, PaddingKey, _padding); - - JsonUtils::GetOptionalString(json, ScrollbarStateKey, _scrollbarState); - - JsonUtils::GetOptionalString(json, StartingDirectoryKey, _startingDirectory); - - JsonUtils::GetOptionalString(json, IconKey, _icon); - - JsonUtils::GetOptionalString(json, BackgroundImageKey, _backgroundImage); - - JsonUtils::GetOptionalDouble(json, BackgroundImageOpacityKey, _backgroundImageOpacity); - - JsonUtils::GetOptionalValue(json, BackgroundImageStretchModeKey, _backgroundImageStretchMode, &Profile::_ConvertJsonToStretchMode); - - JsonUtils::GetOptionalValue(json, BackgroundImageAlignmentKey, _backgroundImageAlignment, &Profile::_ConvertJsonToAlignment); - - JsonUtils::GetOptionalValue(json, RetroTerminalEffectKey, _retroTerminalEffect, Profile::_ConvertJsonToBool); - - if (json.isMember(JsonKey(AntialiasingModeKey))) - { - auto antialiasingMode{ json[JsonKey(AntialiasingModeKey)] }; - _antialiasingMode = ParseTextAntialiasingMode(GetWstringFromJson(antialiasingMode)); - } + JsonUtils::GetValueForKey(json, FontWeightKey, _fontWeight); + JsonUtils::GetValueForKey(json, ConnectionTypeKey, _connectionType); + JsonUtils::GetValueForKey(json, CommandlineKey, _commandline); + JsonUtils::GetValueForKey(json, FontFaceKey, _fontFace); + JsonUtils::GetValueForKey(json, FontSizeKey, _fontSize); + JsonUtils::GetValueForKey(json, AcrylicTransparencyKey, _acrylicTransparency); + JsonUtils::GetValueForKey(json, UseAcrylicKey, _useAcrylic); + JsonUtils::GetValueForKey(json, SuppressApplicationTitleKey, _suppressApplicationTitle); + JsonUtils::GetValueForKey(json, CloseOnExitKey, _closeOnExitMode); + JsonUtils::GetValueForKey(json, PaddingKey, _padding); + JsonUtils::GetValueForKey(json, ScrollbarStateKey, _scrollbarState); + JsonUtils::GetValueForKey(json, StartingDirectoryKey, _startingDirectory); + JsonUtils::GetValueForKey(json, IconKey, _icon); + JsonUtils::GetValueForKey(json, BackgroundImageKey, _backgroundImage); + JsonUtils::GetValueForKey(json, BackgroundImageOpacityKey, _backgroundImageOpacity); + JsonUtils::GetValueForKey(json, BackgroundImageStretchModeKey, _backgroundImageStretchMode); + JsonUtils::GetValueForKey(json, BackgroundImageAlignmentKey, _backgroundImageAlignment); + JsonUtils::GetValueForKey(json, RetroTerminalEffectKey, _retroTerminalEffect); + JsonUtils::GetValueForKey(json, AntialiasingModeKey, _antialiasingMode); } void Profile::SetFontFace(std::wstring fontFace) noexcept @@ -770,249 +635,6 @@ std::wstring Profile::EvaluateStartingDirectory(const std::wstring& directory) } } -// Method Description: -// - Helper function for converting a user-specified font weight value to its corresponding enum -// Arguments: -// - The value from the settings.json file -// Return Value: -// - The corresponding value which maps to the string provided by the user -winrt::Windows::UI::Text::FontWeight Profile::_ParseFontWeight(const Json::Value& json) -{ - if (json.isUInt()) - { - winrt::Windows::UI::Text::FontWeight weight; - weight.Weight = static_cast(json.asUInt()); - - // We're only accepting variable values between 100 and 990 so we don't go too crazy. - if (weight.Weight >= 100 && weight.Weight <= 990) - { - return weight; - } - } - - if (json.isString()) - { - auto fontWeight = json.asString(); - if (fontWeight == FontWeightThin) - { - return winrt::Windows::UI::Text::FontWeights::Thin(); - } - else if (fontWeight == FontWeightExtraLight) - { - return winrt::Windows::UI::Text::FontWeights::ExtraLight(); - } - else if (fontWeight == FontWeightLight) - { - return winrt::Windows::UI::Text::FontWeights::Light(); - } - else if (fontWeight == FontWeightSemiLight) - { - return winrt::Windows::UI::Text::FontWeights::SemiLight(); - } - else if (fontWeight == FontWeightNormal) - { - return winrt::Windows::UI::Text::FontWeights::Normal(); - } - else if (fontWeight == FontWeightMedium) - { - return winrt::Windows::UI::Text::FontWeights::Medium(); - } - else if (fontWeight == FontWeightSemiBold) - { - return winrt::Windows::UI::Text::FontWeights::SemiBold(); - } - else if (fontWeight == FontWeightBold) - { - return winrt::Windows::UI::Text::FontWeights::Bold(); - } - else if (fontWeight == FontWeightExtraBold) - { - return winrt::Windows::UI::Text::FontWeights::ExtraBold(); - } - else if (fontWeight == FontWeightBlack) - { - return winrt::Windows::UI::Text::FontWeights::Black(); - } - else if (fontWeight == FontWeightExtraBlack) - { - return winrt::Windows::UI::Text::FontWeights::ExtraBlack(); - } - } - - return winrt::Windows::UI::Text::FontWeights::Normal(); -} - -// Method Description: -// - Helper function for converting a user-specified closeOnExit value to its corresponding enum -// Arguments: -// - The value from the settings.json file -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -CloseOnExitMode Profile::ParseCloseOnExitMode(const Json::Value& json) -{ - if (json.isBool()) - { - return json.asBool() ? CloseOnExitMode::Graceful : CloseOnExitMode::Never; - } - - if (json.isString()) - { - auto closeOnExit = json.asString(); - if (closeOnExit == CloseOnExitAlways) - { - return CloseOnExitMode::Always; - } - else if (closeOnExit == CloseOnExitGraceful) - { - return CloseOnExitMode::Graceful; - } - else if (closeOnExit == CloseOnExitNever) - { - return CloseOnExitMode::Never; - } - } - - return CloseOnExitMode::Graceful; -} - -// Method Description: -// - Helper function for converting a user-specified scrollbar state to its corresponding enum -// Arguments: -// - The value from the settings.json file -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -ScrollbarState Profile::ParseScrollbarState(const std::wstring& scrollbarState) -{ - if (scrollbarState == AlwaysVisible) - { - return ScrollbarState::Visible; - } - else if (scrollbarState == AlwaysHide) - { - return ScrollbarState::Hidden; - } - else - { - return ScrollbarState::Visible; - } -} - -// Method Description: -// - Helper function for converting a user-specified image stretch mode -// to the appropriate enum value -// Arguments: -// - The value from the settings.json file -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -Media::Stretch Profile::ParseImageStretchMode(const std::string_view imageStretchMode) -{ - if (imageStretchMode == ImageStretchModeNone) - { - return Media::Stretch::None; - } - else if (imageStretchMode == ImageStretchModeFill) - { - return Media::Stretch::Fill; - } - else if (imageStretchMode == ImageStretchModeUniform) - { - return Media::Stretch::Uniform; - } - else // Fall through to default behavior - { - return Media::Stretch::UniformToFill; - } -} - -// Method Description: -// - Helper function for converting a user-specified image horizontal and vertical -// alignment to the appropriate enum values tuple -// Arguments: -// - The value from the settings.json file -// Return Value: -// - The corresponding enum values tuple which maps to the string provided by the user -std::tuple Profile::ParseImageAlignment(const std::string_view imageAlignment) -{ - if (imageAlignment == ImageAlignmentTopLeft) - { - return std::make_tuple(HorizontalAlignment::Left, - VerticalAlignment::Top); - } - else if (imageAlignment == ImageAlignmentBottomLeft) - { - return std::make_tuple(HorizontalAlignment::Left, - VerticalAlignment::Bottom); - } - else if (imageAlignment == ImageAlignmentLeft) - { - return std::make_tuple(HorizontalAlignment::Left, - VerticalAlignment::Center); - } - else if (imageAlignment == ImageAlignmentTopRight) - { - return std::make_tuple(HorizontalAlignment::Right, - VerticalAlignment::Top); - } - else if (imageAlignment == ImageAlignmentBottomRight) - { - return std::make_tuple(HorizontalAlignment::Right, - VerticalAlignment::Bottom); - } - else if (imageAlignment == ImageAlignmentRight) - { - return std::make_tuple(HorizontalAlignment::Right, - VerticalAlignment::Center); - } - else if (imageAlignment == ImageAlignmentTop) - { - return std::make_tuple(HorizontalAlignment::Center, - VerticalAlignment::Top); - } - else if (imageAlignment == ImageAlignmentBottom) - { - return std::make_tuple(HorizontalAlignment::Center, - VerticalAlignment::Bottom); - } - else // Fall through to default alignment - { - return std::make_tuple(HorizontalAlignment::Center, - VerticalAlignment::Center); - } -} - -// Method Description: -// - Helper function for converting a user-specified cursor style corresponding -// CursorStyle enum value -// Arguments: -// - cursorShapeString: The string value from the settings file to parse -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -CursorStyle Profile::_ParseCursorShape(const std::wstring& cursorShapeString) -{ - if (cursorShapeString == CursorShapeVintage) - { - return CursorStyle::Vintage; - } - else if (cursorShapeString == CursorShapeBar) - { - return CursorStyle::Bar; - } - else if (cursorShapeString == CursorShapeUnderscore) - { - return CursorStyle::Underscore; - } - else if (cursorShapeString == CursorShapeFilledbox) - { - return CursorStyle::FilledBox; - } - else if (cursorShapeString == CursorShapeEmptybox) - { - return CursorStyle::EmptyBox; - } - // default behavior for invalid data - return CursorStyle::Bar; -} - // Method Description: // - If this profile never had a GUID set for it, generate a runtime GUID for // the profile. If a profile had their guid manually set to {0}, this method @@ -1078,17 +700,13 @@ GUID Profile::_GenerateGuidForProfile(const std::wstring& name, const std::optio // - The json's `guid`, or a guid synthesized for it. GUID Profile::GetGuidOrGenerateForJson(const Json::Value& json) noexcept { - std::optional guid{ std::nullopt }; - - JsonUtils::GetOptionalGuid(json, GuidKey, guid); - if (guid) + if (const auto guid{ JsonUtils::GetValueForKey>(json, GuidKey) }) { return guid.value(); } - const auto name = GetWstringFromJson(json[JsonKey(NameKey)]); - std::optional source{ std::nullopt }; - JsonUtils::GetOptionalString(json, SourceKey, source); + const auto name{ JsonUtils::GetValueForKey(json, NameKey) }; + const auto source{ JsonUtils::GetValueForKey>(json, SourceKey) }; return Profile::_GenerateGuidForProfile(name, source); } @@ -1097,28 +715,3 @@ void Profile::SetRetroTerminalEffect(bool value) noexcept { _retroTerminalEffect = value; } - -// Method Description: -// - Helper function for converting a user-specified antialiasing mode -// corresponding TextAntialiasingMode enum value -// Arguments: -// - antialiasingMode: The string value from the settings file to parse -// Return Value: -// - The corresponding enum value which maps to the string provided by the user -TextAntialiasingMode Profile::ParseTextAntialiasingMode(const std::wstring& antialiasingMode) -{ - if (antialiasingMode == AntialiasingModeCleartype) - { - return TextAntialiasingMode::Cleartype; - } - else if (antialiasingMode == AntialiasingModeAliased) - { - return TextAntialiasingMode::Aliased; - } - else if (antialiasingMode == AntialiasingModeGrayscale) - { - return TextAntialiasingMode::Grayscale; - } - // default behavior for invalid data - return TextAntialiasingMode::Grayscale; -} diff --git a/src/cascadia/TerminalApp/Profile.h b/src/cascadia/TerminalApp/Profile.h index bd48592157c..17edad98bb6 100644 --- a/src/cascadia/TerminalApp/Profile.h +++ b/src/cascadia/TerminalApp/Profile.h @@ -15,6 +15,7 @@ Author(s): --*/ #pragma once #include "ColorScheme.h" +#include "SettingsTypes.h" // fwdecl unittest classes namespace TerminalAppLocalTests @@ -35,14 +36,7 @@ constexpr GUID RUNTIME_GENERATED_PROFILE_NAMESPACE_GUID = { 0xf65ddb7e, 0x706b, namespace TerminalApp { class Profile; - - enum class CloseOnExitMode - { - Never = 0, - Graceful, - Always - }; -}; +} class TerminalApp::Profile final { @@ -107,24 +101,8 @@ class TerminalApp::Profile final private: static std::wstring EvaluateStartingDirectory(const std::wstring& directory); - static winrt::Microsoft::Terminal::Settings::ScrollbarState ParseScrollbarState(const std::wstring& scrollbarState); - static winrt::Windows::UI::Xaml::Media::Stretch ParseImageStretchMode(const std::string_view imageStretchMode); - static winrt::Windows::UI::Xaml::Media::Stretch _ConvertJsonToStretchMode(const Json::Value& json); - static std::tuple ParseImageAlignment(const std::string_view imageAlignment); - static std::tuple _ConvertJsonToAlignment(const Json::Value& json); - - static winrt::Windows::UI::Text::FontWeight _ParseFontWeight(const Json::Value& json); - - static CloseOnExitMode ParseCloseOnExitMode(const Json::Value& json); - - static winrt::Microsoft::Terminal::Settings::CursorStyle _ParseCursorShape(const std::wstring& cursorShapeString); - - static winrt::Microsoft::Terminal::Settings::TextAntialiasingMode ParseTextAntialiasingMode(const std::wstring& antialiasingMode); - static GUID _GenerateGuidForProfile(const std::wstring& name, const std::optional& source) noexcept; - static bool _ConvertJsonToBool(const Json::Value& json); - std::optional _guid{ std::nullopt }; std::optional _source{ std::nullopt }; std::wstring _name; @@ -159,7 +137,7 @@ class TerminalApp::Profile final std::optional _backgroundImageStretchMode; std::optional> _backgroundImageAlignment; - std::optional _scrollbarState; + std::optional<::winrt::Microsoft::Terminal::Settings::ScrollbarState> _scrollbarState; CloseOnExitMode _closeOnExitMode; std::wstring _padding; diff --git a/src/cascadia/TerminalApp/SettingsTypes.h b/src/cascadia/TerminalApp/SettingsTypes.h new file mode 100644 index 00000000000..66903ab41a4 --- /dev/null +++ b/src/cascadia/TerminalApp/SettingsTypes.h @@ -0,0 +1,28 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- SettingsTypes.h + +Abstract: +- Types used in the settings model (non-exported) +--*/ + +#pragma once + +namespace TerminalApp +{ + enum class CloseOnExitMode + { + Never = 0, + Graceful, + Always + }; + + struct LaunchPosition + { + std::optional x; + std::optional y; + }; +}; diff --git a/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h b/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h new file mode 100644 index 00000000000..40de89d2258 --- /dev/null +++ b/src/cascadia/TerminalApp/TerminalSettingsSerializationHelpers.h @@ -0,0 +1,272 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- TerminalSettingsSerializationHelpers.h + +Abstract: +- Specializations of the JsonUtils helpers for things that might end up in a + settings document. + +--*/ + +#pragma once + +#include "pch.h" + +#include "JsonUtils.h" +#include "SettingsTypes.h" + +#include +#include + +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::CursorStyle) +{ + static constexpr std::array mappings = { + pair_type{ "bar", ValueType::Bar }, + pair_type{ "vintage", ValueType::Vintage }, + pair_type{ "underscore", ValueType::Underscore }, + pair_type{ "filledBox", ValueType::FilledBox }, + pair_type{ "emptyBox", ValueType::EmptyBox } + }; +}; + +JSON_ENUM_MAPPER(::winrt::Windows::UI::Xaml::Media::Stretch) +{ + static constexpr std::array mappings = { + pair_type{ "uniformToFill", ValueType::UniformToFill }, + pair_type{ "none", ValueType::None }, + pair_type{ "fill", ValueType::Fill }, + pair_type{ "uniform", ValueType::Uniform } + }; +}; + +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::ScrollbarState) +{ + static constexpr std::array mappings = { + pair_type{ "visible", ValueType::Visible }, + pair_type{ "hidden", ValueType::Hidden } + }; +}; + +JSON_ENUM_MAPPER(std::tuple<::winrt::Windows::UI::Xaml::HorizontalAlignment, ::winrt::Windows::UI::Xaml::VerticalAlignment>) +{ + // reduce repetition + using HA = ::winrt::Windows::UI::Xaml::HorizontalAlignment; + using VA = ::winrt::Windows::UI::Xaml::VerticalAlignment; + static constexpr std::array mappings = { + pair_type{ "center", std::make_tuple(HA::Center, VA::Center) }, + pair_type{ "topLeft", std::make_tuple(HA::Left, VA::Top) }, + pair_type{ "bottomLeft", std::make_tuple(HA::Left, VA::Bottom) }, + pair_type{ "left", std::make_tuple(HA::Left, VA::Center) }, + pair_type{ "topRight", std::make_tuple(HA::Right, VA::Top) }, + pair_type{ "bottomRight", std::make_tuple(HA::Right, VA::Bottom) }, + pair_type{ "right", std::make_tuple(HA::Right, VA::Center) }, + pair_type{ "top", std::make_tuple(HA::Center, VA::Top) }, + pair_type{ "bottom", std::make_tuple(HA::Center, VA::Bottom) } + }; +}; + +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::TextAntialiasingMode) +{ + static constexpr std::array mappings = { + pair_type{ "grayscale", ValueType::Grayscale }, + pair_type{ "cleartype", ValueType::Cleartype }, + pair_type{ "aliased", ValueType::Aliased } + }; +}; + +// Type Description: +// - Helper for converting a user-specified closeOnExit value to its corresponding enum +JSON_ENUM_MAPPER(::TerminalApp::CloseOnExitMode) +{ + JSON_MAPPINGS(3) = { + pair_type{ "always", ValueType::Always }, + pair_type{ "graceful", ValueType::Graceful }, + pair_type{ "never", ValueType::Never }, + }; + + // Override mapping parser to add boolean parsing + CloseOnExitMode FromJson(const Json::Value& json) + { + if (json.isBool()) + { + return json.asBool() ? ValueType::Graceful : ValueType::Never; + } + return EnumMapper::FromJson(json); + } + + bool CanConvert(const Json::Value& json) + { + return EnumMapper::CanConvert(json) || json.isBool(); + } +}; + +// This specialization isn't using JSON_ENUM_MAPPER because we need to have a different +// value type (unsinged int) and return type (FontWeight struct). JSON_ENUM_MAPPER +// expects that the value type _is_ the return type. +template<> +struct ::TerminalApp::JsonUtils::ConversionTrait<::winrt::Windows::UI::Text::FontWeight> : + public ::TerminalApp::JsonUtils::EnumMapper< + unsigned int, + ::TerminalApp::JsonUtils::ConversionTrait<::winrt::Windows::UI::Text::FontWeight>> +{ + // The original parser used the font weight getters Bold(), Normal(), etc. + // They were both cumbersome and *not constant expressions* + JSON_MAPPINGS(11) = { + pair_type{ "thin", 100u }, + pair_type{ "extra-light", 200u }, + pair_type{ "light", 300u }, + pair_type{ "semi-light", 350u }, + pair_type{ "normal", 400u }, + pair_type{ "medium", 500u }, + pair_type{ "semi-bold", 600u }, + pair_type{ "bold", 700u }, + pair_type{ "extra-bold", 800u }, + pair_type{ "black", 900u }, + pair_type{ "extra-black", 950u }, + }; + + // Override mapping parser to add boolean parsing + auto FromJson(const Json::Value& json) + { + unsigned int value{ 400 }; + if (json.isUInt()) + { + value = json.asUInt(); + } + else + { + value = BaseEnumMapper::FromJson(json); + } + + ::winrt::Windows::UI::Text::FontWeight weight{ + static_cast(std::clamp(value, 100u, 990u)) + }; + return weight; + } + + bool CanConvert(const Json::Value& json) + { + return BaseEnumMapper::CanConvert(json) || json.isUInt(); + } +}; + +JSON_ENUM_MAPPER(::winrt::Windows::UI::Xaml::ElementTheme) +{ + JSON_MAPPINGS(3) = { + pair_type{ "system", ValueType::Default }, + pair_type{ "light", ValueType::Light }, + pair_type{ "dark", ValueType::Dark }, + }; +}; + +JSON_ENUM_MAPPER(::winrt::TerminalApp::LaunchMode) +{ + JSON_MAPPINGS(3) = { + pair_type{ "default", ValueType::DefaultMode }, + pair_type{ "maximized", ValueType::MaximizedMode }, + pair_type{ "fullscreen", ValueType::FullscreenMode }, + }; +}; + +JSON_ENUM_MAPPER(::winrt::Microsoft::UI::Xaml::Controls::TabViewWidthMode) +{ + JSON_MAPPINGS(3) = { + pair_type{ "equal", ValueType::Equal }, + pair_type{ "titleLength", ValueType::SizeToContent }, + pair_type{ "compact", ValueType::Compact }, + }; +}; + +// Type Description: +// - Helper for converting the initial position string into +// 2 coordinate values. We allow users to only provide one coordinate, +// thus, we use comma as the separator: +// (100, 100): standard input string +// (, 100), (100, ): if a value is missing, we set this value as a default +// (,): both x and y are set to default +// (abc, 100): if a value is not valid, we treat it as default +// (100, 100, 100): we only read the first two values, this is equivalent to (100, 100) +template<> +struct ::TerminalApp::JsonUtils::ConversionTrait<::TerminalApp::LaunchPosition> +{ + ::TerminalApp::LaunchPosition FromJson(const Json::Value& json) + { + ::TerminalApp::LaunchPosition ret; + std::string initialPosition{ json.asString() }; + static constexpr char singleCharDelim = ','; + std::stringstream tokenStream(initialPosition); + std::string token; + uint8_t initialPosIndex = 0; + + // Get initial position values till we run out of delimiter separated values in the stream + // or we hit max number of allowable values (= 2) + // Non-numeral values or empty string will be caught as exception and we do not assign them + for (; std::getline(tokenStream, token, singleCharDelim) && (initialPosIndex < 2); initialPosIndex++) + { + try + { + int32_t position = std::stoi(token); + if (initialPosIndex == 0) + { + ret.x.emplace(position); + } + + if (initialPosIndex == 1) + { + ret.y.emplace(position); + } + } + catch (...) + { + // Do nothing + } + } + return ret; + } + + bool CanConvert(const Json::Value& json) + { + return json.isString(); + } +}; + +// Possible Direction values +JSON_ENUM_MAPPER(::winrt::TerminalApp::Direction) +{ + JSON_MAPPINGS(4) = { + pair_type{ "left", ValueType::Left }, + pair_type{ "right", ValueType::Right }, + pair_type{ "up", ValueType::Up }, + pair_type{ "down", ValueType::Down }, + }; +}; + +// Possible SplitState values +JSON_ENUM_MAPPER(::winrt::TerminalApp::SplitState) +{ + JSON_MAPPINGS(3) = { + pair_type{ "vertical", ValueType::Vertical }, + pair_type{ "horizontal", ValueType::Horizontal }, + pair_type{ "auto", ValueType::Automatic }, + }; +}; + +// Possible SplitType values +JSON_ENUM_MAPPER(::winrt::TerminalApp::SplitType) +{ + JSON_MAPPINGS(1) = { + pair_type{ "duplicate", ValueType::Duplicate }, + }; +}; + +JSON_ENUM_MAPPER(::winrt::TerminalApp::SettingsTarget) +{ + JSON_MAPPINGS(3) = { + pair_type{ "settingsFile", ValueType::SettingsFile }, + pair_type{ "defaultsFile", ValueType::DefaultsFile }, + pair_type{ "allFiles", ValueType::AllFiles }, + }; +}; diff --git a/src/cascadia/TerminalApp/Utils.cpp b/src/cascadia/TerminalApp/Utils.cpp deleted file mode 100644 index 01fa28dfdd1..00000000000 --- a/src/cascadia/TerminalApp/Utils.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#include "pch.h" -#include "Utils.h" - -// Method Description: -// - Constructs a wstring from a given Json::Value object. Reads the object as -// a std::string using asString, then builds an hstring from that std::string, -// then converts that hstring into a std::wstring. -// Arguments: -// - json: the Json::Value to parse as a string -// Return Value: -// - the wstring equivalent of the value in json -std::wstring GetWstringFromJson(const Json::Value& json) -{ - return winrt::to_hstring(json.asString()).c_str(); -} diff --git a/src/cascadia/TerminalApp/Utils.h b/src/cascadia/TerminalApp/Utils.h index bba97694282..cb23bac450d 100644 --- a/src/cascadia/TerminalApp/Utils.h +++ b/src/cascadia/TerminalApp/Utils.h @@ -13,8 +13,6 @@ Author(s): --*/ #pragma once -std::wstring GetWstringFromJson(const Json::Value& json); - // Method Description: // - Create a std::string from a string_view. We do this because we can't look // up a key in a Json::Value with a string_view directly, so instead we'll use diff --git a/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj b/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj index 6c9dc3323b7..0fb6b823c4c 100644 --- a/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj +++ b/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj @@ -109,6 +109,7 @@ + @@ -178,8 +179,6 @@ - - diff --git a/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj.filters b/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj.filters index 5f856a6d4a8..d716860a4af 100644 --- a/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj.filters +++ b/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj.filters @@ -8,7 +8,6 @@ - @@ -50,9 +49,6 @@ json - - json - tab @@ -92,6 +88,9 @@ settings + + settings + settings @@ -199,4 +198,4 @@ app - \ No newline at end of file + diff --git a/src/cascadia/ut_app/JsonTests.cpp b/src/cascadia/ut_app/JsonTests.cpp index 9fd573134f7..1afbeaeddff 100644 --- a/src/cascadia/ut_app/JsonTests.cpp +++ b/src/cascadia/ut_app/JsonTests.cpp @@ -28,8 +28,6 @@ namespace TerminalAppUnitTests TEST_METHOD(ParseSimpleColorScheme); TEST_METHOD(ProfileGeneratesGuid); - TEST_METHOD(TestWrongValueType); - TEST_CLASS_SETUP(ClassSetup) { InitializeJsonReader(); @@ -169,58 +167,4 @@ namespace TerminalAppUnitTests VERIFY_ARE_EQUAL(profile3.GetGuid(), nullGuid); VERIFY_ARE_EQUAL(profile4.GetGuid(), cmdGuid); } - - void JsonTests::TestWrongValueType() - { - // This json blob has a whole bunch of settings with the wrong value - // types - strings for int values, ints for strings, floats for ints, - // etc. When we encounter data that's the wrong data type, we should - // gracefully ignore it, as opposed to throwing an exception, causing us - // to fail to load the settings at all. - - const std::string settings0String{ R"( - { - "defaultProfile" : "{00000000-1111-0000-0000-000000000000}", - "profiles": [ - { - "guid" : "{00000000-1111-0000-0000-000000000000}", - "acrylicOpacity" : "0.5", - "closeOnExit" : "true", - "fontSize" : "10", - "historySize" : 1234.5678, - "padding" : 20, - "snapOnInput" : "false", - "icon" : 4, - "backgroundImageOpacity": false, - "useAcrylic" : 14 - } - ] - })" }; - - const auto settings0Json = VerifyParseSucceeded(settings0String); - - CascadiaSettings settings; - - settings._ParseJsonString(settings0String, false); - // We should not throw an exception trying to parse the settings here. - settings.LayerJson(settings._userSettings); - - VERIFY_ARE_EQUAL(1u, settings._profiles.size()); - auto& profile = settings._profiles.at(0); - Profile defaults{}; - - VERIFY_ARE_EQUAL(defaults._acrylicTransparency, profile._acrylicTransparency); - VERIFY_ARE_EQUAL(defaults._closeOnExitMode, profile._closeOnExitMode); - VERIFY_ARE_EQUAL(defaults._fontSize, profile._fontSize); - VERIFY_ARE_EQUAL(defaults._historySize, profile._historySize); - // A 20 as an int can still be treated as a json string - VERIFY_ARE_EQUAL(L"20", profile._padding); - VERIFY_ARE_EQUAL(defaults._snapOnInput, profile._snapOnInput); - // 4 is a valid string value - VERIFY_ARE_EQUAL(L"4", profile._icon); - // false is not a valid optional - VERIFY_IS_FALSE(profile._backgroundImageOpacity.has_value()); - VERIFY_ARE_EQUAL(defaults._useAcrylic, profile._useAcrylic); - } - } diff --git a/src/cascadia/ut_app/JsonUtilsTests.cpp b/src/cascadia/ut_app/JsonUtilsTests.cpp index 1016fb282a1..f3f3c7c5b2c 100644 --- a/src/cascadia/ut_app/JsonUtilsTests.cpp +++ b/src/cascadia/ut_app/JsonUtilsTests.cpp @@ -3,7 +3,7 @@ #include "precomp.h" -#include "../TerminalApp/JsonUtilsNew.h" +#include "../TerminalApp/JsonUtils.h" using namespace Microsoft::Console; using namespace WEX::Logging;